Микро-80/Радио 1983-11,12/Программное обеспечение микро-ЭВМ/MonRK80.asm

Материал из Emuverse
Версия от 11:59, 19 июня 2008; Panther (обсуждение | вклад) (http://retro.h1.ru/MK80/CPU/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