Специалист/Техническая информация

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Источник: 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 - пауза при вводе с клавиатуры
 Изм: регистров не портит

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=08H - без поиска синхробайта
      A=FFH - с поиском синхробайта
 Вых: 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 - CONIN, ввод символа с клавиатуры. Просто 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 - MSSG, вывод сообщения на экран (с очисткой знакомест)
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, константа чтения с МГ