1536 lines
32 KiB
NASM
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
|