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