From d1b19c8739956c73d2db1f684286cf96f38fa14a Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Mon, 8 Feb 2021 17:20:20 +0100 Subject: [PATCH] CBDOS can now return status --- src/,,config_mega65.s | 2 +- src/dos_m65/,aliases_dos.s | 21 +++++--- src/dos_m65/dos_acptr_ciout.s | 91 ++++++++++++++++++++++++++++++++++- src/dos_m65/dos_init.s | 6 ++- src/dos_m65/dos_listen_talk.s | 24 ++++++--- src/dos_m65/dos_second_tksa.s | 10 +++- tools/generate_strings.cc | 2 +- 7 files changed, 135 insertions(+), 21 deletions(-) diff --git a/src/,,config_mega65.s b/src/,,config_mega65.s index 59537149..6dcd28d8 100644 --- a/src/,,config_mega65.s +++ b/src/,,config_mega65.s @@ -66,7 +66,7 @@ ;; #CONFIG# KEYCMD_HELP "LIST" -;; #CONFIG# KEYCMD_F9 "REM F9" +;; #CONFIG# KEYCMD_F9 "@20$" ;; #CONFIG# KEYCMD_F10 "\5FL" ;; #CONFIG# KEYCMD_F11 "COLORSET 128" ;; #CONFIG# KEYCMD_F12 "\5FHF" diff --git a/src/dos_m65/,aliases_dos.s b/src/dos_m65/,aliases_dos.s index a8b3e35b..ec0002ae 100644 --- a/src/dos_m65/,aliases_dos.s +++ b/src/dos_m65/,aliases_dos.s @@ -21,14 +21,23 @@ ; General DOS status - !addr IDX_LISTENER = $8008 ; listener idx * 2, >=$80 = none - for calling routines via vector table - !addr IDX_TALKER = $8009 ; talker idx * 2, >=$80 = none - for calling routines via vector table + !addr IDX1_LISTENER = $8008 ; listener idx, >=$80 = none + !addr IDX2_LISTENER = $8009 ; listener idx * 2, >=$80 = none - for calling routines via vector table + !addr IDX1_TALKER = $800A ; talker idx, >=$80 = none + !addr IDX2_TALKER = $800B ; talker idx * 2, >=$80 = none - for calling routines via vector table - ; Free space: $800A-$806F + ; Free space: $800C-$8069 + + !addr XX_CHANNEL = $806A ; current channel + !addr SD_CHANNEL = $806A ; - SD card + !addr FD_CHANNEL = $806B ; - floppy + !addr RD_CHANNEL = $806C ; - ram disk + + !addr XX_STATUS_IDX = $806D ; index byte for reading status + !addr SD_STATUS_IDX = $806D ; - SD card + !addr FD_STATUS_IDX = $806E ; - floppy + !addr RD_STATUS_IDX = $806F ; - ram disk !addr SD_STATUS_STR = $8070 ; status string for SD card, terminated by 0 - !addr SD_STATUS_IDX = $809F ; index byte for reading status !addr FD_STATUS_STR = $80A0 ; status string for floppy drive, terminated by 0 - !addr FD_STATUS_IDX = $80CF ; index byte for reading status !addr RD_STATUS_STR = $80D0 ; status string for ram disk, terminated by 0 - !addr RD_STATUS_IDX = $80FF ; index byte for reading status diff --git a/src/dos_m65/dos_acptr_ciout.s b/src/dos_m65/dos_acptr_ciout.s index 4b868ae5..bee74e56 100644 --- a/src/dos_m65/dos_acptr_ciout.s +++ b/src/dos_m65/dos_acptr_ciout.s @@ -5,13 +5,89 @@ ; -dos_ACPTR: +dos_ACPTR: ; does not have to preserve .X - ; XXX provide implementation + ldx IDX1_TALKER + bmi dos_ACPTR_fail + + lda XX_CHANNEL, X + cmp #$0F + beq dos_ACPTR_status + + ; XXX providde implementation for non-status streams + + jmp dos_ACPTR_fail + +dos_ACPTR_status: + + ldx IDX2_TALKER + jsr (dos_ACPTR_getsts_table, X) + sta TBTCNT ; byte return + beq dos_ACPTR_reset_status + + ; XXX + + clc + rts + +dos_ACPTR_fail: + + ; XXX set error code sec rts +dos_ACPTR_reset_status: + + ; XXX replace status with OK instead + + ldx IDX1_TALKER + lda #$00 + sta XX_STATUS_IDX,x + + ; FALLTROUGH + +dos_ACPTR_eoi: + + jsr kernalstatus_EOI + + clc + rts + +dos_ACPTR_getsts_SD: ; get next byte of status - SD card + + ldx SD_STATUS_IDX + inc SD_STATUS_IDX + lda SD_STATUS_STR,x + rts + +dos_ACPTR_getsts_FD: ; get next byte of status - floppy + + ldx FD_STATUS_IDX + inc FD_STATUS_IDX + lda FD_STATUS_STR,x + rts + +dos_ACPTR_getsts_RD: ; get next byte of status - ram disk + + ldx RD_STATUS_IDX + inc RD_STATUS_IDX + lda RD_STATUS_STR,x + rts + + +dos_ACPTR_getsts_table: + + !word dos_ACPTR_getsts_SD + !word dos_ACPTR_getsts_FD + !word dos_ACPTR_getsts_RD + + + + + + + dos_CIOUT: @@ -20,3 +96,14 @@ dos_CIOUT: sec rts + + + +kernalstatus_EOI: + + ; XXX reuse original code instead + + lda IOSTATUS + ora #K_STS_EOI + sta IOSTATUS + rts diff --git a/src/dos_m65/dos_init.s b/src/dos_m65/dos_init.s index e1bb14a6..5cad08ed 100644 --- a/src/dos_m65/dos_init.s +++ b/src/dos_m65/dos_init.s @@ -34,8 +34,10 @@ dos_INIT: ; Clear listener / talker lda #$FF - sta IDX_LISTENER - sta IDX_TALKER + sta IDX1_LISTENER + sta IDX2_LISTENER + sta IDX1_TALKER + sta IDX2_TALKER ; Initialize device handlers diff --git a/src/dos_m65/dos_listen_talk.s b/src/dos_m65/dos_listen_talk.s index 2855500c..c959d435 100644 --- a/src/dos_m65/dos_listen_talk.s +++ b/src/dos_m65/dos_listen_talk.s @@ -22,19 +22,22 @@ dos_LISTEN: cmp UNIT_FLOPPY bne @2 - lda #$02 + lda #$01 bra dos_LISTEN_success @2: cmp UNIT_RAMDISK bne dos_fail_TALK_LISTEN - lda #$04 + lda #$02 ; FALLTROUGH dos_LISTEN_success: - sta IDX_LISTENER + sta IDX1_LISTENER + asl + sta IDX2_LISTENER + bra dos_common_LSN_TALK_UN ; TALK @@ -54,19 +57,22 @@ dos_TALK: cmp UNIT_FLOPPY bne @2 - lda #$02 + lda #$01 bra dos_TALK_success @2: cmp UNIT_RAMDISK bne dos_fail_TALK_LISTEN - lda #$04 + lda #$02 ; FALLTROUGH dos_TALK_success: - sta IDX_TALKER + sta IDX1_TALKER + asl + sta IDX2_TALKER + bra dos_common_LSN_TALK_UN dos_fail_TALK_LISTEN: @@ -82,14 +88,16 @@ dos_UNLSN: pha lda #$FF - sta IDX_LISTENER + sta IDX1_LISTENER + sta IDX2_LISTENER bra dos_common_LSN_TALK_UN dos_UNTLK: pha lda #$FF - sta IDX_TALKER + sta IDX1_TALKER + sta IDX2_TALKER ; FALLTROUGH diff --git a/src/dos_m65/dos_second_tksa.s b/src/dos_m65/dos_second_tksa.s index 076f6850..6ad101cb 100644 --- a/src/dos_m65/dos_second_tksa.s +++ b/src/dos_m65/dos_second_tksa.s @@ -15,6 +15,7 @@ dos_SECOND: dos_TKSA: + phx pha and #$60 bne dos_TKSA_OPEN @@ -22,6 +23,7 @@ dos_TKSA: ; XXX provide implementation + plx sec rts @@ -30,11 +32,16 @@ dos_TKSA_OPEN: pla and #$1F + + ldx IDX1_TALKER ; store channel + sta XX_CHANNEL, X + cmp #$0F beq dos_TKSA_OPEN_cmd ; XXX provide implementation + plx sec rts @@ -43,5 +50,6 @@ dos_TKSA_OPEN_cmd: ; XXX provide implementation - sec + plx + clc rts diff --git a/tools/generate_strings.cc b/tools/generate_strings.cc index 62c22dbd..424bed0a 100644 --- a/tools/generate_strings.cc +++ b/tools/generate_strings.cc @@ -1224,7 +1224,7 @@ void DataSet::generateConfigDepStrings() // CBDOS features - featureStrM65 += "CBDOS : CARD "; + featureStrM65 += "CBDOS : SDCARD "; // Keyboard support features