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

1644 lines
34 KiB
NASM
Vendored

; --------------------------
; MZ-800 BASIC IOCS command
; FI:IOCS ver 1.0B 9.20.84
; Programed by T.Miho
; --------------------------
;
INCLD MACRO
;
;
RUNRFL: EQU 11A4H ;KEYBUF label
BKEYBF: EQU 11A5H ;KEYBUF+1 label
;
; ZFLAG1 bit position
;
##RND: EQU 5 ;FD
##SEQ: EQU 6 ;CMT, QD, RAM
##STRM: EQU 7 ;CRT, KB, LPT, RS, USR
;
; ZRWX bit position
;
##ROPN: EQU 0 ;R.opened
##WOPN: EQU 1 ;W.opened
##XOPN: EQU 2 ;X.opened
##EOF: EQU 7 ;End of file
;
;
CMTLU: EQU 80H
LDALU: EQU 81H
CRTLU: EQU 88H
LPTLU: EQU 89H
DATLU: EQU 8AH
;
;
CRTLU?: LD A,(ZLOG)
CP CRTLU
RET
;
PRTEXP: ENT
CALL EXPR
LD A,(PRCSON)
CP 3
PUSH HL
EX DE,HL
JR Z,PRTEX2
CALL CVNMFL
POP HL
SVC .COUNT
RST 3
DEFB .COUNT
ENDM
RET
PRTEX2: CALL CVTSDC
POP HL
RET
SKP H
;
; PRINT command
;
PRINT: ENT
XOR A
LD (DISPX),A
CALL GETLU
SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
JP C,ER44 ;not open
BIT 2,A ;X?
JP NZ,PRX
BIT 1,A ;W?
JP Z,ER59 ;can't exec
CALL LU2CH
CALL CRTLU?
JR NZ,PRT04
LD A,(SELCOL)
LD (COL),A
TEST1 "["
CALL TEST1
DEFB "["
ENDM
JR NZ,PRT04
CALL COLCHK
LD (COL),A
TESTX "]"
CALL TESTX
DEFB "]"
ENDM
PRT04: CALL ENDCHK
JP Z,PRTCR
PRT10: LD A,M
CP E3H ;USING
JR Z,PRUSNG
LD BC,PRT20
PUSH BC ;Return adrs
CP ";"
RET Z
CP ","
RET Z
CP E6H ;TAB
JR Z,PRTAB
CALL PRTEXP
JP PRTMS2
;
PRT20: CALL ENDCHK
JP Z,PRTCR
CP ","
JR NZ,PRT30
CALL CRTLU?
JR C,PRT25
IOCALL ZPOS ;TAB10
LD IX,(ZPOS)
CALL IOCALL
ENDM
LD B,A
SUB 10
JR NC,-2
NEG
LD B,A
CALL PRTAB2
JR PRT30
PRT25: CALL PRTCR
PRT30: LD A,M
CP ","
JR Z,+4
CP ";"
JR NZ,+3
INC HL
CALL ENDCHK
RET Z
JR PRT10
;
PRTAB: CALL CRTLU?
JP C,ER59
CALL ICH28H
CALL IBYTE
CALL HCH29H
IOCALL ZPOS
LD IX,(ZPOS)
CALL IOCALL
ENDM
SUB E
RET NC
NEG
LD B,A
CALL CRTLU?
LD A,13H ;Cursor right
JR Z,+4
PRTAB2: LD A," "
LD DE,BKEYBF
PUSH BC
PUSH DE
CALL ?SETDE
POP DE
POP BC
JR PRTMS2
SKP 3
;
PRUSNG: INC HL ;PRINT USING
CALL STREXP
LD A,B
OR A
JP Z,ER03
PUSH HL
LD HL,BKEYBF
PUSH HL
PUSH BC
CALL LDHLDE
POP BC
LD A,F0H
LD E,B
LD D,0
INC DE
SVC .OPSEG
RST 3
DEFB .OPSEG
ENDM
LD (USINGS),HL
LD (USINGP),HL
POP DE
CALL LDHLDE
LD M,0
POP HL
PRUSG2: CALL ENDCHK
JR Z,PRUSG8
INC HL
CP ","
JR Z,PRUSG4
CP ";"
JP NZ,ER01
PRUSG4: CALL ENDCHK
JR Z,PRUSG9
CALL EXPRNX
PUSH HL
LD BC,(TMPEND)
PUSH BC
CALL USNGSB
POP DE
CALL PRTMSG
POP HL
JR PRUSG2
PRUSG8: CALL PRTCR
PRUSG9: LD A,F0H
SVC .DLSEG
RST 3
DEFB .DLSEG
ENDM
RET
;
;
.CR: DEFW 0DH ;FMP
PRTCR: ENT
LD DE,.CR
;
PRTMSG: ENT
SVC .COUNT ;print message
RST 3
DEFB .COUNT
ENDM
PRTMS2: CALL CRTLU?
JR Z,PRTMC
SVC .PRSTR
RST 3
DEFB .PRSTR
ENDM
RET
;
PRTMC: PUSH AF
LD A,(COL)
SVC .DCOL
RST 3
DEFB .DCOL
ENDM
POP AF
SVC .PRSTR
RST 3
DEFB .PRSTR
ENDM
LD A,(SELCOL)
SVC .DCOL
RST 3
DEFB .DCOL
ENDM
RET
;
SKP H
;
; READ command
;
READ: ENT
LD A,DATLU
LD (ZLOG),A
JR INP10
;
; INPUT command
;
INPUT: ENT ;INPUT command
CALL GETLU
SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
JP C,ER44 ;not open
BIT 2,A ;X?
JP NZ,INX
BIT 0,A ;R?
JP Z,ER59 ;can't exec
CALL LU2CH
CALL CRTLU?
JR NZ,INP10
CALL HLFTCH
CP '"'
LD DE,MEM?IN
LD B,2
JR NZ,INP05
CALL STREXP
TESTX ";"
CALL TESTX
DEFB ";"
ENDM
INP05: LD A,B
OR A
JR Z,INP10
INP07: LD A,(DE)
INC DE
SVC .CRT1C
RST 3
DEFB .CRT1C
ENDM
DJNZ INP07
INP10: LD (INPSP+1),SP
LD DE,(VARED)
LD (TMPEND),DE
INP15: LD DE,(TMPEND)
CALL MEMECK
CALL INTGTV
PUSH AF
PUSH BC
CALL ENDCHK
JR Z,INP20
CALL CH2CH
JR INP15
;
ER44: LD A,44 ;not opened
DEFB 21H
ER59: LD A,59+80H ;can't exec
JP ERRORJ
;
MEM?IN: DEFM "? "
;
;
INP20: XOR A
PUSH AF ;END=00
PUSH HL
SVC .INSTT
RST 3
DEFB .INSTT
ENDM
LD HL,(INPSP+1)
DEC HL
INP24: LD A,M
OR A
JR Z,INP30
DEC HL
DEC HL
LD B,M
DEC HL
LD C,M
DEC HL
PUSH HL
PUSH AF ;Type
PUSH BC ;Adrs
LD DE,(TMPEND)
CALL INPMX
LD H,0
LD L,B
ADD HL,DE
LD M,0
POP DE ;Adrs
POP AF ;Type
CALL INSUB
POP HL
JR INP24
INP30: POP HL
INPSP: LD SP,0 ;xxx
RET
;
INPMX: LD A,(ZLOG)
CP DATLU
JR Z,DATINP
SVC .INMSG
RST 3
DEFB .INMSG
ENDM
RET
SKP H
;
;
INSUB: CP 3 ;String ?
JR NZ,INSUB4 ; No
LD HL,(TMPEND) ; Yes
LD A,B
JP STRLET
;
INSUB4: PUSH DE
LD HL,(INTFAC)
LD DE,(TMPEND)
EX DE,HL
CALL HLFTCH
CP "E"
JP Z,ER03
EX DE,HL
CALL CVFLAS
EX DE,HL
TEST1 0
CALL TEST1
DEFB 0
ENDM
JP NZ,ER03
EX DE,HL
POP DE
JP LDIR5
SKP H
;
; RESTORE command
;
RESTOR: ENT
XOR A
LD (DATFLG),A
CALL ENDCHK
CALL NZ,GETLIN
EX DE,HL
CALL NZ,DTSRCX
EX DE,HL
JP DATA ;ON RESTORE
;
DATINP: PUSH HL
PUSH DE
CALL DATINX
POP DE
POP HL
RET
;
DATIN0: LD HL,(TEXTST)
CALL DTSRCX
DATINX: LD A,(DATFLG) ;read flag
CP 1 ;0 is restore top
JP Z,ER24 ;1 is out of data
JR C,DATIN0 ;2 is ok
LD HL,(DATPTR) ;read pointer
LD C,":"
SVC .INDAT
RST 3
DEFB .INDAT
ENDM
LD (DATPTR),HL ;read pointer
CALL ENDCHK
SCF
CCF
RET NZ
DEC HL
DTSRCH: CALL DTSKSB ;DATA search
OR A
JR NZ,DTSRC4
INC HL
DTSRCX: LD A,M
INC HL
OR M
LD A,1
JR Z,DTSRC9
INC HL
INC HL
JR DTSRCH
DTSRC4: CP 94H ;DATA
JR NZ,DTSRCH
INC HL
LD (DATPTR),HL ;read pointer
LD A,2
DTSRC9: LD (DATFLG),A ;read flag
RET
SKP H
;
; GETLU ... interpret #n, /P, /T
; ent HL: pointer
; ext HL: pointer
; A: LU#
;
GETLU: ENT
TEST1 "#"
CALL TEST1
DEFB "#"
ENDM
JR NZ,GETLU2
CALL HLFTCH
CP 20H
JP NC,ER01
PUSH DE
PUSH BC
LD DE,ZFAC
PUSH DE
CALL FACNUM
EX (SP),HL
CALL HLFLT
LD A,H
OR A
JP NZ,ER64
OR L
JP Z,ER64
JP M,ER64
POP HL
POP BC
POP DE
RET
GETLU2: TEST1 FBH ;/
CALL TEST1
DEFB FBH
ENDM
LD A,CRTLU
RET NZ
TEST1 "P"
CALL TEST1
DEFB "P"
ENDM
LD A,LPTLU
RET Z
TESTX "T"
CALL TESTX
DEFB "T"
ENDM
LD A,CMTLU
RET
;
;
LU2CH: LD A,(ZLOG)
OR A
RET M
JP HCH2CH
SKP H
;
; DEFAULT "dev:"
;
DEFAULT:ENT
CALL DEVNAM
SVC .SETDF
RST 3
DEFB .SETDF
ENDM
RET
;
; INIT "dev:command"
;
INIT: ENT
CALL ENDCHK
LD B,0
CALL NZ,STREXP
;
INIT2: PUSH HL
SVC .DEVNM
RST 3
DEFB .DEVNM
ENDM
SVC .FINIT
RST 3
DEFB .FINIT
ENDM
POP HL
RET
;
;
; ROPEN, WOPEN, XOPEN
;
ROPEN: ENT
LD A,1
DEFB 1
WOPEN: ENT
LD A,2
DEFB 1
XOPEN: ENT
LD A,4
PUSH AF
LD (ZRWX),A
CALL GETLU
CP CRTLU
JR NZ,+4
LD A,CMTLU
LD (ZLOG),A
CALL LU2CH
CALL ELMT
POP AF
CP 4 ;X
JR Z,+4
OPN.B: LD A,3 ;BSD
LD (ELMD),A
PUSH AF
SVC .RWOPN
RST 3
DEFB .RWOPN
ENDM
LD A,(ELMD)
POP BC
CP B
JP NZ,ER61
RET
SKP H
;
; CLOSE/KILL command
;
CLOSE: ENT
DEFB F6H
KILL: ENT
XOR A
LD B,A
CALL ENDCHK
JR Z,CLALL ;all files
CLKL2: CALL GETLU
CP CRTLU
RET NC
SVC .CLKL
RST 3
DEFB .CLKL
ENDM
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR CLKL2
;
CLALL: XOR A
SVC .CLKL
RST 3
DEFB .CLKL
ENDM
RET
;
;
ELMT: ENT
CALL END2C
LD B,0
CALL NZ,STREXP
PUSH HL
SVC .DEVFN
RST 3
DEFB .DEVFN
ENDM
POP HL
RET
SKP H
;
DEVNAM: PUSH HL
CALL HLFTCH
LD DE,ELMWRK
LD B,1
CALL ELMCK
CALL NC,ELMCK
JR C,DEVNM2
CALL ELMCK
CALL TSTNUM
CALL ELMCK2
CALL ENDCHK
JR NZ,DEVNM2
LD A,":"
LD (DE),A
POP AF ;dummy
LD DE,ELMWRK
JR DEVNM4
DEVNM2: POP HL
CALL ENDCHK
LD B,0
CALL NZ,STREXP
DEVNM4: PUSH HL
SVC .DEVNM
RST 3
DEFB .DEVNM
ENDM
INC M
DEC M
JP NZ,ER58
POP HL
RET
;
ELMCK: CP "A"
RET C
CP "Z"+1
CCF
ELMCK2: RET C
LD (DE),A
INC HL
INC DE
LD A,M
INC B
RET
;
ELMWRK: DEFS 4
SKP H
;
; LOAD "dev:filename"
;
LOAD: ENT
TEST1 E5H ;ALL
CALL TEST1
DEFB E5H
ENDM
JR NZ,LOAD2
XOR A
LSALL: SVC .LSALL
RST 3
DEFB .LSALL
ENDM
RET
LOAD2: CALL ELMT
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JP Z,LOADA
PUSH HL
CALL LDRDY
DEC A
JR Z,LDOBJ
DEC A
JP NZ,ER61 ;il file mode
CALL CKCOM
CALL CLRVAR
CALL LDFIL
JR LOAD9
LDOBJ: LD HL,(ELMD22) ;load addr
PUSH HL
LD DE,(MEMLMT)
CALL COMPR
LD DE,(ELMD20) ;size
LD BC,(MEMMAX)
CALL NC,MEMOBJ
JP C,ER18
POP HL
SVC .LOADF
RST 3
DEFB .LOADF
ENDM
LOAD9: CALL LDEND
POP HL
RET
;
MEMOBJ: ADD HL,DE
RET C
EX DE,HL
LD HL,BC
COMPR: ENT
PUSH HL
OR A
SBC HL,DE
POP HL
RET
;
; CHAIN "dev:filename"
;
CHAIN: ENT
CALL ELMT
CALL LDRDY
CP 2
JP NZ,ER61 ;il file mode
LD A,(LSWAP)
OR A
JP Z,RUN2
JP SWAP2
SKP H
;
; MERGE "dev:filename"
;
MERGE: ENT
CALL CKCOM
CALL ELMT
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR Z,MERGEA
SVC .LOPEN
RST 3
DEFB .LOPEN
ENDM
CP 2
JP NZ,ER61
PUSH HL
LD HL,(VARED)
LD (TMPEND),HL
LD BC,1000
ADD HL,BC
JP C,ER06'
PUSH HL
LD BC,(ELMD20) ;size
INC B
ADD HL,BC
JP C,ER06'
SBC HL,SP
JP NC,ER06'
POP HL
PUSH HL
SVC .LOADF
RST 3
DEFB .LOADF
ENDM
POP HL
CALL MERGE0
POP HL
RET
;
MERGE0: CALL LDDEMI
LD A,D
OR E
RET Z
PUSH DE
CALL LDDEMI
PUSH HL
LD HL,DE
LD (EDLINE),HL
CALL DELSUB
POP HL
POP BC
PUSH BC
PUSH HL
CALL INSTLIN
POP HL
POP BC
ADD HL,BC
DEC HL
DEC HL
DEC HL
DEC HL
JR MERGE0
SKP H
;
; LOAD/MERGE/RUN ascii
;
LOADA: CALL CKCOM
LD A,1
DEFB 1
MERGEA: LD A,0
DEFB 1
RUNA: LD A,2
PUSH AF
TESTX "A"
CALL TESTX
DEFB "A"
ENDM
CALL ENDZ
LD A,1
LD (ZRWX),A
LD A,LDALU
LD (ZLOG),A
CALL OPN.B
POP AF
PUSH AF
PUSH HL ;RJOB
LD HL,0
LD DE,FFFFH
OR A
CALL NZ,DELSUB ;load/run only
LD A,LDALU
SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
LD HL,(VARED)
LD (TMPEND),HL
LD BC,1000
ADD HL,BC
JP C,ER06
PUSH HL ;load start adrs
LD (LDAPTR),HL
LDA2: LD HL,-512
ADD HL,SP
LD DE,(LDAPTR)
SBC HL,DE
JP C,ER06
LD DE,(TMPEND)
SVC .INMSG
RST 3
DEFB .INMSG
ENDM
LD A,B
OR A
JR Z,LDA4
CALL CVBCAS
LD A,B
OR C
JP Z,ER03
LD HL,(LDAPTR)
PUSH HL ;load pointer
INC HL
INC HL
LD M,C
INC HL
LD M,B
INC HL
PUSH HL
LD HL,DE
TEST1 0
CALL TEST1
DEFB 0
ENDM
JP Z,ER03
POP HL
LD A,(DE)
CP " "
JR NZ,+3
INC DE
CALL CVIMTX
LD M,0
INC HL
LD (LDAPTR),HL
POP DE ;old load pointer
OR A
SBC HL,DE
EX DE,HL ;DE := length
LD M,E
INC HL
LD M,D
JR LDA2
LDA4: LD HL,(LDAPTR)
CALL LDHL00
CALL CLR
POP HL ;load start adrs
CALL MERGE0
POP HL ;RJOB
POP AF
CP 2 ;RUN ?
RET NZ ;no (load/merge)
JP RUNX ;RUN from text-top
;
LDAPTR: DEFS 2
SKP H
;
; RUN "dev:filename"
;
FRUN: ENT
CALL ELMT
PUSH HL
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR NZ,RUN1
CALL HLFTCH
CP "A"
JP Z,RUNA
RUN1: CALL LDRDY
POP HL
DEC A
JR Z,RUNOBJ
DEC A
JP NZ,ER61 ;il file mode
CALL CLRVAR
RUN2: CALL LDFIL ;jump from CHAIN
CALL LDEND
JP RUNX
;
RUNOBJ: LD D,0 ; normal
LD BC,FF00H
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR NZ,RUNOB2
TESTX "R"
CALL TESTX
DEFB "R"
ENDM
LD D,1 ;,R
LD BC,CFF0H
RUNOB2: LD A,D
LD (RUNRFL),A ;,R flag
LD HL,(ELMD20) ;size
LD DE,(ELMD22) ;load addr
PUSH HL
CALL MEMOBJ
POP DE ;size
LD HL,$BASIC ;load file area
LD BC,FF00H
CALL NC,MEMOBJ
JP C,ER06'
LD SP,0
CALL CLPTR
XOR A
LD (LOADFG),A
LD A,36H ;count0 mode3
OUT (D7H),A ;8253 mode set
LD A,1
OUT (D3H),A ;8253 music enable
LD HL,(ELMD22) ;load addr
LD DE,(TMPEND)
CALL COMPR
JR NC,RUNOB3
;
; destroy BASIC
;
PUSH HL
LD HL,$BASIC ;load file area
LD (TEXTST),HL
CALL CLPTR
LD HL,RUNOBE-PRXFER+BKEYBF
LD (ERRORP),HL
POP HL
;
RUNOB3: LD DE,(TMPEND)
CALL COMPR
JR NC,+3
EX DE,HL
PUSH AF
PUSH HL
LD HL,PRXFER
LD DE,BKEYBF
PUSH DE
LD BC,RUNTBE-PRXFER
LDIR
RET ;JP BKEYBF
;
;
; ORG BKEYBF
;
PRXFER: POP HL
SVC .LOADF
RST 3
DEFB .LOADF
ENDM
LD A,C3H ;int tbl make
LD HL,038DH
LD (1038H),A
LD (1039H),HL
LD A,01H ;320*200 4 color
SVC .DSMOD
RST 3
DEFB .DSMOD
ENDM
SVC .DI
RST 3
DEFB .DI
ENDM
EX AF,AF'
LD A,(RUNRFL) ;run" " ,r
OR A
CALL NZ,INITIO-PRXFER+BKEYBF
EX AF,AF'
LD HL,(ELMD24) ;exec addr
LD A,H
OR L
EXX
LD HL,(TMPEND) ;data store addr
LD DE,(ELMD22) ;load addr
LD BC,(ELMD20) ;size
OR D
OR E
JR Z,PROX0
LD A,E9H ;jp (hl)
LD (PRO70P-PRXFER+BKEYBF),A
PROX0: EXX
POP AF ;ldir flg
PUSH HL ;store exec addr
LD HL,PROFF-PRXFER+BKEYBF
LD DE,FF00H
LD BC,PRO80E-PROFF
LDIR
EXX
JP FF00H
;
; ORG FF00H
;
PROFF: JR NC,RUNOB4
LDIR
RUNOB4: EX AF,AF'
RET Z ;,R
IN A,(LSDMD) ;check dipsw
AND 2
LD A,0 ;mode 800
OUT (LSDMD),A ; 800 mode
LD HL,PRO800-PROFF+FF00H
LD BC,PRO80E-PRO800
JR NZ,MODSET
;
LD A,8 ;mode 700
OUT (LSDMD),A ;700 or 800 mode
IN A,(LSE0) ;CG xfer
LD HL,1000H
LD DE,C000H
LD BC,1000H
LDIR
IN A,(LSE1)
;
LD HL,PRO700-PROFF+FF00H
LD BC,PRO70E-PRO700
MODSET:
LD DE,CFF0H
LDIR
POP HL
LD SP,IBUFE
LD DE,D800H ;vram2 for 700 mode
JP CFF0H
;
RUNOBE: SVC .ERRX
RST 3
DEFB .ERRX
ENDM
SVC .ERCVR
RST 3
DEFB .ERCVR
ENDM
SVC .DI
RST 3
DEFB .DI
ENDM
HALT
; ORG CFF0H
PRO700:
OUT (LSE4),A
PRO701: LD A,71H ;blue and white
LD (DE),A ;vram2 clr
INC DE
LD A,D
CP E0H
JR NZ,PRO701
PRO70P: OUT (LSE0),A ;jp (hl)
JP (HL)
PRO70E:
;
; ORG CFF0H
PRO800:
OUT (LSE0),A ;700mon rom bank off
OUT (LSE3),A ;800mon rom bank on
JP (HL)
PRO80E:
;
;
;
INITIO:
PUSH AF
DI ;run "file name",r
IM 1
LD HL,RUNTBL-PRXFER+BKEYBF
LD B,17
SVC .IOOUT ;io dev init
RST 3
DEFB .IOOUT
ENDM
POP AF
RET
;
;
;
RUNTBL:
; pio channel a
DEFW FC00H ; int vecter
DEFW FCCFH ; mode 3 (bit mode)
DEFW FC3FH ; i/o reg. set
DEFW FC07H ; int seqence (disenable)
; pio channel b
DEFW FD00H ; int vecter
DEFW FDCFH ; mode 3 (bit mode)
DEFW FD00H ; i/o reg. set
DEFW FD07H ; int seqence (disenable)
;
DEFW D774H ;8253 C1 mode 2
DEFW D7B0H ; C2 mode 0
DEFW D6C0H ;counter2 12h
DEFW D6A8H ;
DEFW D5FBH ;counter1 1s
DEFW D53CH ;
DEFW D305H ;8253 int ok
DEFW CD01H ;RF mode 700
DEFW CC01H ;WF mode 700
RUNTBE:
;
SKP H
;
LDRDY0: LD HL,(VARED)
LD (TMPEND),HL
LD DE,(POOL)
LD (OLDPOOL),DE
OR A
SBC HL,DE
LD (VARLN),HL
LD HL,-256
ADD HL,SP
LD (LAST),HL
LD DE,(VARED)
PUSH HL
OR A
SBC HL,DE
JP C,ER06'
EX (SP),HL
EX DE,HL
LD BC,(VARLN)
INC BC
LDDR
POP DE
SVC .ADDP0
RST 3
DEFB .ADDP0
ENDM
LD A,1
LD (LOADFG),A
RET
;
LDRDY: CALL LDRDY0
SVC .LOPEN
RST 3
DEFB .LOPEN
ENDM
LD A,(ELMD)
RET
;
CLRVAR: LD HL,(VARED)
XOR A
DEC HL
LD M,A
DEC HL
LD M,A
LD (STRST),HL
DEC HL
LD M,A
LD (VARST),HL
DEC HL
LD M,A
LD (POOL),HL
LD HL,4
LD (VARLN),HL
RET
;
OLDPOOL:DEFS 2
VARLN: DEFS 2
LAST: DEFS 2
LOADFG: DEFB 0
;
CKCOM: ENT
PUSH AF
CALL ?DIRECT
JP NZ,ER19
POP AF
RET
SKP H
;
LDFIL: LD BC,(ELMD20)
PUSH BC
LD HL,(POOL)
LD DE,(TEXTST)
OR A
SBC HL,DE ;HL := text area size
LD L,0
SBC HL,BC
JP C,ER06'
LD HL,0
LD (OLDPOOL),HL
CALL RUNINT
LD HL,0
LD (LNOBUF),HL
LD HL,(TEXTST)
SVC .LOADF
RST 3
DEFB .LOADF
ENDM
POP BC
LD HL,(TEXTST)
ADD HL,BC
LD (OLDPOOL),HL
RET
;
LDEND: ENT
LD A,LDALU
LD B,0
SVC .CLKL
RST 3
DEFB .CLKL
ENDM
LD HL,LOADFG
LD A,M
OR A
RET Z
LD M,0
LD HL,(OLDPOOL)
LD A,H
OR L
JR NZ,LDEND2
LD HL,(TEXTST)
CALL LDHL00
LDEND2: EX DE,HL
LD HL,(POOL)
LD BC,(VARLN)
LDIR
EX DE,HL
OR A
SBC HL,DE
EX DE,HL
SVC .ADDP0
RST 3
DEFB .ADDP0
ENDM
RET
SKP H
;
; VERIFY "CMT:filename"
;
VERIFY: ENT
PUSH HL
CALL REFLNX
POP HL
CALL ELMT
PUSH HL
SVC .LOPEN
RST 3
DEFB .LOPEN
ENDM
CP 2
JP NZ,ER61
LD HL,(TEXTST)
SVC .VRFYF
RST 3
DEFB .VRFYF
ENDM
POP HL
RET
;
; SAVE "dev:filename"
;
SAVE: ENT
TEST1 E5H ;ALL
CALL TEST1
DEFB E5H
ENDM
LD A,1
JP Z,LSALL
PUSH HL
CALL REFLNX
POP HL
CALL ELMT
TEST1 ","
CALL TEST1
DEFB ","
ENDM
JR Z,SAVEA
PUSH HL
LD A,2
LD (ELMD),A
LD HL,(TEXTED)
LD DE,(TEXTST)
OR A
SBC HL,DE
LD (ELMD20),HL
LD A,(ELMD1)
CP 0DH
JP Z,ER60
SVC .SAVEF
RST 3
DEFB .SAVEF
ENDM
POP HL
RET
;
SAVEA: TESTX "A"
CALL TESTX
DEFB "A"
ENDM
PUSH HL
LD A,2
LD (ZRWX),A
LD A,LDALU
LD (ZLOG),A
CALL OPN.B
POP HL
CALL LIST0
CALL PRTCR
LD B,1
LD A,LDALU
SVC .CLKL
RST 3
DEFB .CLKL
ENDM
RET
SKP H
;
; LOCK/UNLOCK "dev:filename"
;
UNLOCK: ENT
XOR A
DEFB 1
LOCK: ENT
LD A,1
PUSH AF
CALL STREXP
SVC .DEVFN
RST 3
DEFB .DEVFN
ENDM
POP AF
SVC .LOCK
RST 3
DEFB .LOCK
ENDM
RET
;
; DIR[#n] "dev:"
; DIR[/P] dev
;
DIR: ENT
CALL GETLU
PUSH AF ;lu#
SVC .LUCHK
RST 3
DEFB .LUCHK
ENDM
JP C,ER44
BIT 1,A ;W?
JP Z,ER59
CALL LU2CH
CALL DEVNAM
LD B,A ;ch#
XOR A
SVC .DIR ;read directory
RST 3
DEFB .DIR
ENDM
LD A,B ;A=ch#
SVC .SETDF ;set default
RST 3
DEFB .SETDF
ENDM
POP AF ;A=lu#
SVC .DIR ;print directory
RST 3
DEFB .DIR
ENDM
RET
;
; DELETE "dev:filename"
;
FDEL: ENT
CALL STREXP
SVC .DEVFN
RST 3
DEFB .DEVFN
ENDM
SVC .DELET
RST 3
DEFB .DELET
ENDM
RET
;
; RENAME "dev:oldname","newnae"
;
RENAME: ENT
CALL STREXP
SVC .DEVFN
RST 3
DEFB .DEVFN
ENDM
CALL HCH2CH
CALL STREXP
SVC .RENAM
RST 3
DEFB .RENAM
ENDM
RET
SKP H
;
; random file access
;
PRX: CALL RAN0
PRX2: CALL PRTEXP
SVC .PRREC
RST 3
DEFB .PRREC
ENDM
CALL ENDCHK
RET Z
CALL CH2CH
JR PRX2
;
;
INX: CALL RAN0
LD DE,(TMPEND)
CALL MEMECK
INX2: CALL INTGTV
PUSH HL
PUSH AF
PUSH BC
LD DE,(TMPEND)
SVC .INREC
RST 3
DEFB .INREC
ENDM
POP DE
POP AF
CALL INSUB
POP HL
CALL ENDCHK
RET Z
CALL CH2CH
JR INX2
;
RAN0: TEST1 "("
CALL TEST1
DEFB "("
ENDM
RET NZ
CALL IDEEXP
LD A,D
OR E
JP Z,ER03
SVC .RECST
RST 3
DEFB .RECST
ENDM
CALL HCH29H
TEST1 ","
CALL TEST1
DEFB ","
ENDM
RET
;
SKP H
;
; SWAP "dev:filename"
;
SWAP: ENT
LD A,(LSWAP)
OR A
JP NZ,ER25
PUSH HL
LD B,0
SVC .DEVNM
RST 3
DEFB .DEVNM
ENDM
LD (SWAPDV),DE
LD (SWAPCH),A
LD HL,(TEXTED)
LD DE,(TEXTST)
XOR A
SBC HL,DE
LD (ELMD20),HL
SVC .SWAP
RST 3
DEFB .SWAP
ENDM
POP HL
CALL ELMT
CALL ENDZ
LD A,(ZFLAG1)
BIT ##RND,A
JP Z,ER59
PUSH HL ;RJOB
LD HL,(SWAPNB)
ADD HL,SP
LD SP,HL
EX DE,HL
LD HL,SWAPDS
LD BC,(SWAPBY)
LDIR
CALL LDRDY
CP 2
JP NZ,ER61
LD (SWAP2+1),SP
SWAP2: LD SP,0 ;jump from CHAIN
CALL LDFIL
CALL LDEND
LD HL,FFFDH
PUSH HL ;SWAP flag
PUSH HL
LD A,1
LD (LSWAP),A
LD HL,(TEXTST)
JP NXLINE
;
; Recover SWAP
;
BSWAP: ENT
XOR A
LD (LSWAP),A
POP IX
BSWAP2: POP BC
LD A,B
CP FFH
JP NZ,ER25
LD A,C
CP FDH
JR Z,BSWAP6
CP FEH
LD HL,4
JR Z,BSWAP4
CP 12H
LD HL,10H
JP NZ,ER25
BSWAP4: ADD HL,SP
LD SP,HL
JR BSWAP2
;
BSWAP6: LD DE,(SWAPDV)
LD A,(SWAPCH)
SVC .SETDF
RST 3
DEFB .SETDF
ENDM
LD B,0
SVC .DEVNM
RST 3
DEFB .DEVNM
ENDM
CALL LDRDY0
OR FFH
SVC .SWAP
RST 3
DEFB .SWAP
ENDM
CALL LDFIL
CALL LDEND
LD HL,0
ADD HL,SP
LD DE,SWAPDS
LD BC,(SWAPBY)
LDIR
LD SP,HL
POP HL ;RJOB
RET
;
SWAPDV: DEFS 2
SWAPCH: DEFS 1
;
; I/O initial for cold-start
;
IOINIT: ENT
POP HL
PUSH HL
LD (ERRORP),HL
LD A,"1"
CALL IOINI2
LD A,"2"
CALL IOINI2
LD DE,INITD3
LD B,INITD4-INITD3
JR IOINI4
IOINI2: LD (INITD1+2),A
LD DE,INITD1
LD B,INITD3-INITD1
IOINI4: JP INIT2
;
INITD1: DEFM "RS?:0,$8C,13"
INITD3: DEFM "CMT:T"
INITD4:
;
END