CIO Library with Note and Point for Kyan Pascal#

(* FILELIB.I - Routines to allow the use of standard ATARI I/O calls in KYAN
   Pascal programs.
   
   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.
   FileGetChar - Reads one character from the file.
   FilePut     - The inverse of FileGet.
   FilePutChar - The inverse of FileGetChar.
   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.  They were written for use in a small database program that
   DEMANDED true random access files.  Use them with care as none of the
   protection provided by Pascal is present here.  <Mike Long  9/19/86>      *)
   


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 #12
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 #6
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 RecLen
; _T+1 = MSB of RecLen
; _T+2 = LSB of ^Rec
; _T+3 = MSB of ^Rec
; _T+4 = LSB of IOCBnum
; _T+5 = MSB of IOCBnum (Unused)

     TXA            ;Saved X register
     PHA
     LDX #5         ;Copy heap
     LDY #10
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 FileGetChar(IOCBnum : Integer;
                      Var Byte : Char);
                      
Begin
#a

; _T   = LSB of ^Byte
; _T+1 = MSB of ^Byte
; _T+2 = LSB of IOCBnum
; _T+3 = MSB of IOCBnum

     TXA            ; Save X register
     PHA
     LDX #3         ; Copy heap
     LDY #8
CL4  LDA (_SP),Y     
     STA _T,X
     DEY
     DEX
     BPL CL4
     LDA _T+2       ;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 #0         ;Single byte get
     STA ICBLL,X
     STA ICBLH,X
     JSR CIOV       ;Do the I/O
     LDY #0         ;Store the byte in
     STA (_T),Y     ;  'Byte'
     PLA            ;Restore X register
     TAX
     
#
End; (* FileGetChar *)


Procedure FilePut(IOCBnum : Integer;
                  Var Rec : RecType;
                  RecLen  : Integer);
                  
Begin
#a

; _T   = LSB of RecLen
; _T+1 = MSB of RecLen
; _T+2 = LSB of ^Rec
; _T+3 = MSB of ^Rec
; _T+4 = LSB of IOCBnum
; _T+5 = MSB of IOCBnum

     TXA            ;Save X register
     PHA
     LDX #5         ;Copy heap
     LDY #10
     
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
     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 FilePutChar(IOCBnum : Integer;
                      Byte : Char);
                      
Begin
#a

; _T   = Byte
; _T+1 = LSB of IOCBnum
; _T+2 = MSB of IOCBnum

     TXA            ; Save X register
     PHA
     LDX #3         ; Copy heap
     LDY #8
     
CL6  LDA (_SP),Y
     STA _T,X
     DEY
     DEX
     BPL CL6
     LDA _T+1       ;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 #0         ;Single byte put
     STA ICBLL,X
     STA ICBLH,X
     LDA _T         ;Put Byte in ACC
     JSR CIOV       ;Do the I/O
     PLA            ;Restore X register
     TAX
     
#
End; (* FilePutChar *)

Procedure FileNote(IOCBnum : Integer;
                   Var Sector,Byte : Integer);
                   
Begin
#a

; _T   = LSB of ^Byte
; _T+1 = MSB of ^Byte
; _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 #10
     
CL7  LDA (_SP),Y
     STA _T,X
     DEY
     DEX
     BPL CL7
     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 #10
     
CL8  LDA (_SP),Y
     STA _T,X
     DEY
     DEX
     BPL CL8
     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 *)