Soviet Union ZX Spectrum CommunityВоскресенье, 24.11.2024, 21:00
Вы вошли как Гость | Группа "Гости" | RSS
 [ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
OUT(#FD),A и как с ним бороться
Black_CatДата: Воскресенье, 07.07.2013, 12:43 | Сообщение # 1
Координатор
Группа: Координаторы
Сообщений: 730
Статус: Offline
OUT(#FD),A и как с ним бороться BC Info Guide #8 /стандартизация/

Предлагаю Вашему вниманию статью посвящённую использованию на Спектруме обращения к портам с основанием #xxFD в короткой адресации командой OUT(#FD),A , проблемам возникающим в этой связи, и их решению.
Прикрепления: BC_IG_8_OUT-FD-.txt (6.2 Kb)


"Трудно найти чёрную кошку в тёмной комнате.. ...особенно, если её там нет", "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”:
Прикрепления: 1316207.png (61.0 Kb)


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 никогда не меняется (в связи с чем) схему можно оптимизировать
до более простого варианта.
Прикрепления: 3196854.gif (40.1 Kb)


Spectrum жив в нашей душе навсегда

Сообщение отредактировал Hazar - Четверг, 09.04.2015, 17:57
 
  • Страница 1 из 1
  • 1
Поиск:

Copyright MyCorp © 2006Сайт управляется системой uCoz