Код:
; МОНИТОР-1 для ПРК "ОРИОН-128.2"
; Disassembler v2.1 (DSDOS)
; 05.04.2019 by Denn /SPb/
STACK:EQU 0F3C9h ; вершина стэка
C_DSCR:EQU 30C0h ; параметры окна экрана
C_TAPE:EQU 6040h ; константы чтения/записи МГ
RD_BOOT:EQU 0B800h ; а/н загрузчика ROM-диска
GO_BOOT:EQU 0BFFDh ; адрес старта загрузчика
RamTOP:EQU 0BFFFh ; верхняя граница ОЗУ пользователя
B_FONTS:EQU 0F000h ; а/н знакогенератора
; Порт клавиатуры (ВВ55)
PT_KB_A:EQU 0F400h ; выход на матрицу
PT_KB_B:EQU 0F401h ; вход от матрицы
PT_KB_C:EQU 0F402h ; упр. клавиши, с/д и МГ
PT_KB_CFG:EQU 0F403h ; настройка порта
; Порт ROM-диска (ВВ55)
PT_RD_DAT:EQU 0F500h ; данные
PT_RD_ADR:EQU 0F501h ; адрес
PT_RD_CFG:EQU 0F503h ; настройка порта
; Порты видео и ОЗУ
PT_MODE:EQU 0F800h ; порт видеорежима
PT_BANK:EQU 0F900h ; порт банков ОЗУ
PT_SCRN:EQU 0FA00h ; порт экранов
M_ExUSR:EQU 0F3CAh ; вектор п/п F821h
M_ExPRC:EQU 0F3CDh ; вектор п/п F809h
; Системные переменные
M_BSCR:EQU 0F3CFh ; ст.байт а/н экрана
M_WSCR:EQU 0F3D0h ; ширина экрана
M_BFNTS:EQU 0F3D1h ; а/н знакогенератора
M_INVRS:EQU 0F3D3h ; 00-прямой, FF-инверсный
M_START:EQU 0F3D8h ; адрес запуска
M_cSvMG:EQU 0F3DAh ; константа записи на МГ
M_cLdMG:EQU 0F3DBh ; константа чтения с МГ
M_LdbMG:EQU 0F3DCh ; переменная п/п LdByteMG
M_PosXY:EQU 0F3D4h ; позиция курсора
M_MdPRC:EQU 0F3DDh ; переменная п/п MonPRC
M_SfSTK:EQU 0F3DFh ; сохр-е стека (MonPRC)
M_RTOP:EQU 0F3E3h ; адрес верхней границы ОЗУ
M_RuLa:EQU 0F3E5h ; 00h-LAT, FFh-РУС
M_AUTO:EQU 0F3E6h ; автоповтор клавиатуры
M_ADDR:EQU 0F3EEh ; сохр-е адреса (CMDL)
B_CMDL:EQU 0F3F0h ; а/н командной строки
B_CMDP:EQU 0F3F1h ; параметры в командной строке
ExUSR:EQU 0F3C9h ; адрес п/п MonUSR
ExPRC:EQU 0F3CCh ; адрес п/п MonPRC
ORG 0F800h
; керналь переходов на стандартные п/п монитора
MF800:JMP RESET
MF803:JMP MonKEY
MF806:JMP LdByteMG
MF809:JMP ExPRC
MF80C:JMP SvByteMG
MF80F:JMP MonPRA
MF812:JMP MonTST
MF815:JMP MonPRH
MF818:JMP MonMSG
MF81B:JMP MonSCN
MF81E:JMP MonASK
MF821:JMP ExUSR
MF824:JMP CMD_I
MF827:JMP CMD_O
MF82A:JMP MonSUM
MF82D:JMP MonUZG
MF830:JMP GetTOP
MF833:JMP SetTOP
MF836:JMP LdBYTE
MF839:JMP SvBYTE
MF83C:JMP MonCUR
MF83F:RET
DW 0
RESET:
; "Холодный" сброс ПРК [F800h]
LXI SP,STACK
XRA A
STA PT_MODE
STA PT_BANK
STA PT_SCRN
STA M_INVRS
STA PT_KB_C
MVI A,0C3h
STA ExPRC
STA ExUSR
CALL SetVARS
; инициализация констант чтения/записи
LXI H,C_TAPE
SHLD M_cSvMG
LXI H,T_MAIN
CALL MonMSG
HotSTART:
; "Горячий" сброс ПРК [F86Ch]
LXI SP,STACK
; настройка порта клавиатуры
MVI A,8Ah
STA PT_KB_CFG
; вывод промпта
LXI H,T_PRMPT
CALL MonMSG
STA M_RuLa
LXI H,PrERROR
SHLD M_START
; адрес возврата (HotSTART)
LXI H,HotSTART
PUSH H
CALL INPUT
CALL PrENTER
CALL GetPARAM
; меню команд монитора
LDA B_CMDL
CPI 'M'
JZ CMD_M
CPI 'D'
JZ CMD_D
CPI 'I'
JZ CMD_I
CPI 'O'
JZ CMD_O
CPI 'R'
JZ CMD_R
CPI 'Z'
JZ GO_BOOT
CPI 'C'
JZ CMD_C
CPI 'G'
JNZ PrERROR
PCHL
SetVARS:
; распаковка знакогенератора
LXI H,B_FONTS
SHLD M_BFNTS
CALL MonUZG
; инициализация окна рабочего экрана
LXI H,C_DSCR
SHLD M_BSCR
; инициализация векторов п/п F809 и F821
LXI H,MonPRC
SHLD M_ExPRC
LXI H,MonUSR
SHLD M_ExUSR
; инициализация верхней границы ОЗУ польз.
LXI H,RamTOP
SHLD M_RTOP
MonUSR:
RET
INPUT:
; Ввод данных в командную строку
LXI D,B_CMDL
INPUT1:
CALL MonKEY
CPI '.'
JZ PrERROR
CPI 7Fh ; [ЗБ]
JZ INPUT3
CPI 18h ; []
JZ INPUT5
CPI 08h ; []
JNZ INPUT4
MVI A,0F0h
CMP E
JZ INPUT1
INPUT2:
MVI A,8
DCX D
INPUT3:
CALL MonPRA
JMP INPUT1
INPUT4:
STAX D
INPUT5:
CALL MonPRA
CPI 0Dh ; [Enter]
RZ
INX D
MOV A,E
CPI 0FFh
JNZ INPUT1
JMP INPUT2
GetPARAM:
; Взятие параметров из командной строки
LXI D,B_CMDP
CALL GetADDR
SHLD M_ADDR
RC
CALL GetADDR
XCHG
LHLD M_ADDR
RET
GetADDR:
; Взятие адреса из командной строки
LXI H,0
MOV B,L
MOV C,L
GetADDR1:
DAD B
LDAX D
INX D
CPI 0Dh ; [Enter]
JZ GetADDR3
CPI ','
RZ
SUI '0'
JM PrERROR
CPI 10
JM GetADDR2
CPI 11h
JM PrERROR
CPI 17h
JP PrERROR
SUI 7
GetADDR2:
MOV C,A
DAD H
DAD H
DAD H
DAD H
JNC GetADDR1
PrERROR:
; обработка ошибки в параметрах
MVI A,'?'
CALL MonPRA
JMP HotSTART
GetADDR3:
LXI D,0
STC
RET
PR[M]:
MOV A,M
MonPRH:
; Вывод [A] в HEX-виде
PUSH PSW
RRC
RRC
RRC
RRC
CALL MonPRH1
POP PSW
MonPRH1:
ANI 0Fh
CPI 10
JM $+5
ADI 7
;$+5
ADI '0'
PUSH B
MOV C,A
CALL MF809 ; MonPRC
POP B
RET
MonMSG:
; Вывод сообщения [HL]
MOV A,M
ANA A
RZ
PUSH B
MOV C,A
CALL MF809 ; MonPRC
POP B
INX H
JMP MonMSG
MonSUM:
; Подсчет контрольной суммы
LXI B,0
MonSUM1:
MOV A,C
ADD M
MOV C,A
PUSH PSW
CALL TSTHD
JZ PswRET
POP PSW
MOV A,B
ADC M
MOV B,A
INX H
JMP MonSUM1
PrEntHL:
CALL PrENTER
CALL PR_SPC
PR[HL]:
MOV A,H
CALL MonPRH
MOV A,L
CALL MonPRH
PR_SPC:
MVI A,' '
JMP MonPRA
TSTHD:
MOV A,H
CMP D
RNZ
MOV A,L
CMP E
RET
MonASK:
; Запрос позиции курсора
LHLD M_PosXY
MOV A,L
RRC
RRC
MOV L,A
RET
MonCUR:
; Установка позиции курсора [HL]
MOV A,L
RLC
RLC
MOV L,A
SHLD M_PosXY
RET
SetTOP:
; Установка верхней границы ОЗУ пользователя
SHLD M_RTOP
GetTOP:
; Запрос верхней границы ОЗУ пользователя
LHLD M_RTOP
RET
MonUZG:
; Распаковка знакогенератора в F000h
LXI H,B_CFNTS
LXI D,B_FONTS
MonUZG1:
MVI C,7
XRA A
STAX D
INX D
MonUZG2:
MOV A,M
RLC
RLC
RLC
ANI 7
MOV B,A
MonUZG3:
MOV A,M
ANI 1Fh ; 0001 1111
STAX D
INX D
DCR C
DCR B
JP MonUZG3
INX H
MOV A,H
ANA A
RZ
MOV A,C
ANA A
JNZ MonUZG2
JMP MonUZG1
LdBYTE:
; Чтение байта из доп. страницы ОЗУ
STA PT_BANK
MOV C,M
SetBANK0:
XRA A
STA PT_BANK
RET
SvBYTE:
; Запись байта в доп. страницу ОЗУ
STA PT_BANK
MOV M,C
JMP SetBANK0
LdNxtByte:
; Загрузка байта с магнитофона
; без поиска синхробайта
MVI A,8
LdByteMG:
; Загрузка байта с магнитофона
; I: [A]=FFh - с поиском синх/байта, 08h-без
PUSH B
PUSH D
PUSH H
MVI C,0
MOV D,A
LDA PT_KB_C
RRC
RRC
RRC
RRC
ANI 1
MOV E,A
LdByteMG1:
MOV A,C
ANI 7Fh ; 0111 1111
RLC
MOV C,A
MVI B,0
LdByteMG2:
DCR B
JNZ LdByteMG3
GoSTART:
LHLD M_START
PCHL
LdByteMG3:
LDA PT_KB_C
RRC
RRC
RRC
RRC
ANI 1
CMP E
JZ LdByteMG2
ORA C
MOV C,A
CALL WaitLdMG
LDA PT_KB_C
RRC
RRC
RRC
RRC
ANI 1
MOV E,A
MOV A,D
ORA A
JP LdByteMG6
MOV A,C
CPI 0E6h
JNZ LdByteMG4
XRA A
STA M_LdbMG
JMP LdByteMG5
LdByteMG4:
CPI 19h
JNZ LdByteMG1
MVI A,0FFh
STA M_LdbMG
LdByteMG5:
MVI D,9
LdByteMG6:
DCR D
JNZ LdByteMG1
LDA M_LdbMG
XRA C
AllRET:
POP H
POP D
POP B
RET
SvWordMG:
; Запись слова на магнитофон
; I: [HL] - слово
MOV C,H
CALL SvByteMG
MOV C,L
SvByteMG:
; Запись байта на магнитофон
; I: [C] - байт
PUSH PSW
PUSH D
PUSH B
MVI D,8
SvByteMG1:
MOV A,C
RLC
MOV C,A
MVI A,1
XRA C
STA PT_KB_C
CALL WaitSvMG
XRA A
XRA C
STA PT_KB_C
CALL WaitSvMG
DCR D
JNZ SvByteMG1
POP B
POP D
PswRET:
POP PSW
RET
WaitSvMG:
; задержка импульса записи на МГ
LDA M_cSvMG
JMP WAIT_A
WaitLdMG:
; задержка импульса чтения с МГ
LDA M_cLdMG
WAIT_A:
DCR A
JNZ WAIT_A
RET
CMD_M0:
INX H
CMD_M:
; Модификация ячеек ОЗУ
CALL PrEntHL
CALL PR[M]
CALL PR_SPC
CALL INPUT
LXI D,B_CMDL
LDAX D
CPI 0Dh ; [Enter]
JZ CMD_M0
PUSH H
CALL GetADDR
XCHG
POP H
MOV M,E
JMP CMD_M0
CMD_D:
; Вывод дампа ОЗУ
MOV B,E
CMD_D1:
CALL PrEntHL
CMD_D2:
CALL PR_SPC
MOV A,B
ANA A
JZ CMD_D3
CALL LdBYTE
MOV A,C
JMP CMD_D4
CMD_D3:
MOV A,M
CMD_D4:
CALL MonPRH
INX H
MOV A,L
ANI 0Fh
JNZ CMD_D2
MOV A,L
ANA A
JNZ CMD_D1
CALL INPUT
JMP CMD_D1
CMD_I:
; Загрузка файла с магнитофона
MVI A,0FFh
CALL LdWordMG
XCHG
CALL LdNxtWordMG
XCHG
PUSH H
CMD_I1:
CALL LdNxtByte
MOV M,A
CALL TSTHD
INX H
JNZ CMD_I1
MVI A,0FFh
CALL LdWordMG
MOV B,H
MOV C,L
POP H
CALL PR[HL]
XCHG
CALL PR[HL]
XCHG
PUSH B
CALL MonSUM
POP D
MOV H,B
MOV L,C
CALL PR[HL]
CALL TSTHD
RZ
JMP GoSTART
LdNxtWordMG:
MVI A,8
LdWordMG:
; Чтение слова с МГ
CALL LdByteMG
MOV H,A
CALL LdNxtByte
MOV L,A
RET
CMD_O:
; Запись файла на магнитофон
; I: [HL]-а/н, [DE]-а/к массива
PUSH H
CALL MonSUM
POP H
PUSH B
PUSH H
LXI B,0
CMD_O1:
CALL SvByteMG
DCR B
JNZ CMD_O1
MVI C,0E6h
CALL SvByteMG
CALL SvWordMG
XCHG
CALL SvWordMG
XCHG
POP H
CMD_O2:
MOV C,M
CALL SvByteMG
CALL TSTHD
INX H
JNZ CMD_O2
LXI H,0
CALL SvWordMG
MVI C,0E6h
CALL SvByteMG
POP H
CALL SvWordMG
JMP PR[HL]
CMD_C:
; Окраска экрана
MOV C,L
MVI A,6
STA PT_MODE
MVI A,1
STA PT_BANK
LXI H,M_INVRS
MOV D,M
MOV M,C
CALL MFE00
MOV M,D
XRA A
STA PT_BANK
RET
MonTST:
; Тест состояния клавиатуры
; O: [A]=00h-не нажата, FFh-нажата клавиша
XRA A
STA PT_KB_A
LDA PT_KB_B
XRI 0FFh
RZ
MVI A,0FFh
RET
CMD_R:
; Запуск загрузчика из ROM-диска
LXI D,RD_BOOT
MOV H,E
MOV L,E
MVI A,90h
STA PT_RD_CFG
CMD_R1:
SHLD PT_RD_ADR
LDA PT_RD_DAT
STAX D
INX D
INX H
MOV A,H
CPI 8
JNZ CMD_R1
JMP GO_BOOT
MonKEY:
; Ввод символа с клавиатуры
PUSH B
PUSH D
PUSH H
CALL MonSCN
CPI 0FFh
JNZ MonKEY1
STA M_AUTO
MonKEY1:
MVI D,0
MonKEY2:
INX D
DCR E
INR E
CZ PrCURS
CALL MonSCN
INR A
JZ MonKEY2
PUSH PSW
MOV A,D
RRC
CNC PrCURS
POP PSW
DCR A
JP MonKEY4
; инверсия с/д РУС/LAT
LXI H,M_RuLa
MOV A,M
CMA
MOV M,A
STA PT_KB_C
MonKEY3:
CALL MonSCN
INR A
JNZ MonKEY3
CALL PrCURS
JMP MonKEY1
MonKEY4:
MOV E,A
MVI D,14h
LXI H,M_AUTO
CMP M
JZ MonKEY6
MonKEY5:
DCR D
JZ MonKEY6
CALL MonSCN
CMP E
JZ MonKEY5
MonKEY6:
CALL SOUND
MOV M,E
CALL PrCURS
MOV A,E
JMP AllRET
MonSCN:
; Сканирование клавиатуры
PUSH B
PUSH D
PUSH H
LXI H,AllRET
PUSH H
MVI B,0
MVI D,9
MVI C,0FEh
MonSCN1:
MOV A,C
STA PT_KB_A
RLC
MOV C,A
LDA PT_KB_B
CPI 0FFh
JZ MonSCN2
MOV E,A
CALL MonSCN11
LDA PT_KB_B
CMP E
JZ MonSCN4
MonSCN2:
MOV A,B
ADI 8
MOV B,A
DCR D
JNZ MonSCN1
LDA PT_KB_C
ANI 80h
MVI A,0FEh
RZ
INR A
RET
MonSCN3:
INR B
MonSCN4:
RAR
JC MonSCN3
MOV A,B
ANI 3Fh
CPI 10h
JC MonSCN9
CPI 3Fh
MOV B,A
MVI A,' '
RZ
LDA PT_KB_C
MOV C,A
ANI 40h
JNZ MonSCN5
MOV A,B
ANI 1Fh
RET
MonSCN5:
LDA M_RuLa
ANA A
JNZ MonSCN10
MOV A,C
ANI 20h
MOV A,B
JZ MonSCN6
CPI 1Ch
JM MonSCN7
CPI 20h
JM MonSCN8
JMP MonSCN7
MonSCN6:
CPI 1Ch
JC MonSCN8
MonSCN7:
ADI 10h
MonSCN8:
ADI 10h
POP H
JMP AllRET
MonSCN9:
LXI H,B_CtrKEYS
MOV C,A
MVI B,0
DAD B
MOV A,M
RET
B_CtrKEYS:
DB 0Ch ; [Home]
DB 1Fh ; [СТР]
DB 1Bh ; [AP2]
DB 00h ; [F1]
DB 01h ; [F2]
DB 02h ; [F3]
DB 03h ; [F4]
DB 04h ; [F5]
DB 09h ; [Tab]
DB 0Ah ; [ПС]
DB 0Dh ; [ВК]
DB 7Fh ; [ЗБ]
DB 08h ; [<-]
DB 19h ; [Up]
DB 18h ; [->]
DB 1Ah ; [Down]
MonSCN10:
MOV A,C
ANI 20h
MOV A,B
JZ MonSCN6
CPI 1Ch
JM MonSCN7
CPI 20h
JM MonSCN8
ADI 40h
RET
MonSCN11:
LXI H,0B00h
MonSCN12:
DCX H
MOV A,H
ORA L
JNZ MonSCN12
RET
PrENTER:
MVI A,0Dh
CALL MonPRA
MVI A,0Ah
MonPRA:
PUSH B
MOV C,A
JMP MonPRC1
MonPRC:
; Вывод символа [C]
PUSH B
MonPRC1:
PUSH D
PUSH H
PUSH PSW
MOV A,C
CPI 7Fh
JNZ MonPRC2
; инверсия вывода
LDA M_INVRS
CMA
STA M_INVRS
JMP ALLRET
MonPRC2:
MVI H,20h
SUB H
JC MonPRC4
; вычисление начала образа символа в ZG
MOV L,A
DAD H
DAD H
DAD H
XCHG
LHLD M_BFNTS
DAD D
XCHG
CALL MonPRC14
XCHG
MVI A,16h
MonPRC3:
PUSH PSW
PUSH H
LDA M_INVRS
XRA M
ANI 3Fh ; 0011 1111
MOV L,A
LDA M_MdPRC
DCR A
MVI H,0
;$-3
DAD H
DAD H
INR A
JNZ $-3
XCHG
MOV A,B
XRA M
ANA M
ORA D
MOV M,A
INR H
MOV A,C
XRA M
ANA M
ORA E
MOV M,A
DCR H
INR L
XCHG
POP H
INX H
POP PSW
SUI 3
JP MonPRC3
LXI H,0FD85h ; %%
CPI 0F8h
JNZ MonPRC3
MonPRC4:
; код меньше 20h
LHLD M_PosXY
CALL MonPRC10
DAD B
MOV A,H
CPI 19h
JC MonPRC9
JNZ MonPRC8
INR D
MOV H,D
JZ MonPRC9
PUSH H
LXI H,0
DAD SP
SHLD M_SfSTK
LDA M_WSCR
MOV B,A
LDA M_BSCR
MOV H,A
MVI L,0Ah
SPHL
MVI L,0
MonPRC5:
MVI C,3Ch
MonPRC6:
POP D
MOV M,E
INR L
MOV M,D
INR L
POP D
MOV M,E
INR L
MOV M,D
INR L
DCR C
JNZ MonPRC6
LDA M_INVRS
MonPRC7:
INX SP
MOV M,A
INR L
JNZ MonPRC7
INR H
DCR B
JNZ MonPRC5
LHLD M_SfSTK
SPHL
POP H
MonPRC8:
MVI H,18h
MonPRC9:
SHLD M_PosXY
ALLRET:
POP PSW
JMP AllRET
MonPRC10:
LXI B,0100h
MOV D,C
INR A
CZ MFE00
JZ MonPRC12
CPI 0EBh
RZ
DCR D
ADI 5
RZ
INR D
MVI B,0FFh
INR A
RZ
MVI C,0FCh
CPI 0EFh
RZ
LXI B,0
CPI 0F0h
JNZ MonPRC11
MOV A,L
ANI 0E0h
ADI 20h
MOV L,A
RET
MonPRC11:
MVI C,4
INR A
RZ
CPI 0EFh
JZ SOUND
ADI 0Bh
JZ MonPRC13
INR A
RNZ
MonPRC12:
MOV H,D
MonPRC13:
MOV L,D
MOV B,D
MOV C,D
RET
MonPRC14:
LHLD M_PosXY
MOV A,L
RRC
MOV L,A
RRC
ADD L
MOV B,A
MOV L,H
LDA M_BSCR
MOV H,A
MOV A,B
DCR H
MonPRC15:
INR H
SUI 4
JNC MonPRC15
STA M_MdPRC
PUSH H
LXI H,00FCh
MonPRC16:
DAD H
DAD H
INR A
JNZ MonPRC16
MOV B,H
MOV C,L
POP H
MOV A,L
RLC
RLC
RLC
ADD L
ADD L
MOV L,A
RET
PrCURS:
; Вывод (инверсия) курсора
CALL MonPRC14
ADI 9
MOV L,A
MOV A,B
XRA M
MOV M,A
INR H
MOV A,C
XRA M
MOV M,A
RET
MFE00:
PUSH PSW
PUSH H
LDA M_BSCR
MOV H,A
LDA M_WSCR
ADD H
MOV C,A
MVI L,0
LDA M_INVRS
MOV B,A
;$-4
MOV M,B
INX H
MOV A,H
CMP C
JNZ $-4
POP H
POP PSW
RET
SOUND:
; Звук через EI/DI [MFE1Bh]
LXI B,4014h
SndLOOP:
MOV A,B
;$-2
EI
DCR A
JNZ $-2
MOV A,B
;$-2
DI
DCR A
JNZ $-2
DCR C
JNZ SndLOOP
MOV B,C
RET
T_MAIN:
; Текст приглашения монитора [MFE30h]
DB 31,' orion-128.2',0
T_PRMPT:DB 13,10,10,' =>',7,0
DB 53H
DB 56H
B_CFNTS:
; Упакованный знакогенратор [MFE48h]
DATA M1.CFT ; здесь вставка бинарника
END