OUT(#FD),A и как с ним бороться
|
|
Black_Cat | Дата: Воскресенье, 07.07.2013, 12:43 | Сообщение # 1 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| OUT(#FD),A и как с ним бороться BC Info Guide #8 /стандартизация/
Предлагаю Вашему вниманию статью посвящённую использованию на Спектруме обращения к портам с основанием #xxFD в короткой адресации командой OUT(#FD),A , проблемам возникающим в этой связи, и их решению.
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Воскресенье, 29.03.2015, 12:07 | Сообщение # 2 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| ************************************** {Для обеспечения обратной совместимости с ZX Spectrum 128, использовать короткую адресацию для портов #0FFD, #1FFD, #2FFD, #3FFD строго не рекомендуется вообще. }
{Несмотря на потенциальную возможность использования короткой адресации для #FFFD, всё же не рекомендуется её использовать, т.к. в будущем это может привести к конфликтам с новыми внутренними регистрами управления выходящими за пределы диапазона #E0-#FF}
{команда OUT(#FD),A как правило не применяется для блокировки порта #7FFD} ********************************************
Согласен что предложенные ранее схемные решения не совсем решают проблему конфликтов дешифрации портов. Старые программы писали для старого железа
Добавлено (29.03.2015, 12:07) ---------------------------------------------
Новое железо как не крути требует нового подхода Ну и как правильно писали(ZX Review #3) команду OUT(#FD),A. можно совсем не использовать
Обращаться к порту 7FFD для переключения страниц проще следующим образом:
LD BC,#7FFD LD A,N+16 ;N-номер страницы OUT ©,A
По портовым командам IN A,(#n) и OUT(#n),A
Эти команды часто использовали и воспринимали как одно-байтовые то,есть для 8 битной адресации, в реале Z80 формирует полный 16-разрядный номер порта, и в некоторых компьютерах, это используется. Регистр A перед использованием не проверяли (а по науке то вот полезно его очистить если хотим обратится к 8b порту) Если надо было получить полную адресацию то делали так :
LD A,#7F IN A,(#FE). И таким образом проводили чтение из порта #7FFE
То есть команды IN A, (#nn) / OUT (#nn) ,A мало смысла использовать в качестве фильтра (или блокиратора порта), поскольку ее можно использовать по разному, как обращение к 8 битным портам, так и к 16 битным.
Другое дело если использовать команды косвенной адресации: это тот случай когда полный адрес порта ввода/вывода берется из регистра BC (регистр “B” в ассемблерной мнемонике не указывается, используется сокращение ©. )
Команды вывода в порт устройства:
Мнемоника Код операции S Z 5 H 3 P/V N C Такты OUT (N),A D3 NN - - - - - - - - 11 OUT ©,A ED 79 - - - - - - - - 12 OUT ©,B ED 41 - - - - - - - - 12 OUT ©,C ED 49 - - - - - - - - 12 OUT ©,D ED 51 - - - - - - - - 12 OUT ©,E ED 59 - - - - - - - - 12 OUT ©,H ED 61 - - - - - - - - 12 OUT ©,L ED 69 - - - - - - - - 12 OUTF *1 ED 71 - - - - - - - - 12
Команды ввода из порта устройства:
Мнемоника Код операции S Z 5 H 3 P/V N C Такты IN A,(N) DB NN - - - - - - - - 11 IN A,© ED 78 + + 5 0 3 P 0 - 12 IN B,© ED 40 + + 5 0 3 P 0 - 12 IN C,© ED 48 + + 5 0 3 P 0 - 12 IN D,© ED 50 + + 5 0 3 P 0 - 12 IN E,© ED 58 + + 5 0 3 P 0 - 12 IN H,© ED 60 + + 5 0 3 P 0 - 12 IN L,© ED 68 + + 5 0 3 P 0 - 12 INF *1 ED 70 + + 5 0 3 P 0 - 12
Некоторые команды этой группы сложно использовать для адресации портов, так как например команда IN B,© изменяет сам адрес порта который хранится в BC.
Если убрать все редко используемые и ненужные команды, то в итоге останется только 10 портовых команд из всего ряда . На основе этих команд можно сделать несложное устройство которое позволит Отлавливать команды полной адресации, что позволит портовому устройству различать когда в коде используется полная адресация а когда короткая.
Схемное решение для отслеживания всех портовых команд с префиксом “ED”:
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Воскресенье, 29.03.2015, 12:21 |
|
| |
Black_Cat | Дата: Воскресенье, 29.03.2015, 22:45 | Сообщение # 3 |
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
| Цитата Hazar ( ) То есть команды IN A, (#nn) / OUT (#nn) ,A мало смысла использовать в качестве фильтра (или блокиратора порта), поскольку ее можно использовать по разному, как обращение к 8 битным портам, так и к 16 битным. Ну, для портов с короткой адресацией пусть юзают и дальше out (#nn), A , тут проблем нет, проблемы существовали в основном с портами с основанием #xxFD. Эти порты юзают неполную дешифрацию 16 разрядного адреса, и в out (#nn), A это как раз учитывали. Проблема была в другом - в разной дешифрации #7FFD в ZX Spectrum 128, и +3, что привело к их неполной программной совместимости, т.к. программеры успели накодить используя out (#nn), A , учитывая в аккумуляторе только старший разряд адреса A15, в то время как в более поздних амстрадовских клонах уже нужно было учитывать как минимум ещё и A14. Потом на эти грабли наступили и наши демомейкеры писавшие под Pentagon-128, и юзавшие out (#nn), A исключительно ради экономии тактов, а также свой вклад в ещё большее ухудшение ситуации внесло безграмотное расширение памяти Пентагона свыше 128к. При том патовой ситуацию сделали именно криворукие демописатели под Пентагон. В результате сложилась ситуация, когда софт, написанный западниками под ZX Spectrum 128, и учитывавший только A15, можно было прекрасно детектить аппаратной ловушкой кода, в то время как софт под Pentagon-512 не использовавший дешифрацию старшего байта ничем отдетектить стало невозможно. Поэтому, для разруливания этой ситуации существует только один способ - задавать в сетапе будущих клонов конфигурацию компьютера под определённый софт.
"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "Forever!". "Я никогда не причиняю им зла. Я говорю им правду, и они думают, что это - зло." Гарри Трумэн
|
|
| |
Hazar | Дата: Четверг, 09.04.2015, 17:56 | Сообщение # 4 |
80h
Группа: Пользователи
Сообщений: 231
Статус: Offline
| Цитата В данном методе постоянно сравниваются старший байт адреса и байт данных, и по их равенству определяется исполнение команды OUT(#FD),A. Такое сравнение произ- водится только для A15=0 чтобы отделить обращения к портам #BFFD, #FFFD, #DFFD, и для A13=0, т.к. команда OUT(#FD),A как правило не применяется для бло- кировки порта #7FFD. Этот метод имеет недостаток - ложное срабатывание при запи- си #1F в порт #1FFD, или #0F в порт #0FFD. Устраняется этот недостаток либо отказом в использовании этих портов, либо запретом использования таких комбина- ций данных для этих портов, что для отечественных клонов, использующих порт #1FFD вполне осуществимо.
Метод сравнения байтов шины данных и адреса на мой взгляд самый интересный и многообещающий из всех предложенных аппаратных вариантов. При реализации этой идеи на CPLD или FPGA можно обойтись простой логикой без Применения цифровых компараторов, так как содержимое байта"FD" команды OUT(#FD),A никогда не меняется (в связи с чем) схему можно оптимизировать до более простого варианта.
Spectrum жив в нашей душе навсегда
Сообщение отредактировал Hazar - Четверг, 09.04.2015, 17:57 |
|
| |
|