From 676db127c3d2689fcce5d617338dedc871bed7a4 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sat, 10 Aug 2019 16:06:32 +0200 Subject: [PATCH] implemented UDTIM routine --- STATUS.md | 2 +- c64/kernal/scnkey.s | 10 ---------- c64/kernal/udtim.s | 42 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 43 insertions(+), 11 deletions(-) diff --git a/STATUS.md b/STATUS.md index 83831a1f..e29d912c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -106,7 +106,7 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | `$FFE1` | `STOP` | DONE | | | `$FFE4` | `GETIN` | PARTIAL | only some devices supported | | `$FFE7` | `CLALL` | DONE | | -| `$FFEA` | `UDTIM` | NOT DONE | checking for STOP key present in SCNKEY instead | +| `$FFEA` | `UDTIM` | DONE | | | `$FFED` | `SCREEN` | DONE | | | `$FFF0` | `PLOT` | NOT DONE | | | `$FFF3` | `IOBASE` | DONE | | diff --git a/c64/kernal/scnkey.s b/c64/kernal/scnkey.s index d5a6bb1b..c1a8a28a 100644 --- a/c64/kernal/scnkey.s +++ b/c64/kernal/scnkey.s @@ -204,10 +204,6 @@ ReturnNoKeys: NoActivityDetected: - ;; Cancel STKEY status - lda #$FF - sta STKEY ; XXX this variable should be set by UDTIM - ;; So cancel all bucky keys lda key_bucky_state sta key_last_bucky_state @@ -334,12 +330,6 @@ next_row: ;; //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ;; // Check and flag Non Alphanumeric Keys - ;; Store last row of keyboard scan result, - ;; so that RUN/STOP etc can be checked easily - ;; (Compute's Mapping the 64, p27) - lda ScanResult+0 - sta STKEY ; XXX this variable should be set by UDTIM - ;; Store de-bounce data for bucky keys ;; (Compute's Mapping the 64, p58-59) lda key_bucky_state diff --git a/c64/kernal/udtim.s b/c64/kernal/udtim.s index b502112f..28af8cc4 100644 --- a/c64/kernal/udtim.s +++ b/c64/kernal/udtim.s @@ -9,4 +9,46 @@ ;; udtim: + + ;; Update jiffy clock. The whole day is $4F1A00 jiffies (24 hours * 60 minutes * 60 seconds * 60 jiffies), + ;; after this time we have to reset the clock. + + inc TIME+0 + bne udtim_clock_done + inc TIME+1 + bne udtim_clock_rollover + inc TIME+2 + + ;; FALLTROUGH + +udtim_clock_done: +udtim_update_stkey: ; entry to be used when interrupts are disabled + + ;; Another action we have to perform is to copy the last row of keyboard to RAM, + ;; so that various routines can detect the STOP key press + ;; XXX scnkey contains similar sequence - deduplicate this! + lda #$FF + sta CIA1_DDRA ; output + lda #$00 + sta CIA1_DDRB ; input + + lda #$7F + sta CIA1_PRA ; select the last row (bit to 0) + + lda CIA1_PRB ; read the row + sta STKEY rts + +udtim_clock_rollover: + + ;; At this point TIME+0 has to contain 0, + lda TIME+1 + cmp #$1A + bne udtim_clock_done + lda TIME+2 + cmp #$4F + bne udtim_clock_done + lda #$00 + sta TIME+2 + sta TIME+1 + beq udtim_clock_done ; will always jump