Files
TZFS/asm/mz-xz009/MON3.ASM

942 lines
21 KiB
NASM

INCLD MACRO
LIST
INCLD XMON-ROM
;
;---------------------------------
; XMON-ROM 8.30.84
;
; JISX MZ-800 --> ASC
; ent A :data
; IX :output sub
; (HL) :tab counter
; E :DISPX
;
;---------------------------------
;
;
JISX: ENT
CP 0DH
JR Z,JISXCR
CP 0AH
JR Z,JISXCR
CALL AJISX ;code change
CP 20H
JR NC,.IX
BIT 0,E ;print/p ?
JR Z,.IX ;no
LD A," "
.IX: JP (IX)
;
JISXCR: CALL .IX
LD M,0
RET
;
AJISX: PUSH BC
LD C,0
CALL AJISX1
POP BC
RET
;
;
AJISX1: CALL PUSHR
LD HL,(CTABLE)
LD B,(HL) ;code counter set
INC HL ;HL=MZ-800
LD D,H ;DE=JIS
LD E,L
INC DE
BIT 0,C ;MZ-800 --> JIS ?
JR Z,AJISX2 ;yes
EX DE,HL
AJISX2: CP (HL)
JR Z,AJISX3 ;code match
INC HL
INC HL
INC DE
INC DE
DJNZ AJISX2
RET
;
AJISX3: LD A,(DE)
RET
;
;
;---------------------------------
;
;
; JISR ASC --> MZ-800
; ent (A) :data
; IX :input sub
;
;---------------------------------
;
;
JISR: ENT
CALL .IX ;input sub :A set
RET C
;
PUSH BC
LD C,1
CALL AJISX1
POP BC
OR A
RET
;---------------------------------
;
$LPT: ENT
DEFW $CMT
DEFM "LPT"
DEFB 0
DEFB 8AH ;Streem, O1C, W
DEFW 0
DEFW LPTINI
DEFW ER59 ;ROPEN
DEFW .RET ;WOPEN
DEFW .RET ;CLOSE
DEFW .RET ;KILL
DEFW 0 ;INP
DEFW LPT1C?
DEFW LPTPOS
;
;
PIO.AC: EQU FCH ;Port-A control
PIO.AD: EQU FEH ;Port-A data
PIO.BC: EQU FDH ;Port-B control
PIO.BD: EQU FFH ;Port-B data
;
P.PLT: EQU 0 ;1P01, 1P09
P.KP5: EQU 1 ;KP5
P.JIS: EQU 2 ;JIS code
P.THRU: EQU 3 ;thrue
;
;
LPTPOS: LD A,(INPFLG)
OR A
LD A,(LPOSB)
RET Z
LD A,(CURX)
RET
;
;
;
;----------------------------------
;
; PL ROM CALL
;
;----------------------------------
ROMST: EQU 03H ;F403H
ROMST1: EQU F400H
;
;
TIMST: ENT
CALL ROMJP2
DEFB ROMST
;
TIMRD: ENT
CALL ROMJP2
DEFB ROMST+3
;
STICK: ENT
CALL ROMJP2
DEFB ROMST+6
;
STRIG: ENT
CALL ROMJP2
DEFB ROMST+9
;
HCPY: ENT
CALL ROMJP
DEFB ROMST+12
;
LPT1C?: ENT
LD HL,DISPX
BIT 0,M
JR NZ,LPT1CX
;
LPT1C: ENT
PUSH IY
EX AF,AF'
LD A,3+15 ;F003+15
LD (APL1CD),A
LD A,.CRT1C
APL1CF: LD (APL1CE),A
EX AF,AF'
CALL APL1C
POP IY
PUSH BC
LD B,A
LD A,(INPFLG)
OR A
LD A,B
POP BC
RET Z
RST 3
APL1CE: DEFB .CRT1C
RET
APL1C: LD IY,JISX
CALL ROMJP
APL1CD: DEFB ROMST+15
;
LPT1CX: ENT
PUSH IY
EX AF,AF'
LD A,3+18 ;F003+18
LD (APL1CD),A
LD A,.CRT1CX
JR APL1CF
;
LPTINI: ENT
CALL ROMJP
DEFB ROMST+21
;
LPTOUT: ENT
CALL ROMJP
DEFB ROMST+24
;
PBCCLR: ENT
CALL ROMJP
DEFB ROMST+27
;
SPLOFF: ENT
CALL ROMJP
DEFB ROMST+30
;
SPLON: ENT
CALL ROMJP
DEFB ROMST+33
;
SPLSW: ENT
CALL ROMJP
DEFB ROMST+36
;
LPTM02: ENT
CALL ROMJP
DEFB ROMST+39
;
;---------------------------
;
;
;
ROMJP: EX AF,AF'
LD A,(PSEL)
BIT P.KP5,A
JR Z,ROMJP1
;
PUSH BC
LD B,3
SVC .MCTRL
RST 3
DEFB .MCTRL
ENDM
POP BC
;
ROMJP1: EX AF,AF'
ROMJP2: EX AF,AF'
XOR A
LD (KEY266),HL
LD (HERRF),A
EX AF,AF'
DI
LD (KEY264),SP
EX (SP),HL ;HL=call stored address
LD SP,HL ;
POP HL ;HL=call address
OUT (LSE3),A
LD SP,KEY262
CALL HLJP
OUT (LSE1),A
LD SP,(KEY264)
EX (SP),HL
INC SP
INC SP
EI
EX AF,AF'
LD A,(HERRF)
OR A
JR NZ,ROMERR
EX AF,AF'
RET
HLJP: LD H,0F4H ;HL=F4??H
JP (HL)
;
;
ROMERR:
LD B,A ;B=0
EX AF,AF'
DEC B ;B=1
JP Z,BREAKZ
DEC B ;B=2
JP NZ,ERRORJ
ROMER1: LD HL,(PBCN) ;INIT M2
LD A,H
OR L
JR Z,LPTM02
CALL SPLON
SVC .BREAK
RST 3
DEFB .BREAK
ENDM
JP Z,BREAKZ
JR ROMER1
;
;
LPTINT: ENT
DI
PUSH AF
PUSH HL
PUSH BC
LD (WKLINT),SP
LD SP,WKLINT
OUT (LSE3),A
CALL ROMST1
OUT (LSE1),A
LD SP,(WKLINT)
POP BC
POP HL
POP AF
EI
RETI
DEFS 8
WKLINT: DEFW 0
;
END
SKP H
INCLD MONOP
; ---------------------------
; MZ-800 Monitor command
; FI:MONOP ver 1.0A 8.04.84
; ---------------------------
;
MONOP: ENT
PUSH HL
LD DE,(ERRORP)
PUSH DE
LD DE,MONERR
LD (ERRORP),DE ;error ret adr set
LD A,(LINLIM)
PUSH AF
LD A,100 ;getline max set
LD (LINLIM),A
LD (MONSP+1),SP ;stack pointer push
XOR A
LD (FILOUT),A ;crt mode
MONCLD: LD SP,0000H ;stack initize
MONHOT: LD BC,MONHOT
PUSH BC ;last return addrs set
SVC .CR2 ;linefeed & cr
RST 3
DEFB .CR2
ENDM
LD A,"*" ;prompt disp
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
CALL MONEDT ;memory corretion ?
JR NC,-3
LD A,(DE)
CP "*"
RET NZ ;prompt check
INC DE
LD A,(DE) ;acc=next interpret data
INC DE ;next interpret data addr
;
;
; moniter tabel command jump
;
EXX ;parameter push
LD HL,MNCMTB
LD B,10 ;commands counter
MNCMCP: CP M
INC HL
JR Z,MNCMOK ;skip if just command
INC HL ;next search
INC HL
DJNZ MNCMCP
EXX
RET
;
MONERR: LD C,A
AND 7FH
JR Z,MONCLD ;Break
LD A,C ;acc=errcode
SVC .ERRX ;display error messege
RST 3
DEFB .ERRX
ENDM
SVC .ERCVR ;error recover fd/qd
RST 3
DEFB .ERCVR
ENDM
JR MONCLD
;
;
MNCMOK: LD E,M
INC HL
LD D,M
PUSH DE ;commnd addr set
EXX ;parameter pop
RET
;
MNCMTB: DEFM 'D'
DEFW MONDMP
DEFM 'M'
DEFW MONSET
DEFM 'P'
DEFW MONPRT
DEFM 'G'
DEFW MONGOT
DEFM 'F'
DEFW MONSCH
DEFM 'R'
DEFW MONSP
DEFM 'S'
DEFW MONSAV
DEFM 'L'
DEFW MONLOD
DEFM 'V'
DEFW MONVRY
DEFM 'T'
DEFW MONTRN
;
MONPRT: LD A,(FILOUT) ;lpt/crt
XOR 1
LD (FILOUT),A
RET
;---------------------------------
;
; moniter save commnd
;
;---------------------------------
MONSAV: CALL SAVTRN ;set addrs
RET C
EXX
CALL FNMST ;file name set
EXX
LD (ELMD20),BC ;bytes
LD (ELMD22),DE ;data adrs
LD (ELMD24),HL ;exec adrs
SVC .SAVEF ;save file
RST 3
DEFB .SAVEF
ENDM
RET
;---------------------------------
;
; moniter load command
;
;---------------------------------
MONLOD: CALL HLSET ;load addr set
PUSH HL ;hl=load addrs
PUSH AF
CALL LOAVRY ;filename set & open
POP AF
POP HL
JR NC,+5 ;user load addr set ??
LD HL,(ELMD22)
SVC .LOADF ;load file
RST 3
DEFB .LOADF
ENDM
RET
;---------------------------------
;
; filename set & open
;
;---------------------------------
LOAVRY: CALL FNMST ;file name set
SVC .LOPEN ;ropen
RST 3
DEFB .LOPEN
ENDM
CP 1
RET Z
JP ER61 ;File mode error
;---------------------------------
;
; moniter verify command
;
;---------------------------------
MONVRY: CALL LOAVRY ;filename set
LD HL,(ELMD22)
SVC .VRFYF ;file verify
RST 3
DEFB .VRFYF
ENDM
RET
;---------------------------------
;
; moniter rerturn command
;
; to BASIC
;---------------------------------
MONSP: LD SP,0000H
POP AF
LD (LINLIM),A
POP HL
LD (ERRORP),HL
POP HL
RET
;---------------------------------
;
; moniter operation
;
;---------------------------------
MONEDT: LD DE,FF00H ;moniter work
SVC .GETL
RST 3
DEFB .GETL
ENDM
JR C,MONEDE
;
; check ':xxxx='
;
LD A,(DE)
CP ":" ;mem correct ??
SCF
RET NZ
;
INC DE
CALL HLSET ;addrs input ?
RET C
LD A,(DE)
INC DE
XOR 3DH ;"=" input ?
RET NZ
;
;
NEXTAC: CALL ACSET ;data read
CCF
RET NC
LD M,A ;mem correction !
INC HL ;next pointer
JR NEXTAC
;
;
MONEDE: LD (DE),A ;error
RET
;----------------------------------
;
; 4 ascii to binary (word)
;
; ent. de=ascii data pointer
; ext hl=xxxxH
;
;----------------------------------
HLSET: PUSH HL
CALL SPCTAC ;separater search
PUSH DE
CALL ACSETH ;2 ascii to binary
JR C,HLSETE
LD H,A
CALL ACSETH ;2 ascii to binary
JR C,HLSETE
LD L,A
POP AF
POP AF
XOR A
RET
;
HLSETE: POP DE
POP HL
SCF
RET
;----------------------------------
;
; separater search
;
;----------------------------------
SPCTA2: INC DE
SPCTAC: LD A,(DE)
CP 20H
JR Z,SPCTA2
RET
;---------------------------------
;
; 1 ascii to binary (nible)
;
; ent. de=ascii data pointer
; ext acc= 0xH
;
;---------------------------------
ACSETS: LD A,(DE)
SVC .CKHEX ;0-9 a-f check
RST 3
DEFB .CKHEX
ENDM
INC DE ;next pointer
RET
;---------------------------------
;
; 2 ascii to binary (byte)
;
; ent. de=ascii data pointer
; ext acc= xxH
;
;---------------------------------
ACSET: CALL SPCTAC ;separeter search
CP ";"
JR Z,SEMIOK ;skip if ascii input
ACSETH:
PUSH BC
PUSH DE
CALL ACSETS ;1 ascii to binary(nible)
JR C,ACSTER
LD C,A ;high nible
CALL ACSETS ;1 ascii to binary(nible)
JR C,ACSTER
LD B,A ;low nible
LD A,C
RLCA
RLCA
RLCA
RLCA
ADD A,B
LD C,A
LD A,C
POP BC
POP BC
OR A
RET
;
ACSTER: POP DE
POP BC
SCF
RET
;----------------------------------
;
; ascii code input mode
;
;----------------------------------
SEMIOK: INC DE
LD A,(DE)
INC DE
OR A ;¯¯JR ACSETO
RET ;¯¯
;----------------------------------
;
; moniter jump commnd
;
;----------------------------------
MONGOT: CALL HLSET ;addrs set
RET C
JP (HL)
;----------------------------------
;
; moniter dump commnd
;
;----------------------------------
MONDMP: CALL HLSET ;top addrs set
JR C,MONDP1 ;skip if 'd' only
PUSH HL
CALL HLSET ;end addrs set
JR C,MONDP2 ;skip if top addrs only
POP DE
EX DE,HL
JR MONDP3
;
;
;
MONDP2: POP HL ;
MONDP1: EX DE,HL
LD HL,80H
ADD HL,DE ;last addrs calc
EX DE,HL
MONDP3: LD C,8 ;counter set
CALL MONDPS ;dump list disp
RET C
PUSH HL
SBC HL,DE ;dump end calc
POP HL
RET NC
JR MONDP3
;
MONDPS: CALL HLHXPR ;addrs disp
LD B,C
PUSH HL
MONDP4: LD A,M ;data read
CALL ACHXPR ;1 byte disp
INC HL
LD A,20H ;space disp
SVC .&1C
RST 3
DEFB .&1C
ENDM
DJNZ MONDP4
POP HL
;
LD A,"/" ;separater disp
SVC .&1C
RST 3
DEFB .&1C
ENDM
LD B,C
MONDP5: LD A,M ;data read
CP 20H ;contol code
JR NC,+4
LD A,"." ;yes, control code
SVC .&1C
RST 3
DEFB .&1C
ENDM
INC HL ;next pointer
DJNZ MONDP5
;
SVC .&CR ;
RST 3
DEFB .&CR
ENDM
SVC .HALT ;braek & stop
RST 3
DEFB .HALT
ENDM
OR A
RET
;--------------------------------
;
; disp addrs
;
; ent. hl=addrs
; ':xxxx='
;
;--------------------------------
HLHXPR: LD A,":"
SVC .&1C
RST 3
DEFB .&1C
ENDM
LD A,H
CALL ACHXPR ;acc disp
LD A,L
CALL ACHXPR ;acc disp
LD A,"="
SVC .&1C
RST 3
DEFB .&1C
ENDM
RET
;--------------------------------
;
; acc disp
;
; ent. acc = disp data
;
;--------------------------------
ACHXPR: PUSH AF
RLCA
RLCA
RLCA
RLCA
CALL AC1HXP ;nible disp
POP AF
AC1HXP: AND 0FH ;ascii trans
ADD A,30H
CP ":"
JR C,+4
ADD A,7
SVC .&1C ;disp acc(nible)
RST 3
DEFB .&1C
ENDM
RET
;---------------------------------
;
; moniter mem correction comd
;
;---------------------------------
MONSET: CALL HLSET ;
LD A,(FILOUT) ;lpt/crt switch
PUSH AF
XOR A
LD (FILOUT),A ;crt mode
MONSTL: SVC .CR2
RST 3
DEFB .CR2
ENDM
CALL HLHXPR ;addrs disp
LD A,M ;data read
CALL ACHXPR ;data disp
LD A,20 ;back space
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
CALL MONEDT ;moniter operation
JR NC,MONSTL
POP AF
LD (FILOUT),A
RET
;--------------------------------
;
; moniter search command
;
;--------------------------------
MONSCH: CALL HLSET ;start addrs
RET C
PUSH HL
CALL HLSET ;end addrs
POP BC
RET C
PUSH HL ;hl end addr
PUSH BC ;bc start addr
LD HL,FF00H ;check data read
CALL NEXTAC ;(hl)<--data
LD DE,FF00H
OR A
SBC HL,DE ;check data bytes
LD C,L
POP HL
PUSH HL
EXX
POP HL ;hl start addr
POP DE ;de end addr
EXX
RET Z
MNSHLP: CALL HLDECK ;de=FF00h
JR NZ,SKPSCH ;de check databuf
CALL MONDPS ;data disp
RET C
SKPSCH: SVC .BREAK
RST 3
DEFB .BREAK
ENDM
RET Z
EXX
INC HL ;next check pointer
PUSH HL
SCF
SBC HL,DE ;end check ?
POP HL
RET NC
PUSH HL
EXX
POP HL ;next check pointer
JR MNSHLP
;----------------------------------
;
; 3 pointer data interpret
;
; ent de=ascii data top addr
;
; ext de=first data
; bc=(second-first) data
; hl=last data
;
; used save,xfer commnd
;
; command : save : xfer
;
; de : start: source
; bc : bytes: bytes
; hl : end : destination
;----------------------------------
SAVTRN: CALL HLSET ;first
PUSH HL
CALL NC,HLSET ;second
POP BC ;first
RET C
SBC HL,BC ;calc bytes
INC HL
PUSH HL ;bytes
PUSH BC ;first
CALL HLSET ;last
PUSH HL ;last
EXX
POP HL ;last
POP DE ;first
POP BC ;bytes
RET
;-------------------------------
;
; moniter xfer command
;
;-------------------------------
MONTRN: CALL SAVTRN ;
RET C
EX DE,HL
PUSH HL
SBC HL,DE ;direction check
POP HL
JR C,LDDRTR
LDIR
RET
LDDRTR: ADD HL,BC ;last addrs calc
DEC HL
EX DE,HL
ADD HL,BC
DEC HL
EX DE,HL
LDDR
RET
;----------------------------------
;
; filename set
;
;----------------------------------
FNMST: LD A,(DE)
OR A
JR Z,FNMST2
INC DE
CP ":" ;demiliter seach
JR NZ,FNMST
FNMST2: SVC .COUNT ;count string length
RST 3
DEFB .COUNT
ENDM
SVC .DEVFN ;interpret dev. file name
RST 3
DEFB .DEVFN
ENDM
LD A,1
LD (ELMD),A ;.OBJ atribut
RET
;---------------------------------
;
; check (de) (hl) ?
;
; hl,de check data point
; c counter
;
;---------------------------------
HLDECK: LD A,(DE)
CP M
RET NZ
PUSH BC
PUSH DE
PUSH HL
LD B,C
HLDEC1: LD A,(DE)
CP M
JR NZ,HLDEC2
INC DE
INC HL
DJNZ HLDEC1
XOR A
HLDEC2: POP HL
POP DE
POP BC
RET
;
END
END