Специалист/Техническая информация: различия между версиями
Panther (обсуждение | вклад) (http://www.emu80.org/dev/dev_s.html) |
Barsik (обсуждение | вклад) м (мелкие уточнения) |
||
Строка 1: | Строка 1: | ||
{{ДИ|Источник=http://www.emu80.org/dev/dev_s.html}} | {{ДИ|Источник=http://www.emu80.org/dev/dev_s.html}} | ||
== | == Карта памяти == | ||
<PRE> | <PRE> | ||
0000-8FFF - ОЗУ | 0000-8FFF - ОЗУ | ||
9000-BFFF - Видео-ОЗУ | 9000-BFFF - Видео-ОЗУ | ||
C000-C7FF - ПЗУ | C000-C7FF - ПЗУ (Загрузчик Волкова/Зверкова) | ||
C800- | C800-CFFF - ПЗУ (Монитор Орлова) | ||
F000-F7FF - | D000-EFFF - может стоять ПЗУ пользователя | ||
F800-FFFF - | F000-F7FF - ППА пользователя (есть не на всех платах) | ||
F800-FFFF - ППА клавиатуры | |||
</PRE> | </PRE> | ||
== Структура видео-ОЗУ == | == Структура видео-ОЗУ == | ||
Экранная область имеет разрешение 384x256 в черно-белом режиме. | Экранная область имеет разрешение 384x256 в черно-белом режиме. Байт по адресу 9000H представляет 8 первых точек в первой строке экрана. Байт по адресу 9001H — 8 первых точек во второй строке, а байт | ||
Байт по адресу 9000H представляет 8 первых точек в первой строке | по адресу 9100h — точки с 8 по 16 в первой строке и т. д. Старшие биты располагаются слева. Бит, установленный в 1 — светлая точка. По формату экрана есть совместимость с ОРИОНОМ-128. Наличие внешней платы адаптера цвета позволяет выводить экранные байты в заранее заданном (в порту PC ППА клавиатуры) цвете. Окрашивается только цвет единичных точек (т.е тех пикселей, что соответствуют 1 в экранном байте). | ||
экрана. Байт по адресу 9001H — 8 первых точек во второй строке, а байт | |||
по адресу 9100h — точки с 8 по 16 в первой строке и т. д. Старшие биты | |||
располагаются слева. Бит, установленный в 1 — светлая точка. | |||
== Программирование ВВ55 == | == Программирование ППА ВВ55 == | ||
Матрица клавиатуры имеет | Матрица клавиатуры имеет формат 6x12, всего 72 клавиши. И ещё отдельная клавиша <НР>. Клавиши <CTRL> применяемой в программах от РК86 и CP/M нет. В некоторых программах её заменяют клавишей <НР>. | ||
<PRE> | <PRE> | ||
Развёрнуто на 90' (слева верхний ряд): | |||
СТР -= :* .> ЗБ ВК | СТР -= :* .> ЗБ ВК | ||
[ ] 0 ХH Э\ /? ПС | [ ] 0 ХH Э\ /? ПС | ||
Строка 35: | Строка 34: | ||
</PRE> | </PRE> | ||
;Порт A: | ;Порт A: | ||
* | * левые 8 горизонтальных линий из 12 матрицы клавиатуры (ввод/вывод) | ||
;Порт B: | ;Порт B: | ||
* биты | * биты D2..D7: 6 вертикальных линий матрицы клавиатуры (ввод/вывод) | ||
* бит | * бит D1: клавиша <НР> (0 если нажата) | ||
* бит | * бит D0: ввод с магнитофона | ||
;Порт C: | ;Порт C: | ||
* биты | * биты D0..D3: правые 4 горизонтальные линии из 12 матрицы клавиатуры | ||
* бит | * бит D4: триггер НП (начальный пуск). По сбросу =0 и всё адресное пространство ПЗУ | ||
* бит 5: выход звука | * бит 5: выход звука | ||
* бит 6: не используется | * бит 6: без цвета не используется (бит регистра цвета при цветном адаптере) | ||
* бит 7: выход на магнитофон | * бит 7: выход на магнитофон (бит регистра цвета при цветном адаптере) | ||
Теоретически для опроса клавиатуры может использоваться один из трех методов: | |||
* Порты A, младшая половина C и B программируются на ввод. Нажатая клавиша определяется по положению нулей в обоих портах. Нажатая клавиша располагается на пересечении положения нулей. | * Порты A, младшая половина C и B программируются на ввод. Нажатая клавиша определяется по положению нулей в обоих портах. Нажатая клавиша располагается на пересечении положения нулей. | ||
Строка 55: | Строка 54: | ||
* Порт A и младшая половина C программируются на ввод, порт B — на вsвод. Осуществляется сканирование методом бегущего «0» путем записи в порт B и анализа портов A и C. | * Порт A и младшая половина C программируются на ввод, порт B — на вsвод. Осуществляется сканирование методом бегущего «0» путем записи в порт B и анализа портов A и C. | ||
== Стандартные | Реально в программах используется только первый вариант. Два других варианта со сканированием из-за отсутсвия диодов (как в матрице РК86) чреваты выходом из строя ППА ВВ55, т.к создают КЗ выходов ППА, к тому же на порядок более медленные и даже, если ППА не выйдет из строя могут давать при опросе таким методом непредсказуемый результат. | ||
Есть два варианта ПЗУ Загрузчика, оригинал от А.Волкова и вариант Зверкова. Всегда используется второй вариант, т.к с ним работает монитор Орлова. Отличия в кодах клавиш <F1>...<F7>, они вместо кодов 82H...89H выдают коды 00...07. Коды клавиш <F8>...<F11> совпадают. Монитор А.Волкова исходно опубликованный в стартовой публикации (работающий в ОЗУ 8D00) с 1988 года не используется. Вместо него стандартом является монитор Орлова располагающийся в ПЗУ C800. Т.к именно загрузчик Зверкова и Монитор Орлова используют практически 100% программ. Некоторые игры работают при наличии только загрузчика. Но системные программы все используют входные точки ПЗУ C800, т.к подпрограммы загрузчика имеют недостатки. | |||
== Стандартные подпрограммы Загрузчика Волкова/Зверкова == | |||
<PRE> | <PRE> | ||
C010 - CLS, очистка экрана | |||
Вх: (8FFA)=FFFF - светлый фон | Вх: (8FFA)=FFFF - светлый фон | ||
(8FFA)=0000 - темный фон | (8FFA)=0000 - темный фон | ||
Изм: | Изм: портит все | ||
C037 - COUT, вывод символа на экран | |||
Вх: C - код символа | Вх: C - код символа | ||
( | (8FFC), (8FFD) - положение курсора | ||
( | (8FE7), (8FE8) - (адрес знакогенератора)/8 | ||
Изм: | Не делает ролик экрана, нет обслуживания искейп-кодов. И даже знакоместо перед выводом не очищает, делая XOR изображения символа и исходного содержимого знакоместа. | ||
Изм: все регистры сохраняет | |||
C170 - SOUND, генерирование звука | |||
Вх: ( | Вх: (8FF1) - частота сигнала | ||
( | (8FF2) - длительность сигнала | ||
Изм: | Изм: все регистры сохраняет | ||
C196 - пауза при вводе с клавиатуры | |||
Изм: регистров не портит | |||
C1A0 - HISND, звук высокого тона | |||
Изм: не сохраняет А | |||
Изм: | |||
C1AB - LOSND, звук низкого тона | |||
Изм: не сохраняет А | |||
C254 - PPA82, программирование порта клавиатуры | |||
(А,С - вывод, В - ввод, режим 0). | (А,С - вывод, В - ввод, режим 0). | ||
Изм: | Изм: не сохраняет А | ||
C25A - PPA91, программирование порта клавиатуры | |||
(А,С0..С3 - ввод, В,С4..С7 - вывод, режим 0). | (А,С0..С3 - ввод, В,С4..С7 - вывод, режим 0). | ||
Изм: не сохраняет А | |||
C337 - RDKEY, ввод символа с клавиатуры (ждёт нажатия клавиши) | |||
Вых: A - | Вых: A - код символа | ||
Изм: | Изм: BC,DE,HL не портит | ||
C377 - LDBYTE, ввод байта с магнитофона | |||
Вх: A=08H - без поиска синхробайта | Вх: A=08H - без поиска синхробайта | ||
A=FFH - с поиском синхробайта | A=FFH - с поиском синхробайта | ||
Вых: A - введенный байт | Вых: A - введенный байт | ||
Изм: | Изм: BC,DE,HL не портит | ||
C3D0 - SVBYTE, запись байта на магнитофон | |||
Вх: A - выводимый байт | Вх: A - выводимый байт | ||
Изм: | Изм: регистров не портит | ||
В отличие от аналогичной п/п РК86 выводимый байт не в рег.C, а в рег.А | |||
C3F9 - LDBLK1, ввод блока произвольной длины с магнитофона с поиском синхробайта. | |||
(1-2 байт в блоке - адрес начала, 3-4 байт - адрес конца блока. | (1-2 байт в блоке - адрес начала, 3-4 байт - адрес конца блока. | ||
Изм: | Изм: сохраняет BC,DE. Заносит нач.адрес в ячейки ASTART (8FF3/8FF4) | ||
C414 - LDBLK2, чтение блока с МГ без поиска синхробайта | |||
Изм: сохраняет BC,DE. Ячейки ASTART не меняет. | |||
C422 - LDBLK3, всё как у п/п C414, но с поиском синхробайта | |||
Вх: HL - адрес начала блока | Вх: HL - адрес начала блока | ||
DE - адрес конца блока | DE - адрес конца блока | ||
Изм: | Изм: сохраняет BC,DE. Ячейки ASTART не меняет. | ||
C427 - CMPDH, сравнение регистров HL и DE | |||
Вх: HL, DE | Вх: HL, DE | ||
Вых: Z=1, если | Вых: Z=1, если HL=DE; CY=1, если DE>HL (т.е устанавливает признаки по операции HL-DE) | ||
Изм: A | Изм: A | ||
C42D - TRANS, пересылка блока памяти (HL)...(DE) --> (BC) | |||
Вх: HL - адрес начала блока | Вх: HL - адрес начала блока | ||
DE - адрес конца блока | DE - адрес конца блока плюс 1 | ||
BC - новый адрес блока | BC - новый адрес блока | ||
Изм: A,BC,HL | Изм: A,BC,HL | ||
Особенность: байт на который указывает DE не копируется. При пересылке вверх, недопустимо перекрытие адресов. | |||
C438 - ZMSSG, вывод сообщения на экран. Стоп-байт 00. | |||
Вх: HL - адрес начала сообщения | Вх: HL - адрес начала сообщения | ||
Изм: A, | Изм: портит A,C,HL. При выходе HL указывает на стоп-байт. | ||
В отличие от п/п C818 не делает ролика и не чистит знакоместа при выводе. | |||
C444 - RESET, обработка сброса, т.е исполнительная часть загрузчика | |||
Вводит по сбросу блок с МГ-ленты и запускает его. КС блока не проверяется. Нажатием функц.клавиш ожидание синхробайта прерывается и ожидает нажатия клавиши с кодом константы ввода. По <ВК> выход в монитор, по <ПС> запуск ранее введённой программы по JMP (ASTART). | |||
</PRE> | </PRE> | ||
== Стандартные | == Стандартные подпрограммы Монитора Орлова == | ||
<PRE> | <PRE> | ||
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) | |||
C830 - установка верхней границы свободной памяти | |||
C833 - запрос верхней границы свободной памяти | |||
/PRE> | |||
== Служебные ячейки Загрузчика == | == Служебные ячейки Загрузчика Волкова/Зверкова == | ||
<PRE> | <PRE> | ||
8FE3,8FE4 - ASTART, адрес последнего введённого с МГ блока | |||
8FDF,8FE0 - AEKEYS, адрес подпрограммы обработки кодов клавиш | |||
8FE7,8FE8 - AFONT, адрес фонта делённый на 8 | |||
8FE9 - LAST_S, код символа выведенного на экран | |||
8FED,8FEE - адрес подпрограммы задержки при вводе символа с клавиатуры | 8FED,8FEE - адрес подпрограммы задержки при вводе символа с клавиатуры | ||
8FEF - LAST_K, код нажатой клавиши (в верхнем регистре) | |||
8FF0 - служебная для автоповтора | |||
8FF1,8FF2 - PARSND, константа звука и число периодов для п/п SOUND | |||
8FF3 - INV_MG, признак инвертирования сигнала с магнитофона | |||
8FF1, 8FF2 - | 8FF8,8FF9 - адрес нижней ячейки в знакоместе символа | ||
8FF3 - признак инвертирования сигнала с магнитофона | 8FFA,8FFB - INVERSE, задают фон экрана (00,00 или FF,FF) | ||
8FF8, 8FF9 - адрес нижней | 8FFC - V_CUR, вертикальная координата курсора (0...FF) | ||
8FFD - H_CUR, горизонтальная координата курсора сдвинутая на 2р. влево (0...BF) | |||
8FFE - KNS_SV, константа записи на МГ | |||
8FFF - KNS_LD, константа чтения с МГ | |||
</PRE> | </PRE> | ||
[[Категория:Специалист]] | [[Категория:Специалист]] |
Версия от 01:23, 11 декабря 2019
Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Источник: 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, программирование порта клавиатуры (А,С - вывод, В - ввод, режим 0). Изм: не сохраняет А C25A - PPA91, программирование порта клавиатуры (А,С0..С3 - ввод, В,С4..С7 - вывод, режим 0). Изм: не сохраняет А 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) Изм: A 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).
Стандартные подпрограммы Монитора Орлова
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) C830 - установка верхней границы свободной памяти C833 - запрос верхней границы свободной памяти /PRE> == Служебные ячейки Загрузчика Волкова/Зверкова == <PRE> 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, константа чтения с МГ