(* FILELIB.I - Routines to allow the use of standard ATARI I/O calls in KYAN Pascal programs. IOCBUsed - If called immediately following a pascal Reset or Rewrite call this function will return the number of the IOCB that was used. FileOpen - Exactly like the ATARI Basic OPEN command. FileClose - Exactly like the ATARI Basic CLOSE command. FileGet - Replace the parameters REC and RECLEN with the name and length of your record and this routine will read one record from the file. FilePut - The inverse of FileGet. FileNote - Exactly like the ATARI Basic NOTE command. FilePoint - Exactly like the ATARI Basic POINT command. I don't recommend that you mix these routines with the standard Pascal I/O routines, though CLOSE might be useful. They were written for use in a small database program the DEMANDED true random access files. Use them with care as none of the protection provided by Pascal is present here. *) Function IOCBUsed : Integer; Begin #a LDA $2E ;Get IOCB # LSR A ;Divide by 16 LSR A LSR A LSR A LDY #3 ;Store in IOCBnum STA (SP),Y INY LDA #0 STA (SP),Y # End; (* IOCBUsed *) Procedure FileOpen(IOCBnum,IOdir,Auxbyte : Integer; Var FileName : String15); Begin #a ICHID EQU $0340 ICDNO EQU $0341 ICCMD EQU $0342 ICSTA EQU $0343 ICBAL EQU $0344 ICBAH EQU $0345 ICPTL EQU $0346 ICPTH EQU $0347 ICBLL EQU $0348 ICBLH EQU $0349 ICAX1 EQU $034A ICAX2 EQU $034B ICAX3 EQU $034C ICAX4 EQU $034D ICAX5 EQU $034E ICAX6 EQU $034F CIOV EQU $E456 ; T = LSB of 'FileName' ; T+1 = MSB of 'FileName' ; T+2 = LSB of AuxByte ; T+3 = MSB of AuxByte (Unused) ; T+4 = LSB of IOdir ; T+5 = MSB of IOdir (Unused) ; T+6 = LSB of IOCBnum ; T+7 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #7 ;Copy heap LDY #10 CL1 LDA (SP),Y STA T,X DEY DEX BPL CL1 LDA T+6 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #3 ;Open command STA ICCMD,X LDA T ;Filename address STA ICBAL,X LDA T+1 STA ICBAH,X LDA T+4 ;Data direction STA ICAX1,X LDA T+2 ;Aux byte STA ICAX2,X JSR CIOV ;Do the I/O PLA ;Restore X register TXA # End; (* FileOpen *) Procedure FileClose(IOCBnum : Integer); Begin #a ; T = LSB of IOCBnum ; T+1 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #1 ;Copy heap LDY #4 CL2 LDA (SP),Y STA T,X DEY DEX BPL CL2 LDA T ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #12 ;Close command STA ICCMD,X JSR CIOV ;Do the I/O PLA ;Restore X register TAX # End; (* FileClose *) Procedure FileGet(IOCBnum : Integer; Var Rec : RecType; RecLen : Integer); Begin #a ; T = LSB of Length ; T+1 = MSB of Length ; T+2 = LSB of 'Word' ; T+3 = MSB of 'Word' ; T+4 = LSB of IOCBnum ; T+5 = MSB of IOCBnum (Unused) TXA ;Saved X register PHA LDX #5 ;Copy heap LDY #8 CL3 LDA (SP),Y STA T,X DEY DEX BPL CL3 LDA T+4 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #7 ;Get record command STA ICCMD,X LDA T+2 ;Data address STA ICBAL,X LDA T+3 STA ICBAH,X LDA T ;Data length STA ICBLL,X LDA T+1 STA ICBLH,X JSR CIOV ;Do the I/O PLA ;Restore X register TAX # End; (* FileGet *) Procedure FilePut(IOCBnum : Integer; Var Rec : RecType; RecLen : Integer); Begin #a ; T = LSB of Length ; T+1 = MSB of Length ; T+2 = LSB of 'Word' ; T+3 = MSB of 'Word' ; T+4 = LSB of IOCBnum ; T+5 = MSB of IOCBnum TXA ;Save X register PHA LDX #5 ;Copy heap LDY #8 CL4 LDA (SP),Y STA T,X DEY DEX BPL CL4 LDA T+4 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #11 ;Put record command STA ICCMD,X LDA T+2 ;Data address STA ICBAL,X LDA T+3 STA ICBAH,X LDA T ;Data length STA ICBLL,X LDA T+1 STA ICBLH,X JSR CIOV ;Do the I/O PLA ;Restore X register TAX # End; (* FilePut *) Procedure FileNote(IOCBnum : Integer; Var Sector,Byte : Integer); Begin #a ; T = LSB of 'Byte' ; T+1 = MSB of 'Byte' (Unused) ; T+2 = LSB of 'Sector' ; T+3 = MSB of 'Sector' ; T+4 = LSB of IOCBnum ; T+5 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #5 ;Copy heap LDY #8 CL5 LDA (SP),Y STA T,X DEY DEX BPL CL5 LDA T+4 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A PHA ;Save for later TAX ;Move to X register LDA #38 ;Note command STA ICCMD,X JSR CIOV ;Do the I/O PLA ;Get IOCB # X 16 TAX ;Move to X register LDY #0 LDA ICAX5,X ;Get LSB of Byte STA (T),Y LDA ICAX3,X ;Get LSB of Sector STA (T+2),Y INY LDA #0 ;MSB of Byte STA (T),Y LDA ICAX4,X ;Get MSB of Sector STA (T+2),Y PLA ;Restore X register TAX # End; (* FileNote *) Procedure FilePoint(IOCBnum,Sector,Byte : Integer); Begin #a ; T = LSB of Byte ; T+1 = MSB of Byte (Unused) ; T+2 = LSB of Sector ; T+3 = MSB of Sector ; T+4 = LSB of IOCBnum ; T+5 = MSB of IOCBnum (Unused) TXA ;Save X register PHA LDX #5 ;Copy heap LDY #8 CL6 LDA (SP),Y STA T,X DEY DEX BPL CL6 LDA T+4 ;Get IOCB # ASL A ;Multiply by 16 ASL A ASL A ASL A TAX ;Move to X register LDA #37 ;Point command STA ICCMD,X LDA T+2 ;LSB of Sector STA ICAX3,X LDA T+3 ;MSB of Sector STA ICAX4,X LDA T ;LSB of Byte STA ICAX5,X JSR CIOV ;Do the I/O PLA ;Restore X register TAX # End; (* FilePoint *) TTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT