CP/M DISK I/O PACKAGE VERSION 2.X 08/17/78 COMPATIBLE WITH MICROSOFT FORTRAN DICK CURTISS 843 NW 54TH SEATTLE, WASHINGTON 98107 (206) 784 8018 FORTRAN USAGE: INTEGER DOPEN , DCLOSE , GCLOSE INTEGER BREAD , BWRITE INTEGER LREAD , LWRITE INTEGER DATABYTE , LINE(40) , STATUS INTEGER MCOUNT , ACOUNT INTEGER FILETABLE(83) , FILENAME(6) DATA FILETABLE(1) , FILETABLE(2) / 0 , 'XX' / DATA FILENAME / 'B:' , 'FN' , 'AM' , 'E.' , 'TX' , 'T ' / OPEN DISK FILE: 1 STATUS = DOPEN ( FILETABLE , FILENAME , 2 ) 3 1 READ ACCESS 2 WRITE ACCESS - NO DELETE 3 WRITE ACCESS WITH DELETE IF ( STATUS .NE. 0 ) GO TO ...... ERROR CLOSE DISK FILE: STATUS = DCLOSE ( FILETABLE ) IF ( STATUS .NE. 0 ) GO TO ...... ERROR CLOSE ALL OPEN FILES STATUS = GCLOSE ( 0 ) READ BYTE FROM DISK FILE: DATABYTE = 0 STATUS = BREAD ( FILETABLE , DATABYTE ) IF ( STATUS .EQ. 255 ) GO TO ...... END OF FILE IF ( STATUS .NE. 0 ) GO TO ...... ERROR WRITE BYTE TO DISK FILE: STATUS = BWRITE ( FILETABLE , DATABYTE ) IF ( STATUS .EQ. 255 ) GO TO ...... END OF MEDIUM IF ( STATUS .NE. 0 ) GO TO ...... ERROR READ LINE FROM DISK FILE: MCOUNT = 80 STATUS = LREAD ( FILETABLE , LINE , MCOUNT , ACOUNT ) IF ( STATUS .EQ. 255 ) GO TO ...... END OF FILE IF ( STATUS .NE. 0 ) GO TO ...... ERROR WRITE LINE TO DISK FILE: ACOUNT = 80 STATUS = LWRITE ( FILETABLE , LINE , ACOUNT ) IF ( STATUS .EQ. 255 ) GO TO ...... END OF MEDIUM IF ( STATUS .NE. 0 ) GO TO ...... ERROR NOTES: 1. EACH FILE MUST HAVE ITS OWN "FILETABLE" OF 165 BYTES. 2. THE "FILETABLE" SHOULD NOT BE ALTERED BY THE USER EXCEPT DURING PROGRAM INITIALIZATION WHEN THE FIRST 2 BYTES SHOULD BE SET TO ZERO AND THE FOURTH BYTE SET TO SOME CHARACTER WHICH WILL BE DISPLAYED IN ANY ERROR MESSAGES. 3. "FILENAME" IS A CHARACTER STRING REPRESENTING A VALID CP/M FILE NAME WITH OPTIONAL DISK SELECT AND FILE TYPE. LEADING SPACES ARE IGNORED AND THE MAY BE TERMINATED BY A SPACE, CARRIAGE RETURN, ",", OR "=". STORAGE MUST BE A CONTIGUOUS STRING OF BYTES - NOT ONE CHARACTER PER INTEGER WORD. 4. TWO OPTIONS ARE AVAILABLE FOR WRITE ACCESS. IF THE FILE ALREADY EXISTS AND THE ACCESS CODE IS 2, AN ERROR WILL RESULT AND THE FILE WILL NOT BE OPENED. IF THE ACCESS CODE IS 3, AN EXISTING FILE WILL BE DELETED BEFORE OPEN. 5. OPERATION "STATUS" 0 NORMAL 1-254 ERROR CODE - NOT PRESENTLY SPECIFIED 255 END OF FILE ON READ 255 END OF MEDIUM ON WRITE 6. LREAD -- CARRIAGE RETURN IS END OF LINE LINE FEED, NULL AND RUBBOUT ARE IGNORED CONTROL Z IS END OF FILE ASCII PARITY BIT IS REMOVED 7. LWRITE -- LINES ARE AUTOMATICALLY TERMINATED BY CARRIAGE RETURN - LINE FEED 8. "DATABYTE" STORAGE FOR READ AND WRITE IS A SINGLE BYTE AS FAR AS THE ROUTINES ARE CONCERNED. PRIOR TO READ THE MOST SIGNIFICANT BYTE OF "DATABYTE" SHOULD BE SET TO ZERO IF THE DATA IS TO BE USED IN INTEGER COMPARES, ETC. 9. "MCOUNT" AND "ACOUNT" ARE SINGLE BYTE INTEGERS AS FAR AS THE ROUTINES ARE CONCERNED. ASSEMBLER USAGE: FILETABLE: DB 0 ; ACCESS CODE STORAGE DB 0 ; STATUS CODE STORAGE DS 1 ; BUFFER INDEX OR POINTER DB 'X' ; FILE ID FOR ERROR MESSAGES DS 33 ; CP/M FILE CONTROL BLOCK DS 128 ; DATA BUFFER STORAGE 1 READ ACCESS ACCESS: DB 2 ; WRITE ACCESS - NO DELETE 3 WRITE WITH DELETE FILENAME: DB 'B:FNAME.TXT ' DATABYTE: DS 1 ; STORAGE FOR DATABYTE MCOUNT: DB 80 ; LENGTH OF READ BUFFER LINE: DS 80 ; LINE BUFFER ACOUNT: DS 1 ; LINE READ ACTUAL COUNT OPEN DISK FILE: LXI H,FILETABLE LXI D,FILENAME LXI B,ACCESS CALL DOPEN ; OPEN FILE JNZ ERROR CLOSE DISK FILE: LXI H,FILETABLE CALL DCLOSE ; CLOSE FILE JNZ ERROR CLOSE ALL OPEN FILES: CALL GCLOSE ; CLOSE ALL OPEN FILES JNZ ERROR READ BYTE FROM DISK FILE: LXI H,FILETABLE LXI D,DATABYTE CALL BREAD ; READ A BYTE INR A JZ ENDOFFILE DCR A JNZ ERROR WRITE BYTE TO DISK FILE: LXI H,FILETABLE LXI D,DATABYTE CALL BWRITE ; WRITE A BYTE INR A JZ ENDOFMEDIUM DCR A JNZ ERROR READ LINE FROM DISK FILE: LXI H,FILETABLE LXI D,LINE LXI B,ARGLIST CALL LREAD ; READ A LINE INR A JZ ENDOFFILE DCR A JNZ ERROR ARGLIST: DW MCOUNT DW ACOUNT WRITE LINE TO DISK FILE: LXI H,FILETABLE LXI D,LINE LXI B,ACOUNT CALL LWRITE ; WRITE A LINE INR A JZ ENDOFMEDIUM DCR A JNZ ERROR NOTES: 1. EACH FILE MUST HAVE ITS OWN "FILETABLE" OF 165 BYTES. 2. THE "FILETABLE" SHOULD NOT BE ALTERED BY THE USER EXCEPT DURING PROGRAM INITIALIZATION WHEN THE FIRST 2 BYTES SHOULD BE SET TO ZERO AND THE FOURTH BYTE SET TO SOME CHARACTER WHICH WILL BE DISPLAYED IN ANY ERROR MESSAGES. 3. "FILENAME" IS A CHARACTER STRING REPRESENTING A VALID CP/M FILE NAME WITH OPTIONAL DISK SELECT AND FILE TYPE. LEADING SPACES ARE IGNORED AND THE STRING MAY BE TERMINATED BY A SPACE, CARRIAGE RETURN, ",", OR "=". 4. TWO OPTIONS ARE AVAILABLE FOR WRITE ACCESS. IF THE FILE ALREADY EXISTS AND THE ACCESS CODE IS 2, AN ERROR WILL RESULT AND THE FILE WILL NOT BE OPENED. IF THE ACCESS CODE IS 3, AN EXISTING FILE WILL BE DELETED BEFORE OPEN. 5. OPERATION STATUS (HL), (A) AND (Z) (HL) (A) (Z) 0 1 NORMAL 1-254 0 ERROR CODE - NOT PRESENTLY SPECIFIED 255 0 END OF FILE ON READ 255 0 END OF MEDIUM ON WRITE 6. LREAD -- CARRIAGE RETURN IS END OF LINE LINE FEED, NULL AND RUBBOUT ARE IGNORED CONTROL Z IS END OF FILE ASCII PARITY BIT IS REMOVED 7. LWRITE -- LINES ARE AUTOMATICALLY TERMINATED BY CARRIAGE RETURN - LINE FEED