TSconf: Ports

В данном разделе я хотел бы описать все группы портов, которые задействованы в управлении системой TSconf.
Данный раздел описывает общее назначение портов. Полная дока по портам лежит здесь.

Итак, порты системы можно разделить на следующие группы:
  • порты управления выполнения кода процессором. Сюда отнесём такие порты как: SysConfig, CacheConfig
  • порты управления памятью: MemConfig, Page0 — Page3, FMAddr
  • порты страниц графики TSU: VPage, T0GPage, T1GPage,TMPage, SGPage
  • порты управления графическими режимами / цветом: VConfig, PalSel, Border
  • порты управления отображением: TSConfig, GXOffs/GYOffs, T0XOffs/T0YOffs, T1XOffs/T1YOffs
  • порты управления DMA: DMASAddr, DMADAddr, DMALen, DMANum, DMACtrl
  • порты управления приходом INT: INTMask, HSINT, VSINT
  • порт управления виртуальным FDD: FDDVirt

Дао говорит: Управление конфигурацией происходит через программирование портов. Порты системы так-же можно программировать записью данных в FMaps с адреса #0400.
Существует два типа портов по способу задания данных: изменение отдельных значимых битов, или же указание 8-битных значений.
Данные для некоторых устройств собираются из пары портов, в названии которых фигурируют буквы H (high byne) & L (low byte).

Итак, рассмотрим по порядку:

