From 98860e983122f0371ccd4cf4d35ed38034b83381 Mon Sep 17 00:00:00 2001 From: FeralChild64 Date: Sun, 20 Oct 2019 13:37:25 +0200 Subject: [PATCH] CINT should be complete now --- STATUS.md | 7 +-- ...keyboard_real.s => cint_screen_keyboard.s} | 54 +------------------ c64/kernal/init/e518.cint_legacy.s | 22 ++++++++ c64/kernal/init/e518.interop | 3 ++ c64/kernal/init/e51b.cint_screen_keyboard.s | 6 --- c64/kernal/init/e51b.interop | 2 - c64/kernal/init/fda3.ioinit.s | 17 +++--- c64/kernal/init/ff5b.cint.s | 46 ++++++++++++++-- .../interrupts/fe66.default_brk_handler.s | 8 ++- 9 files changed, 88 insertions(+), 77 deletions(-) rename c64/kernal/init/{cint_screen_keyboard_real.s => cint_screen_keyboard.s} (51%) create mode 100644 c64/kernal/init/e518.cint_legacy.s create mode 100644 c64/kernal/init/e518.interop delete mode 100644 c64/kernal/init/e51b.cint_screen_keyboard.s delete mode 100644 c64/kernal/init/e51b.interop diff --git a/STATUS.md b/STATUS.md index f3c680be..b23dba37 100644 --- a/STATUS.md +++ b/STATUS.md @@ -102,8 +102,8 @@ NOTE: Even the 'DONE' routines won't support features described as missing in on | Address | Unofficial | Name | Status | Remarks | | :-------: | :--------: | :---------- | :------: | :--------------------------------------------------: | | `($028F)` | | `KEYLOG` | DONE | | -| `$FF81` | `$FF5B` | `CINT` | PARTIAL | probably incomplete, needs adjustments for compat. | -| `$FF84` | `$FDA3` | `IOINIT` | PARTIAL | CIA initialization incomplete | +| `$FF81` | `$FF5B` | `CINT` | DONE | | +| `$FF84` | `$FDA3` | `IOINIT` | PARTIAL | CIA initialization might be incomplete | | `$FF87` | `$FD50` | `RAMTAS` | PARTIAL | probably shouldn't touch VIC and CIA's | | `$FF8A` | `$FD15` | `RESTOR` | DONE | | | `$FF8D` | `$FD1A` | `VECTOR` | DONE | | @@ -157,7 +157,8 @@ Not all of them - only these we want to have implemented. | Address | Name | Status | Remarks | | :-------: | :--------------------------- | :------: | :------------------------------------------------: | -| `$E51B` | init screen keyboard, no VIC | PARTIAL | not sure if correct | +| `$E518` | legacy part of CINT | DONE | | +| `$E51B` | init screen keyboard, no VIC | DONE | | | `$E544` | clear screen | DONE | | | `$E50C` | set cursor position | PARTIAL | | | `$E566` | home cursor | NOT DONE | | diff --git a/c64/kernal/init/cint_screen_keyboard_real.s b/c64/kernal/init/cint_screen_keyboard.s similarity index 51% rename from c64/kernal/init/cint_screen_keyboard_real.s rename to c64/kernal/init/cint_screen_keyboard.s index 453320f4..0470d710 100644 --- a/c64/kernal/init/cint_screen_keyboard_real.s +++ b/c64/kernal/init/cint_screen_keyboard.s @@ -1,62 +1,12 @@ // -// It seems this is a part CINT which initializes screen and keyboard, but does not -// reset VIC-II. See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 +// This is a part CINT which initializes screen and keyboard // // For more details see: // - [RG64] C64 Programmer's Reference Guide - page 280 // - [CM64] Compute's Mapping the Commodore 64 - page 242 -cint_screen_keyboard_real: - - // XXX check what really is performed here - - // According to [CM64], this routine checks for PAL/NTSC. It's definitely not done - // within the 'BRK' part, this can be easily checked - POKE something - // to address 678 on a real C64, press STOP+RESTORE, the value won't change - - // Detect video system (PAL/NTSC), use Graham's method, as it's short and reliable - // see here: https://codebase64.org/doku.php?id=base:detect_pal_ntsc - - lda #$C8 // preparation, as the VIC might be uninitialized - sta VIC_SCROLX - -cint_w0: - lda VIC_RASTER -cint_w1: - cmp VIC_RASTER - beq cint_w1 - bmi cint_w0 - - // Result in A, if no interrupt happened during the test: - // #$37 -> 312 rasterlines, PAL, VIC 6569 - // #$06 -> 263 rasterlines, NTSC, VIC 6567R8 - // #$05 -> 262 rasterlines, NTSC, VIC 6567R56A - - cmp #$07 - bcs cint_pal - -cint_ntsc: - - // NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), - // is clocked at 1.022727 MHz, so that 1/60s is 17045 CPU cycles - - ldy #<17045 - ldx #>17045 - - sty CIA1_TIMALO - stx CIA1_TIMAHI - - lda #$00 - beq !+ - -cint_pal: - - lda #$01 -!: - sta TVSFLG - -cint_brk: // entry for BRK and STOP+RESTORE - XXX, where should it start? +cint_screen_keyboard: // Setup KEYLOG vector diff --git a/c64/kernal/init/e518.cint_legacy.s b/c64/kernal/init/e518.cint_legacy.s new file mode 100644 index 00000000..93effe63 --- /dev/null +++ b/c64/kernal/init/e518.cint_legacy.s @@ -0,0 +1,22 @@ + +// +// Part of the official Kernal routine, described in: +// +// - [RG64] C64 Programmer's Reference Guide - page 280 +// - [CM64] Compute's Mapping the Commodore 64 - page 242 +// +// CPU registers that has to be preserved (see [RG64]): none +// + + +cint_legacy: // $E518 + + // Setup video and I/O + // See here: https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=22 + jsr setup_vicii + + // Code below must be placed under $E51B, or some code will break - see here: + // - https://csdb.dk/forums/index.php?roomid=11&topicid=17048&firstpost=2 + // Game 'Operacja Proboszcz' is one example. + + jmp cint_screen_keyboard // XXX try to fit the code here diff --git a/c64/kernal/init/e518.interop b/c64/kernal/init/e518.interop new file mode 100644 index 00000000..9d542a55 --- /dev/null +++ b/c64/kernal/init/e518.interop @@ -0,0 +1,3 @@ + +Game 'Operacja Proboszcz' explicitly calls $E51B - thus, it is sane +to place old CINT routine in it's original place diff --git a/c64/kernal/init/e51b.cint_screen_keyboard.s b/c64/kernal/init/e51b.cint_screen_keyboard.s deleted file mode 100644 index 5ed66544..00000000 --- a/c64/kernal/init/e51b.cint_screen_keyboard.s +++ /dev/null @@ -1,6 +0,0 @@ - -// Routine too long to fit here - -cint_screen_keyboard: - - jmp cint_screen_keyboard_real diff --git a/c64/kernal/init/e51b.interop b/c64/kernal/init/e51b.interop deleted file mode 100644 index 5b2be0e9..00000000 --- a/c64/kernal/init/e51b.interop +++ /dev/null @@ -1,2 +0,0 @@ - -Game 'Operacja Proboszcz' explicitly calls this location. diff --git a/c64/kernal/init/fda3.ioinit.s b/c64/kernal/init/fda3.ioinit.s index 28437fe5..21db2594 100644 --- a/c64/kernal/init/fda3.ioinit.s +++ b/c64/kernal/init/fda3.ioinit.s @@ -77,17 +77,16 @@ IOINIT: // Set timer interval to ~1/60th of a second - // (This value was calculated by running a custom IRQ handler on a C64 - // with original KERNAL, and writing the values of $DC04/5 to the screen - // in the IRQ handler to see roughly what value the timers must be set to) - // ldy #<16380 - // ldx #>16380 + // Probably NTSC is the default one, as PAL support was introduced later, + // in a patch - see [CM64] page 242 and page: + // - http://commodore64.se/wiki/index.php/Commodore_64_KERNAL_ROM_versions + // "The KERNAL ROM R1 was obviously used only in early NTSC systems. It lacks the PAL/NTSC detection" - // PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), - // is clocked at 0.985248 MHz, so that 1/60s is 16421 CPU cycles + // NTSC C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), + // is clocked at 1.022727 MHz, so that 1/60s is 17045 CPU cycles - ldy #<16421 - ldx #>16421 + ldy #<17045 + ldx #>17045 sty CIA1_TIMALO stx CIA1_TIMAHI diff --git a/c64/kernal/init/ff5b.cint.s b/c64/kernal/init/ff5b.cint.s index bb3b91b0..3be82f54 100644 --- a/c64/kernal/init/ff5b.cint.s +++ b/c64/kernal/init/ff5b.cint.s @@ -10,7 +10,47 @@ CINT: - // Setup video and I/O - jsr setup_vicii + jsr cint_legacy - jmp cint_screen_keyboard +cint_check_pal_ntsc: + + // Detect video system (PAL/NTSC), use Graham's method, as it's short and reliable + // see here: https://codebase64.org/doku.php?id=base:detect_pal_ntsc + + lda VIC_RASTER +!: + cmp VIC_RASTER + beq !- + bmi cint_check_pal_ntsc + + // Result in A, if no interrupt happened during the test: + // #$37 -> 312 rasterlines, PAL, VIC 6569 + // #$06 -> 263 rasterlines, NTSC, VIC 6567R8 + // #$05 -> 262 rasterlines, NTSC, VIC 6567R56A + + cmp #$07 + bcc cont_done + +cint_pal: + + // (This value was calculated by running a custom IRQ handler on a C64 + // with original KERNAL, and writing the values of $DC04/5 to the screen + // in the IRQ handler to see roughly what value the timers must be set to) + // ldy #<16380 + // ldx #>16380 + + // PAL C64 (https://codebase64.org/doku.php?id=base:cpu_clocking), + // is clocked at 0.985248 MHz, so that 1/60s is 16421 CPU cycles + + ldy #<16421 + ldx #>16421 + + sty CIA1_TIMALO + stx CIA1_TIMAHI + + lda #$01 +!: + sta TVSFLG + +cont_done: + rts diff --git a/c64/kernal/interrupts/fe66.default_brk_handler.s b/c64/kernal/interrupts/fe66.default_brk_handler.s index c788385e..78a63c72 100644 --- a/c64/kernal/interrupts/fe66.default_brk_handler.s +++ b/c64/kernal/interrupts/fe66.default_brk_handler.s @@ -12,8 +12,12 @@ default_brk_handler: jsr JRESTOR jsr JIOINIT - jsr setup_vicii // XXX should probably be a part of cint_brk - jsr cint_brk + + // Original routine calls just a part of CINT - but I'm not sure which one. Most likely it + // skips the PAL/NTSC check by calling $E518. I suspect bug in the original ROM, let's + // call the whole CINT, just to be sure everything is initialized. + + jsr CINT cli