CHKIN and CKOUT refactoring

This commit is contained in:
FeralChild64 committed 2019-10-29 21:24:25 +01:00
1 parent e00bda3548
commit 7eca8ea05b
12 files changed
+223 -164

No files matched your search

-148
View File
@@ -1,148 +0,0 @@
//
// 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, .A (see [CM64], page 213)
//
// CHKIN implementation
chkin_real:
// Store registers for preservation
pha
phy_trash_a
// 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 chkin_file_not_input
#if CONFIG_IEC
// For IEC devices, send TALK + TKSA first
lda FAT,Y
jsr iec_check_devnum_oc
bcs chkin_set_device
jsr TALK
bcs chkinout_device_not_present // don't set DFLTN in case of failure
lda LAT, Y
jsr TKSA
bcs chkinout_device_not_present
#endif // CONFIG_IEC
chkin_set_device:
lda FAT,Y
sta DFLTN
// FALLTROUGH
// Common part for booth CHKIN and CKOUT
chkinout_end:
ply_trash_a
pla
clc // indicate success
rts
chkin_file_not_input: // XXX move this out of common section
ply_trash_a
pla
jmp kernalerror_FILE_NOT_INPUT
chkinout_file_not_open:
ply_trash_a
pla
jmp kernalerror_FILE_NOT_OPEN
chkinout_device_not_present:
ply_trash_a
pla
jsr kernalstatus_DEVICE_NOT_FOUND
jmp kernalerror_DEVICE_NOT_FOUND
// CKOUT implementation
ckout_real:
// Store registers for preservation
pha
phy_trash_a
// 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 ckout_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 ckout_file_not_output
#if CONFIG_IEC
// For IEC devices, send LISTEN + SECOND first
lda FAT,Y
jsr iec_check_devnum_oc
bcs ckout_set_device
jsr LISTEN
bcs chkinout_device_not_present // don't set DFLTO in case of failure
lda LAT, Y
jsr SECOND
bcs chkinout_device_not_present
#endif // CONFIG_IEC
ckout_set_device:
lda FAT,Y
sta DFLTO
jmp chkinout_end
ckout_file_not_output:
ply_trash_a
pla
jmp kernalerror_FILE_NOT_OUTPUT
-6
View File
@@ -1,6 +0,0 @@
// In our implementation CHKIN and CKOUT are closely tied,
// placing it here would cause a collision
CHKIN:
jmp chkin_real
-6
View File
@@ -1,6 +0,0 @@
// In our implementation CHKIN and CKOUT are closely tied,
// placing it here would cause a collision
CKOUT:
jmp ckout_real
+30
View File
@@ -0,0 +1,30 @@
//
// IEC part of the CHKIN routine
//
#if CONFIG_IEC
chkin_iec:
// Fail if the file is open for writing (secondary address 1)
lda LAT, Y
cmp #$01
beq_far chkin_file_not_input
// Send TALK + TKSA first
lda FAT,Y
jsr TALK
bcs_far chkinout_device_not_present
lda LAT, Y
jsr TKSA
bcs_far chkinout_device_not_present
jmp chkin_set_device
#endif // CONFIG_IEC
+30
View File
@@ -0,0 +1,30 @@
//
// IEC part of the CKOUT routine
//
#if CONFIG_IEC
ckout_iec:
// Fail if the file is open for reading (secondary address 0)
lda LAT, Y
beq_far ckout_file_not_output
// Send LISTEN + SECOND first
lda FAT,Y
jsr LISTEN
bcs_far chkinout_device_not_present
lda LAT, Y
jsr SECOND
bcs_far chkinout_device_not_present
jmp ckout_set_device
#endif // CONFIG_IEC
+18
View File
@@ -0,0 +1,18 @@
//
// Common part of CHKIN and CKOUT
//
chkinout_device_not_present:
ply_trash_a
pla
jsr kernalstatus_DEVICE_NOT_FOUND
jmp kernalerror_DEVICE_NOT_FOUND
chkinout_file_not_open:
ply_trash_a
pla
jmp kernalerror_FILE_NOT_OPEN
+69
View File
@@ -0,0 +1,69 @@
//
// Official Kernal routines, described in:
//
// - [RG64] C64 Programmer's Reference Guide - page 275
// - [CM64] Compute's Mapping the Commodore 64 - page 229
//
// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213)
//
CHKIN:
// Store registers for preservation
pha
phy_trash_a
// Reset status
jsr kernalstatus_reset
// First retrieve the FAT/LAT/SAT table index (and check if file is open)
txa
jsr find_fls
bcs_far chkinout_file_not_open
// Now we have table index in Y
lda FAT,Y
// Handle all the devices
beq chkin_set_device // 0 - keyboard
// Tape not supported here
#if HAS_RS232
cmp #$02
beq_far chkin_rs232
#endif // HAS_RS232
#if CONFIG_IEC
jsr iec_check_devnum_oc
bcc_far chkin_iec
#endif // CONFIG_IEC
cmp #$03 // screen - only legal one left
bne_far chkinout_device_not_present
chkin_set_device:
lda FAT,Y
sta DFLTN
// FALLTROUGH
chkinout_end:
ply_trash_a
pla
clc // indicate success
rts
chkin_file_not_input:
ply_trash_a
pla
jmp kernalerror_FILE_NOT_INPUT
File renamed without changes.
+76
View File
@@ -0,0 +1,76 @@
//
// Official Kernal routines, described in:
//
// - [RG64] C64 Programmer's Reference Guide - page 276
// - [CM64] Compute's Mapping the Commodore 64 - page 229
//
// CPU registers that has to be preserved (see [RG64]): .Y, .A (see [CM64], page 213)
//
CKOUT:
// Store registers for preservation
pha
phy_trash_a
// Reset status
jsr kernalstatus_reset
// First retrieve the FAT/LAT/SAT table index (and check if file is open)
txa
jsr find_fls
bcs_far chkinout_file_not_open
// Now we have table index in Y
lda FAT,Y
// Handle all the devices
beq ckout_file_not_output // 0 - keyboard
// Tape not supported here
#if HAS_RS232
cmp #$02
beq_far ckout_rs232
#endif // HAS_RS232
#if CONFIG_IEC
jsr iec_check_devnum_oc
bcc_far ckout_iec
#endif // CONFIG_IEC
cmp #$03 // screen - only legal one left
bne_far chkinout_device_not_present
ckout_set_device:
lda FAT,Y
sta DFLTO
jmp chkinout_end
ckout_file_not_output:
ply_trash_a
pla
jmp kernalerror_FILE_NOT_OUTPUT
File renamed without changes.
-2
View File
@@ -3,8 +3,6 @@
// RS-232 part of the CHKIN routine
//
// XXX connect to I/O stack
#if HAS_RS232
-2
View File
@@ -3,8 +3,6 @@
// RS-232 part of the CKOUT routine
//
// XXX connect to I/O stack
#if HAS_RS232