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 *)