home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.barnyard.co.uk
/
2015.02.ftp.barnyard.co.uk.tar
/
ftp.barnyard.co.uk
/
cpm
/
walnut-creek-CDROM
/
SIMTEL
/
CPMUG
/
CPMUG051.ARK
/
IOOP.SRC
< prev
next >
Wrap
Text File
|
1984-04-29
|
16KB
|
977 lines
REV EQU 16H ; 06/13/79 R. CURTISS NO ERR ON REWIND CLOSED FILE
;REV EQU 15H ; 06/10/79 R. CURTISS DREV, C, ICNTL
;REV EQU 14H ; 05/31/79 R. CURTISS FIX LF, MORE, XDEVC, GBPDEV
;REV EQU 13H ; 05/30/79 R. CURTISS XDEVC FIX, PATCH SPACE
;REV EQU 12H ; 05/29/79 R. CURTISS IWRT5,MCHOFF
;REV EQU 11H ; 05/29/79 R. CURTISS MORE,FPRS,FNAME
;REV EQU 10H ; 05/29/79 R. CURTISS NEW VERSION
;
; STAGE2 MAIN PROGRAM AND I/O OPERATION PACKAGE
;
; REVISION B02 03/15/78 R. CURTISS ADD COMMENTS
;
MAIN EQU 100H
PROGR EQU 1000H
ORG MAIN
JMP F4IO ; MAIN ENTRY POINT - PROGRAM STARTUP
DB REV ; IOOP REVISION
JMP IOOP ; ENTRY POINT - I/O PACKAGE
DB DREV ; DISK I/O REVISION
JMP TRAP ; ENTRY POINT - END OF MACROS DETECTED
NOP
JMP MEMSET ; ENTRY POINT - SET UP FLUB MEMORY BOUNDS
NOP
PROGRM: JMP PROGR ; EXTERNAL REFERENCE - STAGE2, FLT1, FLT2
NOP
EXIT: JMP 0000H ; EXTERNAL REFERENCE - RETURN TO CP/M
NOP
;
; -------------------------------------
;
; MAIN PROGRAM
;
DS 38H ; STACK SPACE
F4IO: LXI SP,F4IO
;
CALL INIT
CALL PROGRM
;
; CLOSE ALL CHANNELS
;
CALL GCLOSE
CALL EXIT
JMP F4IO
;
; --------------------------------------
;
; INITIALIZE CHANNEL I/O TABLE
;
INIT:
MVI B,6*MAXCH
LXI D,CHAN
LXI H,JCHAN+1
;
INIT1:
LDAX D
MOV M,A
INX D
INX H
DCR B
JNZ INIT1
;
CALL FINIT ; GET FILES FROM COMMAND LINE
RET
;
; -----------------------------------------
;
; INITIAL VALUES FOR CHANNEL CONTROL TABLE
;
CHAN:
; R W O C U S
DB 1,0,1,1,2,1 ; CHANNEL 1 - INPUT FILE
DB 1,1,1,1,1,1 ; CHANNEL 2 - SCRATCH FILE
DB 0,1,1,1,2,1 ; CHANNEL 3 - OUTPUT FILE
DB 0,1,1,1,3,1 ; CHANNEL 4 - LISTING FILE
DB 1,1,0,0,2,4 ; CHANNEL 5 - CONSOLE I/O
;
MAXCH EQU ($-CHAN)/6
;
;
; R KCH+1 READ ACCESS
; 0 - ILLEGAL
; 1 - CHANNEL AVAILABLE FOR READ
;
; W KCH+2 WRITE ACCESS
; 0 - ILLEGAL
; 1 - MACHINE READABLE OUTPUT
; 2 - HUMAN READABLE OUTPUT
; 3 - FIRST LINE OF HUMAN READABLE OUTPUT
; ALLOWS TOP OF FORM
;
; O KCH+3 OPEN ACCESS
; 0 - NO ACTION REQUIRED
; 1 - OPEN REQUIRED
;
; C KCH+4 CONTROL ACCESS (CLOSE)
; 0 - NO ACTION REQUIRED
; 1 - CLOSE REQUIRED
;
; U KCH+5 DEVICE CODE
; 0 - NULL DEVICE
; 1 - DISK
; 2 - CONSOLE
; 3 - LIST DEVICE
;
; S KCH+6 CHANNEL STATUS
; 0 - NOT AVAILABLE
; 1 - CLOSED
; 2 - OPEN FOR READ
; 3 - OPEN FOR WRITE
; 5 - END OF FILE ON READ
; END OF MEDIUM ON WRITE
;
; -------------------------------------
;
TRAP: NOP ; TRAP AT END OF MACRO READING
NOP
RET
;
; --------------------------------------
;
; SET FLUB MEMORY BOUNDS
; DE LOW LIMIT
; HL HIGH LIMIT
;
MEMSET: LHLD 0006H ; GET BDOS ENTRY ADDRESS
DCR H ; ONE PAGE LESS TO BE SAFE
RET
;
; ----------------------------------------
;
; I/O SUPERVISOR
;
; OPERATION CODE
; 0 - CLOSE
; 1 - WRITE
; -1 - READ
;
; OPERATION STATUS
; 0 - NORMAL
; 1 - EOF OR END OF MEDIUM
; 2 - ILLEGAL OPERATION
; 3+ ERROR CODE
;
; STATUS = IOOP ( OPERATION , CHANNEL , BUFFER )
; (A) (B) (HL)
;
; MAXLEN: DB N
; LENGTH: DS 1
; BUFFER: DS N+1
;
; READ OPERATION
; REGISTER BEFORE AFTER
; A -1 STATUS
; B CHANNEL
; HL START OF LINE
; BUFFER MAXLEN LENGTH
; LINE DATA
;
; WRITE OPERATION
; REGISTER BEFORE AFTER
; A 1 STATUS
; B CHANNEL
; HL START OF LINE
; BUFFER LENGTH
; LINE DATA
;
; CLOSE/REWIND OPERATION
; REGISTER BEFORE AFTER
; A 0 STATUS
; B CHANNEL
;
IOOP:
STA JOP ; SAVE OPERATION CODE
SHLD POINT ; SAVE BUFFER POINTER
MOV A,B
STA NCHAN ; SAVE CHANNEL NUMBER
ORA A ; TEST CHANNEL NUMBER
JM LL7 ; JUMP IF < 0 ERROR CONDITION
JZ LL5 ; JUMP IF = 0 NULL CHANNEL BIT BUCKET
;
CPI MAXCH+1
JP LL7 ; JUMP IF CHANNEL > MAX CHANNEL
;
CALL MCHOFF ; MAKE CHANNEL OFFSET
XCHG
SHLD CHOFF ; CHANNEL OFFSET
XCHG
;
LXI H,JCHAN+6 ; STATUS = JCHAN(KCH+6)
DAD D
MOV A,M
ORA A
JZ LL7 ; JUMP IF STATUS = UNAVAILABLE
;
MOV B,A ; SAVE CHANNEL STATUS
LDA JOP
ORA A
JM LL10 ; JUMP IF READ OPERATION
JNZ LL20 ; JUMP IF WRITE OPERATION
;
; -------------------------------------
;
; CONTROL OPERATION
;
MOV A,B ; GET CHANNEL STATUS
CPI 1
JZ LL4 ; JUMP IF STATUS = CLOSED
;
LXI H,JCHAN+4
DAD D
MOV A,M ; CONTROL ACCESS = JCHAN(KCH+4)
;
ORA A
JZ LL3 ; JUMP IF CONTROL OPERATION UNAVAILABLE
;
PUSH D ; SAVE KCH
CALL ICNTL ; PERFORM CONTROL OPERATION
POP D ; RESTORE KCH
RET
;
LL3:
LXI H,JCHAN+6 ; SET CHANNEL STATUS TO INACTIVE
DAD D
MVI M,1 ; JCHAN(KCH+6) = 1
;
LL4: ; NORMAL TERMINATION
XRA A ; SET OPERATION STATUS TO ZERO
RET
;
LL5: ; NULL CHANNEL I/O
LDA JOP
ORA A
JP LL4 ; JUMP IF NOT READ OPERATION
;
LL6:
MVI A,1 ; EOF STATUS OR END OF MEDIUM
RET
;
LL7:
MVI A,2 ; ILLEGAL OPERATION STATUS
RET
;
; ---------------------------------
;
; READ OPERATION
;
LL10:
MOV A,B ; GET CHANNEL STATUS
DCR A
JZ LL11 ; JUMP IF CLOSED
DCR A
JZ LL12 ; JUMP IF OPEN FOR READ
DCR A
JZ LL7 ; JUMP IF OPEN FOR WRITE ERROR
DCR A
JZ LL12 ; JUMP IF OPEN FOR BOTH READ AND WRITE
DCR A
JZ LL6 ; JUMP IF END OF FILE
JMP LL7 ; ERROR
;
LL11:
LXI H,JCHAN+1
DAD D
MOV A,M ; GET READ ACCESS PERMISSION
;
ORA A
JZ LL7 ; JUMP IF READING NOT ALLOWED
;
LXI H,JCHAN+6
DAD D
MVI M,2 ; SET CHANNEL STATUS OPEN FOR READ
;
LXI H,JCHAN+3
DAD D
MOV A,M ; GET OPEN ACCESS FOR CHANNEL
ORA A
JZ LL12 ; JUMP IF OPEN NOT REQUIRED
;
PUSH D ; SAVE KCH
LXI B,IACCE ; READ ACCESS
CALL IOPEN
POP D
ORA A
RNZ ; RETURN IF OPEN ERROR
;
LL12:
PUSH D ; SAVE KCH
CALL IREAD ; PERFORM READ OPERATION
POP D
JMP LL30
;
; -------------------------------------
;
; WRITE OPERATION
;
LL20:
MOV A,B ; GET CHANNEL STATUS
DCR A
JZ LL21 ; JUMP IF CLOSED
DCR A
JZ LL7 ; JUMP IF OPEN FOR READ
DCR A
JZ LL22 ; JUMP IF OPEN FOR WRITE
DCR A
JZ LL22 ; JUMP IF OPEN FOR READ OR WRITE
DCR A
JZ LL6 ; JUMP IF AT END OF MEDIUM
JMP LL7 ; ERROR
;
LL21:
LXI H,JCHAN+2
DAD D
MOV A,M ; GET WRITE ACCESS
ORA A
JZ LL7 ; JUMP IF WRITING NOT POSSIBLE
;
LXI H,JCHAN+6
DAD D
MVI M,3 ; SET CHANNEL OPEN FOR WRITE
;
LXI H,JCHAN+3
DAD D
MOV A,M ; GET OPEN ACCESS
ORA A
JZ LL22 ; JUMP IF NO OPEN REQUIRED
;
PUSH D ; SAVE KCH
LXI B,OACCE ; WRITE ACCESS
CALL IOPEN
POP D
ORA A
RNZ ; RETURN IF OPEN ERROR
;
LL22:
PUSH D ; SAVE KCH
CALL IWRIT ; PERFORM WRITE OPERATION
POP D
;
;
LL30:
CPI 1
RNZ ; RETURN IF NOT EOF OR EOM
;
LXI H,JCHAN+6
DAD D
MVI M,5 ; SET STATUS TO EOF OR EOM
RET
;
; --------------------------------------
;
; BUFFER READ ROUTINE
;
IREAD: CALL GBPDEV ; HL = BUFFER POINTER
ORA A ; A = DEVICE CODE
JZ IRED0 ; JUMP IF 0 - NULL
DCR A
JZ IRED1 ; JUMP IF 1 - DISK
DCR A
JZ IRED2 ; JUMP IF 2 - CONSOLE IN
IRED0: MVI A,1 ; END OF FILE OR ERROR CONDITION
RET
;
;
IRED1: PUSH H
DCX H
SHLD ARGLST+2 ; SET LENGTH POINTER
DCX H
SHLD ARGLST ; SET MAX LENGTH POINTER
CALL GFTAB ; HL = FILE TABLE POINTER
POP D ; DE = BUFFER POINTER
LXI B,ARGLST
CALL LREAD ; READ LINE
ORA A
RZ ; RETURN IF NO ERROR OR EOF
IREOF: CALL MORE ; CHECK FOR CHAN 1 MULTIPLE INPUTS
JZ IREAD ; JUMP IF ANOTHER INPUT FILE
RET
ARGLST: DW 0 ; MAX LINE LENGTH POINTER
DW 0 ; ACTUAL LINE LENGTH POINTER
;
; GET LINE FROM CONSOLE
;
IRED2: XCHG
DCX D
DCX D
CALL CIB ; INPUT BUFFER FROM CONSOLE
MVI E,0AH
CALL CO ; SEND LINE FEED TO CONSOLE
LHLD POINT
MOV A,M
CPI 1AH ; CONTROL Z
JZ IREOF ; JUMP IF FIRST CHAR IN BUFFER IS ^Z
XRA A ; NO ERROR
RET
;
; ------------------------------------
;
; CHECK FOR CHANNEL 1 MULTIPLE INPUTS
;
MORE: LDA NCHAN
DCR A
JZ MORE1 ; JUMP IF CHAN 1
MVI A,1 ; END OF FILE
RET
MORE1: LHLD FNPTR1 ; P = IP
MVI C,','
CALL SCAN
JZ MORE2 ; JUMP IF ',' FOUND
MVI A,1 ; END OF FILE
RET
MORE2: INX H
SHLD FNPTR1 ; IP = P+1
CALL GDEVIC ; GET DEVICE CODE
DCR A
JNZ MORE3 ; JUMP UNLESS 1 - DISK
CALL GFTAB ; HL = FILE TABLE POINTER
CALL DCLOSE ; CLOSE DISK FILE
MORE3: LHLD FNPTR
MVI B,1
CALL XDEVC ; LU(1) = XUNIT(IP)
ORA A
JZ MORE8 ; ERROR IF NUL:
CPI 3
JZ MORE ; ERROR IF LIST DEVICE
LXI B,IACCE
CALL IOPEN ; OPEN FILE IF DISK
RET
MORE8: MVI A,1 ; END OF FILE
RET
;
; -------------------------------------
;
; BUFFER WRITE ROUTINE
;
IWRIT:
LXI H,JCHAN+2 ; GET WRITE ACCESS
DAD D
MOV B,M ; JHOW = JCHAN(KCH+2)
;
DCR B
JZ IWRTB ; JUMP IF JHOW = 1 MACHINE READABLE FILE
;
DCR B
JZ IWRTA ; JUMP IF JHOW = 2 HUMAN READABLE OUTPUT
;
; *** MAYBE OUTPUT FORM FEED
MVI M,2 ; SET JHOW TO 2 TOP OF FORM DONE
CALL GBPDEV ; HL - BUFFER POINTER
CPI 3 ; A - DEVICE CODE
JNZ IWRT1 ; JUMP UNLESS LIST DEVICE
MVI E,0CH
CALL LO ; FORM FEED TO PRINTER
IWRTA:
IWRTB: CALL GBPDEV ; HL - BUFFER POINTER
ORA A ; A - DEVICE CODE
RZ ; RETURN IF 0 - NULL DEVICE
DCR A
JZ IWRT1 ; JUMP IF 1 - DISK DEVICE
DCR A
JZ IWRT2 ; JUMP IF 2 - CONSOLE OUT
DCR A
JZ IWRT3 ; JUMP IF 3 - LIST DEVICE
MVI A,1 ; ERROR CONDITION
RET
;
;
IWRT1: LHLD POINT ; RECALL BUFFER POINTER
LDA NCHAN ; RECALL CHANNEL NUMBER
CPI 5
JZ IWRT2 ; JUMP IF CONSOLE CHANNEL
PUSH H
CALL GFTAB ; HL = FILE TABLE POINTER
POP D ; DE = BUFFER POINTER
MOV B,D
MOV C,E
DCX B ; BC = POINTER TO LINE LENGTH
CALL LWRITE ; WRITE LINE
ORA A
RZ ; RETURN IF NO ERROR
MVI A,1
RET
;
; SEND LINE TO CONSOLE
;
IWRT2: DCX H
MOV C,M ; GET LINE LENGTH
INR C
IWRT2L: DCR C
JZ IWRT2D
INX H
MOV E,M
PUSH B
PUSH H
CALL CO
POP H
POP B
JMP IWRT2L
IWRT2D: MVI E,0DH
CALL CO
MVI E,0AH
CALL CO
XRA A ; NO ERROR
RET
;
; SEND LINE TO LIST DEVICE
;
IWRT3: DCX H
MOV C,M ; GET LINE LENGTH
INR C
IWRT3L: DCR C
JZ IWRT3D
INX H
MOV E,M
PUSH B
PUSH H
CALL LO
POP H
POP B
JMP IWRT3L
IWRT3D: MVI E,0DH
CALL LO
MVI E,0AH
CALL LO
XRA A
RET
;
; -------------------------------------
;
; OPEN CHANNEL
;
IOPEN:
PUSH B ; BC POINTS TO ACCESS CODE
CALL GFTAB ; HL = FILE TABLE POINTER
PUSH H
CALL FNAME ; DE = FILE NAME POINTER
POP H
POP B
RZ ; RETURN UNLESS DISK DEVICE
CALL DOPEN ; OPEN FILE
ORA A
RZ ; RETURN IF NO ERROR
MVI A,1
; *** *** ERROR MESSAGE
RET
;
; --------------------------------------
;
; CLOSE CHANNEL
;
ICNTL: CALL GBPDEV ; HL - BUFFER POINTER
CPI 1 ; A - DEVICE CODE
JNZ ICNT3 ; JUMP UNLESS 1 - DISK DEVICE
LXI H,JCHAN+6
DAD D
MVI M,1 ; SET STATUS CLOSED
CALL GFTAB ; HL = FILE TABLE POINTER
CALL DCLOSE ; CLOSE FILE
ORA A
RZ ; RETURN IF NO ERROR
MVI A,1
RET
ICNT3:
XRA A ; SET OPERATION STATUS = 0
RET
;
; ------------------------------------
;
; GET BUFFER POINTER & DEVICE CODE NUMBER
; HL A
;
GBPDEV: LHLD CHOFF ; RECALL CHANNEL OFFSET
XCHG
LXI H,JCHAN+5
DAD D ; ADD CHANNEL OFFSET
MOV A,M ; DEVICE CODE
LHLD POINT
RET
;
; ---------------------------------
;
; GET FILE TABLE POINTER
;
GFTAB: LDA NCHAN ; GET CHANNEL NUMBER
DCR A
ADD A
MOV E,A
MVI D,0
LXI H,FTABP
DAD D
MOV A,M
INX H
MOV H,M
MOV L,A
RET
;
; -------------------------------------
;
; GET FILE NAMES FROM COMMAND LINE
;
FINIT: LXI D,80H
LXI H,COMLIN-1
LDA 80H
INR A
MOV C,A ; # OF CHARACTERS
FINIT1: LDAX D
MOV M,A
INX H
INX D
DCR C
JNZ FINIT1
FINIT2: MVI M,0 ; TERMINATE LINE WITH NULL
CALL FINIT3 ; CONVERT TO UPPER CASE
CALL FPRS ; PARSE COMMAND LINE
RZ ; RETURN IF NO COMMAND LINE ERROR
LXI D,COMERR
CALL COB ; ERROR MESSAGE TO CONSOLE
LXI D,COMLIN-2
CALL CIB ; GET NEW COMMAND LINE
LXI H,COMLIN-1
MOV E,M ; GET LINE LENGTH
MVI D,0
INX H
DAD D
JMP FINIT2
FINIT3: LXI H,COMLIN-1
MOV C,M ; LENGTH OF COMMAND LINE
INX H
INR C
FINIT4: DCR C
RZ ; RETURN IF AT END OF LINE
MOV A,M ; GET CHARACTER
CALL FINIT5 ; CONVERT IF LOWER CASE
MOV M,A
JMP FINIT4
FINIT5: CPI 'A'+20H
RC ; RETURN IF < 'a'
CPI 'Z'+21H
RNC ; RETURN IF > 'z'
SUI 20H
RET
;
; --------------------------------------
;
; PARSE COMMAND LINE
;
FPRS: LXI H,COMLIN ; P = ^COM
MVI C,'='
CALL SCAN
JZ FPRS1 ; JUMP IF '=' FOUND
LXI H,COMLIN
SHLD FNPTR1 ; IP = ^COM
LXI H,FNCON
SHLD FNPTR3 ; OP = ^'CON:'
LXI H,FNLST
SHLD FNPTR4 ; LP = ^'LST:'
JMP FPRS3
FPRS1: MVI M,0 ; MEM(P) = 0
INX H ; P = P + 1
SHLD FNPTR1 ; IP = P
LXI H,COMLIN ; P = ^COM
SHLD FNPTR3 ; OP = ^CHANNEL 3 SPECIFICATION
MVI C,','
CALL SCAN
JZ FPRS2 ; JUMP IF ',' FOUND
LXI H,FNLST
SHLD FNPTR4 ; LP = ^'LST:'
JMP FPRS3
FPRS2: MVI M,0 ; MEM(P) = 0
INX H ; P = P + 1
SHLD FNPTR4 ; LP = ^CHANNEL 4 SPECIFICATION
FPRS3: LHLD FNPTR1
MVI B,1
CALL XDEVC ; LU(1) = XUNIT(IP)
ORA A
JZ FPRS8 ; ERROR IF NUL: SPECIFIED
CPI 3
JZ FPRS8 ; ERROR IF LST: SPECIFIED
LHLD FNPTR3
MVI B,3
CALL XDEVC ; LU(3) = XUNIT(OP)
LHLD FNPTR4
MVI B,4
CALL XDEVC ; LU(4) = XUNIT(LP)
XRA A ; NO COMMAND ERROR DETECTED
RET
FPRS8: ORI 1 ; COMMAND ERROR DETECTED
RET
;
; -------------------------------------
;
SCAN: MOV A,M
CMP C
RZ ; RETURN IF SEARCH SUCCESSFUL
ORA A
JZ SCAN1 ; JUMP IF END OF STRING
INX H
JMP SCAN
SCAN1: INR A ; Z=0 - SEARCH FAILS
RET
;
; -------------------------------------
;
; GET FILE NAME POINTER FOR OPEN
;
FNAME: CALL GDEVIC ; GET DEVICE CODE
CPI 1
JZ FNAME1 ; JUMP IF DISK DEVICE
XRA A
RET
FNAME1: LDA NCHAN
DCR A
ADD A
MOV E,A
MVI D,0
LXI H,FNPTR ; FILE NAME POINTER TABLE
DAD D
MOV E,M
INX H
MOV D,M
MVI A,1
ORA A
RET
GDEVIC: LHLD CHOFF ; CHANNEL TABLE OFFSET
LXI D,JCHAN+5
DAD D
MOV A,M
RET
;
; --------------------------------------
;
; HL - POINTER TO FILE NAME
; B - CHANNEL NUMBER
; A - DEVICE CODE NUMBER
;
XDEVC: CALL SKIPB ; SKIP BLANKS
MVI C,0 ; NULL DEVICE
JZ XDEVC4 ; JUMP IF , = OR NULL FOUND
PUSH H
LXI D,XDVTBL-2 ; SPECIAL DEVICE CODE TABLE
XDEVC2: INX D
XDEVC1: INX D
XDEVC0: LDAX D
MOV C,A
CPI 1
JZ XDEVC3 ; JUMP IF END OF TABLE
POP H
PUSH H
INX D
LDAX D
INX D
CMP M
JNZ XDEVC2 ; JUMP IF NO MATCH
INX H
LDAX D
INX D
CMP M
JNZ XDEVC1 ; JUMP IF NO MATCH
INX H
LDAX D
INX D
CMP M
JNZ XDEVC0 ; JUMP IF NO MATCH
INX H ; TABLE MATCH FOUND
MVI A,':'
CMP M
JZ XDEVC3 ; JUMP IF COLON
MVI C,1 ; DISK DEVICE ASSUMED
XDEVC3: POP H ; RESTORE STACK
XDEVC4: PUSH B ; B - CHAN # C - DEVICE CODE #
CALL MCHOFF ; MAKE CHANNEL OFFSET POINTER
POP B
LXI H,JCHAN+5
DAD D
MOV M,C ; JCHAN(CH+5) = DEVICE CODE
MOV A,C
RET
;
;
XDVTBL: DB 0,'NUL'
DB 2,'CON'
DB 2,'TTY'
DB 2,'CRT'
DB 2,'KBD'
DB 3,'LST'
DB 3,'LPT'
DB 1
;
;
SKIPB: MOV A,M
ORA A
RZ
SUI ','
RZ
MOV A,M
SUI '='
RZ
MOV A,M
CPI ' '
RNZ
INX H
JMP SKIPB
;
; -----------------------------------
;
MCHOFF: DCR B ; COMPUTE CHANNEL OFFSET
MOV A,B ; FOR TABLE LOOKUP
RLC ; KCH = (JCH-1)*6
ADD B
RLC
MOV E,A
MVI D,0
RET
;
; -------------------------------------
;
; CONSOLE I/O
;
BDOS EQU 0005H
CIB: MVI C,10
CALL BDOS
RET
COB: MVI C,9
CALL BDOS
RET
CO: MVI C,2
CALL BDOS
RET
LO: MVI C,5
CALL BDOS
RET
;
; ------------------------------------
;
; STORAGE
;
JCHAN: DS 6*MAXCH+1 ; WORKING STORAGE FOR I/O TABLE
JOP: DS 1 ; STORAGE FOR OPERATION CODE
POINT: DS 2 ; BUFFER POINTER
NCHAN: DS 1 ; STORAGE FRO CHANNEL NUMBER
LEN: DS 1 ; LINE LENGTH
CHOFF: DS 2 ; CHANNEL TABLE OFFSET
;
IACCE: DB 1 ; READ ACCESS CODE
OACCE: DB 3 ; WRITE ACCESS CODE WITH DELETE
FTABP: DW FTAB1
DW FTAB2
DW FTAB3
DW FTAB4
FTAB1: DB 0,0,0,'1' ; CHAN 1 FILE TABLE
DS 33+128
FTAB2: DB 0,0,0,'2'
DS 33+128
FTAB3: DB 0,0,0,'3'
DS 33+128
FTAB4: DB 0,0,0,'4'
DS 33+128
FNPTR:
FNPTR1: DS 2
FNPTR2: DW FNCH2
FNPTR3: DS 2
FNPTR4: DS 2
FNCH2: DB 'STAGE2.CH2',0
FNNUL: DB 'NUL:',0
FNCON: DB 'CON:',0
FNLST: DB 'LST:',0
DB 128,0
COMLIN: DS 129 ; STORAGE FOR COMMAND LINE
COMERR: DB 0DH,0AH,'>>>>> COMMAND ERROR - REENTER'
DB 0DH,0AH,'$',0
;
;