Есть такое.
Вид для печати
Есть такое.
А как-же это: Радио-86РК на 8088 (или 8086) ?
Итак, основная работа над изменением Монитора практически завершена.
Подпрограммы вывода на экран
- CALL F809 выводит символ на экран из регистра C
- CALL F80F выводит символ на экран из регистра A (как в «Орионе»)
- CALL F815 выводит байт на экран, сохраняя все регистры
- CALL F818 выводит текст на экран с утерей регистра A (завершение строки по 00 или >128)
Код подпрограммы вывода символа на экран полностью переписан, поддерживает пользовательский буфер и оконность.
Рабочие ячейки:Тем самым, подпрограмма Монитора уже поддерживает оконность (от 1x1 до 80x64) и может полноценно работать с буфером в любом месте ОЗУ. Исключения составляют только коды:Код:CONADR: EQU 07600H ; Адрес символа под курсором в памяти;
CONPOS: EQU 07602H ; Координаты позиции X,Y курсора на экране;
CON@PX: EQU 07602H ; Консольная позиция курсора по X;
CON@PY: EQU 07603H ; Консольная позиция курсора по Y;
CONSTA: EQU 07604H ; Консольный статус в Escape-последовательности;
CONLEN: EQU 0760FH ; Ширина одного знакоряда в настройках ИМС ВГ75 (стандарт: 78);
CONORG: EQU 07610H ; Консольный организатор окна с позицией X1,Y1 относительно начала буфера;
CON@XO: EQU 07610H ; Консольная абсолютная позиция окна по горизонтали (стандарт: 8);
CON@YO: EQU 07611H ; Консольная абсолютная позиция окна по вертикали (стандарт: 3);
CONBOX: EQU 07612H ; Относительный размер бокса ограничителя окна на экране (стандарт: 63x24);
CON@XS: EQU 07612H ; Относительный размер окна по горизонтали с указанием крайнего правого столбца (стандарт: 63);
CON@YS: EQU 07613H ; Относительный размер окна по вертикали с указанием крайней нижней строки (стандарт: 24)
- 19 - Перемещает позицию курсора лишь до верхней основной строки окна, затем - прокручивает область вниз;
- 1B - Помимо установки курсора в нужную позицию по Escape-команде «Y», все остальные комбинации перенаправляет в драйвер пользователя, вызываемый через ловушку;
- 1F/0C - Перезапускают ВТ57/ВГ75 в стандартный режим 78x30 в буфере 76D0…7FF3 с окном 64x25 в позиции 8,3;
- 1F - Очищает буфер 76D0…7FFF и перезапускает ВТ57/ВГ75 на стандартный режим
Подпрограмма управления режимом экрана
Для переключения режима ВТ57 и ВГ75 достаточно в HL загрузить адрес на таблицу с описанием режима и вызвать подпрограмму F83C.
Естественно, служебные ячейки с параметрами окна нужно корректировать непосредственно.
Ниже - сам образ ПЗУ Монитора и подгружаемый файл с режимом 80x64.
http://www.youtube.com/watch?v=UIiwSYm8gWY
После запуска программы с переходом по G0 режим экрана переключается и управление возвращается Монитору, что позволяет использовать все директивы в установленном режиме: Даже директивы «I» и «O»!
Выход из режима, как выше и говорилось, клавиша «Стр» или «Home»…
P.S.: Пришлось пожертвовать директивами «X» и «C»… :roll:
Для запуска игры «Volcano» следует сначала обнулить ячейки 03EA и 03EE…
Не совсем уместный вопрос...
Сколько страниц памяти доступно для рк с минимальными изменениями?
Минимальные изменения, предлагаемые здесь?
Конкретно данный вариант Монитора разрабатывается под одну страницу объёмом в 65536 байтов (пользователь имеет доступ ко всем 65536 ячейкам).Код:ПАМЯТЬ ПОД БСВВ / ДОС (PC>DFFF) ПАМЯТЬ ПОЛЬЗОВАТЕЛЯ (PC<E000)
FFFF +-------------------------+ FFFF +-------------------------+
| ПЗУ "МОНИТОР" / ПДП | | |
F800 +-------------------------+ | ОЗУ |
| ПЗУ #2 / РЕГИСТРЫ КНГМД | | ПОЛЬЗОВАТЕЛЯ |
F000 +-------------------------+ | (ТОЛЬКО ДАННЫЕ) |
| ПЗУ "ДОС" | | |
E000 +-------------------------+ E000 +-------------------------+
| ВГ75 | | |
C000 +-------------------------+ | ОЗУ |
| D14 ВВ55 | | ПОЛЬЗОВАТЕЛЯ |
A000 +-------------------------+ | (ПРОГРАММЫ И ДАННЫЕ) |
| D20 ВВ55 | | |
8000 +-------------------------+ 8000 +-------------------------+
| БУФЕР ЭКРАНА | | БУФЕР ЭКРАНА |
76D0 +-------------------------+ 76D0 +-------------------------+
| РАБОЧИЕ ЯЧЕЙКИ МОНИТОРА | | РАБОЧИЕ ЯЧЕЙКИ МОНИТОРА |
7600 +-------------------------+ 7600 +-------------------------+
| | | |
| ОЗУ | | ОЗУ |
| | | |
| ПОЛЬЗОВАТЕЛЯ | | ПОЛЬЗОВАТЕЛЯ |
| | | |
| (ПРОГРАММЫ И ДАННЫЕ) | | (ПРОГРАММЫ И ДАННЫЕ) |
| | | |
0000 +-------------------------+ 0000 +-------------------------+
То есть, код пользователя видит только одно сплошное ОЗУ и к УВВ прямого доступа не имеет. Только через вызовы подпрограмм Монитора F836/F839/F83C приложение может читать УВВ, писать в УВВ и менять режим ВТ57/ВГ75.
С другой стороны, сам код Монитора не видит верхние 32 Кб непосредственно, но директивы D/F/L/S/T через трюковые механизмы получают доступ ко всем 64 Кб.
(Директивы I и O пока ещё не переработал: Они не видят верхние 32 Кб ОЗУ. То есть «OF800,FFFF» выгрузит содержимое ПЗУ Монитора, а не ОЗУ…)
Область 8000-DFFF заявлена как "программы и данные", однако триггер устанавливается по значению только одного бита А15. Какой будет использован дешифратор, если программа будет выполняться в данной области?
Может необходимо добавить еще элемент И для А13-А15?
- - - Добавлено - - -
Может второй дешифратор и не нужен вовсе?
В рамках доработки rk86.ru я дополнил скрипт с проверкой на «cpu.pc < 0x8000»…
Однако, Виктор Пыхонин помог в плане сборки Emu80 с поддержкой переключений и в рамках «ночной сборки Emu80» конфигурация позволяет использовать память 0000…DFFF полностью под код также, как и "заявленно".
(В рамках rk86.ru я специально себя ограничил.)
А так, элемент К155ЛИ3 может помочь получить исполнение кода до самых DFFF.Второй ИД7 упоминается лишь формально, так как с заменой РУ6 на РУ5 выборка ОЗУ должна производиться минуя ИД7, так как на ТМ2 перекладывается эта функция
Как известно, микропроцессор 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, можно легко обнаружить семь документированных странных инструкций, который официально могли быть и недокументированными.Так как нормальные программы в нормальных условиях не могут и не будут изобиловать этими инструкциями, так как они работают как NOP'ы на 5 тактов, что нужно лишь в участках кода с жёсткой привязке к машинному времени, то их можно использовать за префиксы подмены сегмента памяти. Аналогично, как в ВМ86 префиксы «CS:»/«DS:»/«ES:»/«SS:» и «FS:»/«GS:» в более новых моделях процессоров x86.
- 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
Вот, примерно такая аналогия:
- «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.
На схеме:
- ИР27 просто сохраняет слово состояние процессора о текущем Машинном Цикле
- ИР1 левый служит для сохранения младших битов D0-D2 инструкции и флага-признака, что СП1 обнаружил MOV-префикс
- ИР1 правый хранит статус предыдущей команды, чтобы влияние обнаруженного MOV-префикса передавалось следующей команде, а не срабатывало на самом же префиксе
- промежуточные вентили НЕ между регистрами необходимы для дополнения кода с коррекцией до невозможного префикса «MOV M,M», что активен всегда по умолчанию
- ЛИ1 необходима для подавления любого паразитного кода, если код предыдущей команды не был префиксом
- ЛЕ4 управляет вентилями ЛИ1 и подавляет прохождение любого кода во время выборки команды, "начального пуска" и при отсутствии префикса
- ИД7 дополнительный - лишь для примера для дешифрации именованных сигналов, соответствующих каждый своему префиксу
P.S.: Схема не является принципиальной, так как не учитывается нагрузочная способность шим процессора с необходимостью буферного усиления, а всего лишь отображает базовый логический принцип к реализации поставленной задачи как вариант.
P.P.S.: Схема не является пособием к расширению ОЗУ до 512 Кб, а всего лишь иллюстрирует принцип вырабатывания дополнительных битов адреса A16, A17 и A18 для адресации пространства до 512 Кб, что может служить для расширения ОЗУ в частности, а также и для подключения внешних устройств с полной непосредственной адресацией (ROM-Диск, PC-Карточка CGA, PC-Карточка EGA и т.п.