CIO Library for Kyan Pascal#
CIO EQUATES FILE
While you program with your Atari, you will frequently use input and output operations, and you will invariably use CIO to do these operations (except for specialized operations, in which case you may use something like SIO). CIO has many labels associated with it such as ICCMD and ICAX1, which you will use often. But if you EQUate these labels in different routines, the Kyan Macro Assembler (AS) will hand you a 'multiply defined label' error, so you must equate these labels globally (which means right after your global VARiable declarations).
I have created an include file, CIOEqu.i, to make these global equates, which may then be used by assembly language routines throughout your program. It is not an all- encompassing file--that is, it does not contain equates for every CIO label and command number, just most of the more commonly encountered ones. You may, of course, add missing labels and commands to this file.
This file should generally be the first one that you include after your global VARiable declarations, since its labels may be used by other included routines. The function GetCha is a routine that makes use of CIOEqu.i. It is available in this data library under the filenames GETCHR.DOC and GETCHR.PAS.
(CIOEQU.PAS should be renamed to CIOEQU.I after you download it.)
CIOEQU.I#
#A ;_________CIO equates file__________ ; ;-->cio labels: ICCMD EQU $0342 ;command byte ICCOM EQU $0342 ;cover both bases ICSTA EQU $0343 ;status ICBAL EQU $0344 ;LSB for buffer ICBAH EQU $0345 ;MSB " " ICBLL EQU $0348 ;buffer length LSB ICBLH EQU $0349 ; " " MSB ICAX1 EQU $034A ;auxillary byte one ICAX2 EQU $034B ; " " two CIOV EQU $E456 ;The big vector! ; ;-->iocb numbers: iocb0 EQU $00 iocb1 EQU $10 iocb2 EQU $20 iocb3 EQU $30 iocb4 EQU $40 iocb5 EQU $50 iocb6 EQU $60 iocb7 EQU $70 ; ;-->cio commands: open EQU $03 getrec EQU $05 getch EQU $07 putrec EQU $09 putch EQU $0B close EQU $0C status EQU $0 ; ;-->fms commands rename EQU $20 delete EQU $21 protect EQU $23 unprotect EQU $24 point EQU $25 note EQU $26 format EQU $FE ; ;-->S: display commands draw EQU $11 fill EQU $12 ; ;-->aux commands read EQU 4 conread EQU 5 readdir EQU 6 write EQU 8 append EQU 9 update EQU 12 conrw EQU 13 ; ;This is not an 'Omni-File'...Only the ;more commonly used CIO things are ;included. You may add to it without ;any problems. #
CIOLIB .PAS#
(* CIOLib.i ________ (C) 1986 Erik C. Warren Routines to access CIO calls. Last Updated: 30 July, 1986 These routines are in the public domain and may not be sold, except for the price of the software media, with- out the expressed, written permission of the author. *) FUNCTION Close(IOCB_Num: Integer): Integer; BEGIN Close:= 1; IOCB_Num:= IOCB_Num * 16; #A stx _t ldy #7 lda (_sp),y ;IOCB tax lda #12 ;close command sta $342,x jsr $e456 ;ciov tya ;same as icsta ldy #5 sta (_sp),y ;store in Close ldx _t # END;(* Close *) FUNCTION Open(IOCB_Num,Ax1,Ax2: Integer; VAR Dev: Device_String) : Integer; BEGIN Open:= 1; IOCB_Num:= IOCB_Num * 16; (* stack: opn num ax1 ax2 dev 5 13 11 9 7 *) #A stx _t ldy #13 lda (_sp),y ;IOCB tax lda #3 ;open command sta $342,x dey dey ;11 lda (_sp),y ;icax1 sta $34a,x dey dey ;9 lda (_sp),y ;icax2 sta $34b,x dey ;8 lda (_sp),y ;dev MSB sta $345,x ;icbah dey ;7 lda (_sp),y ;icbal sta $344,x jsr $e456 ;ciov tya ;same as icsta ldy #5 sta (_sp),y ;store in Open ldx _t # END;(* Open *) FUNCTION Get_Byte(IOCB_Num: Integer; VAR GB: Integer) : Integer; VAR TB: Integer; BEGIN TB:= 0; Get_Byte:= 1; GB:= 0; IOCB_Num:= IOCB_Num * 16; (* stack: get num gb tb 7/8 11/12 9/10 5/6 *) #A stx _t ldy #11 lda (_sp),y ;IOCB tax lda #7 ;get char command sta $342,x lda #$00 ;zero out the unused sta $348,x ;store in accumulator sta $349,x ;...after CIOV jump jsr $e456 sty _t+1 ;hold temporarily ldy #5 sta (_sp),y ;put byte in GB lda _t+1 ;get status back ldy #7 sta (_sp),y ;store in Get_Byte ldx _t # GB:= TB END;(* Get_Byte *) FUNCTION Put_Byte(IOCB_Num: Integer; PB: Integer) : Integer; BEGIN Put_Byte:= 1; IOCB_Num:= IOCB_Num * 16; (* stack: put num pb 5 9 7 *) #A stx _t ldy #9 lda (_sp),y ;IOCB tax lda #11 ;put char command sta $342,x lda #$00 ;zero out the unused sta $348,x ;put from accumulator sta $349,x ldy #7 lda (_sp),y ;put PB in accumulator jsr $e456 tya ;same as icsta ldy #5 sta (_sp),y ;store in Put_Byte ldx _t # END;(* Put_Byte *)