;; ;; 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