Files
open-roms/c64/kernal/chkinout.s
T

145 lines
2.5 KiB
ArmAsm

;;
;; Official Kernal routines, described in:
;;
;; - [RG64] C64 Programmer's Reference Guide - page 275 (CHKIN) / 276 (CKOUT)
;; - [CM64] Compute's Mapping the Commodore 64 - page 229
;;
;; CPU registers that has to be preserved (see [RG64]): .Y
;;
;; CHKIN implementation
chkin:
;; Store Y for preservation
tya
pha
;; Reset status
jsr kernalstatus_reset
;; First retrieve the FAT/LAT/SAT table index (and check if file is open)
txa
jsr find_fls
bcs chkinout_file_not_open
;; Now we have table index in Y - first filter out unsuitable devices
lda FAT,Y
cmp #$01
beq chkinout_device_not_present ; tape not implemented
cmp #$02
beq chkinout_device_not_present ; RS-232 not implemented
;; Fail if the file is open for writing (secondary address 1)
lda LAT, Y
cmp #$01
beq chkinout_file_not_input
;; For IEC devices, send TALK + TKSA first
lda FAT,Y
jsr iec_devnum_check
bcs chkin_set_device
jsr talk
bcs chkinout_end ; don't set DFLTN in case of failure
lda LAT, Y
jsr tksa
bcs chkinout_end
jsr iec_turnaround_to_listen ;; XXX shouldn't this be sent by TALK/TKSA???
bcs chkinout_end
chkin_set_device:
lda FAT,Y
sta DFLTN
clc ; for success
;; FALLTROUGH
;; Common part for booth CHKIN and CKOUT
chkinout_end:
pla
tay
rts
chkinout_file_not_open:
pla
tay
jmp kernalerror_FILE_NOT_OPEN
chkinout_device_not_present:
pla
tay
jsr kernalstatus_DEVICE_NOT_FOUND
jmp kernalerror_DEVICE_NOT_FOUND
chkinout_file_not_input:
pla
tay
jmp kernalerror_FILE_NOT_INPUT
chkinout_file_not_output:
pla
tay
jmp kernalerror_FILE_NOT_OUTPUT
chkinout_common:
;; CKOUT implementation
ckout:
;; Store Y for preservation
tya
pha
;; Reset status
jsr kernalstatus_reset
;; First retrieve the FAT/LAT/SAT table index (and check if file is open)
txa
jsr find_fls
bcs chkinout_file_not_open
;; Now we have table index in Y - first filter out unsuitable devices
lda FAT,Y
cmp #$01
beq chkinout_device_not_present ; tape not implemented
cmp #$02
beq chkinout_device_not_present ; RS-232 not implemented
cmp #$00
beq chkinout_file_not_output ; cannot output to keyboard - XXX check real ROM behaviour
;; Fail if the file is open for reading (secondary address 0)
lda LAT, Y
beq chkinout_file_not_output
;; For IEC devices, send LISTEN + SECOND first
lda FAT,Y
jsr iec_devnum_check
bcs chkin_set_device
jsr listen
bcs chkinout_end ; don't set DFLTO in case of failure
lda LAT, Y
jsr second
bcs chkinout_end
hkout_set_device:
lda FAT,Y
sta DFLTO
clc ; for success
jmp chkinout_end