Как известно, микропроцессор i8086/ВМ86 "эффективным адресом" способен адресовать лишь до 64 Кб памяти, так как в качестве указателей могут использоваться 16-битные регистры BX/BP/SP/SI/DI. Этим он мало чем отличается от i8080/z80/ВМ80.
Главное его отличие - наличие сегментных регистров, которые тоже 16-разрядные, но при адресации их биты сдвигаются влево на четыре разряда и складываются с регистром-указателем, так как инженеры Intel посчитали, что суммарно 1 Мб - хватит всем!
(
Хотя могли бы сразу выделить под сегмент гранулярность не 16 байтов, а все 256, что позволило бы с самого начала иметь перспективу масштабирования системы до 16 Мб!)
Но, это всё - лирика!
Сегменты у ВМ80
Конечно, не совсем сегменты в понимании ВМ86, но их подобие.
Идея очень простая. Вместо того, чтобы разбивать адресацию в 64 Кб на отдельные мелкие параграфы/окна по 4 Кб или 8 Кб, переключая в них страницы расширенной памяти, а в случае с Орионом-128 - не обойтись без вызова подпрограмм Монитора, так как страницы переключаются всеми 64 Кб, мною давно рассматривался вопрос имитации сегментных префиксов в ВМ80 как у ВМ86 на период исполнения только одной инструкции.
Вглядываясь в систему команд ВМ80, можно легко обнаружить семь документированных
странных инструкций, который официально могли быть и недокументированными.
- MOV B,B - код 40h
- MOV C,C - код 49h
- MOV D,D - код 52h
- MOV E,E - код 5Bh
- MOV H,H - код 64h
- MOV L,L - код 6Dh
- MOV A,A - код 7Fh
Так как нормальные программы в нормальных условиях не могут и не будут изобиловать этими инструкциями, так как они работают как NOP'ы на 5 тактов, что нужно лишь в участках кода с жёсткой привязке к машинному времени, то их можно использовать за префиксы подмены
сегмента памяти. Аналогично, как в ВМ86 префиксы «CS:»/«DS:»/«ES:»/«SS:» и «FS:»/«GS:» в более новых моделях процессоров x86.
Вот, примерно такая аналогия:
- «MOV A,A»+«LDAX B» => «LDAX AS:B»
- «MOV B,B»+«LDAX B» => «LDAX BS:B»
- «MOV C,C»+«LDAX B» => «LDAX CS:B»
- «MOV D,D»+«LDAX B» => «LDAX DS:B»
- «MOV E,E»+«LDAX B» => «LDAX ES:B»
- «MOV H,H»+«LDAX B» => «LDAX HS:B»
- «MOV L,L»+«LDAX B» => «LDAX LS:B»
В этом ключе обобщённая запись всех доступных под префиксами расширяемых инструкций выглядит так:
- «MOV x,x»+«LDAX YZ» => «LDAX xS:YZ»
- «MOV x,x»+«STAX YZ» => «STAX xS:YZ»
- «MOV x,x»+«MOV M,R» => «MOV xS:M,R»
- «MOV x,x»+«MOV R,M» => «MOV R,xS:M»
- «MOV x,x»+«ADD M» => «ADD xS:M»
- «MOV x,x»+«ADC M» => «ADC xS:M»
- «MOV x,x»+«SUB M» => «SUB xS:M»
- «MOV x,x»+«SBB M» => «SBB xS:M»
- «MOV x,x»+«ANA M» => «ANA xS:M»
- «MOV x,x»+«XRA M» => «XRA xS:M»
- «MOV x,x»+«ORA M» => «ORA xS:M»
- «MOV x,x»+«CMP M» => «CMP xS:M»
- «MOV x,x»+«R-CON» => «R-CON xS:»
- «MOV x,x»+«RET» => «RET xS:»
- «MOV x,x»+«PUSH YZ» => «PUSH xS:YZ»
- «MOV x,x»+«POP YZ» => «POP xS:YZ»
- «MOV x,x»+«XTHL» => «XTHL xS:SP»
Если хотите получить более-менее понятное представление.
- Префикс «MOV A,A» - код 7Fh, биты адреса A18_A17_A16 - «0_0_1»
- Префикс «MOV H,H» - код 64h, биты адреса A18_A17_A16 - «0_1_0»
- Префикс «MOV L,L» - код 6Ch, биты адреса A18_A17_A16 - «0_1_1»
- Префикс «MOV D,D» - код 52h, биты адреса A18_A17_A16 - «1_0_0»
- Префикс «MOV E,E» - код 5Bh, биты адреса A18_A17_A16 - «1_0_1»
- Префикс «MOV B,B» - код 40h, биты адреса A18_A17_A16 - «1_1_0»
- Префикс «MOV C,C» - код 49h, биты адреса A18_A17_A16 - «1_1_1»
Схематически просто следует выявить в Цикле M1 на Шине Данных коды 40h/49h/52h/5Bh/64h/6Dh/7Fh и сохранить биты D0-D2 в промежуточном регистре.
Сам процессор прочтёт этот код и выполнит холостую MOV-пересылку, затратив 5 тактов. Но схема на следующем цикле уже сможет подставить другую страницу памяти, преобразуя биты D0-D2 предыдущей MOV-инструкции в дополнительные разряды Шины Адреса - A16-A18.
Так как необходимо перехватывать коды команд с симметричными битами (200₈/211₈/222₈/233₈/244₈/255₈/277₈), можно использовать схему сравнения на К155ЛП5, хотя проще обойтись К155СП1 или связкой К155ИД7+К155КП5.
На схеме:
- ИР27 просто сохраняет слово состояние процессора о текущем Машинном Цикле
- ИР13 служит для сохранения младших битов D0-D2 инструкции и флага-признака, что СП1 обнаружил MOV-префикс, с перемещением их из младшей тетрады в старшую
- ИР13 выходом указывает на статус предыдущей команды, чтобы влияние обнаруженного MOV-префикса передавалось следующей команде, а не срабатывало на самом же префиксе
- промежуточные вентили НЕ на входе регистра необходимы для дополнения кода с коррекцией до невозможного префикса «MOV M,M», что активен всегда по умолчанию, так как по сигналу Сброса регистр также обнуляется и все префиксы аннулируются
- ЛИ1 необходима для подавления любого паразитного кода, если код предыдущей команды не был префиксом
- ЛА3 управляет вентилями ЛИ1 и подавляет прохождение любого кода во время выборки команды, захвата шины ПДП и при отсутствии префикса
- ИД7 дополнительный - лишь для примера для дешифрации именованных сигналов, соответствующих каждый своему префиксу
- Удаление перемычки «512 Kb» запрещает работу расширения адресации префиксами
P.S.: Схема не является принципиальной, так как не учитывается нагрузочная способность шим процессора с необходимостью буферного усиления, а всего лишь отображает базовый логический принцип к реализации поставленной задачи как вариант.
P.P.S.: Схема не является пособием к расширению ОЗУ до 512 Кб, а всего лишь иллюстрирует принцип вырабатывания дополнительных битов адреса A16, A17 и A18 для адресации пространства до 512 Кб, что может служить для расширения ОЗУ в частности, а также и для подключения внешних устройств с полной непосредственной адресацией (ROM-Диск, PC-Карточка CGA, PC-Карточка EGA и т.п.).
You do not have the required permissions to view the files attached to this post.