Files
TZFS/asm/mz-xz009/MON-IOCS.ASM

1536 lines
32 KiB
NASM

; -----------------------------
; Lx-monitor IOCS-part
; FI:MON-IOCS ver 1.01 5.24.84
; -----------------------------
;
INCLD MACRO
ORG 1800H
;
$IOCS: ENT
JP $START
;
; FALG1 bit position
;
##REN: EQU 0 ;ROPEN enable
##WEN: EQU 1 ;WOPEN enable
##RCHR: EQU 2 ;Read at 1 char
##WCHR: EQU 3 ;Write at 1 char
##FNM: EQU 4 ;File name exist
##RND: EQU 5 ;FD
##SEQ: EQU 6 ;CMT, QD, XM
##STRM: EQU 7 ;CRT, LPT, RS, USR
;
; FLAG2 bit position
;
##CMT: EQU 7 ;Disp filename
##1OPN: EQU 6 ;1 file only open
##1WOP: EQU 5 ;1 file only wopen
##EOFE: EQU 4 ;select EOF process
; bit 0,1,2 ..... max channel
;
; ZRWX bit position
;
##ROPN: EQU 0 ;R.opened
##WOPN: EQU 1 ;W.opened
##XOPN: EQU 2 ;X.opened
##LOPN: EQU 3 ;L.opened
##EOF: EQU 7 ;End of file
;
; DIR offset
;
#SIZE: EQU 20
#PTR: EQU 64 ;BSD block pointer
#BLKNO: EQU 64+16-2 ;BSD block number
;
CMTLU: EQU 80H
CRTLU: EQU 88H
LPTLU: EQU 89H
;
;
CRTLU?: LD A,(ZLOG)
CP CRTLU
RET
;
ZMODE: DEFW 0 ;File mode
ZBUFF: ENT
DEFW 0 ;Buffer adrs
ZBUFE: ENT
DEFW 0 ;Buffer end
SKP H
;
; SVC .PRSTR ;print string into file
; ent DE:adrs
; B: length
;
PRTSTR: ENT
CALL IO.RDY
CALL PRTST0
IO.OK: ENT
XOR A
LD (QSEG),A
RET
;
IO.RDY: ENT
LD A,(ZLOG)
LD (QSEG),A
RET
;
PRTST0: CALL PUSHR
LD A,(ZFLAG1)
BIT ##STRM,A
LD HL,PRT1C
JR Z,PRTST2
BIT ##WCHR,A ;Output at
LD HL,.ZOUT
JR NZ,PRTST2 ; 1 char
.ZOUT: IOCALL ZOUT ; 1 line
LD IX,(ZOUT)
CALL IOCALL
ENDM
RET
;
PRTST2: LD A,B ;SEQ/RND
OR A
RET Z
LD A,(DE)
PRTST4: CALL .HL ;PRT1C or .ZOUT
INC DE
DEC B
JR PRTST2
;
PRT1C: CALL PUSHR
LD E,(IY+#PTR)
LD D,(IY+#PTR+1)
LD HL,(ZBUFF)
ADD HL,DE
LD M,A
INC DE
LD HL,(ZBLK)
OR A
SBC HL,DE
CALL Z,PRT1B ;Buffer full
LD (IY+#PTR),E
LD (IY+#PTR+1),D
INC (IY+#SIZE)
RET NZ
INC (IY+#SIZE+1)
RET NZ
JP ER55 ;too long file
SKP H
;
PRT1B: PUSH BC ;Output 1 block
LD B,02H ;F# not update, blocked
PRT1B0: CALL ?RND
LD IX,.ZOUT
JR Z,+6
LD IX,PRX1B
LD A,B
CALL SEQSET
CALL .IX
PRT1B9: INC (IY+#BLKNO)
LD DE,0
POP BC
RET
;
.IX: JP (IX)
;
PRT1BX: LD A,1AH ;Output last block
LD E,(IY+#PTR)
LD D,(IY+#PTR+1)
PRT1X2: LD HL,(ZBUFF)
ADD HL,DE
LD M,A
INC DE
LD HL,(ZBLK)
XOR A
SBC HL,DE
JR NZ,PRT1X2
PUSH BC
LD HL,(ZBUFF)
DEC HL
LD M,FFH ;EOF mark
DEC HL
LD M,FFH
LD B,06H ;F# update, blocked
JR PRT1B0
;
;
SEQSET: LD BC,(ZBLK)
INC BC
INC BC
LD HL,(ZBUFF)
DEC HL
DEC HL
LD DE,(ZMODE)
RET
;
;
.ZEND: DEFB F6H
.ZSTRT: XOR A
IOCALL ZSTRT
LD IX,(ZSTRT)
CALL IOCALL
ENDM
RET
SKP H
;
; SVC .INSTT ;INPUT command start
;
INPSTRT:ENT
CALL CRTLU? ;input start
RET NZ
PUSH DE
LD DE,KEYBUF
CALL BINPUT
LD (INPKB+1),DE
POP DE
RET NC
JP BREAKZ
;
; SVC .INMSG ;input from file
; ent DE:adrs
; ext B: length
;
INPMSG: ENT
PUSH HL
PUSH DE
CALL IO.RDY
LD HL,(ZTOP)
INC HL
BIT ##EOF,M
PUSH HL
LD B,0
SCF
CALL Z,INPMS0
POP HL
CALL C,INEOF
POP DE
PUSH AF
CALL IO.OK
LD L,B
LD H,0
ADD HL,DE
LD M,0
POP AF
POP HL
RET
;
INEOF: SET ##EOF,M
LD HL,ZFLAG2
BIT ##EOFE,M
RET Z ;nomally
JP ER63 ;old method
;
INPMS0: CALL CRTLU? ;input 1 record
JR Z,INPKB
LD A,(ZFLAG1)
BIT ##STRM,A
LD HL,INP1C
JR Z,INPMC
BIT ##RCHR,A
LD HL,.ZINP
JR NZ,INPMC
.ZINP: IOCALL ZINP
LD IX,(ZINP)
CALL IOCALL
ENDM
RET
;
INPKB0: LD A,"?"
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
LD A," "
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
SVC .INSTT
RST 3
DEFB .INSTT
ENDM
INPKB: LD HL,0 ;xxx
CALL HLFTCH
OR A
JR Z,INPKB0
LD C,0
SVC .INDATA
RST 3
DEFB .INDATA
ENDM
LD (INPKB+1),HL
RET
;
; SVC .INDAT ;read 1 item from buffer
; ent HL:data pointer
; DE:input buffer
; C: separater(nomaly 00H or ":")
; ext B: length
; HL:data pointert
;
INPDT: ENT
LD B,0
TEST1 '"'
CALL TEST1
DEFB '"'
ENDM
JR NZ,INPDT6
INPDT2: LD A,M
OR A
RET Z
INC HL
CP '"'
JR Z,INPDT4
LD (DE),A
INC DE
INC B
JR INPDT2
INPDT4: TEST1 ","
CALL TEST1
DEFB ","
ENDM
OR A ;Reset CF
RET
;
INPDT6: LD A,M
OR A
RET Z
CP C
RET Z
INC HL
CP ","
RET Z
LD (DE),A
INC DE
INC B
JR INPDT6
;
INPMC: LD (INPMC2+1),HL ;input by chr
LD B,0
INPMC2: CALL 0 ;INP1C or (ZINP)
RET C
CP 0DH
RET Z
LD (DE),A
INC DE
INC B
JR NZ,INPMC2
JP ER41 ;I/O error
SKP H
;
INP1C0: ENT
LD A,(ZFLAG1)
BIT ##STRM,A
JP NZ,ER59 ;STRM ommit
INP1C: CALL PUSHR
LD E,(IY+#PTR)
LD D,(IY+#PTR+1)
LD HL,(ZBLK)
OR A
SBC HL,DE
CALL Z,INP1B
RET C
LD L,(IY+#BLKNO)
LD H,(IY+#BLKNO+1)
XOR A
SBC HL,DE
SCF
RET Z ;EOF
LD HL,(ZBUFF)
ADD HL,DE
LD A,M
INC DE
LD (IY+#PTR),E
LD (IY+#PTR+1),D
RET
;
INP1B: CALL ?RND
JP NZ,INX1B
DEFB F6H ;not first block
INP1B0: XOR A ;first block
CALL SEQSET
CALL .ZINP
RET C
LD A,M
INC HL
AND M
LD M,FFH
INC A
LD DE,0
RET NZ ;Nomal block
PUSH HL ;EOF block
LD HL,(ZBUFE)
LD BC,(ZBLK)
INP1B2: DEC HL
DEC BC
LD A,M
OR A
JR Z,INP1B2
POP HL
LD M,B ;#BLKNO := Block length
DEC HL
LD M,C
RET
SKP H
;
; SVC .LUCHK ;check lu & set Z-area
; ent A: lu
; ext A: 1:R, 2:W
; if CF then not-found
;
LUCHK: ENT
CALL PUSHR
LD HL,CRTTBL
CP CRTLU
JR Z,LUCHK4
LD HL,LPTTBL
CP LPTLU
JR Z,LUCHK4
SVC .SEGAD
RST 3
DEFB .SEGAD
ENDM
RET C ;LU# not found
LUCHK4: LD (ZTOP),HL
LD DE,ZLOG
LD BC,8
LDIR
LD (ZMODE),HL
LD IY,HL
LD DE,ELMD
CALL LDIR64
PUSH HL
LD HL,(ZEQT)
LD DE,ZNXT
LD BC,ZBYTES
LDIR
POP HL
LD BC,16
ADD HL,BC
LD (ZBUFF),HL
LD BC,(ZBLK)
ADD HL,BC
LD (ZBUFE),HL
LD A,(ZRWX)
AND 0FH
RET
;
;
CRTTBL: DEFB CRTLU
DEFB 3 ;W R
DEFW $CRT
DEFW 0
DEFW 0
;
LPTTBL: DEFB LPTLU
DEFB 2 ;W
DEFW $LPT
DEFW 0
DEFW 0
;
SKP H
;
; SVC .DEVNM ;Interp. dev name
; ent DE:device name pointer
; ext DE:equipment table
; HL:file name pointer
; A: channel
;
DEV: ENT
LD HL,KEYBUF
PUSH HL
LD A,B
OR A
CALL NZ,LDHLDE
LD M,0
LD HL,EQTBL
JR +5
DEV1: LD HL,0 ;xxx
LD A,L
OR H
JR Z,DEV8 ;Not found
LD (DEV7+1),HL
CALL LDDEMI
LD (DEV1+1),DE
LD DE,KEYBUF
EX DE,HL
DEV2: LD A,(DE)
OR A
JR Z,DEV4
CP M
JR NZ,DEV1 ;Mismatch
INC HL
INC DE
JR DEV2
DEV4: LD A,M
INC HL
CP ":"
LD C,0
JR Z,DEV5 ;Match
SUB "1"
CP 9
JR NC,DEV1 ;Mismatch
LD C,A
LD A,M
INC HL
CP ":"
JR NZ,DEV1 ;Mismatch
DEV5: EX (SP),HL ;Found
DEV7: LD HL,0 ;xxx
LD A,C
JR DEV9
DEV8: POP HL ;Not found
PUSH HL
DEV82: LD A,M
INC HL
CP ":"
JP Z,ER58 ;Dev name err
OR A
JR NZ,DEV82
LD HL,(DDEV)
LD A,(DCHAN)
DEV9: LD (ZEQT),HL
PUSH HL
LD (ZCH),A
LD DE,ZNXT
LD BC,ZBYTES
LDIR
LD B,A
LD A,(ZFLAG2)
AND 07H ;bit 0,1,2
CP B
JP C,ER58 ;Dev name err (CH#)
LD A,B
POP DE
POP HL
RET
;
; SVC .DEVFN ;Interp. dev&file name
; ent DE:pointer
; B: length
;
DEV&FN: ENT
CALL PUSHR
SVC .DEVNM
RST 3
DEFB .DEVNM
ENDM
EX DE,HL
LD HL,ELMD1
LD B,31
CALL ?CLRHL
LD HL,ELMD
SVC .COUNT
RST 3
DEFB .COUNT
ENDM
CALL SETFNAM
LD HL,ZFLAG1
BIT ##FNM,M
RET Z
INC HL
BIT ##CMT,M
RET NZ
LD A,(ELMD1) ;except CMT,
CP 0DH ; no filename is
JP Z,ER60 ; error 60.
RET
SKP H
;
; SVC .RWOPEN ;ROPEN/WOPEN/XOPEN
;
RWOPEN: ENT
CALL PUSHR
CALL OPEN00
LD B,0
CALL TYPECK
JP DUST
;
OPEN00: LD A,(ZLOG)
SVC .SEGAD
RST 3
DEFB .SEGAD
ENDM
JP NC,ER43 ;LU already opened
CALL ?OPEND ;Check already opened
LD HL,8+64+16+5 ;LU, DIR and work
LD A,(ZFLAG1)
LD DE,(ZBLK)
INC DE
INC DE
BIT ##STRM,A
JR NZ,+3
ADD HL,DE ;SEQ,RND
LD A,(ZRWX)
BIT 2,A
JR Z,+3
ADD HL,DE ;XO
EX DE,HL
LD A,(ZLOG)
SVC .OPSEG ;open segment
RST 3
DEFB .OPSEG
ENDM
LD (QSEG),A
LD (ZTOP),HL
EX DE,HL
LD HL,ZLOG
LD BC,8
LDIR ;xfer ZLOG to seg
LD (ZMODE),DE
LD IY,DE
LD HL,ELMD
CALL LDIR64 ;xfer ELMD to seg
LD HL,16
ADD HL,DE
LD (ZBUFF),HL
LD DE,(ZBLK)
ADD HL,DE
LD (ZBUFE),HL
CALL ?RND
JP NZ,OPX ;RND
LD A,(ZRWX) ;SEQ/STRM
BIT ##XOPN,A
JP NZ,ER59
BIT ##WOPN,A
LD IX,(ZWO)
JR NZ,OPEN20
LD A,(ZFLAG1)
BIT ##STRM,A
JR Z,OPEN30
LD IX,(ZRO) ;STRM RO
OPEN20: LD HL,ELMD ;SEQ/STRM WO
JP IOCALL
OPEN30: LD B,(IY+0) ;SEQ RO
CALL SERFLR
LD A,(ELMD)
CP B
JP NZ,ER61
JP INP1B0 ;First call
;
; SVC .LOPEN ;Search for LOAD
;
LOPEN: ENT
CALL PUSHR
LD IY,0100H ;(ZLOG)=0
LD (ZLOG),IY ;(ZRWX)=1 ;R
LD IY,ELMD
CALL ?RND
LD HL,LOPX
JR NZ,+5
LD HL,SERFLR
CALL .HL
LD B,80H
CALL TYPECK
LD A,(ELMD)
RET
;
; type check (chained or contiguas)
;
TYPECK: LD A,(ELMD)
CP 5
RET C
LD A,(ELMD18)
AND 80H
CP B
RET Z
JP ER61
SKP H
;
; SVC .CLKL ;CLOSE/KILL
; ent A: lu, if A=0 then all-files
; B: B=0:KILL, B<>0:CLOSE
;
CLKL: ENT ;CLOSE/KILL file
CALL PUSHR
OR A
JR Z,CLKLA
CALL CL1F
JP DUST
;
CL1F: SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
RET C ;LU# not found
CALL IO.RDY
PUSH AF
CALL ?RND
JR NZ,CL1FR
BIT ##STRM,A
LD A,B
JR Z,CL1FB
OR A ;Streem I/O
LD IX,(ZKL)
JR Z,+6
LD IX,(ZCL)
CALL IOCALL
JR CL1F8
CL1FB: OR A ;SEQ I/O
JR Z,CL1F8
LD A,(ZRWX)
BIT ##WOPN,A
CALL NZ,PRT1BX
JR CL1F8
CL1FR: CALL CLX ;RND I/O
CL1F8: POP AF
SVC .DLSEG
RST 3
DEFB .DLSEG
ENDM
RET
;
; SVC .CLRIO ;clear all i/o
;
CLRIO: ENT
CALL PUSHR
LD B,0
CLKLA: LD C,8EH ;all files
CLKLA2: LD A,C
PUSH BC
SVC .SEGAD
RST 3
DEFB .SEGAD
ENDM
CALL NC,CL1F
POP BC
DEC C
JR NZ,CLKLA2
JP ERRCVR
SKP H
;
; search file (SEQ device)
;
SERFIL: ENT
CALL PUSHR ;Search file
LD A,(ZFLAG1)
BIT ##SEQ,A
JP Z,ER59 ;SEQ only ok
CALL .ZSTRT
LD A,(ZDIRMX)
LD B,A
SERFL2: LD HL,KEYBUF
PUSH BC
IOCALL ZRO ;RDINF
LD IX,(ZRO)
CALL IOCALL
ENDM
POP BC
SET 0,A ;A<>0
RET C ;Not found
LD DE,IY
CALL FNMTCH
LD A,M
RET Z
DJNZ SERFL2
XOR A ;end of dir
SCF
RET
;
; search file for WOPEN, SAVE
; (SEQ device)
;
SERFLW: ENT
CALL ?OPEND
CALL SERFIL
JP NC,ER42 ;already exist
OR A
JP Z,ER51 ;too many files
RET
;
; search file for ROPEN
; (SEQ device)
;
SERFLR: CALL ?OPEND
CALL SERFIL
JP C,ER40 ;not found
CALL PUSHR
LD HL,KEYBUF
LD DE,IY
PUSH HL
CALL LDIR64
POP HL
LD DE,ELMD
LD A,M
LDIR64: LD BC,64
LDIR
OR A
RET
SKP H
;
; CALL ?OPEND ; Check already opened
;
?OPEND: ENT
LD IX,?OPCKX
?OPEN0: ENT
LD (?OPEN6+1),IX
CALL PUSHR
LD A,(ZLOG)
LD C,A
LD HL,(POOL)
PUSH HL
?OPEN2: POP HL
LD A,M
OR A
RET Z
LD B,A
INC HL
CALL LDDEMI
PUSH HL
ADD HL,DE
EX (SP),HL
CP 8FH
JR NC,?OPEN2 ;non i/o seg.
CP C
JR Z,?OPEN2 ;same lu
INC HL ;ZRWX
LD A,M
EX AF,AF'
INC HL
LD DE,ZEQT
PUSH BC
LD BC,300H
?OPEN4: LD A,(DE)
SUB M
OR C
LD C,A
INC DE
INC HL
DJNZ ?OPEN4
POP BC
JR NZ,?OPEN2 ;Diff. device
LD A,B
?OPEN6: CALL 0 ;xxx
JR ?OPEN2
;
?OPCKX: LD A,(ZFLAG2) ;Same device
BIT ##1OPN,A ;1 file only ?
JP NZ,ER43 ; Yes, already open
BIT ##1WOP,A ;1 file only W ?
RET Z ; No, ok
EX AF,AF'
LD B,A
LD A,(ZRWX)
AND B
BIT ##WOPN,A
RET Z
JP ER43
SKP H
;
; SVC .LOADFL
; ent HL:loaging adrs
; call after .DEVFN and .LOPEN
;
LOADFL: ENT
CALL ?RND
JP NZ,LDX
LD BC,(ELMD20)
PUSH BC
XOR A ;first block
IOCALL ZINP
LD IX,(ZINP)
CALL IOCALL
ENDM
POP BC
RET
;
; SVC .VRFYF ;verify file
; ent HL:adrs
; call after .DEVFN, .LOPEN
;
VRFYFL: ENT
LD A,(ZFLAG2)
BIT ##CMT,A
JP Z,ER59
LD BC,(ELMD20)
JP CMTVRF
;
; SVC .SAVEF ;save file
; ent DE:adrs
; call after .DEVFN
;
SAVEFL: ENT
LD A,(ELMD)
CP 5
JR C,SAVEF2
LD A,80H
LD (ELMD18),A ;contiguas flag
SAVEF2: CALL ?RND
JP NZ,SVX
BIT ##STRM,A
JP NZ,ER59
PUSH DE
LD HL,0200H
LD (ZLOG),HL
CALL ?OPEND
LD HL,ELMD
LD IY,HL
IOCALL ZWO
LD IX,(ZWO)
CALL IOCALL
ENDM
LD BC,(ELMD20)
POP HL
LD A,04H ;F# update,unblocked
IOCALL ZOUT
LD IX,(ZOUT)
CALL IOCALL
ENDM
RET
;
;
?RND: ENT
LD A,(ZFLAG1)
BIT ##RND,A
RET
SKP H
;
; SVC .DIR
; ent A=0 ... read dir
; A>0 ... output dir
;
FDIR: ENT
CALL PUSHR
OR A
JR NZ,FDIR3
LD HL,100H
LD (ZLOG),HL
CALL ?OPEND
LD HL,ZFLAG1
BIT ##STRM,M
JP NZ,ER59 ;Streem i/o omit
BIT ##RND,M
JP NZ,LD.DIR ;RND
INC HL ;SEQ
BIT ##CMT,M
JP NZ,ER59 ;CMT ommit
CALL MWAIT ;MUSIC WAIT
LD HL,DIRARE
LD BC,8 ;clear 0800H bytes
CALL ?CLRHL
DEC C
JR NZ,-4
CALL .ZSTRT
LD A,(ZDIRMX)
LD B,A
LD HL,DIRARE
FDIR2: PUSH BC
IOCALL ZRO ;read infomation
LD IX,(ZRO)
CALL IOCALL
ENDM
PUSH AF
LD BC,32
ADD HL,BC
LD M,0
POP AF
POP BC
JR C,+4
DJNZ FDIR2
JP .ZEND
;
FDIR3: LD (FDIROT+1),A
XOR A
LD (DISPX),A
LD HL,KEYBUF
PUSH HL
LD DE,DIRM1
LD B,DIRM2-DIRM1
CALL LDHLDE
CALL SETDNM ;set device name
LD M," "
INC HL
LD M," "
INC HL
EX DE,HL
CALL ?RND
LD IX,(ZFREE) ;SEQ
JR Z,+6
LD IX,FREEX ;RND
CALL IOCALL
JR C,FDIR4
LD HL,BC
LD B,0
SVC .ASCHL
RST 3
DEFB .ASCHL
ENDM
LD HL,DIRM2
LD B,DIRM3-DIRM2
CALL LDDEHL
FDIR4: EX DE,HL
LD M,0DH
INC HL
LD M,0
POP DE
CALL FDIROT ;DIR OF dd: xxx KB FREE
;
LD B,64 ;max dir
LD HL,DIRARE
FDIR6: CALL FDIRS ;mod "name"
LD DE,32
ADD HL,DE
DJNZ FDIR6
JP DUST
;
FDIRS: CALL PUSHR
LD A,M
OR A
RET Z
RET M
LD DE,KEYBUF
PUSH DE
LD A," "
LD B,38
CALL ?SETDE
LD A,M
CP MAXMOD+1
JR C,+4
LD A,MAXMOD+1
LD IY,HL
POP DE
PUSH DE
INC DE
LD HL,DIRM3-3
LD BC,3
ADD HL,BC
DEC A
JR NZ,-2
LDIR
EX DE,HL
BIT 0,(IY+18)
JR Z,+4
LD M,"*"
INC HL
INC HL
LD M,'"'
INC HL
FDIRS2: LD A,(IY+1)
CP 0DH
JR Z,FDIRS4
LD M,A
INC IY
INC HL
JR FDIRS2
FDIRS4: LD M,'"'
INC HL
LD M,0DH
INC HL
LD M,0
POP DE
FDIROT: LD A,0 ;xxx output lu
SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
SVC .COUNT
RST 3
DEFB .COUNT
ENDM
SVC .PRSTR
RST 3
DEFB .PRSTR
ENDM
SVC .HALT
RST 3
DEFB .HALT
ENDM
RET
;
DIRM1: DEFB 0DH
DEFM "DIRECTORY OF "
DIRM2: DEFM " KB FREE."
DIRM3: DEFM "OBJ" ;1
DEFM "BTX" ;2
DEFM "BSD" ;3
DEFM "BRD" ;4
DEFM "RB " ;5
DEFM " ? " ;6
DEFM "LIB" ;7
DEFM " ? " ;8
DEFM " ? " ;9
DEFM "SYS" ;10
DEFM "GR " ;11
DEFM " ? " ;12
MAXMOD: EQU 11
SKP H
;
; INIT "dev:command"
;
FINIT: ENT
PUSH HL
FINIT2: XOR A
LD (ZLOG),A
LD IX,?OPCKY
LD (?OPCKY+1),SP
CALL ?OPEN0
POP HL
IOCALL ZINIT
LD IX,(ZINIT)
CALL IOCALL
ENDM
RET
;
?OPCKY: LD SP,0
LD B,0
SVC .CLKL ;KILL
RST 3
DEFB .CLKL
ENDM
JR FINIT2
;
; Ask Y or N
;
OKYN: ENT
TEST1 "Y"
CALL TEST1
DEFB "Y"
ENDM
RET Z
LD DE,OK?MSG
SVC .CRTMS
RST 3
DEFB .CRTMS
ENDM
LD A,1
SVC .INKEY
RST 3
DEFB .INKEY
ENDM
CP "Y"
RET Z
JP BREAKZ
OK?MSG: DEFM "OK ? [Y/N]"
DEFB 19H ;alpha
DEFB 0
SKP H
;
; Filename check
;
CKFIL: ENT
LD DE,ELMD
FNMTCH: ENT
CALL PUSHR
INC HL
INC DE
LD A,(DE)
CP 0DH
RET Z
LD B,17
FNMTLP: LD A,(DE)
CP M
RET NZ
CP 0DH
RET Z
INC HL
INC DE
DJNZ FNMTLP
OR A
RET
;
;
SETFNAM:ENT
INC HL
LD C,16
SETFN2: LD A,B
OR A
JR Z,SETFN4
LD A,(DE)
INC DE
DEC B
OR A
JR Z,SETFN4
CP '"'
JR Z,SETFN2
CP ":"
JP Z,ER60 ;file name err
LD M,A
INC HL
DEC C
JR NZ,SETFN2
SETFN4: LD M,0DH
INC HL
SETFN6: LD A,C
OR A
RET Z
LD M," "
INC HL
DEC C
JR SETFN6
SKP H
;
; SVC .SEGAD ;get segment adrs
; ent A .... Seg No.
; ext HL ... Buffer adrs
;
SEGADR: ENT
LD HL,(POOL)
SEGAD2: INC M
DEC M
SCF
RET Z ;not found
CP M
INC HL
JR Z,SEGAD9
PUSH DE
CALL LDDEMI
ADD HL,DE
POP DE
JR SEGAD2
SEGAD9: INC HL
INC HL
RET
;
; SVC .DLSEG ;delete segment
; ent A .... Seg No.
;
DELSEG: ENT
CALL PUSHR
SVC .SEGAD
RST 3
DEFB .SEGAD
ENDM
RET C ;Not exist
DEC HL
LD B,M
DEC HL
LD C,M ;BC = length
DEC HL ;HL = del start
LD DE,HL ;DE = del start
INC BC
INC BC
INC BC ;BC = del size
PUSH BC
ADD HL,BC ;HL = del end
PUSH HL
LD BC,HL
LD HL,(TMPEND)
OR A
SBC HL,BC
LD BC,HL ;BC = Move bytes
POP HL ;HL = del end
LDIR
POP DE ;DE = del size
LD HL,0
OR A
SBC HL,DE
EX DE,HL ;DE= - delete size
SVC .ADDP1
RST 3
DEFB .ADDP1
ENDM
OR A
RET
;
SKP H
;
; SVC .OPSEG ;open segment
; ent A .... Seg No.
; DE ... Buffer length
; ext HL ... Buffer adrs
;
OPSEG: ENT
PUSH AF
PUSH BC
PUSH DE
PUSH DE
INC DE
INC DE
INC DE
LD HL,(TMPEND)
EX DE,HL ;
ADD HL,DE ; ADD DE,HL
EX DE,HL ; DE = new TMPEND
JP C,ER06
PUSH HL
LD HL,-512
ADD HL,SP
SBC HL,DE
JR C,ER06
LD HL,(MEMLMT)
DEC H
DEC H
SBC HL,DE
JR C,ER06
POP HL
PUSH HL ;old TMPEND
LD BC,(VARST) ;POOL END
OR A
SBC HL,BC
LD BC,HL ;BC = move bytes
POP HL ;HL = old TMPEND
INC BC
LDDR
POP DE ;Buffer length
LD M,A ;Seg No.
INC HL
LD M,E ;Size
INC HL
LD M,D
INC HL
PUSH HL
INC DE ;LEN+1
PUSH DE
OPSEG2: LD M,0
INC HL
DEC DE
LD A,D
OR E
JR NZ,OPSEG2
POP DE ;LEN+1
INC DE
INC DE ;LEN+3
SVC .ADDP1
RST 3
DEFB .ADDP1
ENDM
POP HL
POP DE
POP BC
POP AF
RET
SKP H
;
ERENT 03
ER03: ENT
IFD @2
ENDIF
IFU @2
LD A,03
ENDIF
DEFB 21H
ENDM
ERENT 06
ER06: ENT
IFD @2
ENDIF
IFU @2
LD A,06
ENDIF
DEFB 21H
ENDM
ERENT 28,1
ER28: ENT
IFD 1
LD A,28+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 40,1
ER40: ENT
IFD 1
LD A,40+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 41,1
ER41: ENT
IFD 1
LD A,41+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 42,1
ER42: ENT
IFD 1
LD A,42+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 43,1
ER43: ENT
IFD 1
LD A,43+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 46,1
ER46: ENT
IFD 1
LD A,46+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 50,1
ER50: ENT
IFD 1
LD A,50+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 51,1
ER51: ENT
IFD 1
LD A,51+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 52,1
ER52: ENT
IFD 1
LD A,52+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 53,1
ER53: ENT
IFD 1
LD A,53+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 54,1
ER54: ENT
IFD 1
LD A,54+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 55,1
ER55: ENT
IFD 1
LD A,55+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 58
ER58: ENT
IFD @2
ENDIF
IFU @2
LD A,58
ENDIF
DEFB 21H
ENDM
ERENT 59,1
ER59: ENT
IFD 1
LD A,59+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 60,1
ER60: ENT
IFD 1
LD A,60+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 61,1
ER61: ENT
IFD 1
LD A,61+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 63,1
ER63: ENT
IFD 1
LD A,63+80H
ENDIF
IFU 1
ENDIF
DEFB 21H
ENDM
ERENT 64
ER64: ENT
IFD @2
ENDIF
IFU @2
LD A,64
ENDIF
DEFB 21H
ENDM
ER68: ENT
LD A,68+80H
JP ERRORJ
;
;
; Error recover routine
;
ERRCVR: ENT
LD A,(QSEG)
OR A
LD B,0
CALL NZ,CLKL ;KILL
CALL FLOFF ;FD motor off
CALL QDOFF ;QD motor off
XOR A
LD (QSEG),A
JP DUST ;I/O open check
;JP MLDSP
DEFS 3
;
QSEG: ENT
DEFB 0
;
END