TS-Config — различия между версиями
Ts-labs (обсуждение | вклад) (Контроллер маскируемого прерывания) |
Ts-labs (обсуждение | вклад) (follow up) |
||
Строка 1: | Строка 1: | ||
[[Файл:TSdemo.png|thumb|TS Tech Demo by r0bat]] | [[Файл:TSdemo.png|thumb|TS Tech Demo by r0bat]] | ||
'''TS-Config (TS-Conf)''' - конфигурация для компьютера-конструктора [[ZX_Evolution|ZX Evolution]], разработанная TS-Labs. | '''TS-Config (TS-Conf)''' - конфигурация для компьютера-конструктора [[ZX_Evolution|ZX Evolution]], разработанная TS-Labs. | ||
+ | |||
== Характеристики == | == Характеристики == | ||
Строка 16: | Строка 17: | ||
*Банкинг для любого окна памяти по границе 16кБ (#0000, #4000, #8000, #C000). | *Банкинг для любого окна памяти по границе 16кБ (#0000, #4000, #8000, #C000). | ||
*Виртуальное ПЗУ. | *Виртуальное ПЗУ. | ||
+ | |||
== Расширение порта #7FFD == | == Расширение порта #7FFD == | ||
Строка 28: | Строка 30: | ||
*биты в Page3 расположены: 7 6 5 4 3 2 1 0, | *биты в Page3 расположены: 7 6 5 4 3 2 1 0, | ||
*dN - бит шины данных в момент записи в порт #7FFD. | *dN - бит шины данных в момент записи в порт #7FFD. | ||
+ | |||
== Контроллер маскируемого прерывания == | == Контроллер маскируемого прерывания == | ||
Строка 34: | Строка 37: | ||
В TS-Conf можно запрограммировать несколько источников маскируемого прерывания. Среди них: | В TS-Conf можно запрограммировать несколько источников маскируемого прерывания. Среди них: | ||
− | - кадровый (frame, приоритет 0), | + | *- кадровый (frame, приоритет 0), |
− | - строчный (line, приоритет 1), | + | *- строчный (line, приоритет 1), |
− | - сигнал окончания DMA транзакции (dma, приоритет 2). | + | *- сигнал окончания DMA транзакции (dma, приоритет 2). |
Каждый источник прерывания формирует сигнал ~INT и выставляет собственный байт D[7:0] на ШД в цикле ~IORQ || ~M1. В случае прихода нескольких событий одновременно, сначала обработается прерывание с меньшим приоритетом. При завершении ISR инструкциями EI : RET сразу произойдет обработка следующего по порядку ~INT, который разпознается в последнем машцикле инструкции RET. | Каждый источник прерывания формирует сигнал ~INT и выставляет собственный байт D[7:0] на ШД в цикле ~IORQ || ~M1. В случае прихода нескольких событий одновременно, сначала обработается прерывание с меньшим приоритетом. При завершении ISR инструкциями EI : RET сразу произойдет обработка следующего по порядку ~INT, который разпознается в последнем машцикле инструкции RET. | ||
Регистр конфигурации INTMask содержит биты разрешения индивидуального источника маскируемого прерывания, 0 - запрещен / 1 - разрешен. По ~RESET туда записывается значение $01: разрешен frame, все остальные запрещены. Если из ISR прерывания с меньшим приоритетом записать 0 в соответствующий бит маски источника прерывания, ожидающего в данный момент обработки, то произойдет его сброс и прерывание обработано не будет. Запись 1 не влияет на состояние ожидающего прерывания. Структура INTMask следующая: | Регистр конфигурации INTMask содержит биты разрешения индивидуального источника маскируемого прерывания, 0 - запрещен / 1 - разрешен. По ~RESET туда записывается значение $01: разрешен frame, все остальные запрещены. Если из ISR прерывания с меньшим приоритетом записать 0 в соответствующий бит маски источника прерывания, ожидающего в данный момент обработки, то произойдет его сброс и прерывание обработано не будет. Запись 1 не влияет на состояние ожидающего прерывания. Структура INTMask следующая: | ||
− | бит 0, FRAME - разрешение источника frame, | + | *бит 0, FRAME - разрешение источника frame, |
− | бит 1, LINE - разрешение источника line, | + | *бит 1, LINE - разрешение источника line, |
− | бит 2, DMA - разрешение источника dma, | + | *бит 2, DMA - разрешение источника dma, |
− | биты 3-7 - не используются, записывать 0. | + | *биты 3-7 - не используются, записывать 0. |
Источник frame срабатывает, когда значение счетчиков растра совпадает с регистрами HSINT и VSINT. | Источник frame срабатывает, когда значение счетчиков растра совпадает с регистрами HSINT и VSINT. | ||
Строка 50: | Строка 53: | ||
Таблица адресов ISR устроена следующим образом (предположим, что I - регистр вектора прерывания z80 содержит значение $80). | Таблица адресов ISR устроена следующим образом (предположим, что I - регистр вектора прерывания z80 содержит значение $80). | ||
− | $8000 .. $80D0 - не используются, | + | *$8000 .. $80D0 - не используются, |
− | $80D1 .. $80E0 - dma ISR, | + | *$80D1 .. $80E0 - dma ISR, |
− | $80Е1 .. $80F0 - line ISR, | + | *$80Е1 .. $80F0 - line ISR, |
− | $80F1 .. $8100 - frame ISR. | + | *$80F1 .. $8100 - frame ISR. |
Для каждого источника прерывания зарезервирован пул из 8 векторов. Для конфигурации векторов предназначен регистр IM2Vect. Его структра следующая: | Для каждого источника прерывания зарезервирован пул из 8 векторов. Для конфигурации векторов предназначен регистр IM2Vect. Его структра следующая: | ||
− | бит 0 - не используется, значение игнорируется, | + | *бит 0 - не используется, значение игнорируется, |
− | биты 1-3, A[3:1] - выбор вектора внутри пула, | + | *биты 1-3, A[3:1] - выбор вектора внутри пула, |
− | биты 4-6, INTSRC[2:0] - выбор записываемого пула, | + | *биты 4-6, INTSRC[2:0] - выбор записываемого пула, |
− | бит 7 - не используется, записывать 0. | + | *бит 7 - не используется, записывать 0. |
INTSRC[2:0] может принимать следующие значения: | INTSRC[2:0] может принимать следующие значения: | ||
− | 0 (%000) - пул для frame, | + | *0 (%000) - пул для frame, |
− | 1 (%001) - пул для line, | + | *1 (%001) - пул для line, |
− | 2 (%010) - пул для dma, | + | *2 (%010) - пул для dma, |
− | 3 (%011) .. 7 (%111) - не используются, запись этих значений запрещена. | + | *3 (%011) .. 7 (%111) - не используются, запись этих значений запрещена. |
Запись в пул одного источника не влияет на остальные. | Запись в пул одного источника не влияет на остальные. | ||
Структура пула (смещение от начала пула в байтах): | Структура пула (смещение от начала пула в байтах): | ||
− | A[3:1] = 0 (%000) - +$01 | + | *A[3:1] = 0 (%000) - +$01 |
− | A[3:1] = 1 (%001) - +$03 | + | *A[3:1] = 1 (%001) - +$03 |
− | .. | + | *.. |
− | A[3:1] = 6 (%110) - +$0D | + | *A[3:1] = 6 (%110) - +$0D |
− | A[3:1] = 7 (%111) - +$0F | + | *A[3:1] = 7 (%111) - +$0F |
Примеры (I = $80): | Примеры (I = $80): | ||
− | 1. IM2Vect = $0E (%00001110) (данная запись производится аппаратно по ~RESET для совместимости с классическим режимом) | + | *1. IM2Vect = $0E (%00001110) (данная запись производится аппаратно по ~RESET для совместимости с классическим режимом) |
− | Запись в пул frame, выбран вектор 7, адрес таблицы ISR для источника frame равен $80FF..$8100. | + | *Запись в пул frame, выбран вектор 7, адрес таблицы ISR для источника frame равен $80FF..$8100. |
− | 2. IM2Vect = $00 (%00000000) | + | *2. IM2Vect = $00 (%00000000) |
− | Запись в пул frame, выбран вектор 0, адрес таблицы ISR для источника frame равен $80F1..$80F2. | + | *Запись в пул frame, выбран вектор 0, адрес таблицы ISR для источника frame равен $80F1..$80F2. |
− | 3. IM2Vect = $2E (%00101000) | + | *3. IM2Vect = $2E (%00101000) |
− | Запись в пул dma, выбран вектор 4, адрес таблицы ISR для источника frame равен $80D9..$80DA. | + | *Запись в пул dma, выбран вектор 4, адрес таблицы ISR для источника frame равен $80D9..$80DA. |
Версия 03:39, 16 декабря 2013
TS-Config (TS-Conf) - конфигурация для компьютера-конструктора ZX Evolution, разработанная TS-Labs.
Содержание
Характеристики
- Совместимость с Pentagon в версии 512кБ, расширение через биты 6,7 (и опционально - 5 порта #7FFD до 1024кБ, без дополнительных графических режимов). Совместимость с расширениями других клонов не предусмотрена[1].
- Наличие аппаратного видеопроцессора (TSU), обеспечивающего отображение тайлов и спрайтов поверх основной графики.
- Дополнительные графические режимы 16 и 256 цветов на точку.
- Палитра - 256 ячеек с выбором из 64/15625 оттенков.
- Текстовый режим с подгружаемым шрифтом.
- Блиттер (копирование/наложение по маске прямоугольной области экрана).
- Количество видеостраниц ограничено только количеством страниц памяти (256 видеостраниц для режима 6912).
- DMA, в т.ч. для устройств Z-Controller и Nemo-IDE (SD-Card и IDE), внутренних массивов чипсета[2].
- Процессорный кэш, частично устраняющий проблему торможения при доступе к памяти на частоте 14МГц.
- Виртуальный TR-DOS с использованием внешних устройств для хранения имеджей (SD-Card, IDE, RS-232).
- Программируемые позиция INT (с точностью до такта 3,5МГц) и младший байт вектора прерываний IM2.
- Банкинг для любого окна памяти по границе 16кБ (#0000, #4000, #8000, #C000).
- Виртуальное ПЗУ.
Расширение порта #7FFD
Аппаратно регистра, хранящего значение, записанное в #7FFD нет. Вместо этого, для адресации страницы в окне #C000 есть 8-битный регистр Page3, который линейно адресует страницы в диапазоне 0-255.
Биты LCK128[1:0] регистра MEMConfig выбирают 4 режима работы порта #7FFD:
- 00 - 512кБ. Биты Page3: 0 0 0 d7 d6 d2 d1 d0.
- 01 - 128кБ. Биты Page3: 0 0 0 0 0 d2 d1 d0.
- 10 - 512/128к авто. Через OUT (#FD) - 128k / OUT (C), r - 512k.
- 11 - 1024кБ. Бит 5 перестает работать защелкой 48к. Биты Page3: 0 0 d5 d7 d6 d2 d1 d0.
Где:
- биты в Page3 расположены: 7 6 5 4 3 2 1 0,
- dN - бит шины данных в момент записи в порт #7FFD.
Контроллер маскируемого прерывания
В последнем машцикле текущей иструкции z80 опрашивает линию маскируемого прерывания ~INT. Если линия активна, завершается выполнение текущей иструкции, генерируется цикл подтверждения маскируемого прерывания (~IORQ || ~M1), на стек сохраняется текущее значение счетчика команд РС и выполняется переход на адрес процедуры обработки маскируемого прерывания. В режиме IM 2 в цикле подтверждения маскируемого прерывания с шины данных читается байт (D[7:0]), который используется для вычисления адреса процедуры обработки маскируемого прерывания. Вычисление производится следующим образом. Регистр вектора маскируемого прерывания (I[7:0]) используется в качестве старшего байта адреса таблицы, D[7:0] - младшего. Из памяти по полученному адресу читаются подряд 2 байта, образующих адрес процедуры обработки маскируемого прерывания (ISR), на который и выполняется переход.
В TS-Conf можно запрограммировать несколько источников маскируемого прерывания. Среди них:
- - кадровый (frame, приоритет 0),
- - строчный (line, приоритет 1),
- - сигнал окончания DMA транзакции (dma, приоритет 2).
Каждый источник прерывания формирует сигнал ~INT и выставляет собственный байт D[7:0] на ШД в цикле ~IORQ || ~M1. В случае прихода нескольких событий одновременно, сначала обработается прерывание с меньшим приоритетом. При завершении ISR инструкциями EI : RET сразу произойдет обработка следующего по порядку ~INT, который разпознается в последнем машцикле инструкции RET.
Регистр конфигурации INTMask содержит биты разрешения индивидуального источника маскируемого прерывания, 0 - запрещен / 1 - разрешен. По ~RESET туда записывается значение $01: разрешен frame, все остальные запрещены. Если из ISR прерывания с меньшим приоритетом записать 0 в соответствующий бит маски источника прерывания, ожидающего в данный момент обработки, то произойдет его сброс и прерывание обработано не будет. Запись 1 не влияет на состояние ожидающего прерывания. Структура INTMask следующая:
- бит 0, FRAME - разрешение источника frame,
- бит 1, LINE - разрешение источника line,
- бит 2, DMA - разрешение источника dma,
- биты 3-7 - не используются, записывать 0.
Источник frame срабатывает, когда значение счетчиков растра совпадает с регистрами HSINT и VSINT. Источник line срабатывает в каждой строке, когда горизонтальный счетчик растра равен 0. Источник dma срабатывает после окончания любой транзакции DMA.
Таблица адресов ISR устроена следующим образом (предположим, что I - регистр вектора прерывания z80 содержит значение $80).
- $8000 .. $80D0 - не используются,
- $80D1 .. $80E0 - dma ISR,
- $80Е1 .. $80F0 - line ISR,
- $80F1 .. $8100 - frame ISR.
Для каждого источника прерывания зарезервирован пул из 8 векторов. Для конфигурации векторов предназначен регистр IM2Vect. Его структра следующая:
- бит 0 - не используется, значение игнорируется,
- биты 1-3, A[3:1] - выбор вектора внутри пула,
- биты 4-6, INTSRC[2:0] - выбор записываемого пула,
- бит 7 - не используется, записывать 0.
INTSRC[2:0] может принимать следующие значения:
- 0 (%000) - пул для frame,
- 1 (%001) - пул для line,
- 2 (%010) - пул для dma,
- 3 (%011) .. 7 (%111) - не используются, запись этих значений запрещена.
Запись в пул одного источника не влияет на остальные.
Структура пула (смещение от начала пула в байтах):
- A[3:1] = 0 (%000) - +$01
- A[3:1] = 1 (%001) - +$03
- ..
- A[3:1] = 6 (%110) - +$0D
- A[3:1] = 7 (%111) - +$0F
Примеры (I = $80):
- 1. IM2Vect = $0E (%00001110) (данная запись производится аппаратно по ~RESET для совместимости с классическим режимом)
- Запись в пул frame, выбран вектор 7, адрес таблицы ISR для источника frame равен $80FF..$8100.
- 2. IM2Vect = $00 (%00000000)
- Запись в пул frame, выбран вектор 0, адрес таблицы ISR для источника frame равен $80F1..$80F2.
- 3. IM2Vect = $2E (%00101000)
- Запись в пул dma, выбран вектор 4, адрес таблицы ISR для источника frame равен $80D9..$80DA.
Сравнение TS-Conf и Baseconf
Аппаратная возможность | Baseconf | TS-Conf |
Графический режим 16 цветов на точку | Yes[3] | Yes[4] |
Графический режим 256 цветов на точку | No | Yes |
Текстовый режим | Yes[5] | Yes[6] |
Аппаратные скроллеры графического окна | No | Yes |
Подгружаемый шрифт текстового режима | Yes | Yes |
Чтение шрифта текстового режима | Yes[7] | Yes[8] |
Количество ячеек палитры | 16 | 256 |
Количество цветов палитры | 64 | 15625[9] |
Банкинг для всех окон памяти 16кБ | Yes | Yes |
Включение ПЗУ в любое окно 16кБ | Yes | No |
Выбор произвольного банка ПЗУ | Yes | Yes |
Выбор произвольного набора банков ПЗУ | Yes | Yes[10] |
Выбор произвольного набора банков ОЗУ для эмуляции ПЗУ | No | Yes[11] |
Установка защиты записи для ОЗУ в окне памяти | No | Yes |
Режим "открытых" портов TR-DOS | Yes | No |
Аппаратный перехват обращений к портам TR-DOS | No | Yes |
DMA для обмена данными с Z-Controller | No | Yes |
DMA для обмена данными с IDE | No | Yes |
DMA с режимом блиттера | No | Yes |
DMA с режимом затирания страниц 2-байтным кодом | No | Yes |
Аппаратные спрайты | No | Yes[12] |
Аппаратные тайлы | No | Yes[13] |
Кэш процессора | Yes[14] | Yes[15] |
Программируемая позиция кадрового сигнала INT | No | Yes[16] |
Контроллер маскируемого прерывания с приоритетизацией и пулом векторов | No | Yes |
Источники INT | 1 | 3[17] |
Программируемое значение шины данных в цикле подтверждения прерывания IM2 | No | Yes |
Генерация NMI по совпадению адреса в цикле М1 | Yes | No |
NMI в ОЗУ с запоминанием страницы, включенной в #0000 | Yes | No |
Ссылки
Сноски
- ↑ Также не предусмотрена совместимость с советским клоном ZX Spectrum АТМ турбо ни в каких его расширениях.
- ↑ Поддерживаются транзакции только по четным адресам ОЗУ, длина транзакции кратна 2 байтам.
- ↑ Режим "EGA" компьютера ATM Turbo 2 и режим 16col компьютера Pentagon 1024 SL 2.x
- ↑ С линейной адресацией
- ↑ Текстовый режим компьютера ATM Turbo 2 плюс дополнительный текстовый режим "всё в одной странице"
- ↑ С линейной адресацией
- ↑ Специальными ухищрениями
- ↑ Из ОЗУ
- ↑ Поскольку видео-ЦАП имеет разрядность 6 бит, используются аппаратные чанки с размером субпикселя 1/8. Режим совместим только с мониторами ЭЛТ (CRT). Без использования чанковых цветов, их количество - 64
- ↑ Выбор набора из 4-х последовательных страниц (SYS, TR-DOS, Basic128, Basic48), начиная с произвольной, кратной 4
- ↑ Аналогично предыдущему пункту
- ↑ 3 плоскости, 85 спрайтов на строку
- ↑ 2 плоскости, 4096 уникальных тайлов для каждой плоскости
- ↑ 1 слово 16 бит
- ↑ 256 слов 16 бит. Не учитывает изменений в ОЗУ, произведенных DMA, поэтому требует инвалидации при обращении к таким областям.
- ↑ С точностью до такта 3.5МГц
- ↑ Кадровый, строчный, окончание DMA транзакции