106 lines
2.5 KiB
Plaintext
106 lines
2.5 KiB
Plaintext
//
|
|
// this is an example of reading a file with the high-level kernal routines
|
|
//
|
|
|
|
/*
|
|
basic start
|
|
5 POKE 36879,8:PRINT "{clr}{wht}";
|
|
6 REM the ReadFile() function does something like this:
|
|
10 LA=7680
|
|
20 OPEN 1,8,2,"iec"
|
|
30 IF ST<>0 THEN GOTO 60
|
|
40 GET#1,A$:IF A$="" THEN A$=CHR$(0)
|
|
50 POKE LA,ASC(A$):LA=LA+1:GOTO 30
|
|
60 CLOSE 1
|
|
basic end
|
|
*/
|
|
|
|
basic start
|
|
5 POKE 36879,8:PRINT "{clr}{wht}";
|
|
10 print "{down}{down}{down}{down}{down}{down}{down}{down}{down}{down}disk drive test"
|
|
20 sys {main}
|
|
basic end
|
|
|
|
main:
|
|
call ReadFile
|
|
rts
|
|
|
|
const SETNAM = $FFBD ; Kernal Set Filename
|
|
const SETLFS = $FFBA ; Kernal Set Logical First and Secondary
|
|
const ICHKIN = $FFC6 ; Kernal Set Input
|
|
const READST = $FFB7 ; Kernal read status byte
|
|
const ICHRIN = $FFCF ; Kernal read a byte from file
|
|
const ICLOSE = $FFC3 ; Kernal close
|
|
const ICLRCH = $FFCC ; Kernal clear channel
|
|
|
|
#ifdef C64
|
|
const load_address = 1024
|
|
#endif
|
|
|
|
#ifdef VIC20
|
|
const load_address = 7680
|
|
#endif
|
|
|
|
sub ReadFile()
|
|
ld16 $ae, #load_address ; destination buffer
|
|
|
|
LDA #fname_end-fname
|
|
LDX #<fname
|
|
LDY #>fname
|
|
JSR SETNAM
|
|
|
|
LDA #$02 ; file number 2
|
|
LDX #$08 ; default to device 8
|
|
LDY #$02 ; secondary address 2
|
|
JSR $FFBA ; call SETLFS
|
|
JSR $FFC0 ; call OPEN
|
|
|
|
; check if the file could not be opened
|
|
if carry then
|
|
jsr open_error ; handle open error
|
|
jmp close ; even if OPEN failed, the file has to be closed
|
|
end if
|
|
|
|
LDX #$02 ; filenumber 2
|
|
JSR ICHKIN ; file 2 now used as input
|
|
|
|
LDY #$00 ; keep y indexing at 0
|
|
do
|
|
JSR READST ; read status byte
|
|
if not zero then exit do ; either EOF or read error
|
|
JSR ICHRIN ; get a byte from file
|
|
STA ($AE),Y ; write byte to memory
|
|
inc16 $ae ; increment pointer
|
|
loop while not zero
|
|
|
|
AND #$40 ; end of file?
|
|
if zero then jsr read_error
|
|
|
|
close:
|
|
LDA #$02 ; filenumber 2
|
|
JSR ICLOSE
|
|
JSR ICLRCH
|
|
RTS
|
|
|
|
open_error:
|
|
; Akkumulator contains BASIC error code
|
|
; most likely errors:
|
|
; A = $05 (DEVICE NOT PRESENT)
|
|
;... error handling for open errors ...
|
|
lda #00
|
|
sta load_address
|
|
rts
|
|
|
|
read_error:
|
|
; for further information, the drive error channel has to be read
|
|
;... error handling for read errors ...
|
|
lda #01
|
|
sta load_address
|
|
rts
|
|
end sub
|
|
|
|
fname:
|
|
byte "iec"
|
|
fname_end:
|
|
|