Порты управления выполнения кода процессором. SysConfig, CacheConfig
Порт SysConfig (#20af) предназначен для управления скоростью z80, позволяя включить процессор на скорости 3.5, 7.0 и 14.0 Мгц, а так-же позволяет включать внутренний кеш системы.
Использование кеша можно регулировать портом CacheConfig (#2baf), который позволяет включать использование кеша для всех окон памяти: EN_C000 EN_8000 EN_4000 EN_0000

Использование кэш-памяти системы
Кэш позволяет экономить обращения процессора к ОЗУ. При каждом чтении прочитанный из ОЗУ байт и смежный с ним копируются в кэш, и все следующие обращения будут прочитаны из него. Выигрыш быстродействия достигается отсутствием торможения процессора, которое происходит при обращении к физ. ОЗУ, а так же экономятся циклы ОЗУ, которые становятся доступны для других устройств.
Пример 1 (смежные адреса):
— читается адрес 0х8000, обращение к ОЗУ, в кеш попадают данные с адресов 0х8000 и 0х8001
— читается адрес 0х8001, обращение к кешу

Пример 2 (несмежные вдреса):
— читается адрес 0х8001, обращение к ОЗУ, в кеш попадают данные с адресов 0х8000 и 0х8001
— читается адрес 0х8002, обращение к ОЗУ, в кеш попадают данные с адресов 0х8002 и 0х8003

Размер кэша 512 байт, однако память данных расположена таким образом, что бы совпадать с младшими девятью битами адреса процессора. Поэтому последовательные обращение к данным, расположенным по адресам, у которых младшие 9 бит совпадают, будут вызывать конфликт и выбивание предыдущих данных из кэша. Такой кэш называется кэшем прямого отображения и наиболее просто реализуется для FPGA.

Пример 1 (конфликтующие адреса):
— читается адрес 0х8000, обращение к ОЗУ, в кеш попадают данные с адресов 0х8000 и 0х8001
— читается адрес 0х8200, обращение к ОЗУ, в кеш попадают данные с адресов 0х8200 и 0х8201 (данные с адресов 0х8000 и 0х8001 теряются)

Пример 2 (неконфликтующие адреса):
— читается адрес 0х8000, обращение к ОЗУ, в кеш попадают данные с адресов 0х8000 и 0х8001
— читается адрес 0х8100, обращение к ОЗУ, в кеш попадают данные с адресов 0х8100 и 0х8101 (данные с адресов 0х8000 и 0х8001 сохраняются)

Отсюда можно сделать вывод о том, что для более рационального использования кэш, целесообразно размещать код по «непересекающимся» адресам. Например, если требуется использование строчного инта. Это не слишком удобно, но на других платформах прибегали и не к таким ухищрениям.

Кэш учитывает страничную адресацию, поэтому данные по адресу 0хС000 на странице 0 и данные по адресу 0хС000 на странице 1 будут отличаться.

Пример
— включена страница 0, читается адрес 0хС000, обращение к ОЗУ, в кеш попадают данные с адресов 0хС000 и 0хС001
— включена страница 1, читается адрес 0хС000, обращение к ОЗУ, в кеш заново попадают данные с адресов 0хС000 и 0хС001
— включена страница 1, читается адрес 0хС001, обращение к кэшу

Порты управления памятью. MemConfig, Page0 — Page3, FMAddr
Порт #21afMemConfig описан здесь.
Порты Page0 — Page3 (#10af — #13af) предназначены для отображения страниц в заданных окнах адресов RAM: #0000,#4000,#8000,#c000, что охватывает всё адресное пространство памяти.
Порт FMAddr (#15af) предназначен для управления отражением внутренней памяти системы в памяти, доступной процессору для записи.
У нас есть возможность включить это окно по кратным #1000 адресам.
Во внутренней памяти системы хранятся следующие данные: по относительным адресам 0-511 хранится палитра, по адресам 512-1023 — дескрипторы спрайтов, а с адреса #400 находится блок маппинга портов. Запись в эти адреса приводит к программированию портов системы, подобно прямой записи в порт.

Порты страниц графики TSU. VPage, T0GPage, T1GPage,TMPage, SGPage
Данные порты предназначены для указания страниц, используемых TSU (тайлово-спрайтовый движок, отображающий всё на экране) для отображения видео, а так-же графики слоёв тайлов и спрайтов.
Порт VPage (#01af) указывает системе, начиная с какой страницы последовательный набор страниц памяти будет использован как видео-страницы.
Порты T0GPage (#17af), T1GPage (#18af), SGPage (#19af) указывают на страницы, в которых лежит подготовленная графика тайлов для вывода.
Порт TMPage (#16af) указывает на страницу, используемую как карту тайлов.

Порты управления графическими режимами / цветом. VConfig, PalSel, Border
Порт VConfig (#00af) предназначен для следующих задач: установка разрешения и видеорежима, а так-же управление отображением TSU и слоя графики.
Порт PalSel (#07af) предназначен для выбора палитры, которая будет использована в основном графическом экране, и так-же позволяет указать старшие два бита номера палитры для тайловых слоёв. Комбинируя данные два старших бита PalSel для тайлов, и выбранные младшие два бита палитры в описателе тайла, мы получаем номер палитры конкретного тайла.
Порт Border (#0faf) указывает на цвет бордюра в текущей палитре системы.

Порты управления отображением. TSConfig, GXOffs/GYOffs, T0XOffs/T0YOffs, T1XOffs/T1YOffs
Порт TSConfig (#06af) предназначен для TSU и позволяет включать/выключать отображение спрайтов, тайловых слоёв путём установки битов S_EN, T1_EN, T0_EN в 1. Биты T0Z_EN и T1Z_EN предназначены для включения отображения тайлов под номером 0.

Набор портов Х_Offs предназначен для управления окном отображения заданного разрешения для соответствующего порту слоя — графический экран или тайловые слои.
Так как поле видеопамяти (и отображение тайлов) имеет у нас ширину 512 точек и зациклено, то для управления окном отображения используется два порта (старший и младший), дабы указать 9 бит данных, позволяющих указать все доступные позиции 0-511.
Пример: T0XOffsL — младшие 8 бит, T0XOffsH — старший бит.

Порты позиции окна идут парой для X и парой для Y:
Графика: #02af — GXOffsL, #03af — GXOffsH; #04af — GYOffsL, #05af — GYOffsH.
Тайловый слой 0: #40af — T0XOffsL, #41af — T0XOffsH; #42af — T0YOffsL, #43af — T0YOffsH.
Тайловый слой 1: #44af — T1XOffsL, #45af — T1XOffsH; #46af — T1YOffsL, #47af — T1YOffsH.

Порты управления DMA. DMASAddr, DMADAddr, DMALen, DMANum, DMACtrl
Порты указывают адрес источника, приёмника, их страницы, длину передаваемых данных и количество таких транзакций, а так-же порт управления передачей.
Данные порты толково описаны в соответствующей статье о DMA
DMASAddrL (#1aaf), DMASAddrH (#1baf), DMASAddrX (#1caf)
DMADAddrL (#1daf), DMADAddrH (#1eaf), DMADAddrX (#1faf)

DMALen (#26af), DMANum (#28af)
DMACtrl / DMAStatus (#27af) — порт управления, предназначен как для записи, так и для чтения состояния DMA.

Порты управления приходом INT. INTMask, HSINT, VSINT
Порт INTMask (#2aaf) позволяет управлять обработчиками прерываний
Порт HSINT (#22af) указывает на горизонтальную точку прихода прерывания, а пара портов VSINT — старший VSINTH (#24af)(значимым является младший бит) и младший VSINTL (#23a4) (все 8 бит) — вертикальную позицию (строку)
Подробнее о интах — здесь

Управление виртуальным дисководом. FDDVirt
Порт FDDVirt (#29af) использует 4 младших бита, каждый из которых указывает на все доступные дисководы А — D
Дисковод срабатывает при таких условиях:
— бит нужного дисковода = 1.
— выбран соотв. флоп в порту FF[1:0]
— включен трдос
— произошло обращение к любому порту бетадиска
При этом происходит включение паги 255 по адресу 0-3ффф
любое обращение к любому порту бетадиска вызывает отключение паги 255

PS: При запуске всей этой шарманки надо инитить ВСЕ регистры, имеющие отношение к сабжу — это касается всех портов.
Потому что не известно, что задано в портах в текущий момент.


Вопросы:
? Где номера портов найти?
! В Справочнике. Я сознательно в статье не размещал адреса портов, пользуйте интуитивно-понятный ексель.

? А маппинг в эмуле есть?
! А нема пока. Ждём-с.

Литература: Справочник, F.A.Q., Дока от EARL: TS конфигурация

3 комментария

avatar

вроде тоже в тему ))
avatar

Устроили тут смехуечки…
avatar
Что вы вообще понимаете в портах! Вот как выглядят хорошие:

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.