
; CIO-Beispielcode in MAC/65- bzw. ATASM-Syntax

kanal = 1
eol   = 155    ; ATASCII-EOL-Zeichen

icdev = $340   ; Index auf Gerte-Handler, wird vom CIO gesetzt, nicht ndern
icdnr = $341   ; Gertenummer, wird vom CIO gesetzt, nicht ndern
iccmd = $342   ; CIO-Kommando: siehe unten
icsta = $343   ; CIO-Returncode, wird vom CIO gesetzt, >=128: Fehler
icadr = $344   ; CIO-Pufferadresse, muss bei OPEN/XIO auf Filespec zeigen
icput = $346   ; Handler-Put-Adresse-1, wird vom CIO gesetzt, nicht ndern
iclen = $348   ; CIO-Pufferlnge
icaux = $34a   ; CIO-Aux-Bytes AUX1, AUX2, nach Open nicht ndern

ciov  = $e456  ; CIO-Routine

; CIO-Kommandos
; Open=3, Get Record=5, Get Bytes=7, Put Record=9, Put Bytes=11, Close=12
; Status=13, sonstige>=14 (uDOS kann 3-12 und 40)

; CIO-Aux1-Byte fr Open
; Open read=4, Open write=8, Open append=9, Open update=12
; uDOS untersttzt 4,8,12 (8 nur fr 1 Sektor, 12 nur schreibend)

; Datei fr Lesen (AUX1=4) auf Kanal 1 ffnen: open #1,4,0,"D:NAME"
 ldx #kanal*16   ; Kanalnr. * 16 in X-Register setzen
 lda #3
 sta iccmd,x     ; CIO-Kommando 3 = Open
 lda #<filespec
 sta icadr,x     ; icadr muss auf Filespec ziegen
 lda #>filespec
 sta icadr+1,x
 lda #4          ; AUX1=4 fr Open read (8 fr write, 12 fr update)
 sta icaux,x
 jsr ciov        ; CIO aufrufen
 bmi error       ; Returncode prfen (steht in Y und icsta)

; fr Schreiben (AUX1=8) und Update (AUX2=12) genauso

filespec  .byte "D:NAME",eol

; 500 Bytes von Kanal 1 nach data lesen
 ldx #kanal*16   ; Kanalnr. * 16 in X-Register setzen
 lda #7
 sta iccmd,x     ; CIO-Kommando 7 = Get Bytes
 lda #<data
 sta icadr,x     ; icadr muss auf Pufferbeginn frs Lesen zeigen
 lda #>data
 sta icadr+1,x
 lda #<500
 sta iclen,x     ; iclen muss max. Anzahl zu lesender Bytes enthalten
 lda #>500
 sta iclen+1,x
 jsr ciov        ; CIO aufrufen
 bmi error       ; Returncode prfen (steht in Y und icsta)

; iclen/iclen+1 enthlt jetzt die tatschlich gelesene Anzahl Bytes,
; falls ein Fehler aufgetreten ist.
; Achtung: Ist die Datei krzer als 500 Bytes, gibt es hier Error 136.
; Das ist dann kein "Fehler", sondern ein netter Trick, um die ganze Datei
; in einem Rutsch zu lesen, ohne die genaue Dateilnge zu wissen

data  .bs 500    ; 500 Bytes Platz

; 500 Bytes auf Kanal 1 ab data schreiben
 ldx #kanal*16   ; Kanalnr. * 16 in X-Register setzen
 lda #11
 sta iccmd,x     ; CIO-Kommando 11 = Put Bytes
 lda #<data
 sta icadr,x     ; icadr muss auf Pufferbeginn frs Schreiben zeigen
 lda #>data
 sta icadr+1,x
 lda #<500
 sta iclen,x     ; iclen muss Anzahl zu schreibender Bytes enthalten
 lda #>500
 sta iclen+1,x
 jsr ciov        ; CIO aufrufen
 bmi error       ; Returncode prfen (steht in Y und icsta)

; Kanal schlieen
 ldx #kanal*16   ; Kanalnr. * 16 in X-Register setzen
 lda #12
 sta iccmd,x     ; CIO-Kommando 12 = Close
 jsr ciov
 bmi error       ; will man eigentlich nur beim Schreiben prfen

; XIO 40: COM/XEX-Datei laden und ggf. starten, wenn INIT-/RUN-Adresse da
 ldx #kanal*16   ; Kanalnr. * 16 in X-Register setzen
 lda #40
 sta iccmd,x     ; CIO-Kommando 40 = Binary Load
 lda #<filespec
 sta icadr,x     ; icadr muss auf Filespec ziegen
 lda #>filespec
 sta icadr+1,x
 lda #0          ; AUX1=0 (uDOS-Vorgabe)
 sta icaux,x
 jsr ciov        ; CIO aufrufen
 bmi error       ; Returncode prfen (steht in Y und icsta)
