====== Reading from a file byte-by-byte ======
BASIC code:
10 LA=8192
20 OPEN 2,8,2,"JUST A FILENAME"
30 IF ST<>0 THEN GOTO 60
40 GET#2,A$:IF A$="" THEN A$=CHR$(0)
50 POKE LA,ASC(A$):LA=LA+1:GOTO 30
60 CLOSE 2
Assembler code:
load_address = $2000 ; just an example
LDA #fname_end-fname
LDX #fname
JSR $FFBD ; call SETNAM
LDA #$02 ; file number 2
LDX $BA ; last used device number
BNE .skip
LDX #$08 ; default to device 8
.skip LDY #$02 ; secondary address 2
JSR $FFBA ; call SETLFS
JSR $FFC0 ; call OPEN
BCS .error ; if carry set, the file could not be opened
; check drive error channel here to test for
; FILE NOT FOUND error etc.
LDX #$02 ; filenumber 2
JSR $FFC6 ; call CHKIN (file 2 now used as input)
LDA #load_address
STA $AF
LDY #$00
.loop JSR $FFB7 ; call READST (read status byte)
BNE .eof ; either EOF or read error
JSR $FFCF ; call CHRIN (get a byte from file)
STA ($AE),Y ; write byte to memory
INC $AE
BNE .skip2
INC $AF
.skip2 JMP .loop ; next byte
.eof
AND #$40 ; end of file?
BEQ .readerror
.close
LDA #$02 ; filenumber 2
JSR $FFC3 ; call CLOSE
JSR $FFCC ; call CLRCHN
RTS
.error
; Akkumulator contains BASIC error code
; most likely errors:
; A = $05 (DEVICE NOT PRESENT)
;... error handling for open errors ...
JMP .close ; even if OPEN failed, the file has to be closed
.readerror
; for further information, the drive error channel has to be read
;... error handling for read errors ...
JMP .close
fname:
!tx "JUST A FILENAME"
fname_end:
You may open more than one file if you use different file numbers and secondary addresses for them. File numbers and secondary addresses should be in the range of 2 to 14. It's usually a good idea to use the same number for both to keep confusion low.