moved PAL/NTSC support to a separate routine
This commit is contained in:
1 parent
c41da81e06
commit
2afe11c3b3
3 files changed
+67
-60
No files matched your search
@@ -8,6 +8,7 @@
|
|||||||
// CPU registers that has to be preserved (see [RG64]): none
|
// CPU registers that has to be preserved (see [RG64]): none
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
IOINIT:
|
IOINIT:
|
||||||
|
|
||||||
// Set $00/$01 port mode and value
|
// Set $00/$01 port mode and value
|
||||||
@@ -75,22 +76,6 @@ IOINIT:
|
|||||||
sta CIA2_ICR
|
sta CIA2_ICR
|
||||||
sta CIA1_ICR
|
sta CIA1_ICR
|
||||||
|
|
||||||
// Set timer interval to ~1/60th of a second
|
|
||||||
|
|
||||||
// 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"
|
|
||||||
|
|
||||||
// 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
|
|
||||||
|
|
||||||
// Enable timer interrupt
|
// Enable timer interrupt
|
||||||
lda #$81
|
lda #$81
|
||||||
sta CIA1_ICR
|
sta CIA1_ICR
|
||||||
@@ -117,4 +102,3 @@ IOINIT:
|
|||||||
|
|
||||||
// Set IEC bus to its initial idle state
|
// Set IEC bus to its initial idle state
|
||||||
jmp iec_set_idle
|
jmp iec_set_idle
|
||||||
|
|
||||||
@@ -11,46 +11,4 @@
|
|||||||
CINT:
|
CINT:
|
||||||
|
|
||||||
jsr cint_legacy
|
jsr cint_legacy
|
||||||
|
jmp setup_pal_ntsc
|
||||||
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
|
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
|
||||||
|
setup_pal_ntsc:
|
||||||
|
|
||||||
|
lda VIC_RASTER
|
||||||
|
!:
|
||||||
|
cmp VIC_RASTER
|
||||||
|
beq !-
|
||||||
|
bmi setup_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 setup_ntsc
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
setup_pal:
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
lda #$01
|
||||||
|
|
||||||
|
// FALLTROUGH
|
||||||
|
|
||||||
|
setup_pal_ntsc_end:
|
||||||
|
|
||||||
|
sty CIA1_TIMALO
|
||||||
|
stx CIA1_TIMAHI
|
||||||
|
|
||||||
|
sta TVSFLG
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
setup_ntsc:
|
||||||
|
|
||||||
|
// Set timer interval to ~1/60th of a second
|
||||||
|
|
||||||
|
// 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
|
||||||
|
|
||||||
|
lda #$00
|
||||||
|
|
||||||
|
beq setup_pal_ntsc_end // branch always
|
||||||
Reference in new issue
Block a user