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