DREV EQU 24H ; 06/13/79 R. CURTISS "," FOR DELIMITER ALSO ;DREV EQU 23H ; 06/10/79 R. CURTISS DCLOSE XRA A, NOT IF READ ;DREV EQU 22H ; 08/19/78 R. CURTISS DEF. DMA = 80 AFTER ; READS AND WRITES ;DREV EQU 21H ; 08/19/78 R. CURTISS GCLOSE ADDITIONS ; ;DREV EQU 20H ; 08/17/78 R. CURTISS INITIAL CODING ; ;DREV EQU 15H ; 07/26/78 R. CURTISS BWRITE - MVI A,0 JNZ ; ;DREV EQU 14H ; 07/25/78 R. CURTISS OPEN- NR=0 ; ;DREV EQU 13H ; 07/25/78 R. CURTISS FIX ERROR IN READ ; AND OTHER CHANGES ; ;DREV EQU 12H ; 07/01/78 R. CURTISS FIX ERRORS ; ;DREV EQU 11H ; 07/01/78 R. CURTISS INITIAL CODING ; ; CP/M DISK I/O PACKAGE ; 1. INITIAL IMPLEMENTATION ; OPEN, CLOSE, READ BYTE, WRITE BYTE ; ; 2. NEXT STAGE OF DEVELOPMENT ; READ LINE, WRITE LINE, GENERAL CLOSE ; ; 3. ALLOW THE FOLLOWING FOR FILE NAMES: ; CON: - CONSOLE IN/OUT ; RDR: - READER IN ; PUN: - PUNCH OUT ; LST: - LISTING OUT ; ; ; TO OPEN DISK FILE ; ERROR IF FILE ALREADY OPEN ; ERROR IF BAD FILE NAME ; SELECT ( ACCESS ) ; ( 1 = READ ) CONTINUE ; ( 3 = WRITE ) ; ACCESS = 2 ; DELETE FILE IF PRESENT ; CREATE FILE ; ERROR IF NO DIRECTORY SPACE ; FIN ; ( 2 = WRITE ) ; ERROR IF FILE IS PRESENT ; CREATE FILE ; ERROR IF NO DIRECTORY SPACE ; FIN ; ( OTHER ) ERROR ILLEGAL ACCESS CODE ; FIN ; OPEN FILE ; ERROR IF NOT PRESENT ; STATUS = 0 NORMAL ; POINTER = 0 BUFFER EMPTY ; FIN ; ; INPUTS: ; (HL) POINTS TO FILE TABLE ORIGIN ; (DE) POINTS TO FILE NAME STRING ; (BC) POINTS TO ACCESS CODE ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; ; FCBOFF EQU 4 ; FCB OFFSET IN FILE TABLE BUFF EQU 37 ; BUFFER OFFSET IN FILE TABLE BDOS EQU 0005H ; ENTRY POINT TO OPERATING SYSTEM DB DREV ; PUT REVISION NUMBER IN CODE DOPEN: SHLD FTABLE ; SAVE FILE TABLE POINTER MOV A,M ; GET ACCESS CODE FROM FILE TABLE CPI 0 JNZ ERR ; JUMP IF FILE ALREADY OPEN LDAX B ; GET OPEN ACCESS CODE STA ACCESS LHLD FTABLE ; RECALL FILE TABLE POINTER LXI B,FCBOFF ; FCB OFFSET IN FILE TABLE DAD B CALL GETNAM ; GET FILE NAME JNZ ERR ; JUMP IF NAME ERROR LDA ACCESS DCR A JZ OPEN6 ; JUMP IF READ ACCESS DESIRED CPI 2 JNZ OPEN2 ; JUMP IF NOT WRITE WITH DELETE STA ACCESS ; ACCESS = 2 MVI C,19 CALL BDOS1 ; DELETE FILE IF PRESENT JMP OPEN4 OPEN2: CPI 1 JNZ ERR ; JUMP IF INVALID ACCESS CODE MVI C,17 CALL BDOS1 ; CHECK TO SEE IF FILE IS PRESENT CPI 255 JNZ ERR ; JUMP IF FILE IS PRESENT OPEN4: MVI C,22 CALL BDOS1 ; CREATE FILE CPI 255 JZ ERR ; JUMP IF NO DIRECTORY SPACE OPEN6: MVI C,15 CALL BDOS1 ; OPEN FILE CPI 255 JZ ERR ; JUMP IF NOT PRESENT LHLD FTABLE ; RECALL FILE TABLE POINTER LXI D,FCBOFF+32 DAD D MVI M,0 ; NEXT RECORD NUMBER IN FCB CALL GCLADD ; ADD FILE TABLE TO OPEN LIST LHLD FTABLE ; RECALL FILE TABLE POINTER LDA ACCESS MOV M,A ; SET ACCESS CODE IN FILE TABLE INX H XRA A MOV M,A ; SET STATUS TO ZERO (NORMAL) INX H MOV M,A ; SET BUFFER POINTER TO ZERO JMP RETURN ; ; ; TO CLOSE FILE ; OUTPUT LAST BUFFER IF OPEN FOR WRITE ; ERROR IF ACCESS < 1 OR > 2 ; CLOSE FILE IF OPEN FOR WRITE ; ERROR IF NOT PRESENT ; ACCESS = 0 ; BUFFER POINTER = 0 ; FIN ; ; INPUT: ; (HL) POINTS TO FILE TABLE ORIGIN ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; DCLOSE: SHLD FTABLE ; SAVE FILE TABLE POINTER MOV A,M ; GET ACCESS CODE FROM FILE TABLE CPI 2 JNZ CLOSE1 ; JUMP IF NOT OPEN FOR WRITE CALL CLOSE4 ; OUTPUT LAST BUFFER IF NOT EMPTY JZ CLOSE2 ; JUMP IF NO WRITE ERROR PUSH PSW ; SAVE ERROR CONDITION CALL CLOSE2 ; CLOSE THE FILE POP PSW JMP ERR CLOSE1: ORA A JZ RETURN ; JUMP IF ALREADY CLOSED CPI 1 JNZ ERR ; JUMP IF INVALID ACCESS CODE CLOSE2: CALL GCLREM ; REMOVE FILE TABLE FROM OPEN LIST LHLD FTABLE ; RECALL FILE TABLE POINTER XRA A MOV C,M ; GET ACCESS CODE MOV M,A ; ACCESS = 0 - FILE NOT OPEN INX H MOV M,A ; STATUS = 0 - NORMAL INX H MOV M,A ; BUFFER POINTER = 0 DCR C JZ RETURN ; JUMP IF OPEN FOR READ MVI C,16 CALL BDOS1 ; CLOSE FILE CPI 255 JZ ERR ; JUMP IF FILE NOT PRESENT XRA A ; NO ERROR JMP RETURN CLOSE4: INX H INX H MOV A,M ; GET BUFFER POINTER ANI 7FH ; MSB SHOULD BE 0 BUT BE SAFE RZ ; RETURN IF BUFFER IS EMPTY (Z)=1 LXI D,BUFF+127-2 ; -2 FOR 2 (INX HL) ABOVE DAD D ; (HL) POINTS TO LAST BUFFER BYTE CMA ADI 128+1 ; PAD COUNT = 128 - POINTER CLOSE6: MVI M,1AH ; PAD BUFFER WITH CONTROL Z DCX H DCR A JNZ CLOSE6 CALL WRITE2 ; OUTPUT LAST BUFFER RET ; (Z)=1 IF WRITE IS OK ; ; ; TO CLOSE ALL OPEN FILES ; FOR EACH OPEN FILE ; CLOSE FILE ; FIN ; FIN ; ; INPUTS: ; NONE ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; GCLOSE: LDA LSIZE ; RECALL OPEN FILE COUNT ORA A RZ ; RETURN IF LIST IS EMPTY LXI H,FLIST ; GET FIRST FILLE TABLE POINTER MOV E,M INX H MOV D,M XCHG CALL DCLOSE ; CLOSE AND DELETE FILE FROM LIST JMP GCLOSE ; ; ; ADD FILE TABLE TO OPEN FILE LIST ; GCLADD: LDA LSIZE ; GET OPEN FILE COUNT CPI LMAX ; FILE LIST MAX SIZE JNC GCLA9 ; JUMP IF LIST IS FULL INR A STA LSIZE ; LSIZE = LSIZE + 1 DCR A ADD A ; A = A*2 MOV E,A MVI D,0 LXI H,FLIST DAD D ; (HL) POINTS TO NEXT LIST ENTRY POS. XCHG LHLD FTABLE ; RECALL FILE TABLE POINTER XCHG MOV M,E INX H MOV M,D ; LIST(LSIZE) = FILE TABLE POINTER RET GCLA9: ; ****************** NEED EROR MESSAGE RET ; ; ; REMOVE FILE TABLE POINTER FROM OPEN FILE LIST ; GCLREM: LHLD FTABLE ; RECALL FILE TABLE POINTER XCHG LXI H,FLIST ; ORIGIN OF OPEN FILE LIST LDA LSIZE ; RECALL OPEN FILE COUNT MOV C,A INR C GCLR1: DCR C JZ GCLR9 ; JUMP IF END OF OPEN FILE LIST MOV A,M INX H XRA E MOV B,A MOV A,M INX H XRA D ORA B JNZ GCLR1 ; JUMP IF NO MATCH MOV D,H MOV E,L DCX D DCX D GCLR2: DCR C JZ GCLR8 ; JUMP IF END OF LIST MOV A,M STAX D INX H INX D MOV A,M STAX D ; LIST(M-1) = LIST(M) INX H INX D ; M = M + 1 JMP GCLR2 GCLR8: LDA LSIZE DCR A STA LSIZE RET GCLR9: ; ****************** NEED ERROR MESSAGE RET ; ; ; TO READ A LINE ; ERROR IF ACCESS <> "READ" ; ERROR IF STATUS <> "NORMAL" ; I = 1 ; GET-NEXT-BYTE ; UNTIL ( EOL,EOF,ERR ) ; IF ( I <= MAX-CHARACTER-COUNT ) ; LINE(I) = BYTE ; I = I + 1 ; FIN ; GET-NEXT-BYTE ; FIN ; RETURN-ACTUAL-CHARACTER-COUNT ; FIN ; ; INPUTS: ; (HL) POINTS TO FILE TABLE ; (DE) POINTS TO LINE BUFFER ORIGIN ; (BC) POINTS TO PARAMETER LIST ; 3RD POINTS TO MAX CHARACTER COUNT (255 MAX) ; 4TH POINTS TO ACTUAL CHARACTER COUNT (255 MAX) ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; LREAD: SHLD FTABLE ; SAVE FILE TABLE POINTER XCHG SHLD LPOINT ; SAVE LINE POINTER LXI H,DBYTE SHLD DATA ; DATA RETURN POINTER MOV H,B MOV L,C MOV E,M INX H MOV D,M ; (DE) POINTS TO 3RD ARG XCHG MOV C,M ; (C) HOLDS MAX LINE LENGTH MOV A,C STA CMAX ; SAVE MAX LINE LENGTH XCHG INX H MOV E,M INX H MOV D,M ; (DE) POINTS TO 4TH ARG XCHG SHLD ACTP ; SAVE POINTER FOR ACTUAL LENGTH LHLD FTABLE ; RECALL FILE TABLE POINTER MOV A,M ; GET ACCESS CODE CPI 1 JNZ ERR ; JUMP IF NOT OPEN FOR READ INX H MOV A,M ; GET STATUS CODE ORA A JNZ ERR ; JUMP IF NOT NORMAL INX H ; (HL) POINTS TO BUFFER POINTER SHLD BPOINT ; SAVE IT LREAD1: CALL LREAD5 ; GET NEXT BYTE FROM DISK JNZ LREAD2 ; JUMP IF EOL,EOF,ERR CALL LREAD8 ; STORE BYTE INTO LINE JMP LREAD1 LREAD2: PUSH PSW ; SAVE READ STATUS LDA CMAX ; RECALL MAX CHARACTER COUNT SUB C LHLD ACTP MOV M,A ; RETURN ACTUAL CHARACTER COUNT POP PSW CPI 0DH ; CARRIAGE RETURN JNZ RETURN ; RETURN IF EOF OR ERR XRA A JMP RETURN ; NORMAL RETURN ; ; GET NEXT BYTE ; LREAD5: LHLD BPOINT ; RECALL BUFFER POINTER POINTER PUSH B ; SAVE LINE SPACE COUNT CALL BRXXX ; GET NEXT BYTE FROM DISK POP B RNZ ; RETURN IF EOF,ERR LDA DBYTE ; GET BYTE JUST READ ANI 7FH JZ LREAD5 ; IGNORE NULL CPI 0AH JZ LREAD5 ; IGNORE LINE FEED CPI 7FH JZ LREAD5 ; IGNORE RUBBOUT CPI 1AH ; CONTROL Z JZ LREAD6 ; JUMP IF END OF FILE CPI 0DH JZ LREAD7 ; JUMP IF CARRIAGE RETURN CMP A ; (Z)=1 RET ; NORMAL RETURN LREAD6: MVI A,255 ; END OF FILE LREAD7: ORA A ; END OF LINE RET ; ; STORE NEXT BYTE IN LINE ; LREAD8: INR C DCR C RZ ; RETURN IF LINE BUFFER FULL LHLD LPOINT ; RECALL LINE BUFFER POINTER MOV M,A INX H SHLD LPOINT DCR C RET ; ; ; TO READ BYTE ; ERROR IF ACCESS <> "READ" ; ERROR IF STATUS <> "ZERO" ; IF ( BUFFER EMPTY ) ; GET NEXT BUFFER LOAD ; POINT = 0 ; RETURN IF "EOF" ; FIN ; GET NEXT BYTE FROM BUFFER ; POINT = POINT + 1 ; FIN ; ; INPUTS: ; (HL) POINTS TO FILE TABLE ORIGIN ; (DE) POINTS TO DATA BYTE STORAGE ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; ((DE)) = DATA BYTE RETURNED ; BREAD: SHLD FTABLE ; SAVE FILE TABLE POINTER XCHG SHLD DATA ; SAVE DATABYTE POINTER MVI M,1AH ; TENTATIVELY RETURN CONTROL Z XCHG MOV A,M ; GET ACCESS CODE CPI 1 JNZ ERR ; JUMP IF NOT READ ACCESS INX H MOV A,M ; GET STATUS CODE CPI 0 JNZ ERR ; JUMP IF NOT NORMAL INX H BRXXX: MOV A,M ; GET BUFFER POINTER MOV E,A ; SAVE CURRENT POINTER INR A ANI 7FH MOV M,A ; POINTER = (POINTER + 1) MOD 128 MOV A,E ; GET CURRENT POINTER ORA A JNZ READ2 ; JUMP IF BUFFER NOT EMPTY CALL READ4 ; GET NEXT BUFFER LOAD JNZ ERR ; JUMP IF READ ERROR ORA A JNZ RETURN ; JUMP IF END OF FILE MVI E,0 ; CURRENT POINTER READ2: LHLD FTABLE ; RECALL FILE TABLE POINTER MVI D,0 ; (E) IS BUFFER POINTER DAD D LXI D,BUFF ; BUFFER OFFSET IN FILE TABLE DAD D ; (HL) POINTS TO NEXT BYTE IN BUFFER MOV A,M ; GET NEXT DATA BYTE LHLD DATA ; RECALL DATA RETURN POINTER MOV M,A ; RETURN DATA BYTE TO CALLER XRA A ; (A)=0 (Z)=1 JMP RETURN ; NORMAL RETURN READ4: MVI C,26 CALL BDOS2 ; SET DMA ADDRESS MVI C,20 CALL BDOS1 ; READ NEXT DISK RECORD PUSH PSW MVI C,26 LXI D,80H CALL BDOS ; RESTORE DMA ADDR TO DEFAULT POP PSW ORA A RZ ; RETURN IF OK (Z)=1 CPI 1 ; EOF RNZ ; RETURN IF ERROR (A)>1 (Z)=0 LHLD FTABLE ; RECALL FILE TABLE POINTER INX H MVI A,255 MOV M,A ; SET STATUS TO "EOF" CPI 255 ; EOF (A)=255 (Z)=1 RET ; END OF FILE DETECTED ; ; ; TO WRITE A LINE ; ERROR IF ACCESS <> "WRITE" ; ERROR IF STATUS <> "ZERO" "NORMAL" ; FOR I = 1 TO LENGTH OF LINE ; WRITE BYTE LINE(I) ; FIN ; FIN ; ; INPUTS: ; (HL) POINTS TO FILE TABLE ; (DE) POINTS TO LINE BUFFER ORIGIN ; (BC) POINTS TO LINE LENGTH IN BYTES (255 MAX) ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; LWRITE: SHLD FTABLE ; SAVE FILE TABLE POINTER MOV A,M ; GET ACCESS CODE CPI 2 JNZ ERR ; JUMP IF NOT OPEN FOR WRITE INX H MOV A,M ; GET STATUS CODE ORA A JNZ ERR ; JUMP IF NOT NORMAL INX H ; POINTS TO BUFFER POINTER LDAX B ; CHARACTER COUNT MOV C,A INR C LWRIT1: DCR C JZ LWRIT2 ; JUMP IF END OF LINE PUSH H PUSH D PUSH B LDAX D ; GET NEXT DATA BYTE MOV B,A CALL BWXXX ; WRITE BYTE TO DISK POP B POP D POP H RNZ ; RETURN IF WRITE ERROR INX D JMP LWRIT1 LWRIT2: MVI B,0DH PUSH H CALL BWXXX ; WRITE CARRIAGE RETURN TO DISK POP H RNZ ; RETURN IF WRITE ERROR MVI B,0AH CALL BWXXX ; WRITE LINE FEED TO DISK RET ; ; ; TO WRITE BYTE ; ERROR IF ACCESS <> "WRITE" ; ERROR IF STATUS <> "ZERO" ; PUT BYTE INTO BUFFER ; POINT = POINT + 1 ; IF ( BUFFER FULL ) ; WRITE NEXT BUFFER LOAD ; POINT = 0 ; FIN ; FIN ; ; INPUTS: ; (HL) POINTS TO FILE TABLE ORIGIN ; (DE) POINTS TO DATA BYTE STORAGE ; ; OUTPUTS: ; (A)=(HL)= OPERATION STATUS ; (Z) = CONDITION OF (A) ; BWRITE: SHLD FTABLE ; SAVE FILE TABLE POINTER LDAX D ; GET DATA BYTE MOV B,A ; SAVE IN B MOV A,M ; GET ACCESS CODE CPI 2 JNZ ERR ; JUMP IF NOT WRITE ACCESS INX H MOV A,M ; GET STATUS CODE CPI 0 JNZ ERR ; JUMP IF NOT NORMAL INX H ; ; (HL) POINTS TO BUFFER POINTER ; (B) DATA BYTE FOR OUTPUT ; BWXXX: MOV A,M ; GET BUFFER POINTER MOV E,A ; SAVE CURRENT POINTER INR A ANI 7FH MOV M,A ; POINTER = (POINTER+1) MOD 128 MVI D,0 DAD D LXI D,BUFF-2 ; -2 FOR 2 (INX HL) ABOVE DAD D ; (HL) = FTABLE+BUFF+POINT MOV M,B ; STORE DATA BYTE INTO BUFFER CPI 0 MVI A,0 ; NO ERROR JNZ RETURN ; JUMP IF BUFFER NOT FULL CALL WRITE2 ; WRITE BUFFER TO DISK JNZ ERR ; JUMP IF WRITE ERROR JMP RETURN WRITE2: MVI C,26 CALL BDOS2 ; SET DMA ADDRESS MVI C,21 CALL BDOS1 ; WRITE NEXT DISK RECORD PUSH PSW MVI C,26 LXI D,80H CALL BDOS ; RESTORE DMA ADDR. TO DEFAULT POP PSW ORA A RZ ; RETURN IF WRITE OK (A)=0 (Z)=1 CPI 2 ; END OF DISK RNZ ; RETURN IF ERROR (A)=1,>2 (Z)=0 LHLD FTABLE ; RECALL FILE TABLE POINTER INX H MVI A,255 ; END OF MEDIUM MOV M,A ; SET STATUS CPI 255 ; SET ZERO FLAG FOR NO ERROR RET ; (A)=255 (Z)=1 ; ; ; SCAN FILE NAME ; INPUTS: ; (HL) POINTS TO FCB ; (DE) POINTS TO FILE NAME - LEADING SPACES OK ; ; OUTPUTS: ; (A) = COUNT OF "?" IN NAME ; (Z) = CONDITION OF (A) ; (DE)= POINTER TO END OF NAME DELIMITER ; GETNAM: ; GET FILE REFERENCE PUSH H CALL LL35 ; IGNOR LEADING BLANKS ORA A ; NULL INDICATES END OF BUFFER JZ LLA6A ; JUMP IF NULL SBI '@' ; CHECK IF DRIVE SPECIFIED MOV B,A INX D LDAX D CPI ':' JZ LL76 DCX D MVI M,0 ; ZERO FOR CURRENT DRIVE JMP LL7C LL76: MOV M,B ; SPECIFIED DRIVE INX D LL7C: ; GET FILENAME MVI B,8 CALL LL7E ; SCAN FILE NAME MVI B,3 CPI '.' ; FILE TYPE DELIMITER JNZ LLCF ; JUMP IF NO FILE TYPE INX D CALL LL7E ; SCAN FILE TYPE JMP LLD6 LLCF: ; FILL REST OF FILE TYPE WITH SPACES INX H MVI M,' ' DCR B JNZ LLCF LLD6: ; PUT THREE ZEROS IN FILE CONTROL BLOCK MVI B,3 LLD8: INX H MVI M,0 DCR B JNZ LLD8 POP H LXI B,000BH LLE7: ; CHECK FOR AMBIGUOUS FILE REFERENCE INX H MOV A,M CPI '?' JNZ LLEF INR B LLEF: DCR C JNZ LLE7 MOV A,B ORA A ; (A) IS COUNT OF '?' IN NAME RET ; (Z)=1 IF UNAMBIGUOUS NAME ; ; ; --------------------- ; ; (B)= MAX CHARACTER COUNT ; LL7E: ; SCAN FNAME OR FTYPE CALL LL16 JZ LL9F ; JUMP IF DELIMITER FOUND INX H CPI '*' ; IF '*', FILL REST OF FILENAME WITH '?' JNZ LL8F MVI M,'?' JMP LL91 LL8F: MOV M,A ; STORE IN FCB INX D LL91: DCR B ; CHARACTER COUNT JNZ LL7E LL95: ; IGNORE EXTRA CHARACTERS CALL LL16 JZ LLA6 INX D JMP LL95 LL9F: ; FILL REST OF FILENAME WITH SPACES INX H MVI M,' ' DCR B JNZ LL9F LLA6: RET ; ; ---------------------- ; LLA6A: POP H ORI 255 ; NO FILE NAME FOUND RET ; (Z)=0 ; ; -------------------------- ; LL16: ; CHECK FOR DELIMITERS LDAX D ORA A ; NULL RZ CPI ' ' ; SPACE JNC LL16A ; JUMP IF NOT CONTROL CHARACTER MVI A,'?' ; REPLACE CONTROL CHAR RET ; (Z)=0 LL16A: RZ CPI '=' RZ CPI 5FH ; BACK ARROW RZ CPI '.' RZ CPI ',' RZ CPI ':' RZ CPI ';' RZ CPI '<' RZ CPI '>' RET ; ; ---------------- ; LL35: ; ADVANCE TO FIRST NON-BLANK OR END LDAX D ORA A RZ CPI ' ' RNZ INX D JMP LL35 ; ; ; ; BDOS FUNCTIONS USING FILE CONTROL BLOCK POINTER ; BDOS1: LHLD FTABLE ; RECALL FILE TABLE POINTER LXI D,FCBOFF DAD D XCHG ; (DE) POINTS TO FILE CONTROL BLOCK CALL BDOS RET ; ; ; BDOS FUNCTIONS USING BUFFER POINTER ; BDOS2: LHLD FTABLE ; RECALL FILE TABLE POINTER LXI D,BUFF ; BUFFER OFFSET DAD D XCHG ; (DE) POINTS TO BUFFER ORIGIN CALL BDOS RET ; ; ; ALL ERROR CONDITIONS EXIT HERE ; ERR: LHLD FTABLE ; RECALL FILE TABLE POINTER ; .... ..... ADD ERROR MESSAGE SOMETIME INX H MVI A,255 MOV M,A ; SET STATUS TO EOF DCR A ; (A) = 254 (UNSPECIFIED ERROR) ; ; RETURN: MVI H,0 MOV L,A ; FORTRAN INTEGER FUNCTION RESULT ORA A ; DETERMINE ZERO FLAG RET ; ; ; LOCAL TEMPORARY STORAGE ; FTABLE: DS 2 ; FILE TABLE POINTER ACCESS: DS 1 ; ACCESS CODE DATA: DS 2 ; DATA BYTE POINTER ; ; ; STORAGE FOR OPEN FILE LIST ; LSIZE: DB 0 ; COUNT OF FLIST SIZE LMAX EQU 10 ; MAX SIZE OF OPEN FILE TABLE FLIST: DS LMAX*2 ; LIST OF FILE TABLE POINTERS ; ; ; STORAGE FOR LREAD ; LPOINT: DS 2 BPOINT: DS 2 ACTP: DS 2 DBYTE: DS 1 CMAX: DS 1 ; ;