Микро-80/Радио 1983-11,12/Программное обеспечение микро-ЭВМ/MonRK80.asm
| Данный материал защищён авторскими правами!
Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей. Автор: Г. ЗЕЛЕНКО, В. ПАНОВ, С. ПОПОВ Источник: http://retro.h1.ru/MK80/CPU/MonRK80.asm |
STEC: .equ 0F7FFH
EKRAN: .equ 0E800H
CURSOR: .equ 0E000H
WRK: .equ 0F750H
RWRK: .equ WRK+1FH
ABUF: .equ WRK+15H
BUF: .equ WRK+70H
WORK: .equ WRK+2BH
REGP: .equ 0E77CH
SREG: .equ WRK+0ADH
PORT0: .equ 0
PORT1: .equ 1
PORT2: .equ 2
PORT3: .equ 3
PORT4: .equ 4
PORT5: .equ 5
PORT6: .equ 6
PORT7: .equ 7
CR: .equ 0DH
LF: .equ 0AH
.org 0F800H
JMP START
JMP CI
JMP MI
JMP CO
JMP MO
JMP CO
JMP STAT
JMP D16
JMP DISSO
START: LXI H,BUF
SHLD ABUF
LXI SP,STEC
MVI A,1FH
CALL DIS
BEGIN: MVI A,8BH
OUT PORT4
LXI SP,STEC
LXI H,SOOB
CALL DISSO
CALL RADR
LXI H,BEGIN
PUSH H
BEG1: LXI H,WORK
MOV B,M
LXI H,TBL
LOOP: MOV A,M
ANA A
JZ ERROR
CMP B
JZ JOB
INX H
INX H
INX H
JMP LOOP
JOB: INX H
SPHL
POP H
LXI SP,SREG
PCHL
;
RADR: LXI H,WORK
RAD: CALL CI
CPI 8
JZ DELE
CNZ DIS
MOV M,A
CPI CR
JZ BKK
MVI A,9AH
CMP L
INX H
JNZ RAD
ERROR: MVI A,3FH
CALL DIS
JMP BEGIN
BKK: MVI M,CR
RET
;
DELE: CALL DELET
JMP RAD
;
DELET: MVI A,7BH
CMP L
RZ
MVI A,8
CALL DIS
DCX H
RET
;
PV: CALL PROB
LXI H,WORK
PVV0: MVI B,0
PVV: CALL CI
CPI 8
JZ OGR
CNZ DIS
MOV M,A
CPI ' '
JZ SPACE
CPI CR
JZ BK
MVI B,0FFH
MVI A,9AH
CMP L
JZ ERROR
INX H
JMP PVV
;
SPACE: MVI M,CR
MOV A,B
RAL
LXI D,WORK
MVI B,0
RET
;
OGR: CALL DELET
JZ PVV0
JMP PVV
;
BK: INX SP
INX SP
RET
;
DISSOOB:LXI H,CRLF
DISSO: MOV A,M
ANA A
RZ
CALL DIS
INX H
JMP DISSO
;
ADRES: LXI H,WRK+1
MVI B,6
XRA A
LIP: MOV M,A
DCR B
JNZ LIP
LXI D,RWRK+0DH
CALL OBADR
SHLD WRK+1
SHLD WRK+3
RC
CALL OBADR
SHLD WRK+3
PUSH PSW
PUSH D
XCHG
LHLD WRK+1
XCHG
CALL HILO1
JC ERROR
POP D
POP PSW
RC
CALL OBADR
SHLD WRK+5
RC
JMP ERROR
;
OBADR: LXI H,0
FSP: LDAX D
INX D
CPI CR
JZ FBK
CPI ','
RZ
CPI ' '
JZ FSP
SUI '0'
JM ERROR
CPI LF
JM FLF
CPI 11H
JM ERROR
CPI 17H
JP ERROR
SUI 7
FLF: MOV C,A
DAD H
DAD H
DAD H
DAD H
JC ERROR
DAD B
JMP FSP
FBK: STC
RET
;
AD16: LHLD WRK+1
MOV A,M
D16: MOV B,A
MOV A,B
RRC
RRC
RRC
RRC
CALL CD16
MOV A,B
CD16: ANI 0FH
CPI 0AH
JM MD16
ADI 7
MD16: ADI 30H
JMP DIS
MD161: CALL DISSOOB
LXI H,WRK+2
ADR16: MOV A,M
CALL D16
DCX H
MOV A,M
CALL D16
PROB: MVI A,' '
JMP DIS
;
HILO: PUSH D
LHLD WRK+1
XCHG
LHLD WRK+3
CALL HILO1
POP D
JZ BK
LXI H,WRK+1
HIL: INR M
RNZ
INX H
INR M
RET
;
HILO1: MOV A,H
CMP D
RNZ
MOV A,L
CMP E
RET
;
XREG: LXI H,RWRK+0DH
MOV A,M
CPI CR
JZ MBK
CPI 'S'
JZ S
LXI D,DIR
CALL ADRS
LXI H,ABUF
INX D
LDAX D
MOV L,A
PUSH H
CALL PROB
MOV A,M
CALL D16
CALL PV
JNC BEGIN
CALL OBADR
MOV A,L
POP H
MOV M,A
RET
S: CALL PROB
LXI H,ABUF+1
CALL ADR16
CALL PV
JNC BEGIN
CALL OBADR
SHLD ABUF
RET
;
ADRS: LDAX D
ANA A
JZ ERROR
CMP M
RZ
INX D
INX D
JMP ADRS
MBK: LXI D,DIR
MVI B,8
CALL DISSOOB
MB1: LDAX D
MOV C,A
INX D
PUSH B
CALL RAZD
LDAX D
LXI H,ABUF
MOV L,A
MOV A,M
CALL D16
POP B
INX D
DCR B
JNZ MB1
LDAX D
MOV C,A
CALL RAZD
LHLD ABUF
SHLD WRK+1
CALL ADR16-3
MVI C,'O'
CALL RAZD
LXI H,WRK+20H
CALL ADR16
JMP DISSOOB
;
RAZD: CALL PROB
MOV A,C
CALL DIS
MVI A,'-'
JMP DIS
;
DIR: .db 'A',68H
.db 'B',6AH
.db 'C',69H
.db 'D',6CH
.db 'E',6BH
.db 'F',67H
.db 'H',6EH
.db 'L',6DH
.db 'S',65H,0
;
SBS: .db LF
.text "START-"
.db 0
SBD: .db LF
.text "DIR. -"
.db 0
BASTR: CALL ADRES
CALL OST
LHLD WRK+1
MOV A,M
MVI M,0FFH
SHLD RWRK+3
STA RWRK+5
RET
;
OST: MVI A,0C3H
STA 038H
LXI H,WOST
SHLD 39H
RET
;
WOST: SHLD RWRK-2
PUSH PSW
LXI H,4
DAD SP
SHLD ABUF
POP PSW
XTHL
DCX H
XTHL
LXI SP,RWRK-2
PUSH D
PUSH B
PUSH PSW
LXI SP,STEC
LHLD ABUF
DCX H
MOV D,M
DCX H
MOV E,M
MOV L,E
MOV H,D
SHLD RWRK
LHLD RWRK+3
CALL HILO1
JZ WOS
LHLD RWRK+6
CALL HILO1
JZ POT
LHLD RWRK+09H
CALL HILO1
JZ POT1
JMP ERROR
WOS: LDA RWRK+5
MOV M,A
LXI H,0FFFFH
SHLD RWRK+3
JMP BEGIN
;
GO: CALL ADRES
LDA RWRK+0DH
CPI CR
JNZ GO1
LHLD RWRK
SHLD WRK+1
GO1: MVI A,0C3H
STA WRK
LXI SP,ABUF
POP H
POP PSW
POP B
POP D
SPHL
LHLD RWRK-2
JMP WRK
;
POTL: CALL ADRES
CALL OST
LHLD WRK+1
SHLD RWRK+6
MOV A,M
MVI M,0FFH
STA RWRK+08H
LHLD WRK+3
SHLD RWRK+09H
MOV A,M
MVI M,0FFH
STA RWRK+0BH
LDA WRK+5
STA RWRK+2
LXI H,SBS
CALL DISSO
LXI H,RWRK+0DH
CALL RAD
CALL ADRES
LXI H,SBD
CALL DISSO
CALL RADR
JMP GO1
POT: LDA RWRK+8
MOV M,A
LHLD RWRK+09H
MVI A,0FFH
CMP M
JZ POT0
MOV B,M
MOV M,A
MOV A,B
STA RWRK+0BH
POT0: CALL MBK
CALL BEG1
LHLD RWRK
SHLD WRK+1
JMP GO1
POT1: LDA RWRK+0BH
MOV M,A
LHLD RWRK+6
MVI A,0FFH
CMP M
JZ POT0
MOV B,M
MOV M,A
MOV A,B
STA RWRK+8
LXI H,RWRK+2
DCR M
JNZ POT0
LDA RWRK+8
LHLD RWRK+6
MOV M,A
JMP BEGIN
;
DISPL: CALL ADRES
CALL DISSOOB
DIPL1: CALL MD161
IPL2: CALL PROB
CALL AD16
CALL HILO
LDA WRK+1
ANI 0FH
JZ DIPL1
JMP IPL2
;
CREF: CALL ADRES
LHLD WRK+5
XCHG
CRE: LHLD WRK+1
LDAX D
CMP M
JZ CRE1
CALL MD161
CALL PROB
CALL AD16
CALL PROB
LDAX D
CALL D16
CRE1: INX D
CALL HILO
JMP CRE
;
FMEM: CALL ADRES
LDA WRK+5
MOV B,A
FM: LHLD WRK+1
MOV M,B
CALL HILO
JMP FM
;
SBAIT: CALL ADRES
MOV C,L
SB: LHLD WRK+1
MOV A,C
CMP M
CZ MD161
CALL HILO
JMP SB
;
TMEM: CALL ADRES
LHLD WRK+5
XCHG
TM: LHLD WRK+1
MOV A,M
STAX D
INX D
CALL HILO
JMP TM
;
MEMOR: CALL ADRES
MEM: CALL PROB
CALL AD16
CALL PV
JNC MEM1
CALL OBADR
MOV A,L
LHLD WRK+1
MOV M,A
MEM1: LXI H,WRK+1
CALL HIL
CALL MD161
JMP MEM
;
JOBS: CALL ADRES
LHLD WRK+1
PCHL
;
MA: CALL DISSOOB
LDA RWRK+0DH
CALL D16
JMP DISSOOB
;
KLB: CALL CI
CPI 1
JZ BEGIN
CALL DIS
JMP KLB
;
QMEM: CALL ADRES
QM: LHLD WRK+1
MOV C,M
MVI A,55H
MOV M,A
CMP M
CNZ QM1
MVI A,0AAH
MOV M,A
CMP M
CNZ QM1
MOV M,C
CALL HILO
JMP QM
QM1: PUSH PSW
CALL MD161
CALL PROB
CALL AD16
CALL PROB
POP PSW
CALL D16
RET
;
LMEM: CALL ADRES
CALL DISSOOB
LM0: CALL MD161
LM: CALL PROB
LHLD WRK+1
MOV A,M
CPI 20H
JC LM1
CPI 80H
JNC LM1
JMP LM2
LM1: MVI A,'.'
LM2: CALL DIS
CALL HILO
LDA WRK+1
ANI 0FH
JZ LM0
JMP LM
;
HEX: LXI H,WRK+1
MVI B,6
XRA A
HE1: MOV M,A
DCR B
JNZ HE1
LXI D,RWRK+0DH
CALL OBADR
SHLD WRK+1
CALL OBADR
SHLD WRK+3
CALL DISSOOB
LHLD WRK+1
SHLD WRK+5
XCHG
LHLD WRK+3
DAD D
SHLD WRK+1
CALL MD161+3
LHLD WRK+3
XCHG
LHLD WRK+5
MOV A,E
CMA
MOV E,A
MOV A,D
CMA
MOV D,A
INX D
DAD D
SHLD WRK+1
CALL MD161+3
JMP DISSOOB
;
INPUT: MVI A,0FFH
CALL MI
STA WRK+2
STA WRK+0FH
MVI A,8
CALL MI
STA WRK+1
STA WRK+0EH
MVI A,8
CALL MI
STA WRK+4
STA WRK+11H
MVI A,8
CALL MI
STA WRK+3
STA WRK+10H
MVI A,8
LXI H,IN3
PUSH H
INP1: LHLD WRK+1
CALL MI
MOV M,A
CALL HILO
MVI A,8
JMP INP1
IN3: LXI H,WRK+0FH
CALL ADR16
LXI H,WRK+11H
CALL ADR16
JMP DISSOOB
;
OUTPUT: CALL ADRES
XRA A
MVI B,0
OU1: CALL MO
DCR B
JNZ OU1
MVI A,0E6H
CALL MO
LDA WRK+2
CALL MO
LDA WRK+1
CALL MO
LDA WRK+4
CALL MO
LDA WRK+3
CALL MO
OU2: LHLD WRK+1
MOV A,M
CALL MO
CALL HILO
JMP OU2
;
VERIFI: MVI A,0FFH
CALL MI
STA WRK+2
MVI A,8
CALL MI
STA WRK+1
MVI A,8
CALL MI
STA WRK+4
MVI A,8
CALL MI
STA WRK+3
VER0: MVI A,8
CALL MI
LHLD WRK+1
CMP M
JZ VER1
PUSH PSW
CALL MD161
CALL PROB
CALL AD16
CALL PROB
POP PSW
CALL D16
VER1: CALL HILO
JMP VER0
;
MI: PUSH B
PUSH D
MVI C,0
MOV D,A
IN PORT1
MOV E,A
MI0: MOV A,C
ANI 7FH
RLC
MOV C,A
MI1: IN PORT1
CMP E
JZ MI1
ANI 1
ORA C
MOV C,A
CALL DELAY7
IN PORT1
MOV E,A
MOV A,D
ORA A
JP MI5
MOV A,C
CPI 0E6H
JNZ MI4
XRA A
STA WRK+7
JMP MI3
MI4: CPI 19H
JNZ MI0
MVI A,0FFH
STA WRK+7
MI3: MVI D,9
MI5: DCR D
JNZ MI0
LDA WRK+7
XRA C
POP D
POP B
RET
;
DELAY7: PUSH PSW
LDA WRK+0CH
DELY33: MOV B,A
POP PSW
DELY: DCR B
JNZ DELY
RET
;
MO: PUSH B
PUSH D
PUSH PSW
MOV D,A
MVI C,8
MO0: MOV A,D
RLC
MOV D,A
MVI A,1
XRA D
OUT PORT1
CALL DELY5
MVI A,0
XRA D
OUT PORT1
CALL DELY5
DCR C
JNZ MO0
POP PSW
POP D
POP B
RET
;
DELY5: PUSH PSW
LDA WRK+0DH
JMP DELY33
;
TBL: .db 'M'
.dw MEMOR
.db 'C'
.dw CREF
.db 'D'
.dw DISPL
.db 'B'
.dw BASTR
.db 'G'
.dw GO
.db 'P'
.dw POTL
.db 'X'
.dw XREG
.db 'F'
.dw FMEM
.db 'S'
.dw SBAIT
.db 'T'
.dw TMEM
.db 'I'
.dw INPUT
.db 'O'
.dw OUTPUT
.db 'V'
.dw VERIFI
.db 'J'
.dw JOBS
.db 'A'
.dw MA
.db 'K'
.dw KLB
.db 'Q'
.dw QMEM
.db 'L'
.dw LMEM
.db 'H'
.dw HEX
.db 0
SOOB: .db LF
.text "*Њ€ЉђЋ/80* ЊЋЌ€’Ћђ"
.db LF,3EH,0
CRLF: .db LF,0
DIS: PUSH H
PUSH B
PUSH D
PUSH PSW
MOV C,A
JMP DI1
CO: PUSH H
PUSH B
PUSH D
PUSH PSW
DI1: LHLD WRK+0AH
LXI D,0F801H
DAD D
MVI M,0
LHLD WRK+0AH
MOV A,C
CPI 1FH
JZ CTR
CPI 8
JZ LEV
CPI 18H
JZ PRAV
CPI 19H
JZ VERX
CPI 1AH
JZ VNIZ
CPI LF
JZ DLF
CPI 0CH
JZ HOME
MOV A,H
CPI 0F0H
JNZ NEP
CALL STAT
ORA A
JZ ECT
CALL CI
ECT: CALL CLEAR
LXI H,EKRAN
NEP: MOV M,C
INX H
OKON: SHLD WRK+0AH
LXI D,0F801H
DAD D
MVI M,80H
POP PSW
POP D
POP B
POP H
RET
CTR: CALL CLEAR
HOME: LXI H,EKRAN
JMP OKON
CLEAR: LXI H,EKRAN
LXI D,CURSOR
CLE1: MVI M,' '
INX H
MVI A,0
STAX D
INX D
MOV A,H
CPI 0F0H
RZ
JMP CLE1
PRAV: INX H
MOV A,H
CPI 0F0H
JNZ OKON
JZ HOME
LEV: DCX H
MOV A,H
CPI 0E7H
JNZ OKON
LXI H,0EFFFH
JMP OKON
VNIZ: LXI D,40H
DAD D
MOV A,H
CPI 0F0H
JNZ OKON
MVI H,0E8H
JMP OKON
VERX: LXI D,0FFC0H
DAD D
MOV A,H
CPI 0E7H
JNZ OKON
LXI D,800H
DAD D
JMP OKON
DLF: INX H
MOV A,L
ORA A
JZ DLF1
CPI 40H
JZ DLF1
CPI 80H
JZ DLF1
CPI 0C0H
JZ DLF1
JMP DLF
DLF1: MOV A,H
CPI 0F0H
JNZ OKON
CALL STAT
ORA A
JZ CTR
CALL CI
JMP CTR
;
CI: PUSH B
PUSH D
PUSH H
CI0: MVI B,0
MVI C,0FEH
MVI D,8
CI2: MOV A,C
OUT PORT7
RLC
MOV C,A
IN PORT6
ANI 7FH
CPI 7FH
JNZ CI1
MOV A,B
ADI 7
MOV B,A
DCR D
JNZ CI2
JMP CI0
CI1: STA WRK+14H
RAR
JNC CI3
INR B
JMP CI1+3
CI3: MOV A,B
CPI '0'
JNC CI4
ADI '0'
CPI 3CH
JC CI5
CPI 40H
JNC CI5
ANI 2FH
CI5: MOV C,A
JMP CI6
CI4: LXI H,TBLK
SUI 30H
MOV C,A
MVI B,0
DAD B
MOV A,M
JMP CI7
CI6: IN PORT5
ANI 7H
CPI 7
JZ CI8
RAR
RAR
JNC CI9
RAR
JNC CI10
MOV A,C
ORI 20H
JMP CI7
CI9: MOV A,C
ANI 1FH
JMP CI7
CI10: MOV A,C
CPI 40H
JNC CI7
CPI 30H
JNC CI11
ORI 10H
JMP CI7
CI11: ANI 2FH
JMP CI7
CI8: MOV A,C
CI7: MOV C,A
CALL CDELY
LXI H,WRK+14H
CI12: IN PORT6
CMP M
JZ CI12
CALL CDELY
MOV A,C
POP H
POP D
POP B
RET
;
CDELY: LXI D,1000H
CDE: DCX D
MOV A,D
ORA E
RZ
JMP CDE
;
TBLK: .db 20H,18H,8,19H,1AH,CR,1FH,0CH
;
STAT: MVI A,0
OUT PORT7
IN PORT6
ANI 7FH
CPI 7FH
JNZ MIMO
XRA A
RET
MIMO: MVI A,0FFH
RET
.end