; ============================================== ; " O r i o n - P R O " ; ============================================== ; "Монитор-128/PRO" ; ; Клавиатура "86РК", "МС7007" ; ; V2.00 27.05.97 ; V2.10 28.11.99 ; (доработан вектор 0F833H) ; ---------------------------------------------- ; Дизассемблировано и адаптировно для SjasmpPlus. ; Romych-ем в апреле 2021 ; ============================================== ; ============================================== ; 2000H Вход в режим "O-128" ; 2003H Подпрограмма инициализации режима "O-128" ; ============================================== DEVICE NOSLOT64K INCLUDE "ports.inc" ; Порты Ориона ADROM2 EQU 2000H ; Начальный адрес ROM2 ; ; --- ORDOS --- ORROM EQU 2A20H ; 29E0H начальный адрес ORDOS в ROM2 ORSIZE EQU 800H ; размер ORDOS ; ---------------------------------------------- ORG ADROM2 ; 2000H ; ; 2000H - Холодный старт компьютера в режиме Орион-128 JP COLDST JP INI128 ; DB ' BIOS-128/PRO V2.10 ' DB '(C) 1990-99 ORIONSOFT ' ; ---------------------------------------------- ; 2003H - инициализация режима "O-128" из режима "PRO" ; ---------------------------------------------- INI128 CALL INIT1 JP INIT2 ; ---------------------------------------------- ; Подпрограмма загрузки M-2 ; ---------------------------------------------- INIT1 IN A,(PORT_0A_MEM_CFG) AND 0x7F OUT (PORT_0A_MEM_CFG),A LD HL,BEGIN ; Начальный адрес MON в ROM_2 LD DE,START ; Начальный адрес MON в 0F800H LD BC,MNEND-BEGIN ; Размер монитора MON в ROM_2 LDIR ; Перемещение монитора в ОЗУ ;IN A,PORT_0A_MEM_CFG OR 0x80 ; включить режим "ORION-128" OUT PORT_0A_MEM_CFG,A IM 0 RET ; ---------------------------------------------- ; Холодный старт O-128 ; ---------------------------------------------- COLDST LD SP,STACK CALL INIT1 JP START ; 0F800H ; ---------------------------------------------- ; Подпрограмма установки ROM-диска ; (работает в ROM2) ; C=0FFH - установить текущиц ROM-диск и C = его номер ; C=0..3 - установить новый ROM-диск ; ---------------------------------------------- SROMD2 PUSH IX IN A,PORT_05_RAM1P PUSH AF ; установка системного сегмента ОЗУ в окне RAM1 LD A,(0x002F) CP '3' ; проверить модификацию ROM1 ; 33h LD A,0x1F JR NZ,SRD1 LD A,0x03 SRD1 OUT PORT_05_RAM1P,A LD IX,0x7FFB ; ячейки с данными о текущем ROM-диске LD A,C INC A ; "Z"-читать JR NZ,SRD3 LD A,(IX+0) CP 0xA5 JR NZ,SRD2 ; информация недостоверна LD A,(IX+1) LD C,A CP 3+1 JR C,SRD4 ; достоверна SRD2 LD C,0 ; установка нового ROM-диска SRD3 LD (IX+0),0xA5 ; признак достоверности LD (IX+1),C ; определение маски ROM-диска SRD4 LD B,C ; C-номер ROM-диска 0..3 INC B LD A,0x80 SRD5 RLCA DJNZ SRD5 OUT (PORT_2C_ROMD_PAGE),A POP AF OUT (PORT_05_RAM1P),A POP IX RET ; BEGIN ; ============================================== PHASE 0xF800 ; START JP ST1 KBX JP KB ; F803 Вход подпрограммы обработки клавиатуры JP PUSTO ;-F806 TVX JP TVST ;-F809 -//- вывод символа C на TV JP PUSTO ;-F80C JP TV ;-F80F -//- вывод символа A на TV JP STTS ; F812 -//- проверка статуса клавиатуры JP ASC ; F815 -//- байт=>TV(2ASCII) JP MSG ; F818 -//- вывод символьного сообщения JP INKEY ; F81B -//- ввод кода нажатой клавиши JP RCUR ; F81E положение курсора JP TVBT ; F821 печать JP MOVBL ; F824 перенести блок JP CLS ; F827 запись константы в страницу JP CSM ; F82A считать контрольную сумму JP RPAC ; F82D распаковка знакогенератора JP XPAGE ; F830 чтение/запись рабочей страницы JP RESET0 ; F833 инициализация рабочих ячеек JP RRAM ; F836 чтение байта с доп. страниц JP WRAM ; F839 запись байта в доп. страницу JP WCUR ; F83C установка курсора JP BP ; F83F вход в звуковой синтез ; ---------------------------------------------- ; подпрограмма инициализации портов и ячеек холодного старта ; ---------------------------------------------- INIT2 IN A,PORT_0A_MEM_CFG AND 0xE0 OUT PORT_0A_MEM_CFG,A ; включение WIN+ROM(1,2) CALL ROM20 ; сегмент 0 ROM2 / A=0 OUT REG_F9_RAM_PG,A ; PAGE=0 OUT REG_FA_SCRN_CFG,A ; экран=0 LD A,0x1F OUT REG_FC_COLOR,A LD A,0x0E OUT PORT_F8_VMODE,A ; псевдоцвет CALL RESET ; Инициализация рабочих ячеек JP RPAC ; Распаковка ЗГ ; ; Включить доступ к 0 сегменту ROM2 ROM2X OR 8 OUT PORT_0A_MEM_CFG,A ROM20 XOR A OUT PORT_09_ROM2_SEG,A RET ; ---------------------------------------------- ; Холодный старт ; ---------------------------------------------- ST1 LD SP,STACK CALL INIT2 ; UR LD SP,STACK ; "теплый старт" ;------------------------- ; программирование порта KBRD IN A,PORT_00_DIPSW AND 4 ; какая KBRD? LD A,0x8A ; для РК86 JR NZ,UR0 LD A,0x90 ; для МС7007 UR0 OUT PORT_1B_CTL,A ; ---------------------------------------------- ; Загрузка ORDOS ; ---------------------------------------------- ST9 LD A,0x90 OUT (PORT_2B_CTL),A ; PDU LD A,1 OUT PORT_2C_ROMD_PAGE,A ; Включить банк 1 ROM-диска ; IN A,(PORT_00_DIPSW) AND 0x40 ; ORDOS внеш./внутр.? JP Z,ST900 ; D6=0 - внутр. ; ---------------------------------------------- ; Старый загрузчик ORDOS с внешнего ROM-диска ; ---------------------------------------------- XOR A OUT PORT_29_ROMD_ADRL,A ; установить нулевой адрес OUT PORT_2A_ROMD_ADRH,A NOP IN A,PORT_28_ROMD_DATA CP 0xff JP Z,ST_ERR ; ROM-disk не подключен AND A JP Z,ST_ERR ; ROM-disk не подключен ; LD HL,0 CALL STI ; читать первый байт DEC HL CP 0xC3 ; NEW TYPE ROM-DISK? JR NZ,ST90 ; да! ; LD DE,0B800H LD BC,800H CALL ST80 JP ST901 ; JP 0BFFDH ; ; ---------------------------------------------- ; Новый загрузчик из ROM-диска ; ---------------------------------------------- ; если первый байт ROM-диска не "C3", то загрузка в новом формате ; ; первые адреса 0-1FH ROM_диска - служебная информация ; ; 0001 0203 0405 06 07....0F ; \/ \/ \/ II_ кол. ROM-банков (0=1,..3=4) ; | | | |__ 0 - каждый банк автоном. ; | | | >0 - один общий ROM-диск ; | | | ; | | - адр.посад.фл. в ОЗУ+START ; | - размер загруж. блока ; - адр.размещ.фл. в ROM ; ; Внимание!! байты 07-0F - резерв, содержимое ROM-диска начинается с 10H! ; ST90 CALL STI LD E,A CALL STI LD D,A CALL STI LD C,A CALL STI LD B,A PUSH DE CALL STI LD E,A CALL STI LD D,A POP HL PUSH DE ; SP=DE= Адрес начала (RET) ; HL= Адрес в ROM ; DE= Адрес в ОЗУ ; BC= Размер LD A,B AND C INC A JR Z,ST_ER2 ; диск не загрузочный ; ST80 LD A,B OR C RET Z CALL STI LD (DE),A INC DE DEC BC JR ST80 ; ST_ER2 LD HL,TBER2 JR ERR TBER1 DB 1FH,' net wne{nego ROM-diska!',7,7,7,0 TBER2 DB 1FH,' w ROM-diske net sistemy!',7,7,7,0 ; ST_ERR LD SP,STACK LD HL,TBER1 ERR CALL MSG CALL KBRD JP ST9 ; STI LD A,L OUT PORT_29_ROMD_ADRL,A ; PDB LD A,H OUT PORT_2A_ROMD_ADRH,A ; PDC NOP IN A,PORT_28_ROMD_DATA ; PDA INC HL PUSTO RET ; ; ---------------------------------------------- ; Загрузка внутренней ORDOS ; ---------------------------------------------- ST900 IN A,PORT_0A_MEM_CFG PUSH AF ; Сохранение содержимого диспетчера CALL ROM2X ; Включение ROM2 LD HL,ORROM ; 29E0 начало адреса ORDOS в ROM2 LD DE,0xB800 ; B800 начало размещение ORDOS LD BC,ORSIZE ; 800 размер ORDOS ; LD A,(HL) ; CP 0xFF ; JR Z,ST_ER2 ; в ROM-2 нет системы LDIR POP AF OUT PORT_0A_MEM_CFG,A ; Восстановление диспетчера ST901 DEC C ; C=0FFH CALL SROMD ; Установить текущий ROM-диск JP 0xBFFD ; Запуск ORDOS ; ---------------------------------------------- ; RPAC PUSH BC PUSH DE PUSH HL IN A,PORT_0A_MEM_CFG PUSH AF CALL ROM2X ; Открыть ROM2 ; LD DE,NAZG LD HL,(ZNAKG) B0 LD C,0x07 XOR A LD (HL),A INC HL B1 LD A,(DE) RLCA RLCA RLCA AND 0x07 LD B,A B2 LD A,(DE) AND 1FH LD (HL),A INC HL DEC C LD A,B AND A JR Z,B3 DEC B JR B2 B3 INC DE ; LD A,D CP ZGEND >> 8 ; 0x2A JR NZ,B4 LD A,E CP ZGEND & 0xFF ; 0x06 JR NZ,B4 ; POP AF OUT PORT_0A_MEM_CFG,A JP STR2 ; B4 LD A,C AND A JR NZ,B1 JR B0 VIRUS DEPHASE ; ---------------------------------------------- ; Блок исходного состояния ячеек MON-4. ; Переносится при холодном старте в ОЗУ - F3C0-F3F3H ; ---------------------------------------------- PHASE 0xF3C0 ; BEGVIR STACK ; FLRES DB 0 ; FLRES ADRES DW UR ; ADRES BP JP BEEP ; F3C3-..C5 KB JP KBRD ; F3C6-..C8 TVBT JP PRINT ; F3C9-..CB TVST JP TV2 ; F3CC-..CE ; EKRAN DB 0xC0 ; F3CF EKRAN EKRED DB 0x30 ; F3D0 EKRED ZNAKG DW 0xF000 ; F3D1 ZG 20-7F INVERS DB 0 ; F3D3 INVER SZ DB 0 ; F3D4 SWIN PAGE DB 0 ; F3D5 RAM PAGE TVAD DW 0 ; F3D6 TVAD ; DW 0 ; F3D8 - не используется DW 0 ; F3DA - не используется DW 0 ; F3DC - не используется ; AR2 DB 0 ; F3DE ESC SVSTK DW 0 ; F3DF TIMES2 DW TV2 ; F3E1 - не используется JOB1 DB 0 ; F3E3 рабочая ячейка №1 JOB2 DB 0 ; F3E4 рабочая ячейка №2 ; FFIX DB 0 ; F3E5 FL= RUS/LAT SIMV DB 0 ; F3E6 FOR KBRD CBEEP DB 0x55 ; F3E7 константа BEEP TBRUS DW TABR ; F3E8 TBLAT DW TABL ; F3EA ; STTSV DW STTS_ ; F3EC STTS TVAV DW TV_A ; F3EE TV_A IKEYV DW I_KEY ; F3F0 INKEY DW 0 ;F3F2..F3 ? ; ---------------------------------------------- ; Служебные ячейки KBRD+INKEY ; ---------------------------------------------- TSU EQU 0xF3FD TSH EQU 0xF3FE TBT EQU 0xF3FF ; EVIR EQU $ DEPHASE PHASE VIRUS+(EVIR-BEGVIR) ENDVIR ; ; Перенос исходного состояния ячеек в ОЗУ RESET LD HL,VIRUS LD DE,BEGVIR LD BC,EVIR-BEGVIR LDIR RET ; RESET0 AND A JR NZ,RESET1 IN A,PORT_0A_MEM_CFG PUSH AF CALL ROM2X ; ROM2 / сегмент 0 CALL RESET POP AF OUT PORT_0A_MEM_CFG,A ; ---------------------------------------------- ; VECTOR_RESET ; 0 0 0 0 0 0 0 0 ; I \ / \ / ; I I I_ тип ПК 00 - o-128.2 ; I I 01 - O-128+CARD2 ; I I 03 - O-128PLUS ; I I 04 - ORION-POWER ; I I___ реальная скорость 00 - 2.5 МГц ; I 01 - 3.5 МГц ; I_ / 0 - MONIT 02 - 5.0 МГц ; \ 1 - vki 03 - 6.5 МГц ; 04 - 8.5 МГц ; 05 - 10.0 МГц ; 07 - 20.0 МГц LD A,54H RET ; RESET1 INC A ;A=FF? RET NZ ; ---------------------------------------------- ; Установка текущего ROM-диска (C=FF) ; или нового (C=0,1,2,3) ; ---------------------------------------------- SROMD IN A,(PORT_09_ROM2_SEG) PUSH AF XOR A OUT (PORT_09_ROM2_SEG),A IN A,(PORT_0A_MEM_CFG) PUSH AF OR 0x1A ; ROM1+ROM2+RAM1 OUT (PORT_0A_MEM_CFG),A CALL SROMD2 ; вызов из ROM2 POP AF OUT (PORT_0A_MEM_CFG),A POP AF OUT (PORT_09_ROM2_SEG),A LD A,C ; текущий ROM-диск RET ; ASC PUSH AF RRCA RRCA RRCA RRCA CALL AS1 POP AF AS1 AND 0x0F CP 0x0A JP M,AS2 ADD 0x07 AS2 ADD 0x30 TV20 PUSH BC LD C,A CALL TVX POP BC AS3 RET ; MSG LD A,(HL) AND A RET Z CALL TV20 INC HL JR MSG ; ---------------------------------------------- ; Подпрограмма подсчета контрольной суммы ; ---------------------------------------------- CSM EX DE,HL PUSH HL LD A,L LD HL,0 JR CSM2 CSM1 EX DE,HL LD B,(HL) LD C,B INC HL EX DE,HL ADD HL,BC CSM2 CP E JR NZ,CSM1 POP BC PUSH BC LD A,B CP D LD A,C JR NZ,CSM1 LD A,(DE) ADD L LD C,A LD B,H POP HL RET ; DPCMP LD A,H CP D RET NZ LD A,L CP E RET ; WCUR LD A,L RLCA RLCA LD L,A LD (TVAD),HL RCUR LD HL,(TVAD) LD A,L RRCA RRCA LD L,A RET ; WRAM OUT REG_F9_RAM_PG,A LD (HL),C JR RRM RRAM OUT REG_F9_RAM_PG,A LD C,(HL) RRM XOR A OUT REG_F9_RAM_PG,A RET ; ---------------------------------------------- ; Чтение/запись рабочей страницы ; Вход: A = 0 - читать ; A != 0 - записать ; C = номер страницы (0-7) ; Выход: чтение - A = номер страницы ; запись - A = предыдущее состояние ; ---------------------------------------------- XPAGE AND A JR Z,XPG1 PUSH HL LD A,C OUT REG_F9_RAM_PG,A LD HL,PAGE LD A,(HL) LD (HL),C POP HL RET XPG1 LD A,(PAGE) RET ; ---------------------------------------------- ; Подпрограмма записи констаны в X-PAGE ; HL = начальный адрес ; DE = размер ; C = записываемый байт ; A - куда (PAGE) записывать байт ; ---------------------------------------------- CLS AND 0x0F OUT (REG_F9_RAM_PG),A LD (HL),C LD B,D LD C,E LD D,H LD E,L INC DE DEC BC LD A,C OR B JR Z,CLS1 LDIR CLS1 LD A,(PAGE) OUT (REG_F9_RAM_PG),A RET ; ---------------------------------------------- ; Подпрограмма переноса блока PAGE/PAGE ; HL=начальный адрес ; DE=начальный адрес - куда ; BC=количество ; A=0000____ - откуда читать ; ____0000 - куда записать ; ---------------------------------------------- MOVBL PUSH AF AND 0x0F LD (JOB2),A ; куда POP AF ; RRCA RRCA RRCA RRCA AND 0x0F LD (JOB1),A ; откуда LD (SVSTK),SP LD SP,HL ; SP = адрес откуда EX DE,HL ; HL = адрес куда ; TR0 LD A,(JOB1) OUT REG_F9_RAM_PG,A POP DE LD A,(JOB2) OUT REG_F9_RAM_PG,A LD (HL),E INC HL DEC BC LD A,B OR C JR Z,TR1 LD (HL),D INC HL DEC BC LD A,B OR C JR NZ,TR0 TR1 LD A,(PAGE) OUT REG_F9_RAM_PG,A LD SP,(SVSTK) ; восстановим стек RET ; ---------------------------------------------- ; Печать ; Вход: ; 1. A != 0 - чтение статуса PRINT ; 2. A = 0 - печать символа ; C = символ для печати ; Выход: ; A = 0 - символ принят ; A=/=0 - принтер не готов ; D0=1 - PAGEEND ; D1=1 - неисправность (ERROR) ; D2=1 - занят (BUSY) ; ---------------------------------------------- PRINT AND A JR Z,WPRT1 ; A=0 - печать ; ---------------------------------------------- ; Статус принтера ; Выход: ; A = 0 - принтер готов ; A != 0 - принтер не готов ; D0=1 - конец страницы PAGEEND ; D1=1 - неисправность (ERROR) ; D2=1 - занят (BUSY) STATU PUSH BC LD B,5 NOP IN A,PORT_02_PRNT_CTL ; PORT CTRL/PRINT RLCA RLCA RLCA XOR B AND 7 POP BC RET ; ---------------------------------------------- ; Подпрограмма печати символа ; Вход: ; C=символ для печати ; ---------------------------------------------- WPRT1 PUSH BC PUSH DE PUSH HL WPRT2 CALL STATU JP NZ,STR2 LD A,C CPL OUT PORT_01_PRNT_DAT,A ; PORT DATA-PRINT LD A,1 ; STROBE \_ 0 OUT PORT_02_PRNT_CTL,A ; PORT CTRL/PRINT XOR A ; STROBE _/ 1 NOP NOP OUT PORT_02_PRNT_CTL,A ; PORT CTRL/PRINT WPRT5 CALL STATU JP STR2 ; ---------------------------------------------- ; Проверка статуса клавиатуры ; ---------------------------------------------- STTS PUSH HL LD HL,(STTSV) EX (SP),HL RET ; STTS_ IN A,PORT_00_DIPSW AND 4 JR Z,LF9A3 XOR A OUT PORT_18_KBD,A IN A,PORT_19_KBD XOR 0xFF RET Z LD A,0xFF RET LF9A3 XOR A OUT PORT_1A_KBD,A OUT PORT_19_KBD,A IN A,PORT_18_KBD INC A RET Z LD A,0xFF OUT PORT_1A_KBD,A LD A,0xFC OUT PORT_19_KBD,A IN A,PORT_18_KBD AND 0xEB CP 0xEB JR NZ,LF9D0 LD A,3 OUT PORT_19_KBD,A IN A,PORT_18_KBD INC A JR NZ,LF9D0 OUT PORT_1A_KBD,A IN A,PORT_18_KBD INC A RET Z LF9D0 LD A,0xFF RET ; ---------------------------------------------- ; Подпрограмма обработки клавиатуры ; ---------------------------------------------- KBRD PUSH BC PUSH DE PUSH HL CALL INKEY CP 0xFF JR NZ,KBR1 LD (SIMV),A KBR1 LD D,0 KBR2 INC DE DEC E INC E CALL Z,MASC CALL INKEY INC A JR Z,KBR2 PUSH AF LD A,D RRCA CALL NC,MASC POP AF DEC A JP P,KBR5 LD DE,0x5530 LD HL,FFIX LD A,(HL) CPL LD (HL),A AND A LD A,D JR Z,KBR3 LD A,E KBR3 LD (CBEEP),A KBR4 CALL INKEY INC A JR NZ,KBR4 CALL MASC JR KBR1 KBR5 LD E,A LD D,20 LD HL,SIMV CP (HL) JR Z,KBR7 KBR6 DEC D JR Z,KBR7 CALL INKEY CP E JR Z,KBR6 KBR7 CALL BEEP LD (HL),E CALL MASC LD A,E JP STR2 ; ---------------------------------------------- ; Ввод кода нажатой клавиши ; ---------------------------------------------- INKEY PUSH HL LD HL,(IKEYV) EX (SP),HL RET ; I_KEY PUSH BC PUSH DE PUSH HL IN A,PORT_00_DIPSW AND 4 JP Z,INKEY7 ; ; INKEY RK-86 LD HL,STR2 PUSH HL LD B,0 LD D,9 LD C,0FEH INKR1 LD A,C OUT PORT_18_KBD,A RLCA LD C,A IN A,PORT_19_KBD CP 0xFF JR Z,LINKR2 LD E,A ; LD HL,0x0900 LFA5E DEC HL LD A,H OR L JR NZ,LFA5E ; IN A,PORT_19_KBD CP E JR Z,INKR4 LINKR2 LD A,B ADD 8 LD B,A DEC D JR NZ,INKR1 IN A,PORT_1A_KBD AND 0x80 LD A,0xFE RET Z INC A RET INKR3 INC B INKR4 RRA JR C,INKR3 LD A,B AND 0x3F CP 0x10 JP C,INKR12 CP 0x3F LD B,A LD A,0x20 RET Z IN A,PORT_1A_KBD LD C,A AND 0x40 JR NZ,INKR5 LD A,B AND 0x1F RET INKR5 LD A,(FFIX) AND A JR NZ,INKR10 LD A,C AND 0x20 LD A,B JR Z,INKR6 CP 0x1C JP M,INKR8 CP 0x20 JP M,INKR9 JR INKR8 INKR6 CP 0x1C JR C,INKR9 CP 0x20 JR C,INKR8 INKR7 ADD A,0x20 INKR8 ADD A,0x10 INKR9 ADD A,0x10 POP HL JP STR2 INKR10 LD A,C AND 0x20 LD A,B JR Z,INKR11 CP 0x1C JP M,INKR8 CP 0x20 JP M,INKR9 JR INKR7 INKR11 CP 0x1C JP M,INKR9 JR INKR8 INKR12 LD HL,TBRK86 LD C,A LD B,0 ADD HL,BC LD A,(HL) RET TBRK86 DB 0x0C,0x1F,0x1B,0,1,2,3,4 DB 9,0x0A,0x0D,0x7F,8,0x19,0x18,0x1A ; ; INKEY MS7007 INKEY7 LD HL,0xFFFF LD (TSU),HL LD (TSH),HL DEC HL LD C,0 INKM1 LD A,L OUT PORT_19_KBD,A LD A,H OUT PORT_1A_KBD,A IN A,PORT_18_KBD CP 0xFF JR Z,INKM4 LD B,A PUSH HL ; LD HL,0x0900 LFB1C DEC HL LD A,H OR L JR NZ,LFB1C ; POP HL IN A,PORT_18_KBD CP B JR NZ,INKM4 LD B,C JR INKM3 INKM2 INC C INKM3 RRA JR C,INKM2 LD A,C LD C,B LD DE,TSU CP 0x0A JR Z,INKM30 CP 4 INC DE JR Z,INKM30 CP 0x14 JR Z,INKM7 INC DE DB 0x06 ; LD B,0xAF INKM30 XOR A LD (DE),A INKM4 LD A,C ADD 8 LD C,A SCF LD A,L RLA LD L,A LD A,H RLA LD H,A CP 0xF7 JP NZ,INKM1 LD A,(TBT) CP 0xFF JP Z,STR2 LD HL,(TBRUS) EX DE,HL LD HL,(TBLAT) LD A,(FFIX) AND A JR Z,INKM5 EX DE,HL INKM5 LD B,0 LD A,(TBT) ; scan-код клавиши LD C,A LD A,(TSH) ; нажат SHIFT ? AND A JR NZ,INKM6 ; SHIFT не нажат ; EX DE,HL ; ADD HL,BC LD A,C ; scan-код ; ; проверка scan-кодов спецклавиш PUSH HL LD HL,SPECTB LD C,SPECTE-SPECTB CPIR POP HL LD A,(HL) JR NZ,INKM61 ; не спецсимвол ; ; перекодировка спецсимволов при нажатом SHFIT XOR 0x10 JR INKM61 ; INKM6 ADD HL,BC LD A,(HL) ; код символа INKM61 LD C,A ; LD A,(TSU) ; CTRL ? AND A LD A,C JP NZ,STR2 AND 0x1F JP STR2 INKM7 LD A,0FEH JP STR2 ; ; таблица скан-кодов спецклавиш SPECTB DB 19H,21H,29H,30H,39H,41H,48H,50H,57H,4FH DB 47H,46H,10H,37H,54H,45H SPECTE ; ; ; TABR DB 39H,38H,0,0,0,34H,35H,36H DB 1BH,9,0,0EH,0FH,2BH,2DH,0DH DB 2BH,6AH,66H,71H,0,30H,2EH,2CH DB 0,21H,63H,79H,7EH,31H,32H,33H DB 1,22H,75H,77H,73H,37H,0CH,1FH DB 2,23H,6BH,61H,6DH,7FH,1EH,0AH DB 24H,65H,70H,69H,20H,18H,0DH,3FH DB 3,25H,6EH,72H,74H,1AH,19H,5FH DB 4,26H,67H,6FH,78H,3EH,2AH,3DH DB 27H,7BH,6CH,62H,8,7CH,68H,20H DB 28H,7DH,64H,60H,3CH,76H,7AH,29H TABL DB 39H,38H,0,0,0,34H,35H,36H DB 1BH,9,0,0EH,0FH,2BH,2DH,0DH DB 2BH,4AH,46H,51H,0,30H,2EH,2CH DB 0,21H,43H,59H,5EH,31H,32H,33H DB 1,22H,55H,57H,53H,37H,0CH,1FH DB 2,23H,4BH,41H,4DH,7FH,1EH,0AH DB 24H,45H,50H,49H,20H,18H,0DH,3FH DB 3,25H,4EH,52H,54H,1AH,19H,5FH DB 4,26H,47H,4FH,58H,3EH,2AH,3DH DB 27H,5BH,4CH,42H,8,5CH,48H,20H DB 28H,5DH,44H,40H,3CH,56H,5AH,29H ; ; ---------------------------------------------- ; ; ---------------------------------------------- TV PUSH HL LD HL,(TVAV) EX (SP),HL RET ; TV_A PUSH BC LD C,A DB 6 TV2 PUSH BC TBC PUSH DE PUSH HL PUSH AF LD A,C CP 0x1B LD A,0xF0 JP Z,UPR1 LD A,(AR2) AND A JP NZ,UST ARINT LD A,C CP 0x7F JR NZ,VT14 LD A,(INVERS) CPL LD (INVERS),A JP TVQ VT14 LD H,20H SUB H JR C,OP1 LD L,A ADD HL,HL ADD HL,HL ADD HL,HL EX DE,HL LD HL,(ZNAKG) ADD HL,DE EX DE,HL CALL MASC1 EX DE,HL LD A,0x16 V22 PUSH AF PUSH HL LD A,(INVERS) XOR (HL) AND 0x3F LD L,A LD A,(JOB2) DEC A LD H,0 V21 ADD HL,HL ADD HL,HL INC A JR NZ,V21 EX DE,HL LD A,B XOR (HL) AND (HL) OR D LD (HL),A INC H LD A,C XOR (HL) AND (HL) OR E LD (HL),A DEC H INC L EX DE,HL POP HL INC HL POP AF SUB 0x03 JP P,V22 LD HL,ZERO CP 0xF8 JR NZ,V22 OP1 LD HL,(TVAD) CALL OPER ADD HL,BC LD A,H CP 0x19 JR C,V3 JR NZ,V4 INC D LD H,D JR Z,V3 ; "rulon" PUSH HL LD (SVSTK),SP LD A,(EKRED) LD B,A LD A,(EKRAN) LD H,A LD A,(SZ) LD L,A CALL MULT10 LD C,A RL0 LD A,C ADD 0x0A LD L,A LD SP,HL LD L,C LD A,0xF0 RL1 POP DE LD (HL),E INC L LD (HL),D INC L POP DE LD (HL),E INC L LD (HL),D INC L CP L JR NC,RL1 LD A,(INVERS) RL2 INC SP LD (HL),A INC L JR NZ,RL2 INC H DEC B JR NZ,RL0 LD SP,(SVSTK) POP HL V4 LD H,18H V3 LD (TVAD),HL TVQ POP AF STR2 POP HL POP DE POP BC RET ; OPER DB 0x01 ZERO DB 0x00 DB 0x01 LD D,C INC A CALL Z,GTV JR Z,V5 CP 0xEB RET Z DEC D ADD 0x05 RET Z INC D LD B,0xFF INC A RET Z LD C,0xFC CP 0xEF RET Z LD BC,0 CP 0xF0 JR NZ,VDOP LD A,L AND 0xE0 ADD 0x20 LD L,A RET ; VDOP LD C,04H INC A RET Z CP 0xEF JR NZ,V6 POP AF ; баланс стека CALL BEEP JR TVQ V6 ADD 0x0B JR Z,V7 INC A RET NZ V5 LD H,D V7 LD L,D LD B,D LD C,D RET ; MASC1 LD HL,(TVAD) LD A,L RRCA LD L,A RRCA ADD A,L LD B,A LD L,H LD A,(EKRAN) LD H,A LD A,B DEC H M18 INC H SUB 0x04 JR NC,M18 LD (JOB2),A PUSH HL LD HL,0xFC M19 ADD HL,HL ADD HL,HL INC A JR NZ,M19 LD B,H LD C,L POP HL MULT10 LD A,L RLCA RLCA RLCA ADD A,L ADD A,L LD L,A RET ; MASC CALL MASC1 ADD A,0x09 LD L,A LD A,B XOR (HL) LD (HL),A INC H LD A,C XOR (HL) LD (HL),A DEC H RET ; UST1 LD A,C CP 0x59 JR NZ,UST2 LD A,02H OR B UPR1 LD (AR2),A JP TVQ ; UST LD B,A AND 0x03 JR Z,UST1 DEC A JR Z,MEST DEC A JR Z,STROK UST2 XOR A LD (AR2),A LD A,C CP 0x4A JR Z,SNC CP 0x4B JR Z,SPC LD HL,ARINT PUSH HL LD C,0x18 CP 0x43 RET Z INC C CP 0x41 RET Z INC C CP 0x42 RET Z LD C,0x08 CP 0x44 RET Z LD C,0x0C CP 0x48 RET Z LD C,0x1F CP 0x45 RET Z CP C RET Z POP HL JP TVQ ; MEST LD A,C SUB 0x20 RLCA RLCA AND 0xFC LD (TVAD),A XOR A JR UPR1 ; STROK LD A,C SUB 0x20 LD (TVAD+1),A LD A,0xF1 JR UPR1 ; GTV PUSH BC PUSH DE PUSH HL ;D PUSH AF LD A,(SZ) JR SNSZ ; SNC LD A,(TVAD+1) ; стер.ниж.курс INC A SNSZ CP 0x19 JP NC,TVQ LD L,A CALL MULT10 LD C,A LD A,(EKRAN) LD H,A LD A,(EKRED) LD B,A DEC H SNC2 INC H LD L,C LD A,(INVERS) SNC3 LD (HL),A INC L JR NZ,SNC3 DJNZ SNC2 JP TVQ ; SPC LD HL,(TVAD) ; стер.прав.курс. PUSH HL LD B,L LD C,20H SPC1 CALL TV2 LD A,04H ADD B LD B,A JP NZ,SPC1 POP HL JP V3 ; ---------------------------------------------- ; Звук ; ---------------------------------------------- BEEP PUSH BC PUSH AF IN A,PORT_0A_MEM_CFG PUSH AF OR 0x20 ; 2.5МГц OUT PORT_0A_MEM_CFG,A LD C,0x20 BP1 LD A,(CBEEP) OUT PORT_FF_SPEAKER,A BP2 DEC A JR NZ,BP2 DEC C JR NZ,BP1 POP AF OUT PORT_0A_MEM_CFG,A POP AF POP BC RET ; RAMEND DEPHASE ; ASSERT RAMEND>0xF800 AND RAMEND<0xFFF8, Переполнение памяти F800H ; ; Выровнять гекцимальный параграф ОЗУ - XXX0 MNEND EQU $ DS -(MNEND & 0x0F)+0x10 ; ---------------------------------------------- ; Упакованный знакогенератор TV ; ---------------------------------------------- NAZG DB 0C0H,84H,0,4,4AH,60H,2AH,1FH DB 0AH,1FH,2AH,11H,0EH,51H,0EH,11H DB 18H,19H,2,4,8,13H,3,4 DB 2AH,0CH,15H,12H,0DH,26H,2,4 DB 40H,2,4,48H,4,2,8,4 DB 42H,4,8,0,4,15H,0EH,15H DB 4,0,0,24H,1FH,24H,0,40H DB 2CH,4,8,40H,1FH,40H,80H,2CH DB 0,1,2,4,8,10H,0,0EH DB 11H,13H,15H,19H,11H,0EH,4,0CH DB 64H,0EH,0EH,11H,1,6,8,10H DB 1FH,1FH,1,2,6,1,11H,0EH DB 2,6,0AH,12H,1FH,22H,1FH,10H DB 1EH,21H,11H,0EH,7,8,10H,1EH DB 31H,0EH,1FH,1,2,4,48H,0EH DB 31H,0EH,31H,0EH,0EH,31H,0FH,1 DB 2,1CH,0,2CH,20H,2CH,2CH,0 DB 2CH,4,8,2,4,8,10H,8 DB 4,2,20H,1FH,0,1FH,20H,8 DB 4,2,1,2,4,8,0EH,11H DB 1,2,4,0,4,0EH,11H,13H DB 15H,17H,10H,0EH,4,0AH,31H,1FH DB 31H,1EH,31H,1EH,31H,1EH,0EH,11H DB 50H,11H,0EH,1EH,89H,1EH,1FH,30H DB 1EH,30H,1FH,1FH,30H,1EH,50H,0EH DB 11H,30H,13H,11H,0FH,51H,1FH,51H DB 0EH,84H,0EH,61H,31H,0EH,11H,12H DB 14H,18H,14H,12H,11H,90H,11H,1FH DB 11H,1BH,35H,51H,31H,19H,15H,13H DB 31H,0EH,91H,0EH,1EH,31H,1EH,50H DB 0EH,51H,15H,12H,0DH,1EH,31H,1EH DB 14H,12H,11H,0EH,11H,10H,0EH,1 DB 11H,0EH,1FH,0A4H,0B1H,0EH,51H,2AH DB 24H,51H,55H,0AH,31H,0AH,4,0AH DB 31H,31H,0AH,64H,1FH,1,2,0EH DB 8,10H,1FH,0EH,88H,0EH,0,10H DB 8,4,2,1,0,0EH,82H,0EH DB 0EH,11H,80H,0A0H,1FH,12H,35H,1DH DB 35H,12H,4,0AH,31H,1FH,31H,1FH DB 30H,1EH,31H,1EH,92H,1FH,1,6 DB 6AH,1FH,11H,1FH,30H,1EH,30H,1FH DB 4,1FH,35H,1FH,24H,1FH,11H,90H DB 31H,0AH,4,0AH,31H,31H,13H,15H DB 19H,31H,15H,11H,13H,15H,19H,31H DB 11H,12H,14H,18H,14H,12H,11H,7 DB 89H,19H,11H,1BH,35H,51H,51H,1FH DB 51H,0EH,91H,0EH,1FH,0B1H,0FH,31H DB 0FH,5,9,11H,1EH,31H,1EH,50H DB 0EH,11H,50H,11H,0EH,1FH,0A4H,51H DB 0AH,4,8,10H,11H,35H,0EH,35H DB 11H,1EH,31H,1EH,31H,1EH,50H,1EH DB 31H,1EH,51H,19H,35H,19H,0EH,11H DB 1,6,1,11H,0EH,11H,95H,1FH DB 0EH,11H,1,7,1,11H,0EH,95H DB 1FH,1,51H,1FH,41H,52H ZGEND EQU $ ; ASSERT ZGEND < ORROM, Наползание на ORDOS в ROM2 ; DS ORROM-ZGEND,0xFF ; END