Специалист/Техническая информация
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Источник: http://www.emu80.org/dev/dev_s.html |
Карта памяти
0000-8FFF - ОЗУ 9000-BFFF - Видео-ОЗУ C000-C7FF - ПЗУ (Загрузчик Волкова/Зверкова) C800-CFFF - ПЗУ (Монитор Орлова) D000-EFFF - может стоять ПЗУ пользователя F000-F7FF - ППА пользователя (есть не на всех платах) F800-FFFF - ППА клавиатуры
Структура видео-ОЗУ
Экранная область имеет разрешение 384x256 в черно-белом режиме. Байт по адресу 9000H представляет 8 первых точек в первой строке экрана. Байт по адресу 9001H — 8 первых точек во второй строке, а байт по адресу 9100h — точки с 8 по 16 в первой строке и т. д. Старшие биты располагаются слева. Бит, установленный в 1 — светлая точка. По формату экрана есть совместимость с ОРИОНОМ-128. Наличие внешней платы адаптера цвета позволяет выводить экранные байты в заранее заданном (в порту PC ППА клавиатуры) цвете. Окрашивается только цвет единичных точек (т.е тех пикселей, что соответствуют 1 в экранном байте).
Программирование ППА ВВ55
Матрица клавиатуры имеет формат 6x12, всего 72 клавиши. И ещё отдельная клавиша <НР>. Клавиши <CTRL> применяемой в программах от РК86 и CP/M нет. В некоторых программах её заменяют клавишей <НР>.
Развёрнуто на 90' (слева верхний ряд): СТР -= :* .> ЗБ ВК [ ] 0 ХH Э\ /? ПС [x] 9) ЗZ ЖV ,< -> EDIT8( Щ] ДD Ю@ ПВ F8 7, Ш[ ЛL БB <- F7 6& ГG ОO ЬX Sp F6 5% НN РR ТT АР2 F5 4$ ЕE ПP ИI ТАБ F4 3# КK АA МM DOWN F3 2" УU ВW СS UP F2 1! ЦC ЫY Ч^ HOME F1 ;+ ЙJ ФF ЯQ Р/Л
- Порт A
- левые 8 горизонтальных линий из 12 матрицы клавиатуры (ввод/вывод)
- Порт B
- биты D2..D7: 6 вертикальных линий матрицы клавиатуры (ввод/вывод)
- бит D1: клавиша <НР> (0 если нажата)
- бит D0: ввод с магнитофона
- Порт C
- биты D0..D3: правые 4 горизонтальные линии из 12 матрицы клавиатуры
- бит D4: триггер НП (начальный пуск). По сбросу =0 и всё адресное пространство ПЗУ
- бит 5: выход звука
- бит 6: без цвета не используется (бит регистра цвета при цветном адаптере)
- бит 7: выход на магнитофон (бит регистра цвета при цветном адаптере)
Теоретически для опроса клавиатуры может использоваться один из трех методов:
- Порты A, младшая половина C и B программируются на ввод. Нажатая клавиша определяется по положению нулей в обоих портах. Нажатая клавиша располагается на пересечении положения нулей.
- Порт A и младшая половина C программируются на вывод, порт B — на ввод. Осуществляется сканирование методом бегущего «0» путем записи в порты A и C и анализа порта B.
- Порт A и младшая половина C программируются на ввод, порт B — на вsвод. Осуществляется сканирование методом бегущего «0» путем записи в порт B и анализа портов A и C.
Обычно в программах используется только первый вариант. Два других варианта со сканированием бегущим нулём из-за отсутствия диодов (что есть в матрице РК86) чреваты выходом из строя ППА ВВ55, т.к создают КЗ выходов ППА, к тому же на порядок более медленные и даже, если ППА не выйдет из строя могут давать непредсказуемый результат.
Есть два варианта ПЗУ Загрузчика, оригинал от А.Волкова и вариант Зверкова. Всегда используется второй вариант, т.к с ним работает монитор Орлова. Отличия в кодах клавиш <F1>...<F7>, они вместо кодов 82H...89H выдают коды 00...07. Коды клавиш <F8>...<F11> совпадают. Монитор А.Волкова исходно опубликованный в стартовой публикации (работающий в ОЗУ 8D00) с 1988 года не используется. Вместо него стандартом является монитор Орлова располагающийся в ПЗУ C800. Т.к именно загрузчик Зверкова и Монитор Орлова используют практически 100% программ. Некоторые игры работают при наличии только загрузчика. Но системные программы все используют входные точки ПЗУ C800, т.к подпрограммы загрузчика имеют недостатки.
Стандартные подпрограммы Загрузчика Волкова/Зверкова
C010 - CLS, очистка экрана Вх: (8FFA)=FFFF - светлый фон (8FFA)=0000 - темный фон Изм: портит всё C037 - COUT, вывод символа на экран Вх: C - код символа (8FFC), (8FFD) - положение курсора (8FE7), (8FE8) - (адрес знакогенератора)/8 Не делает ролик экрана, нет обслуживания искейп-кодов. И даже знакоместо перед выводом не очищает, делая XOR изображения символа и исходного содержимого знакоместа. Изм: регистров не портит C170 - SOUND, генерирование звука Вх: (8FF1) - частота сигнала (8FF2) - длительность сигнала Изм: регистров не портит C196 - DELAY, пауза при вводе с клавиатуры Изм: регистров не портит C1A0 - HISND, звук высокого тона Изм: не сохраняет А C1AB - LOSND, звук низкого тона Изм: не сохраняет А C254 - PPA82, программирование порта клавиатуры (PА,PС - вывод, PВ - ввод). Изм: не сохраняет А C25A - PPA91, программирование порта клавиатуры (PА,PСL - ввод, PВ,PCH - вывод). Изм: не сохраняет А C337 - RDKEY, ввод символа с клавиатуры (ждёт нажатия клавиши) Вых: A - код символа Изм: BC,DE,HL не портит C377 - LDBYTE, ввод байта с магнитофона Вх: A=08 - без поиска синхробайта A=FF - с поиском синхробайта Вых: A - введенный байт Изм: BC,DE,HL не портит C3D0 - SVBYTE, запись байта на магнитофон Вх: A - выводимый байт Изм: регистров не портит В отличие от аналогичной п/п РК86 выводимый байт не в рег.C, а в рег.А C3F9 - LDBLK1, ввод блока произвольной длины с магнитофона с поиском синхробайта. (1-2 байт в блоке - адрес начала, 3-4 байт - адрес конца блока. Изм: сохраняет BC,DE. Заносит нач.адрес в ячейки ASTART (8FF3/8FF4) C414 - LDBLK2, чтение блока с МГ без поиска синхробайта Изм: сохраняет BC,DE. Ячейки ASTART не меняет. C422 - LDBLK3, всё как у п/п C414, но с поиском синхробайта Вх: HL - адрес начала блока DE - адрес конца блока Изм: сохраняет BC,DE. Ячейки ASTART не меняет. C427 - CMPDH, сравнение HL и DE Вх: HL, DE Вых: Z=1, если HL=DE; CY=1, если DE>HL (т.е устанавливает признаки по операции HL-DE) Изм: не сохраняет А C42D - TRANS, пересылка блока памяти (HL)...(DE) --> (BC) Вх: HL - адрес начала блока DE - адрес конца блока плюс 1 BC - новый адрес блока Изм: портит A,BC,HL Особенность: байт на который указывает DE не копируется. При пересылке вверх, недопустимо перекрытие адресов. C438 - ZMSSG, вывод сообщения на экран. Стоп-байт 00. Вх: HL - адрес начала сообщения Изм: портит A,C,HL. При выходе HL указывает на стоп-байт. В отличие от п/п C818 не делает ролика и не чистит знакоместа при выводе. C444 - RESET, обработка сброса. Т.е это исполнительная часть загрузчика. Вводит по сбросу блок с МГ-ленты и запускает его. КС блока не проверяется. Нажатием функц.клавиш ожидание синхробайта прерывается и ожидает нажатия клавиши с кодом константы ввода. По <ВК> выход в монитор, по <ПС> запуск ранее введённой программы по JMP (ASTART).
Стандартные подпрограммы Монитора Орлова
Они в основном совпадают с аналогичными подпрограммами РК86.
C803 - MCONIN, ввод символа с клавиатуры. Просто JMP на C337 C806 - LDBYTE, чтение байта с МГ. Просто JMP на C377 C809 - COUT, вывод символа. Если не упр.символ, то очищается знакоместо и JMP C037 C80C - SVBYTE, вывод байта на МГ-ленту. Просто JMP на C3D0 (в отличие от РК86 байт в A) C80F - GETLIN, ввод строки символов в буфер (HL)...(DE) C812 - STATUS, проверка нажатия клавиш клавиатуры C815 - HEX_A, вывод байта на экран в шестнадцатеричном виде C818 - MMSSG, вывод сообщения на экран (с очисткой знакомест) C81B - GETKEY, ввод символа с клавиатуры "на лету" C81E - ASKCUR, запрос положения курсора C821 - RET C824 - LD_MAS, чтение массива с МГ. Если A!=0, устанавливает константу. JMP C3F9 C827 - SV_MAS, вывод блока (HL)...(DE) на магнитофон C82A - CHKSUM, подсчет контрольной суммы блока (HL)...(DE) C82D - RET C830 - установка верхней границы свободной памяти C833 - запрос верхней границы свободной памяти
Служебные ячейки Загрузчика Волкова/Зверкова
8FE3,8FE4 - ASTART, адрес последнего введённого с МГ блока 8FDF,8FE0 - AEKEYS, адрес подпрограммы обработки кодов клавиш 8FE7,8FE8 - AFONT, адрес фонта делённый на 8 8FE9 - LAST_S, код символа выведенного на экран 8FED,8FEE - адрес подпрограммы задержки при вводе символа с клавиатуры 8FEF - LAST_K, код нажатой клавиши (в верхнем регистре) 8FF0 - служебная для автоповтора 8FF1,8FF2 - PARSND, константа звука и число периодов для п/п SOUND 8FF3 - INV_MG, признак инвертирования сигнала с магнитофона 8FF8,8FF9 - адрес нижней ячейки в знакоместе символа 8FFA,8FFB - INVERSE, задают фон экрана (00,00 или FF,FF) 8FFC - V_CUR, вертикальная координата курсора (0...FF) 8FFD - H_CUR, горизонтальная координата курсора сдвинутая на 2р. влево (0...BF) 8FFE - KNS_SV, константа записи на МГ 8FFF - KNS_LD, константа чтения с МГ