diff --git a/STATUS.md b/STATUS.md index 3bbd5099..c4d99e8d 100644 --- a/STATUS.md +++ b/STATUS.md @@ -88,7 +88,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | $FFB7 | READST | DONE | | | $FFBA | SETFLS | DONE | | | $FFBD | SETNAM | DONE | | -| $FFC0 | OPEN | PARTIAL | * work in progress | +| $FFC0 | OPEN | DONE | | | $FFC3 | CLOSE | DONE | | | $FFC6 | CHKIN | DONE | | | $FFC9 | CHKOUT | PARTIAL | | diff --git a/c64/kernal/chkinout.s b/c64/kernal/chkinout.s index 4004df20..1af2fc02 100644 --- a/c64/kernal/chkinout.s +++ b/c64/kernal/chkinout.s @@ -42,7 +42,7 @@ chkin: ;; For IEC devices, send TALK + TKSA first lda FAT,Y - jsr iec_devnum_check + jsr iec_check_devnum bcs chkin_set_device jsr talk @@ -125,7 +125,7 @@ ckout: ;; For IEC devices, send LISTEN + SECOND first lda FAT,Y - jsr iec_devnum_check + jsr iec_check_devnum bcs chkin_set_device jsr listen diff --git a/c64/kernal/chrin.s b/c64/kernal/chrin.s index 591936d2..b20014e2 100644 --- a/c64/kernal/chrin.s +++ b/c64/kernal/chrin.s @@ -21,7 +21,7 @@ chrin: beq chrin_keyboard ; #$00 - keyboard ;; XXX add screen support - jsr iec_devnum_check + jsr iec_check_devnum bcs chrin_done_fail ; not a supported device chrin_iec: diff --git a/c64/kernal/chrout.s b/c64/kernal/chrout.s index b7266a66..48f5a606 100644 --- a/c64/kernal/chrout.s +++ b/c64/kernal/chrout.s @@ -27,16 +27,44 @@ chrout: cmp #$03 ; screen beq chrout_screen - - jsr iec_devnum_check + + jsr iec_check_devnum bcs chrout_done_fail ; not a supported device chrout_iec: lda last_printed_character_ascii jsr JCIOUT - bcs chrout_done_fail - jmp chrout_done + bcc chrout_done + + ;; FALLTROUGH + +chrout_done_fail: + jsr show_cursor_if_enabled + + plp + + ;; Restore X and Y, set carry to mark success on exit + pla + tay + pla + tax + sec ; indicate failure + rts + +chrout_done: + jsr show_cursor_if_enabled + + plp + + ;; Restore X and Y, set carry to mark success on exit + pla + tay + pla + tax + lda last_printed_character_ascii + clc ; indicate success + rts chrout_screen: @@ -399,33 +427,7 @@ not_quote: sta current_screen_x jmp screen_advance_to_next_line no_screen_advance_to_next_line: - -chrout_done: - jsr show_cursor_if_enabled - - plp - - ;; Restore X and Y, set carry to mark success on exit - pla - tay - pla - tax - lda last_printed_character_ascii - clc ; indicate success - rts - -chrout_done_fail: - jsr show_cursor_if_enabled - - plp - - ;; Restore X and Y, set carry to mark success on exit - pla - tay - pla - tax - sec ; indicate failure - rts + jmp chrout_done screen_grow_logical_line: ldy current_screen_y diff --git a/c64/kernal/close.s b/c64/kernal/close.s index 523b8b3d..ad218fec 100644 --- a/c64/kernal/close.s +++ b/c64/kernal/close.s @@ -20,7 +20,7 @@ close: ;; We have the entry index in Y - check whether this is IEC device lda FAT, y - jsr iec_devnum_check + jsr iec_check_devnum bcs close_remove_from_table ;; IEC device diff --git a/c64/kernal/clrchn.s b/c64/kernal/clrchn.s index 22b4c9e0..3cc53078 100644 --- a/c64/kernal/clrchn.s +++ b/c64/kernal/clrchn.s @@ -13,14 +13,14 @@ clrchn: ;; Handle IEC input device lda DFLTN - jsr iec_devnum_check + jsr iec_check_devnum bcs + ;; Previous device was IEC one - send UNTALK first jsr untlk * ;; Restore output device to default lda DFLTO - jsr iec_devnum_check + jsr iec_check_devnum bcs + ;; Handle IEC output device jsr unlsn diff --git a/c64/kernal/iec/iec_devnum_check.s b/c64/kernal/iec/iec_check_devnum.s similarity index 71% rename from c64/kernal/iec/iec_devnum_check.s rename to c64/kernal/iec/iec_check_devnum.s index 84cd506b..e5e354fa 100644 --- a/c64/kernal/iec/iec_devnum_check.s +++ b/c64/kernal/iec/iec_check_devnum.s @@ -1,22 +1,22 @@ ;; -;; Checks whether device numbe (in .A) is a correct IEC device number +;; Checks whether device number (in .A) is a correct IEC device number ;; ;; Preserves .A, .X and .Y ;; -iec_devnum_check: +iec_check_devnum: ;; 0, 1, 2, or 3 are illegal - reserved for non-IEC devices on Commodore cmp #$04 bcs + ;; FALLTROUGH -iec_devnum_check_failed: +iec_check_devnum_failed: sec ; indicate non-IEC device rts * ;; 31 and above are illegal too, due to IEC command encoding scheme, ;; see https://www.pagetable.com/?p=1031 cmp #$1F - bcs iec_devnum_check_failed + bcs iec_check_devnum_failed ;; Carry is clear here - indicates IEC device rts diff --git a/c64/kernal/iec/iec_cmd_close.s b/c64/kernal/iec/iec_cmd_close.s new file mode 100644 index 00000000..552428a2 --- /dev/null +++ b/c64/kernal/iec/iec_cmd_close.s @@ -0,0 +1,20 @@ + +;; +;; Kernal internal IEC routine +;; +;; - https://www.pagetable.com/?p=1031, https://github.com/mist64/cbmbus_doc +;; + +iec_cmd_close: + + jsr iec_tx_flush + + ;; Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), + ;; allowed channels are 0-15; report error if out of range + cmp #$10 + bcc + + jmp kernalerror_FILE_NOT_INPUT +* + ora #$E0 + + jmp common_open_close_unlsn_second diff --git a/c64/kernal/iec/iec_cmd_open.s b/c64/kernal/iec/iec_cmd_open.s new file mode 100644 index 00000000..cd184307 --- /dev/null +++ b/c64/kernal/iec/iec_cmd_open.s @@ -0,0 +1,29 @@ + +;; +;; Kernal internal IEC routine +;; +;; - https://www.pagetable.com/?p=1031, https://github.com/mist64/cbmbus_doc +;; + + +iec_cmd_open: ; similar to TKSA, but without turnaround + + ;; Due to OPEN/CLOSE/TKSA/SECOND command encoding (see https://www.pagetable.com/?p=1031), + ;; allowed channels are 0-15; report error if out of range + cmp #$10 + bcc + + jmp kernalerror_FILE_NOT_INPUT +* + ora #$F0 + + ;; FALLTROUGH + +common_open_close_unlsn_second: ; common part of several commands + + sta IEC_TMP2 + jsr iec_tx_command + bcs + ; branch if error + jmp iec_tx_command_finalize +* + rts + diff --git a/c64/kernal/listen.s b/c64/kernal/listen.s index 7ba96f11..dd240070 100644 --- a/c64/kernal/listen.s +++ b/c64/kernal/listen.s @@ -17,9 +17,10 @@ listen: jsr iec_tx_flush ;; Check whether device number is correct - jsr iec_devnum_check - bcs kernalerror_DEVICE_NOT_FOUND - + jsr iec_check_devnum + bcc + + jmp kernalerror_DEVICE_NOT_FOUND +* ;; Encode and execute the command ora #$20 diff --git a/c64/kernal/load.s b/c64/kernal/load.s index 59ae8715..e845b546 100644 --- a/c64/kernal/load.s +++ b/c64/kernal/load.s @@ -62,42 +62,13 @@ load: jsr listen bcs lvs_device_not_found_error - ;; Open channel #0 (p16) - lda #$F0 ; $F0 for TKSA + 0 for channel number - sta IEC_TMP2 - jsr iec_tx_command - bcs lvs_load_verify_error - jsr iec_tx_command_finalize + ;; Open channel 0 (reserved for file reading) + lda #$00 + jsr iec_cmd_open bcs lvs_load_verify_error - ;; Send filename (p16) - ldy #0 - -load_send_filename: - - cpy FNLEN - beq load_filename_sent - - ldx #