Тоже пытаюсь понять инженерную мысль сего интересного и замечательного ПК с помощью дизассемблирования его Монитора.
Вот мои потуги "вскрытия шифра" на данный момент:
; Монитор ПК "ОКЕАН-240"
; Disassembler v2.1 (DSDOS)
; 11-19.03.2019 by Denn
mode 3
cpu 0
file MON_O240
STACK:EQU 0BFD0h ; вершина стека
B_BOOT:EQU 0D600h ; а/н загрузчика ОС
; *** ПОРТЫ ***
; Порт клавиатуры, магнитофона и внешнего ПЗУ
PT_KBRD_A:EQU 40h ; линия A:
; клавиатура и внешнее ПЗУ
PT_KBRD_B:EQU 41h ; линия B:
; B0,B1 - анализ ГО и ГК
; B2,B3 - вход МГ
; B4 - подтвержд-е принтера
PT_KBRD_C:EQU 42h ; линия C:
; клавиатура и внешнее ПЗУ
PT_KBRD_M:EQU 43h ; конфигурация порта
; Порт системного таймера (ВИ53)
PT_CLK_0:EQU 60h ; системный счетчик (RST 4)
PT_CLK_1:EQU 61h ; тактирование RS-232 (ВВ51)
; PT_CLK_2:EQU 62h ; пользовательский (в Мониторе не используется!)
PT_CLK_3:EQU 63h ; регистр задания режима
; Порт контроллера прерываний (ВН59)
PT_INT_0:EQU 80h ;
PT_INT_1:EQU 81h ;
; RST0 - системное прерывание
; RST1 - прерывание от клавиатуры
; RST2 - прерывание от RS-232
; RST3 - готовность принтера
; RST4 - прерывание системного таймера
; RST5 - прерывание по питанию
; RST6, RST7 - пользовательские
; Порт RS-232 (ВВ51)
PT_UART_DAT:EQU 0A0h ; данные
PT_UART_STT:EQU 0A1h ; команда/статус
; Порт конфигурации и выбора банков ЗУ
; (только запись)
PT_VSCRL:EQU 0C0h ; упр. верт. сдвигом изобр.
PT_BANKS:EQU 0C1h ; комм. банков ОЗУ и ПЗУ
PT_HSCRL:EQU 0C2h ; упр. гориз. сдвигом изоб.
PT_CFG_M:EQU 0C3h ; рег. задания режима (0)
; Порт осн/доп ОЗУ, принтер, цвет, упр. МГ
; (только запись)
PT_PRN_OUT:EQU 0E0h ; выдача инф. на принтер
PT_SCR_MODE:EQU 0E1h ; режим отображения:
; B0..B2 - комбин. цветов
; B3..B5 - задание фона
; B6 - монохром/цвет
; B7 - основной/доп. экран
PT_TAPE_SND:EQU 0E2h ; магнитофон, звук:
; C0..C2 - запись на МГ
; C3 - звук (beeper)
; C4 - строб принтера
; C5..C7 - дист. управл. МГ
PT_CFG2_M:EQU 0E3h ; рег-р задания режима (0)
; Порт USER1 (ВВ55)
; PT_USER1_A:EQU 00h ; линия A
; PT_USER1_B:EQU 01h ; линия B
; PT_USER1_C:EQU 02h ; линия C
; PT_USER1_M:EQU 03h ; задание режима порта
; Порт USER2 (ВВ55)
; PT_USER2_A:EQU 20h ; линия A
; PT_USER2_B:EQU 21h ; линия B
; PT_USER2_C:EQU 22h ; линия C
; PT_USER2_M:EQU 23h ; задание режима порта
; Системные переменные
MBF00:EQU 0BF00h; буфер (LdSvTAPE)
MBFD8:EQU 0BFD8h; сохр. указателя стека (RST1)
MBFDC:EQU 0BFDCh; адрес перехода CMD_GOTO
MBFDD:EQU 0BFDDh; только запись! RST1 и GOTO
MBFDA:EQU 0BFDAh; сохранение HL (RST1/GOTO)
MBFDF:EQU 0BFDFh; переменные п/п PRC
MBFE0:EQU 0BFE0h; переменные п/п PRC
MBFE2:EQU 0BFE2h; используется много где...
MBFE3:EQU 0BFE3h
MBFE4:EQU 0BFE4h; один раз на чтение ???
MBFE5:EQU 0BFE5h; --||--
MBFE6:EQU 0BFE6h; какая-то переменная ???
MBFEC:EQU 0BFECh; видеорежим (0000xxxx)
MBFED:EQU 0BFEDh; позиция курсора по Y
MBFEE:EQU 0BFEEh; позиция курсора по X
MBFEF:EQU 0BFEFh; инверсия цвета FG
MBFF0:EQU 0BFF0h; инверсия цвета BG
MBFF1:EQU 0BFF1h; вертикальный сдвиг
MBFF2:EQU 0BFF2h; 0-LAT, 1-РУС, 2-???
MBFF3:EQU 0BFF3h; цвет FG и BG
WBFF4:EQU 0BFF4h; длительность зв. сигнала
WBFF6:EQU 0BFF6h; частота зв. сигнала
MBFF8:EQU 0BFF8h; горизонтальный сдвиг
MBFF9:EQU 0BFF9h; бит.маска генер. зв. bell
WBFFA:EQU 0BFFAh; перем. обсл. принтера
ORG 0E000h
; керналь п/п Монитора
JMP RESET ; E000h - инициализация (сброс)
JMP HotSTART ; E003h - горячий старт
JMP KbdSTAT ; E006h - состояние клавиатуры
JMP INKEY ; E009h - ввод с консоли
JMP PRINT_C ; E00Ch - вывод на консоль
JMP LdUART ; E00Fh - ввод с УСАПП (ВВ51)
JMP SvUART ; E012h - вывод в УСАПП (ВВ51)
JMP PRN_C ; E015h - вывод на принтер
JMP LdDUMP ; E018h - чтение блока с диска
JMP SvDUMP ; E01Bh - запись блока на диск
JMP LdSECT ; E01Eh - чтение сектора с диска
JMP SvSECT ; E021h - запись сектора на диск
JMP LdTAPE ; E024h - чтение с магнитофона
JMP SvTAPE ; E027h - запись на магнитофон
JMP GetTAPE ; E02Ah - чтение данных с МЛ
JMP FndBLOK ; E02Dh - проверка наличия блока
RESET:
; "Холодный сброс"
DI
; инициализация портов
MVI A,80h
OUT PT_CFG_M ; C3h
OUT PT_CFG2_M ; E3h
; клавиатура
MVI A,93h
OUT PT_KBRD_M ; 43h
; принтер, режим цветов, осн/доп ОЗУ, упр. МГ
MVI A,7Fh ; 0111 1111
OUT PT_SCR_MODE ; E1h
; скролл, банк ЗУ
MVI A,01h ; 0000 0001
OUT PT_BANKS ; C1h
; обнуление области 3F00..40FFh
MVI B,0
LXI H,3F00h
MOV A,H
ADI 41h
;$-3
MOV M,B
INX H
CMP H
JNZ $-3
; инициализация номера банка и скролла
MVI A,00h ; 0000 0000
OUT PT_BANKS ; C1h
MVI A,07h ; 0000 0111
OUT PT_HSCRL ; C2h
STA MBFF8
; инициализация переменных
XRA A ; [A]=00h
STA MBFEC
STA MBFF1
STA MBFF0
CMA ; [A]=FFh
STA MBFEF
MVI A,03h
STA MBFF3
;
MVI A,43h ; 0100 0011
OUT PT_SCR_MODE ; E1h
MVI A,04h ; 0000 0100
OUT PT_TAPE_SND ; E2h
STA MBFF9
; инициализация частота/длит. bell
LXI H,0400h
SHLD WBFF4
LXI H,0140h
SHLD WBFF6
; инициализация УСАПП (ВВ51)
MVI A,0CEh ; 1100 1110
OUT PT_UART_STT ; A1h
MVI A,25h ; 0010 0101
OUT PT_UART_STT ; A1h
; инициализация таймера (ВИ53)
MVI A,76h ; 0111 0110
OUT PT_CLK_3 ; 63h
MVI A,14h ; 0001 0100
OUT PT_CLK_1 ; 61h
XRA A ; 0000 0000
OUT PT_CLK_1 ; 61h
; инициализация контроллера прерываний (ВН59)
MVI A,12h ; 0001 0010
OUT PT_INT_0 ; 80h
XRA A ; 0000 0000
OUT PT_INT_1 ; 81h
CMA ; 1111 1111
OUT PT_INT_1 ; 81h
MVI A,20h ; 0010 0000
OUT PT_INT_0 ; 80h
MVI A,0Ah ; 0000 1010
OUT PT_INT_0 ; 80h
; инициализация клавиатуры
MVI A,80h
OUT PT_KBRD_C ; 42h
NOP
NOP
XRA A
OUT PT_KBRD_C ; 42h
; настройка стека
LXI SP,STACK
CALL ME75B
; инициализация переменной стека ???
LXI H,0BFC0h
SHLD MBFD8
; инициализация RST1-перехода
MVI A,0C3h
STA 0008h
LXI H,CallRST1
SHLD 0009h
; подача звукового сигнала
MVI C,7
CALL PRINT_C
; ветвление по наличию загрузчика ОС (C3@D600h)
LDA B_BOOT ; 0D600h
CPI 0C3h ; код команды JMP addr
JZ B_BOOT
; вывод заставки Монитора
LXI H,T_HEADER
;$-10
MOV C,M
MOV A,C
ORA A
JZ HotSTART
CALL PRINT_C
INX H
JMP $-10
T_HEADER:DB 13,10,'240/7 MONITOR',13,10,0
START0:
LXI H,STACK
SPHL
CALL ME2D7
INX H
HotSTART:
; *** Горячий старт ***
LXI H,STACK
SPHL
DI
CALL ME2CE
CALL ME2D7
MVI L,0CDh
INX D
POP PSW
CPI 13
JZ HotSTART
; обработка команд Монитора
LXI H,CmdTABLE
MVI C,11
;$-8
CMP M
JZ _CMD_EXEC
INX H
INX H
INX H
DCR C
JNZ $-8
JMP START0
_CMD_EXEC:
; взятие адреса п/п из таблицы переходов
INX H
MOV A,M
INX H
MOV H,M
MOV L,A
LXI D,HotSTART
PUSH D
MVI C,2
PCHL
CmdTABLE:
; Таблица переходов команд Монитора
DB 'D'
DW CMD_DUMP
DB 'F'
DW CMD_FILL
DB 'G'
DW CMD_GOTO
DB 'L'
DW CMD_LOAD
DB 'M'
DW CMD_MOVE
DB 'R'
DW CMD_READ
DB 'S'
DW CMD_SRCH
DB 'W'
DW CMD_WRITE
DB 'X'
DW CMD_XREG
DB 'B'
DW CMD_BLOK
DB 'A'
DW CMD_ABLK
; *** Команды монитора ***
CMD_BLOK:
; Команда 'B'
DCR C
CALL InpADDR
POP D
LXI H,0100h
CALL LdSECT
RET
CMD_ABLK:
; Команда 'A'
DCR C
CALL InpADDR
POP D
LXI H,0100h
CALL SvSECT
RET
CMD_DUMP:
; Команда 'D' - вывод дампа ОЗУ
DCR C
CALL InpADDR
POP H
LXI D,007Fh
XCHG
DAD D
XCHG
CMD_DUMP1:
CALL ME2CE
CALL PrSPACE
CALL PRINT[HL]
CMD_DUMP2:
CALL PrSPACE
MOV A,M
CALL PRINT_BYTE
CALL DecHD0
RC
MOV A,L
ANI 07h
JNZ CMD_DUMP2
JMP CMD_DUMP1
CMD_FILL:
; Команда 'F'
INR C
CALL InpADDR
POP B
POP D
POP H
;$-4
MOV M,C
CALL DecHD0
JNC $-4
RET
CMD_MOVE:
; Команда 'M'
INR C
CALL InpADDR
POP B
POP D
POP H
;$-6
MOV A,M
STAX B
INX B
CALL DecHD0
JNC $-6
RET
CMD_LOAD:
; Команда 'L'
CALL TypeDIG
JNC START0
CALL ME2CE
CMD_LOAD1:
CALL LdUART
CPI 3Ah
JNZ CMD_LOAD1
XRA A
MOV D,A
CALL LwUART
JZ CMD_LOAD2
MOV E,A
CALL LwUART
MOV H,A
CALL LwUART
MOV L,A
CALL LwUART
MOV C,E
;$-6
CALL LwUART
MOV M,A
INX H
DCR E
JNZ $-6
CALL LwUART
JNZ START0
JMP CMD_LOAD1
CMD_LOAD2:
CALL LwUART
CALL LwUART
CALL LwUART
CALL LwUART
JNZ START0
RET
CMD_SRCH:
; Команда 'S'
CALL InpDIG
RC
CMD_SRCH1:
MOV A,M
CALL PRINT_BYTE
CALL ME2D7
DCR L
CALL TypeDIG
RC
JZ CMD_SRCH2
XCHG
CALL InpDIG1
XCHG
MOV M,E
RC
CMD_SRCH2:
INX H
JMP CMD_SRCH1
CMD_XREG:
; Команда 'X'
LXI H,TAB_REGS
CALL TypeDIG
JC CMD_XREG3
MVI C,9
;$-8
CMP M
JZ CMD_XREG1
INX H
INX H
INX H
DCR C
JNZ $-8
JMP START0
CMD_XREG1:
CALL PrSPACE
CALL CMD_XREG5
CALL ME2D7
DCR L
CALL TypeDIG
RC
JZ START0
PUSH B
CALL InpDIG1
MOV A,L
STAX D
POP PSW
ORA A
JM CMD_XREG2
INX D
MOV A,H
STAX D
CMD_XREG2:
CALL ME2CE
RET
CMD_XREG3:
CALL ME2CE
CMD_XREG4:
XRA A
ORA M
RM
CPI 4Dh
CZ ME2CE
CALL PrSPACE
MOV C,M
CALL ME2FA
CALL ME2D7
DCR A
CALL CMD_XREG5
JMP CMD_XREG4
; Таблица регистров для команды 'X'
TAB_REGS:
DB 'A',0D7h,00h,'B',0D3h,00h,'C',0D2h,00h
DB 'D',0D1h,00h,'E',0D0h,00h,'F',0D6h,00h
DB 'M',0DBh,01h,'P',0DEh,01h,'S',0D9h,01h
DB 0FFh
KbdSTAT:
; Проверка состояния клавиатуры [E006h]
; O: [A]=00h - не нажато, FFh - нажато
IN PT_INT_0 ; 80h
NOP
ANI 02h ; 0000 0010
MVI A,0
RZ
CMA
RET
LdUART:
; Ввод с УСАПП [E00Fh]
; O: [A]=считанный байт
IN PT_UART_STT ; A1h
ANI 02h ; 0000 0010
JZ LdUART
IN PT_UART_DAT ; A0h
ANI 7Fh
RET
INKEY:
; Ввод символа с клавиатуры [E009h]
CALL KbdSTAT
ORA A
JZ INKEY
IN PT_KBRD_A ; 40h
ANI 7Fh
PUSH PSW
MVI A,80h
OUT PT_KBRD_C ; 42h
XRA A
OUT PT_KBRD_C ; 42h
POP PSW
RET
SvUART:
; Вывод в УСАПП [E012h]
; O: [C]-записываемый байт
IN PT_UART_STT ; A1h
ANI 01h ; 0000 0001
JZ SvUART
MOV A,C
OUT PT_UART_DAT ; A0h
RET
IfTYPE:
CALL KbdSTAT
ORA A
RZ
JMP TYPE
ME2CE:
CALL ME2D7
DCR C
CALL ME2D7
LDAX B
RET
ME2D7:
XTHL
MOV C,M
INX H
XTHL
JMP ME2FA
PRN_C:
; Вывод символа на принтер [E015h]
; I: [C]=выводимый символ
;$-4
IN PT_INT_0 ; 80h
ANI 08h ; 0000 1000
JZ $-4
MOV A,C
OUT PT_PRN_OUT ; E0h
MVI A,14h
OUT PT_TAPE_SND ; E2h
;$-4
IN PT_INT_0 ; 80h
ANI 08h ; 0000 1000
JNZ $-4
MVI A,4
OUT PT_TAPE_SND ; E2h
RET
PrSPACE:
MVI C,' '
ME2FA:
CALL IfTYPE
PRINT_C:
; Вывод символа на экран [E00Ch]
; I: [C]=код символа
PUSH H
PUSH D
PUSH B
CALL PRC
POP B
POP D
POP H
RET
PRC:
LXI D,MBFDF
LDAX D
DCR A
ORA A
JM PRC_9
JNZ PRC_15
INX D
LDAX D
ORA A
JP PRC_1
MOV A,C
ANI 0Fh
STAX D
INX D
XRA A
STAX D
RET
PRC_1:
LXI H,MBFE0
MOV B,M
INX H
MOV A,M
INR A
MOV M,A
MOV E,A
MVI D,0
DAD D
MOV M,C
LXI H,ME39D
MOV E,B
DAD D
CMP M
RM
LDA MBFE0
ANI 0Fh
CPI 0Fh
JZ PRC_2
CPI 4
JP PRC_6
PRC_2:
LXI H,MBFE2
MOV D,H
MOV E,L
MVI C,4
PRC_3:
MOV A,M
CPI '9'+1
JM PRC_4
SUI 7
PRC_4:
ANI 0Fh
ADD A
ADD A
ADD A
ADD A
MOV B,A
INX H
MOV A,M
CPI '9'+1
JM PRC_5
SUI 7
PRC_5:
ANI 0Fh
ORA B
INX H
STAX D
INX D
DCR C
JNZ PRC_3
PRC_6:
LXI H,MBFE0
MOV A,M
ANI 0Fh
MOV E,A
DCX H
ORA A
MVI M,2
RZ
MVI D,0
MOV M,D
DCX D
LXI H,TAB_PRC
DAD D
DAD D
MOV E,M
INX H
MOV D,M
XCHG
CPI 4
JP PRC_7
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_8
PRC_7:
LXI D,PRC_8
PUSH D
PCHL
PRC_8:
XRA A
STA MBFDF
RET
ME39D:
; Константы п/п "PRC"
DB 4,8,8,4,1,2
DDB 1,9
DB 8
TAB_PRC:
; Таблица переходов, подпрограммы 1..15
DW PP_01
DW PP_02
DW PP_03
DW PP_04
DW PP_05
DW PP_06
DW PP_07
DW PP_08
DW PP_09
DW PP_10
DW PP_11
DW PP_12
DW PP_13
DW PP_14
DW PP_15
PP_11:
PP_12:
PP_13:
PP_14:
RET
PP_15:
LXI D,MBFE2
LDAX D
MOV H,A
INX D
LDAX D
MOV L,A
SHLD WBFF4
INX D
LDAX D
MOV H,A
INX D
LDAX D
MOV L,A
SHLD WBFF6
RET
PP_09:
POP D
XRA A
STA MBFDF
LDA MBFEC
RET
PP_10:
LDA MBFEC
ANI 07h ; 0000 0111
RNZ
LXI D,30FFh
CALL ME413
DCR E
MVI D,0F0h
PP_10_1:
CALL KbdSTAT
ORA A
JZ PP_10_2
CALL INKEY
CPI 1Bh ; [Esc]
RZ
PP_10_2:
CALL ME413
DCR E
JNZ PP_10_1
MVI D,0E0h
CALL ME413
RET
ME413:
; Подпрограмма
LXI H,ME482
CALL PRN_MSG
LXI H,4
SHLD WBFFA
MVI B,0
_ME421:
MVI C,0
CALL ME48D
ANA D
CNZ ME460
LHLD WBFFA
INX H
SHLD WBFFA
MVI C,1
CALL ME48D
ANA D
CNZ ME460
LHLD WBFFA
INX H
SHLD WBFFA
INR B
MOV A,B
CPI 0ECh
JC _ME421
LXI H,ME47E
CALL PRN_MSG
RET
PRN_MSG:
; Подпрограмма вывода данных на принтер
PUSH B
PRN_MSG1:
MOV A,M
CPI 1Ah ; признак конца данных
JZ PRN_MSG2
MOV C,A
CALL PRN_C
INX H
JMP PRN_MSG1
PRN_MSG2:
POP B
RET
ME460:
; Подпрограмма
PUSH PSW
LXI H,ME487
CALL PRN_MSG
LHLD WBFFA
MOV C,H
CALL PRN_C
MOV C,L
CALL PRN_C
LXI H,ME48A
CALL PRN_MSG
POP PSW
MOV C,A
CALL PRN_C
RET
; управляющие коды принтера
ME47E:DB 1Bh,5Ah,2,1Ah
ME482:DB 1Bh,58h,0,0,1Ah
ME487:DB 1Bh,58h,1Ah
ME48A:DB 1Bh,4Fh,1Ah
ME48D:
; Подпрограмма
LDA MBFF1
ADD B
ADI 13h
MOV L,A
PUSH D
PUSH B
MOV A,E
ANI 07h ; 0000 0111
MOV B,A
MOV A,E
RAR
RAR
RAR
ANI 1Fh ; 0001 1111
ADD A
ADI 40h
MOV H,A
MOV A,C
ANI 01h ; 0000 0001
ADD H
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
MOV E,M
INR H
INR H
MOV D,M
MVI A,0
OUT PT_BANKS ; C1h
;$-10
DCR B
JM _ME4C2
MOV A,D
RAR
MOV D,A
MOV A,E
RAR
MOV E,A
JMP $-10
_ME4C2:
MOV A,E
MVI D,0
RAR
JNC $+5
MVI D,30h
;$+5
RAR
JNC _ME4D3
MOV A,D
ORI 0C0h
MOV D,A
_ME4D3:
MOV A,D
POP B
POP D
RET
PP_08:
; Подпрограмма
LDA MBFE2
ANI 3Fh
STA MBFF3
MOV B,A
LDA MBFEC
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h
RET
PP_07:
LDA MBFE2
ANI 03h ; 0000 0011
STA MBFF2
RET
ME4F9:
; Подпрограмма
MOV L,A
MOV E,A
XRA A
MOV D,A
MOV H,A
DAD H
DAD D
DAD H
DAD D
MOV A,E
CPI '@' ; 40h
JM ME51D
LDA MBFF2
ORA A
JZ ME51D
DCR A
JZ _ME519
MOV A,E
CPI '`' ; 60h
JM ME51D
_ME519:
LXI D,01C0h
DAD D
ME51D:
LXI D,0EB28h
DAD D
RET
PRC_9:
MOV A,C
ANI 7Fh ; 0111 1111
CPI ' '
JM PRC_10
CALL ME4F9
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
ADI 40h
MOV H,A
MVI C,7
LDA MBFEC
ANI 07h ; 0000 0111
JNZ _ME63F
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR D
STAX D
DCR D
INR E
;$-17
LDA MBFEF
ANA M
ADD A
STAX D
INR D
LDA MBFF0
ANA M
ADD A
STAX D
DCR D
INX H
INR E
DCR C
JNZ $-17
MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED
LDA MBFEC
ANI 08h ; 0000 1000
JNZ IF_RIGHT
PRC_RIGHT:
INX H
MOV A,M
ADI 2
ANI 3Fh ; 0011 1111
MOV M,A
DCX H
RNZ
PRC_DOWN:
MOV A,M
ADI 0Eh
CPI 0FAh
JNC _ME589
MOV M,A
RET
_ME589:
LDA MBFF1
ADI 0Eh
OUT PT_VSCRL ; C0h
STA MBFF1
LXI H,40F0h
ADD L
MOV L,A
DCR L
DCR L
MOV C,H
MVI A,1
OUT PT_BANKS ; C1h
XRA A
LXI D,1240h
_ME5A3:
MOV H,C
MOV B,E
;$-3
MOV M,A
INR H
DCR B
JNZ $-3
INR L
DCR D
JNZ _ME5A3
MVI A,0
OUT PT_BANKS ; C1h
RET
PRC_LEFT:
INX H
MOV A,M
SUI 2
ANI 3Fh ; 0011 1111
MOV M,A
CPI 3Eh
DCX H
RNZ
PRC_UP:
MOV A,M
SUI 0Eh
JNC $+5
MVI A,0EEh
;$+5
MOV M,A
RET
PRC_TAB:
INX H
MOV A,M
ADI 16
ANI 30h
MOV M,A
DCX H
RNZ
JMP PRC_DOWN
IF_TAB:
INX H
MOV A,M
ADI 16
ANI 30h
MOV M,A
DCX H
RNZ
JMP IF_PS
IF_RIGHT:
INX H
MOV A,M
ADI 2
ANI 3Fh
MOV M,A
DCX H
RNZ
IF_PS:
MOV A,M
ADI 0Ch
CPI 10h
JNC _ME5F5
MOV M,A
RET
_ME5F5:
LDA MBFF1
MOV L,A
ADI 0Ch
MOV E,A
MVI C,8
MVI A,1
OUT PT_BANKS ; C1h
_ME602:
MVI B,40h
MVI H,40h
MOV D,H
;$-5
LDAX D
MOV M,A
INR H
INR D
DCR B
JNZ $-5
INR L
INR E
DCR C
JNZ _ME602
MVI C,0Ch
LDA MBFF1
ADI 8
MOV E,A
_ME61D:
MVI B,40h
MVI D,40h
XRA A
;$-3
STAX D
INR D
DCR B
JNZ $-3
INR E
DCR C
JNZ _ME61D
MVI A,0
OUT PT_BANKS ; C1h
RET
IF_LEFT:
INX H
MOV A,M
ORA A
DCX H
RZ
INX H
SUI 2
ANI 3Fh ; 0011 1111
MOV M,A
DCX H
RET
_ME63F:
LDA MBFEC
ANI 2
JNZ _ME6C1
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR E
;$-6
MOV A,M
ADD A
STAX D
INX H
INR E
DCR C
JNZ $-6
MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED
MK_RIGHT:
INX H
MOV A,M
ADI 1
ANI 3Fh
MOV M,A
DCX H
RNZ
MK_DOWN:
MOV A,M
ADI 0Bh
CPI 0FAh
JNC $+5
MOV M,A
RET
;$+5
LDA MBFF1
ADI 0Bh
OUT PT_VSCRL ; C0h
STA MBFF1
LXI H,40F0h
ADD L
MOV L,A
MOV C,H
MVI A,1
OUT PT_BANKS ; C1h
XRA A
LXI D,1040h
_ME68E:
MOV H,C
MOV B,E
;$-3
MOV M,A
INR H
DCR B
JNZ $-3
INR L
DCR D
JNZ _ME68E
MVI A,0
OUT PT_BANKS ; C1h
RET
MK_LEFT:
INX H
MOV A,M
SUI 1
ANI 3Fh
MOV M,A
CPI 3Fh
DCX H
RNZ
MK_UP:
MOV A,M
SUI 0Bh
JNC $+5
MVI A,0F2h
;$+5
MOV M,A
RET
MK_TAB:
INX H
MOV A,M
ADI 8
ANI 38h
MOV M,A
DCX H
RNZ
JMP MK_DOWN
_ME6C1:
LDA MBFEE
CPI 40h
JM _ME6D0
LXI H,MBFED
CALL ME75B
RET
_ME6D0:
MVI A,1
OUT PT_BANKS ; C1h
XCHG
XRA A
STAX D
INR E
;$-6
MOV A,M
ADD A
STAX D
INX H
INR E
DCR C
JNZ $-6
MVI A,0
OUT PT_BANKS ; C1h
LXI H,ME75B
PUSH H
LXI H,MBFED
INX H
MOV A,M
ADI 1
CPI 40h
JM $+5
MVI A,40h
;$+5
MOV M,A
DCX H
RET
PRC_STR:
LDA MBFEC
ANI 08h ; 0000 1000
JNZ IF_STR
MVI A,7Fh
OUT PT_SCR_MODE ; E1h
MVI A,1
OUT PT_BANKS ; C1h
LXI D,4000h
XCHG
MOV A,H
ADI 40h
MVI B,0
; обнуление ОЗУ 4000..7FFFh
;$-3
MOV M,B
INX H
CMP H
JNZ $-3
XCHG
LDA MBFF3
MOV B,A
LDA MBFEC
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h
PRC_HOME:
XRA A
NOP
NOP
MOV M,A
INX H
XRA A
MOV M,A
DCX H
MVI A,0
OUT PT_BANKS ; C1h
RET
IF_STR:
LDA MBFF1
MOV L,A
MVI C,14h
MVI A,1
OUT PT_BANKS ; C1h
IF_STR1:
MVI H,40h
MVI B,40h
XRA A
;$-3
MOV M,A
INR H
DCR B
JNZ $-3
INR L
DCR C
JNZ IF_STR1
MVI A,0
OUT PT_BANKS ; C1h
JMP PRC_HOME
ME75B:
; Подпрограмма
LDA MBFEC
ANI 04h ; 0000 0100
RNZ
LDA MBFEC
ANI 07h ; 0000 0111
JNZ _ME790
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
ADI 40h
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
LXI B,7F08h
;$-10
MOV A,M
XRA B
MOV M,A
INR H
MOV A,M
XRA B
MOV M,A
DCR H
INR L
DCR C
JNZ $-10
XCHG
MVI A,0
OUT PT_BANKS ; C1h
RET
_ME790:
XCHG
LHLD MBFED
LDA MBFF1
ADD L
MOV L,A
MOV A,H
CPI 40h
XCHG
RP
XCHG
ADI 40h
MOV H,A
MVI A,1
OUT PT_BANKS ; C1h
LXI B,7F08h
;$-5
MOV A,M
XRA B
MOV M,A
INR L
DCR C
JNZ $-5
XCHG
MVI A,0
OUT PT_BANKS ; C1h
RET
PRC_10:
CPI 1Bh ; [Esc]
JNZ PRC_11
LXI H,MBFDF
MVI M,01h
INX H
MVI M,0FFh
RET
PRC_11:
CPI 7 ; [BEEP]
JZ PRC_BEEP
LXI H,ME75B
PUSH H
LXI H,MBFED
PUSH PSW
CALL ME75B
LDA MBFEC
ANI 08h ; 0000 1000
JZ PRC_12
POP PSW
CPI 9 ; [Tab]
JZ IF_TAB
CPI 8 ; []
JZ IF_LEFT
CPI 18h ; []
JZ IF_RIGHT
CPI 1Fh ; [СТР]
JZ IF_STR
CPI 10 ; [ПС]
JZ IF_PS
CPI 13 ; [ВК]
RNZ
;IF_BK:
INX H
MVI M,0
DCX H
RET
PRC_12:
POP PSW
CPI 1Fh
JZ PRC_STR
CPI 12
JZ PRC_HOME
PUSH PSW
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_13
POP PSW
CPI 9 ; [Tab]
JZ PRC_TAB
CPI 8 ; []
JZ PRC_LEFT
CPI 18h ; []
JZ PRC_RIGHT
CPI 19h ; []
JZ PRC_UP
CPI 1Ah ; []
JZ PRC_DOWN
CPI 10 ; [│]
JZ PRC_DOWN
CPI 13 ; [
]
RNZ
;PRC_BK:
INX H
MVI M,0
DCX H
RET
PRC_13:
LDA MBFEC
ANI 2
JNZ PRC_14
POP PSW
CPI 9 ; [Tab]
JZ MK_TAB
CPI 8 ; []
JZ MK_LEFT
CPI 18h ; []
JZ MK_RIGHT
CPI 19h ; []
JZ MK_UP
CPI 1Ah ; []
JZ MK_DOWN
CPI 10 ; [│]
JZ MK_DOWN
CPI 13 ; [
]
RNZ
;MK_BK:
INX H
MVI M,0
DCX H
RET
PRC_14:
POP PSW
CPI 10 ; [│]
JZ MK_DOWN
CPI 13 ; [
]
RNZ
;MK_BK:
INX H
MVI M,0
DCX H
RET
PRC_BEEP:
; Выдача звуковогО сигнала клавиатуры
LHLD WBFF6
XCHG
LHLD WBFF4
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,L
OUT PT_CLK_0 ; 60h
MOV A,H
OUT PT_CLK_0 ; 60h
LDA MBFF9
MOV B,A
PRC_BEEP1:
MOV A,D
ORA E
RZ
DCX D
MOV A,B
XRI 08h ; 0000 1000
MOV B,A
OUT PT_TAPE_SND ; E2h
;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MOV A,B
XRI 8
MOV B,A
OUT PT_TAPE_SND ; E2h
;$-4
IN PT_INT_0 ; 80h
ANI 10h
JZ $-4
JMP PRC_BEEP1
PP_05:
LDA MBFEC
ANI 08h ; 0000 1000
RNZ
CALL ME75B
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PP_05_1
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
ANI 1Fh ; 0001 1111
ADD A
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 11h
JC $+5
MVI A,11h
;$+5
MOV B,A
ADD A
ADD B
ADD A
ADD B
ADD A
MOV M,A
CALL ME75B
RET
PP_05_1:
LDA MBFEC
ANI 02h ; 0000 0010
JNZ PP_05_2
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
SUI 20h
ANI 3Fh
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 16h
JC $+5
MVI A,16h
;$+5
MOV B,A
ADD A
ADD A
ADD B
ADD A
ADD B
MOV M,A
CALL ME75B
RET
PP_05_2:
LXI D,MBFE2
LXI H,MBFEE
INX D
LDAX D
SUI 20h
CPI 40h
JM $+5
MVI A,40h
;$+5
MOV M,A
DCX D
DCX H
LDAX D
ANI 1Fh ; 0001 1111
CPI 16h
JC $+5
MVI A,16h
;$+5
MOV B,A
ADD A
ADD A
ADD B
ADD A
ADD B
MOV M,A
CALL ME75B
RET
PP_06:
; Подпрограмма
LXI H,MBFEC
LDA MBFF3
MOV B,A
LDA MBFE2
MOV C,A
ANI 08h ; 0000 1000
MOV A,C
JZ $+5
MVI A,08h
;$+5
ANI 0Fh ; 0000 1111
MOV M,A
ANI 07h ; 0000 0111
MVI A,0
JNZ $+5
MVI A,40h
;$+5
ORA B
OUT PT_SCR_MODE ; E1h
LXI H,MBFED
CALL PRC_STR
CALL ME75B
RET
PP_04:
LDA MBFE2
ANI 03h ; 0000 0011
RAR
MOV B,A
MVI A,0
SBB A
STA MBFEF
MOV A,B
DCR A
CMA
STA MBFF0
RET
PRC_15:
LDA MBFEC
ANI 07h ; 0000 0111
JNZ PRC_8
MOV A,C
ANI 7Fh ; 0111 1111
MOV C,A
CPI ' '
JM PRC_8
LXI H,MBFE2
MOV A,M
MOV E,A
ADI 8
JC PRC_8
MOV M,A
INX H
MVI A,0F7h
CMP M
JC PRC_8
MOV D,M
CALL PRC_17
MOV A,L
SUI 7
MOV L,A
PUSH H
MOV A,C
CALL ME4F9
POP D
MVI C,7
PRC_16:
PUSH H
MVI A,1
OUT PT_BANKS ; C1h
MOV L,M
MVI H,0
MOV A,B
ORA A
JZ PRC_18
;$-2
DAD H
DCR A
JNZ $-2
PRC_18:
XCHG
PUSH B
LDA MBFEF
CMA
MOV B,A
MOV A,M
XRA B
ORA E
XRA B
MOV M,A
INR H
INR H
MOV A,M
XRA B
ORA D
XRA B
MOV M,A
DCR H
LDA MBFF0
CMA
MOV B,A
MOV A,M
XRA B
ORA E
XRA B
MOV M,A
INR H
INR H
MOV A,M
XRA B
ORA D
XRA B
MOV M,A
DCR H
DCR H
DCR H
INR L
XCHG
POP B
MVI A,0
OUT PT_BANKS ; C1h
POP H
INX H
DCR C
JNZ PRC_16
RET
PRC_17:
LDA MBFF1
SUB D
DCR A
MOV L,A
MOV A,E
ANI 07h ; 0000 0111
MOV B,A
MOV A,E
RAR
RAR
ANI 3Eh ; 0011 1110
ADI 40h
MOV H,A
RET
PP_01:
LXI H,MBFE5
LXI D,MBFE3
LDAX D
MOV B,M
CMP B
JNC PP_01_1
MOV M,A
MOV A,B
STAX D
PP_01_1:
DCX D
DCX H
LDAX D
MOV B,M
CMP B
JC PP_01_2
MOV M,A
MOV A,B
STAX D
PP_01_2:
XCHG
MOV E,M
INX H
MOV D,M
CALL PRC_17
PUSH H
XRA A
;$-3
STC
RAL
DCR B
JP $-3
RAR
MOV D,A
LXI H,MBFE4
MOV A,M
ANI 07h ; 0000 0111
MOV B,A
XRA A
;$-3
STC
RAL
DCR B
JP $-3
CMA
MOV E,A
MOV A,M
DCX H
DCX H
SUB M
RRC
RRC
RRC
ANI 1Fh ; 0001 1111
MOV C,A
INX H
MOV A,M
INX H
INX H
SUB M
JNZ $+4
INR A
;$+4
MOV B,A
POP H
MOV A,E
STA MBFE6
PP_01_3:
PUSH D
PUSH H
PUSH B
MVI A,1
OUT PT_BANKS ; C1h
MOV A,C
ORA A
JNZ PP_01_5
MOV A,D
ORA E
PP_01_4:
MOV D,A
PP_01_5:
MOV B,D
XCHG
LHLD MBFEF
XCHG
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
INR H
MOV A,C
ORA A
JZ PP_01_7
DCR C
PP_01_6:
LDA MBFE6
JZ PP_01_4
;$-5
MOV M,E
INR H
MOV M,D
INR H
DCR C
JNZ $-5
JMP PP_01_6
PP_01_7:
MVI A,0
OUT PT_BANKS ; C1h
POP B
POP H
POP D
INR L
DCR B
JNZ PP_01_3
RET
PP_02:
LXI H,MBFE2
MOV E,M
INX H
MOV D,M
INX H
MOV A,M
INX H
MOV H,M
MOV L,A
CMP E
JC $+4
XCHG
;$+4
SHLD MBFE2
MOV A,E
SUB L
MOV L,A
MOV A,D
SUB H
MOV H,A
PUSH PSW
JNC PP_02_1
CMA
INR A
MOV H,A
PP_02_1:
XCHG
LHLD MBFE2
XCHG
JZ PP_02_14
MOV A,L
ORA A
JZ PP_02_10
MOV B,A
POP PSW
MVI A,0
ADC A
STA MBFE6
MOV E,H
MVI C,10h
MVI D,0
PP_02_2:
DAD H
XCHG
DAD H
XCHG
MOV A,D
JC PP_02_3
CMP B
JC PP_02_4
PP_02_3:
SUB B
MOV D,A
INX H
PP_02_4:
DCR C
JNZ PP_02_2
LXI D,0
PUSH D
PUSH H
LHLD MBFE2
XCHG
MOV C,B
CALL PRC_17
MVI A,80h
;$-2
RLC
DCR B
JP $-2
CMA
MOV B,A
PP_02_5:
POP D
XTHL
MOV A,H
DAD D
SUB H
CMA
INR A
XTHL
PUSH D
PUSH B
MOV C,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h
LDA MBFE6
ORA A
JNZ PP_02_7
PP_02_6:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_8
DCR C
DCR L
JMP PP_02_6
PP_02_7:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_8
DCR C
INR L
JMP PP_02_7
PP_02_8:
MVI A,0
OUT PT_BANKS ; C1h
POP B
MOV A,B
STC
RAL
JC PP_02_9
RAL
INR H
INR H
PP_02_9:
MOV B,A
DCR C
JNZ PP_02_5
POP H
POP H
RET
PP_02_10:
MOV C,H
CALL PRC_17
MVI A,80h
;$-2
RLC
DCR B
JP $-2
CMA
MOV B,A
XCHG
LHLD MBFEF
XCHG
POP PSW
MVI A,1
OUT PT_BANKS ; C1h
JC PP_02_12
PP_02_11:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_13
DCR C
DCR L
JMP PP_02_11
PP_02_12:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,C
ORA A
JZ PP_02_13
DCR C
INR L
JMP PP_02_12
PP_02_13:
MVI A,0
OUT PT_BANKS ; C1h
RET
PP_02_14:
POP PSW
MOV C,L
MOV A,L
ORA A
JNZ $+4
INR C
;$+4
CALL PRC_17
MVI A,80h
;$-2
RLC
DCR B
JP $-2
CMA
MOV B,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h
PP_02_15:
MOV A,M
XRA E
ANA B
XRA E
MOV M,A
INR H
MOV A,M
XRA D
ANA B
XRA D
MOV M,A
DCR H
MOV A,B
STC
RAL
JC $+6
RAL
INR H
INR H
;$+6
MOV B,A
DCR C
JNZ PP_02_15
MVI A,0
OUT PT_BANKS ; C1h
RET
PP_03:
; Подпрограмма
LHLD MBFE2
XCHG
CALL PRC_17
MVI A,80h
;$-2
RLC
DCR B
JP $-2
MOV B,A
XCHG
LHLD MBFEF
XCHG
MVI A,1
OUT PT_BANKS ; C1h
MOV A,M
XRA B
MOV M,A
INR H
MOV A,M
XRA B
MOV M,A
MVI A,0
OUT PT_BANKS ; C1h
RET
;MEC08:
; включение блока кодов знакогенератора
data FONTS.ZG
; *** Вторая часть (после знакогенератора) ***
LwUART:
PUSH B
CALL LdUART
CALL ChkNUM
RLC
RLC
RLC
RLC
MOV C,A
CALL LdUART
CALL ChkNUM
ORA C
MOV C,A
ADD D
MOV D,A
MOV A,C
POP B
RET
OctToSim:
ANI 0Fh
ADI 90h
DAA
ACI 40h
DAA
MOV C,A
RET
CMD_XREG5:
INX H
MOV E,M
MVI D,0BFh
INX H
MOV B,M
INX H
LDAX D
CALL PRINT_BYTE
DCR B
RM
DCX D
LDAX D
JMP PRINT_BYTE
InpADDR:
CALL InpDIG
XTHL
PUSH H
DCR C
JNC InpADDR1
JNZ START0
RET
InpADDR1:
JNZ InpADDR
JMP START0
DecHD0:
; Подпрограмма [HL]=[HL]-[DE]
; с проверкой [HL] на ноль
INX H
MOV A,H
ORA L
STC
RZ
MOV A,E
SUB L
MOV A,D
SBB H
RET
PRINT[HL]:
; Подпрограмма вывода [HL]
MOV A,H
CALL PRINT_BYTE
MOV A,L
PRINT_BYTE:
PUSH PSW
RRC
RRC
RRC
RRC
CALL PrDIG
POP PSW
PrDIG:
CALL OctToSim
JMP ME2FA
InpDIG:
CALL TypeDIG
JZ START0
InpDIG1:
LXI H,0
InpDIG2:
MOV B,A
CALL ChkNUM
JC InpDIG3
DAD H
DAD H
DAD H
DAD H
ORA L
MOV L,A
CALL TYPE
JMP InpDIG2
InpDIG3:
MOV A,B
CALL ChkSpcComBK
JNZ START0
RET
ChkNUM:
; Подпрограмма
SUI '0'
RC
ADI 0E9h
RC
ADI 6
JP $+6
ADI 7
RC
;$+6
ADI 10
ORA A
RET
TypeDIG:
; Подпрограмма
CALL TYPE
ChkSpcComBK:
CPI ' '
RZ
CPI ','
RZ
CPI 13
STC
RZ
CMC
RET
TYPE:
PUSH B
CALL INKEY
CALL ChkTYPE
CPI 1Bh ; [Esc]
JZ START0
MOV C,A
CALL PRINT_C
MOV A,C
POP B
RET
ChkTYPE:
CPI 61h
RM
CPI 9Bh
RP
ANI 0DFh
RET
CallRST1:
; Обработка прерывания RST 1
DI
SHLD MBFDA
LXI H,2
DAD SP
SHLD MBFD8
POP H
LXI SP,MBFD8
PUSH PSW
MVI A,0
PUSH PSW
MVI A,0
NOP
NOP
PUSH B
PUSH D
MVI A,0
NOP
NOP
SHLD MBFDD
CALL ME2D7
INX H
CALL PRINT[HL]
JMP HotSTART
CMD_GOTO:
CALL TypeDIG
JZ CMD_GOTO1
CALL InpDIG1
SHLD MBFDD
CMD_GOTO1:
JNC START0
CALL ME2CE
MVI A,0C3h
STA MBFDC
LXI SP,STACK
POP D
POP B
POP PSW
NOP
NOP
POP PSW
POP H
SPHL
LHLD MBFDA
JMP MBFDC
CMD_WRITE:
CALL TypeDIG
JNC START0
CALL ME2CE
SvTAPE:
LXI H,MBF00
MVI C,80h
;$-4
MVI M,0
INX H
DCR C
JNZ $-4
LXI H,MBF00
LXI D,0FFFFh
CALL SvDUMP
CALL SvTAPE2
LXI D,0
CALL SvDUMP
CALL SvTAPE2
LXI B,0200h
LXI D,0
SvTAPE1:
PUSH B
LXI H,MBF00
CALL LdSECT
INX D
CALL SvDUMP
CALL SvTAPE2
POP B
DCX B
MOV A,B
ORA C
JNZ SvTAPE1
RET
SvTAPE2:
LXI B,00FAh
SvTAPE3:
DCX B
MOV A,B
ORA C
JNZ SvTAPE3
RET
CMD_READ:
CALL TypeDIG
JNC START0
CALL ME2CE
LdTAPE:
MVI A,64h
CALL GetTAPE
ORA A
JNZ PrBREAK
MVI E,6
LdTAPE1:
DCR E
JZ PrNoStrtREC
LXI H,MBF00
CALL LdDUMP
CPI 4
JZ PrBREAK
ORA A
JNZ LdTAPE1
MOV A,B
ORA C
JNZ LdTAPE1
LXI B,0200h
LXI D,0
LdTAPE2:
PUSH B
CALL LdDUMP
ORA A
JNZ LdTAPE3
DCX B
MOV A,B
CMP D
JNZ PrSEQ
MOV A,C
CMP E
JNZ PrSEQ
CALL SvSECT
INX D
POP B
DCX B
MOV A,B
ORA C
JNZ LdTAPE2
RET
PrNoStrtREC:
LXI H,T_NoStartREC
CALL PRINT_MSG
RET
LdTAPE3:
CPI 2
JZ PrIBG
CPI 4
JZ LdTAPE4
LXI H,T_ChkSUM
CALL PRINT_MSG
CALL PRINT[BC]
POP B
RET
PrSEQ:
LXI H,T_SEQ
CALL PRINT_MSG
INX B
CALL PRINT[BC]
POP B
RET
PrIBG:
LXI H,T_IBG
CALL PRINT_MSG
POP B
RET
LdTAPE4:
POP B
PrBREAK:
LXI H,T_BREAK
CALL PRINT_MSG
RET
PRINT[BC]:
; Подпрограмма вывода [BC]
PUSH B
MOV A,B
CALL PRINT_BYTE
POP B
MOV A,C
CALL PRINT_BYTE
RET
; *** Текстовыйе сообщения ***
T_NoStartREC:DB 'NO START RECORD',0
T_ChkSUM:DB 'CHECKSUM ',0
T_SEQ:DB 'SEQUENCE ',0
T_IBG:DB 'IBG',0
T_BREAK:DB 'BREAK',0
PRINT_MSG:
; Подпрограмма вывода сообщения на экран
; I: [HL]-а/н (/0)
MOV A,M
ORA A
RZ
PUSH B
MOV C,A
CALL PRINT_C
INX H
POP B
JMP PRINT_MSG
LdSECT:
PUSH H
PUSH D
MOV A,D
ANI 01h ; 0000 0001
ORI 02h ; 0000 0010
ORI 00h ; 0000 0000
MOV B,A
XRA A
MOV A,E
RAR
MOV D,A
MVI A,0
RAR
MOV E,A
LdSECT1:
MOV A,B
OUT PT_BANKS ; C1h
LDAX D
MOV C,A
MVI A,0
OUT PT_BANKS ; C1h
MOV M,C
INX H
INX D
MOV A,E
ADD A
JNZ LdSECT1
MVI A,0
OUT PT_BANKS ; C1h
POP D
POP H
RET
SvSECT:
PUSH H
PUSH D
MOV A,D
ANI 01h ; 0000 0001
ORI 02h ; 0000 0010
ORI 00h ; 0000 0000
MOV B,A
XRA A
MOV A,E
RAR
MOV D,A
MVI A,0
RAR
MOV E,A
SvSECT1:
MVI A,0
OUT PT_BANKS ; C1h
MOV C,M
MOV A,B
OUT PT_BANKS ; C1h
MOV A,C
STAX D
INX H
INX D
MOV A,E
ADD A
JNZ SvSECT1
MVI A,0
OUT PT_BANKS ; C1h
POP D
POP H
RET
SvDUMP:
; Запись дампа на диск
PUSH H
PUSH D
PUSH D
LXI B,09F6h
MVI A,0Ah
OUT PT_INT_0 ; 80h
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,C
OUT PT_CLK_0 ; 60h
MOV A,B
OUT PT_CLK_0 ; 60h
LXI D,4
SvDUMP1:
IN PT_INT_0 ; 80h
ANI 10h
JNZ SvDUMP1
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
MVI A,36h
OUT PT_CLK_3 ; 63h
MOV A,C
OUT PT_CLK_0 ; 60h
MOV A,B
OUT PT_CLK_0 ; 60h
DCR E
JNZ SvDUMP1
;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MVI A,0
CALL MF36B
MVI A,0F5h
CALL MF36B
MVI E,0
POP B
MOV A,C
CALL MF36B
MOV A,B
CALL MF36B
MVI B,80h
;$-6
MOV A,M
CALL MF36B
INX H
DCR B
JNZ $-6
MOV A,E
CALL MF36B
MVI A,0
CALL MF36B
;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MVI A,4
OUT PT_TAPE_SND ; E2h
POP D
POP H
RET
MF36B:
; Подпрограмма
PUSH B
MOV B,A
MOV A,E
SUB B
MOV E,A
MVI C,8
MF372:
MOV A,B
RAR
MOV B,A
JC MF39E
;$-4
IN PT_INT_0 ; 80h
ANI 10h
JNZ $-4
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,68h
OUT PT_CLK_0 ; 60h
MVI A,1
OUT PT_CLK_0 ; 60h
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
DCR C
JNZ MF372
POP B
RET
MF39E:
IN PT_INT_0 ; 80h
ANI 10h
JNZ MF39E
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,94h
OUT PT_CLK_0 ; 60h
MVI A,2
OUT PT_CLK_0 ; 60h
MOV A,D
CMA
MOV D,A
ORA A
MVI A,5
JNZ $+5
MVI A,3
;$+5
OUT PT_TAPE_SND ; E2h
DCR C
JNZ MF372
POP B
RET
LdDUMP:
PUSH H
PUSH D
MVI A,0Ah
OUT PT_INT_0 ; 80h
MVI A,36h
OUT PT_CLK_3 ; 63h
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
MVI C,3
LdDUMP1:
CALL MF488
INR A
JZ MF440
MOV A,B
ADI 4
JP LdDUMP1
DCR C
JNZ LdDUMP1
LdDUMP2:
CALL MF488
INR A
JZ MF440
MOV A,B
ADI 4
JM LdDUMP2
MVI C,0
LdDUMP3:
CALL MF488
INR A
JZ MF440
DCR A
RAR
MOV A,C
RAR
MOV C,A
CPI 0F5h
JNZ LdDUMP3
MVI E,0
CALL MF44B
JNC LdDUMP6
MOV C,D
CALL MF44B
JNC LdDUMP6
MOV B,D
PUSH B
MVI C,80h
LdDUMP4:
CALL MF44B
JNC LdDUMP5
MOV M,D
INX H
DCR C
JNZ LdDUMP4
CALL MF44B
JNC LdDUMP5
MOV A,E
ORA A
JZ $+5
MVI A,1
;$+5
POP B
PopDH:
POP D
POP H
RET
LdDUMP5:
POP B
LXI B,0
LdDUMP6:
MVI A,2
JMP PopDH
MF440:
CALL INKEY
MOV C,A
MVI B,0
MVI A,4
JMP PopDH
MF44B:
; Подпрограмма
PUSH B
MVI C,8
;$-14
CALL MF465
RAR
MOV A,D
RAR
MOV D,A
MVI A,4
ADD B
JNC _MF463
DCR C
JNZ $-14
MOV A,D
ADD E
MOV E,A
STC
_MF463:
POP B
RET
MF465:
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
MOV B,A
;$-5
IN PT_KBRD_B ; 41h
ANI 4
CMP B
JZ $-5
MVI A,36h
OUT PT_CLK_3 ; 63h
IN PT_CLK_0 ; 60h
ADI 20h
IN PT_CLK_0 ; 60h
MOV B,A
ACI 2
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
RP
INR A
RET
MF488:
IN PT_KBRD_B ; 41h
ANI 4
MOV B,A
;$-12
IN PT_INT_0 ; 80h
ANI 02h ; 0000 0010
JNZ _MF4B2
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
CMP B
JZ $-12
MVI A,36h
OUT PT_CLK_3 ; 63h
IN PT_CLK_0 ; 60h
ADI 20h
IN PT_CLK_0 ; 60h
MOV B,A
ACI 2
MVI A,0
OUT PT_CLK_0 ; 60h
OUT PT_CLK_0 ; 60h
RP
INR A
RET
_MF4B2:
MVI A,0FFh
RET
GetTAPE:
ORA A
RZ
PUSH D
MOV B,A
GetTAPE1:
MOV C,B
IN PT_KBRD_B ; 41h
ANI 4
MOV E,A
GetTAPE2:
MVI A,36h
OUT PT_CLK_3 ; 63h
XRA A
OUT PT_CLK_0 ; 60h
MVI A,0Ch
OUT PT_CLK_0 ; 60h
GetTAPE3:
IN PT_INT_0 ; 80h
ANI 02h ; 0000 0010
JNZ GetTAPE5
IN PT_INT_0 ; 80h
ANI 10h ; 0001 0000
JZ GetTAPE4
IN PT_KBRD_B ; 41h
ANI 04h ; 0000 0100
CMP E
JNZ GetTAPE1
JMP GetTAPE3
GetTAPE4:
DCR C
JNZ GetTAPE2
XRA A
POP D
RET
GetTAPE5:
CALL INKEY
MOV C,A
MVI A,4
POP D
RET
FndBLOK:
IN PT_KBRD_B ; 41h
ANI 08h ; 0000 1000
MVI A,0
RZ
CMA
RET
DDB 0,2
DDB 0FFh,3
; *** свободная область в конце ПЗУ ***
DDB 0FFh,11*256 ; 2816 байт (2,75 Кб)
END
Что-то не получается разгадать, каким образом работает находящийся в ПЗУ по адресам EC08..F067h знакогенератор. Анализ содержимого указывает на какую-то вялую компрессию... стало быть где-то должен быть алгоритм декомпрессии и выгрузки в ОЗУ. Ни с головы, ни с хвоста он не адресуется никаким кодом из ПЗУ. Даже если бы адрес складывался математически, то явно был бы перенос знакогенератора в начале (при отработке "холодного" сброса), однако там ничего на эту тему нет.
Пытался анализировать работу п/п вывода символа, но там какой-то "треш"... пока не удалось ничего понять /-)
Может кто-то из океанологов в курсе? ;)
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions, Inc. All rights reserved. Перевод: zCarot