CINT should be complete now

This commit is contained in:
FeralChild64 committed 2019-10-20 13:37:25 +02:00
1 parent a9d167810b
commit 98860e9831
9 files changed
+88 -77

No files matched your search

@@ -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
+22
View File
@@ -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
+3
View File
@@ -0,0 +1,3 @@
Game 'Operacja Proboszcz' explicitly calls $E51B - thus, it is sane
to place old CINT routine in it's original place
@@ -1,6 +0,0 @@
// Routine too long to fit here
cint_screen_keyboard:
jmp cint_screen_keyboard_real
-2
View File
@@ -1,2 +0,0 @@
Game 'Operacja Proboszcz' explicitly calls this location.
+8 -9
View File
@@ -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
+43 -3
View File
@@ -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