more sane directory name, updated binaries

This commit is contained in:
FeralChild64 committed 2020-06-26 19:44:01 +02:00
1 parent d4d32095d1
commit 76aaf298b8
697 files changed
+56 -56

No files matched your search

+23
View File
@@ -0,0 +1,23 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# X16 * #IGNORE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
// c64 prg p263
cartridge_check:
ldx #$05
!:
lda CART_SIG-1,x
cmp cartridge_signature-1,x
bne cartridge_check_end
dex
bne !-
// FALLTROUGH
cartridge_check_end:
rts
+76
View File
@@ -0,0 +1,76 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// This is a part CINT which initializes screen and keyboard
//
// For more details see:
// - [RG64] C64 Programmers Reference Guide - page 280
// - [CM64] Computes Mapping the Commodore 64 - page 242
//
cint_screen_keyboard:
// Setup KEYLOG vector
lda #<scnkey_set_keytab
sta KEYLOG+0
lda #>scnkey_set_keytab
sta KEYLOG+1
// Initialise cursor blink flags (Computes Mapping the 64 p215)
lda #$01
sta BLNCT
sta BLNSW
// Enable cursor repeat - XXX make it configurable
#if CONFIG_KEY_REPEAT_DEFAULT && !CONFIG_KEY_REPEAT_ALWAYS
lda #$80
sta RPTFLG
#endif
// Set keyboard decode vector (Computes Mapping the 64 p215)
#if CONFIG_LEGACY_SCNKEY
// Set initial variables for our improved keyboard scan routine
lda #$FF
ldx #6
!: sta BufferOld,x
dex
bpl !-
sta BufferQuantity
// Set key repeat delay (Computes Mapping the 64 p215)
// Making some numbers up here: Repeat every ~1/10th sec
// But require key to be held for ~1/3sec before
// repeating (Computes Mapping the 64 p58)
// Not needed for default keyboard scanning code
ldx #22-2 // Fudge factor to match speed
stx DELAY
#endif
// Set current colour for text (Computes Mapping the 64 p215)
ldx #CONFIG_COLOR_TXT
stx COLOR
// Set maximum keyboard buffer size (Computes Mapping the 64 p215)
ldx #10
stx XMAX
// Put non-zero value in MODE to enable case switch
ldx #$00
stx MODE
// Fallthrough/jump to screen clear routine (Computes Mapping the 64 p215)
jmp clear_screen
+25
View File
@@ -0,0 +1,25 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Part of the official Kernal routine, described in:
//
// - [RG64] C64 Programmers Reference Guide - page 280
// - [CM64] Computes 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
+71
View File
@@ -0,0 +1,71 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# M65 KERNAL_0 #TAKE
// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT
// #LAYOUT# X16 * #IGNORE
// #LAYOUT# * * #IGNORE
//
// Well-known Kernal routine, described in:
//
// - [CM64] Computes Mapping the Commodore 64 - page 215
//
setup_vicii:
#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0)
jsr map_KERNAL_1
jsr_ind VK1__setup_vicii
jmp map_NORMAL
#else
// Clear everything - turn off sprites (observed hanging around after
// running programs and resetting), etc.
lda #$00
ldx #$2E
!:
sta __VIC_BASE, x
dex
bpl !-
#if !CONFIG_MB_MEGA_65 && !CONFIG_MB_ULTIMATE_64
// Disable C128 extra keys - just to be sure they will not interfere with anything
stx VIC_XSCAN
// Disable the C128 2MHz mode, it prevents VIC-II display from working correctly
stx VIC_CLKRATE
#endif
// Set up default IO values
// - [CM64] page 129 - VIC_SCROLY
// - [CM64] pages 140-144 - VIC_SCROLX
// - [CM64] pages 145-146 - VIC_YMCSB
lda #$1B // according to [CM64] page 137 some software assumes oldest bit is 0
sta VIC_SCROLY
lda #$C8
sta VIC_SCROLX // 40 column etc
lda #$14
sta VIC_YMCSB
lda #$0F
sta VIC_IRQ // clear all interrupts
// We use a different colour scheme of white text on all blue by default,
// but brand-specific color scheme can also be enabled
lda #CONFIG_COLOR_BG
sta VIC_EXTCOL
sta VIC_BGCOL0
// Setup default I/O devices
jmp clrchn_reset
#endif // ROM layout
+71
View File
@@ -0,0 +1,71 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
// Resources describing the C64 reset sequence:
// https://www.c64-wiki.com/wiki/Reset_(Process)
hw_entry_reset:
// The GPL program at https://github.com/Klaus2m5/6502_65C02_functional_tests/blob/master/6502_functional_test.a65
// uses the similar initial reset sequence, affirmed by c64 PRG p269
sei // disable the interrupts, as fast as possible - they are disabled in case of HW reset,
// but this routine can be also called manually
cld // required for all CPUs - due to possibility of manual call
#if HAS_OPCODES_65CE02
see // disable extended stack
#endif
ldx #$FF
txs
#if ROM_LAYOUT_M65
jsr map_NORMAL // we want normal memory mapping
#endif
#if CONFIG_PLATFORM_COMMODORE_64
// The following routine is based on reading the public KERNAL jumptable routine
// list, and making unimaginative assumptions about what should be done on reset.
// Also, https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image was used
// as it shows example startup sequence, to be followe by cartridge creators
// C64 PRG p269
jsr cartridge_check
bne !+
jmp (ICART_COLD_START)
!:
// Disable the screen (and set 40 columns) to prevent visual glitches later
ldx #$28
stx VIC_SCROLX
#endif
// Initialising IO is obviously required. Also indicated by c64 prg p269.
jsr JIOINIT
// Setting up the screen and testing ram is obviously required
// also affirmed by p269 of c64 prg
jsr JRAMTAS // called RANTAM on Codebase64 wiki
// Resetting IO vectors is obviously required, if we want interrupts to run
// also affirmed by c64 prg p269
jsr JRESTOR
// "Compute's Mapping the 64" p236
jsr JCINT
// What do we do when finished? A C64 jumps into the BASIC ROM
cli // allow interrupts to happen
// c64 prg p269
jmp (IBASIC_COLD_START)
+5
View File
@@ -0,0 +1,5 @@
System reset routine has to be placed under it's original location due to 'SYS 64738' being extremaly popular to reset the C64,
to the point it went into popular culture.
https://twitter.com/hashtag/SYS64738?src=hash
https://www.computerhope.com/jargon/s/sys64738.htm
+3
View File
@@ -0,0 +1,3 @@
RRAMTAS is an important startup routine, frequentl called b cartridges - unfortunately, we can't count on them calling it
via the jumptable, as even some tutorials on the web advise to call it directly - see for example here:
https://codebase64.org/doku.php?id=base:assembling_your_own_cart_rom_image
+115
View File
@@ -0,0 +1,115 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# M65 KERNAL_0 #TAKE
// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT
// #LAYOUT# X16 KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Official Kernal routine, described in:
//
// - [RG64] C64 Programmers Reference Guide - page 291
// - [CM64] Computes Mapping the Commodore 64 - page 237
//
// CPU registers that has to be preserved (see [RG64]): none
//
RAMTAS:
#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0)
jsr map_KERNAL_1
jsr_ind VK1__RAMTAS
jmp map_NORMAL
#else
// C64 Programmers Reference guide p291:
// Clear $0000-$0101, $0200-$03ff
// PGS: $0000, $0001 are CPU IO ports, so should not get written to
// How many ways are there to efficiently erase these two pages
// of RAM? We would like to avoid any unnecessary byte similarity
// with the C64 KERNAL. Thus we do $0300 before $0200, even though
// with the longer sequence of identicale bytes we see no basis for
// it being copyrightable. Again, we just want to redue the attack
// surface for any misguided suit.
ldy #$00
lda #$00
!:
sta $0300,Y
sta $0200,Y
sta $0002,Y // that is why we do not use .X for index, we do not want zeropage addressing here!
iny
bne !-
// Allocate cassette buffer
ldx #<$033C
stx TAPE1+0
ldx #>$033C
stx TAPE1+1
#if CONFIG_PLATFORM_COMMODORE_64
// Set screen address pointer ("Compute's Mapping the 64" p238)
// This is obvious boiler plate containing no creative input, but to avoid
// unnecessarily similarity to the C64 KERNAL, we use X instead of A to do this,
// and several following
ldx #>$0400
stx HIBASE
// Set BASIC start text pointer
// (remember, that low memory is 0 initialized at this moment)
ldx #>$0800
stx MEMSTR+1
// Work out RAM size and put in MEMSIZK
// Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF
ldx $8000
inx
stx $8000
cpx $8000
bne ramtas_32k
// FALLTROUGH
ramtas_40k:
// 40K RAM - restore memory content, set MEMSIZK
ldy #$A0
!:
sty MEMSIZK+1
// Always restore memory, cartridge might have RAM under ROM
dex
stx $8000
rts
ramtas_32k:
// 32K RAM - restore memory content, set MEMSIZK
ldy #$80
bne !- // branch always
#elif CONFIG_PLATFORM_COMMANDER_X16
ldx #>$0800
stx MEMSTR+1
ldy #$9F
sty MEMSIZK+1
#else
.error "Please fill-in RAMTAS"
#endif // platform
#endif // ROM layout
+174
View File
@@ -0,0 +1,174 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# M65 KERNAL_0 #TAKE
// #LAYOUT# M65 KERNAL_1 #TAKE-FLOAT
// #LAYOUT# X16 * #IGNORE
// #LAYOUT# * * #IGNORE
//
// Official Kernal routine, described in:
//
// - [RG64] C64 Programmers Reference Guide - page 285
// - [CM64] Computes Mapping the Commodore 64 - page 238
//
// CPU registers that has to be preserved (see [RG64]): none
//
IOINIT:
#if (ROM_LAYOUT_M65 && SEGMENT_KERNAL_0)
jsr map_KERNAL_1
jsr_ind VK1__IOINIT
jmp map_NORMAL
#else
//
// First initialize the CPU port, to make sure we have correct memory map
//
// We want BASIC and KERNAL ROMs mapped, and datasette motor off
// (https://www.c64-wiki.com/wiki/Zeropage)
// Work around for VICE bug: Writing $00 before $01 results in rubbish in $01
// after. https://sourceforge.net/p/vice-emu/bugs/1057/
ldx #$27
stx CPU_R6510
ldx #$2F // checked real ROM value
stx CPU_D6510
//
// Now prevent the CIAs from generating interrupts, who knows what damage they can do
//
// Disable IRQ generation for both CIAs - see [CM64], page 149
ldx #$7F
stx CIA1_ICR // $DC0D
stx CIA2_ICR // $DD0D
// See discussion here:
// https://www.lemon64.com/forum/viewtopic.php?t=41744&sid=e294c254db2ba671cde643f100aae341
// It seems that initializing this register to $7F is the best idea - UDTIM key scanning
// also leaves this at $7F
stx CIA1_PRA // $DC00
//
// Now silence the SID chip(s), depending on the configuration - we want them silent ASAP
//
lda #$00
#if !CONFIG_MB_MEGA_65
// First the standard chip (skip if it is covered by whole $D4XX range)
#if !CONFIG_SID_D4XX
sta SID_SIGVOL
#endif // !CONFIG_SID_D4XX
// Silence manually configured 2nd and 3rd SIDs
#if CONFIG_SID_2ND
sta SID_SIGVOL - __SID_BASE + CONFIG_SID_2ND_ADDRESS
#endif // CONFIG_SID_2ND
#if CONFIG_SID_3RD
sta SID_SIGVOL - __SID_BASE + CONFIG_SID_3RD_ADDRESS
#endif // CONFIG_SID_3RD
// Silence whole D4XX and D5XX ranges (if configured)
#if CONFIG_SID_D4XX || CONFIG_SID_D5XX
ldy #$00
!:
#if CONFIG_SID_D4XX
sta SID_SIGVOL + $000, Y
#endif // CONFIG_SID_D4XX
#if CONFIG_SID_D5XX
sta SID_SIGVOL + $100, Y
#endif // CONFIG_SID_D4XX
tya
clc
adc #$20
tay
bne !-
#endif // CONFIG_SID_D4XX || CONFIG_SID_D5XX
#else
// Mega65 specific handling - it contains 4 SIDs
sta SID_SIGVOL + __SID_R1_OFFSET
sta SID_SIGVOL + __SID_R2_OFFSET
sta SID_SIGVOL + __SID_L1_OFFSET
sta SID_SIGVOL + __SID_L2_OFFSET
#endif // CONFIG_MB_MEGA_65
//
// Now continue the CIAs initialization
//
// For CIA #1 we need port A as output and port B as input to scan the keyboard
ldx #$FF
stx CIA1_DDRA // $DC02
inx
stx CIA1_DDRB // $DC03
stx CIA2_DDRB // $DD03 // XXX this port is used for RS-232, value here is most likely wrong!
#if CONFIG_KEYBOARD_C65 || CONFIG_KEYBOARD_C65_CAPS_LOCK
lda #$02
sta C65_EXTKEYS_DDR // output for most keys, input for CAPS LOCK bit
#endif
// Set DDR on CIA2 for IEC bus, VIC-II banking (see [CM64], $DDOO description on page 193)
lda #$3F
sta CIA2_DDRA // $DD02
// Checked using VICE that original ROM initializes timers this way
ldx #$08
stx CIA1_CRB // $DC0F
stx CIA2_CRA // $DD0E
stx CIA2_CRB // $DD0F
// Set VIC-II bank - at least the 'Operacja Proboszcz' game needs this within IOINIT
// Checked on original ROMs, that it sets bit #2 (RS-232 output) high
ldx #%00000111 // XXX adapt this to IEC idle state, JMP at the end won't be needed
stx CIA2_PRA // $DD00
// Put something sane in the IRQ timer
jsr setup_irq_timer
// Enable timer A to run continuously (http://codebase64.org/doku.php?id=base:timerinterrupts)
ldx #$11
stx CIA1_CRA // $DC0E
// Enable timer interrupt
ldx #$81
stx CIA1_ICR // $DC0D
#if CONFIG_IEC
// Set IEC bus to its initial idle state
jmp iec_set_idle
#else
rts
#endif
#endif // ROM layout
+17
View File
@@ -0,0 +1,17 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
//
// Official Kernal routine, described in:
//
// - [RG64] C64 Programmers Reference Guide - page 280
// - [CM64] Computes Mapping the Commodore 64 - page 242
//
// CPU registers that has to be preserved (see [RG64]): none
//
CINT:
jsr cint_legacy
jmp setup_pal_ntsc
+4
View File
@@ -0,0 +1,4 @@
Original Kernal location of the CINT routine.
Routine moved to original location due to game 'Duotris' calling it instead of using the Kernal jumptable.
Starting the game without this patch caused warm reset with 'BRK AT $FF5B' message.
+2
View File
@@ -0,0 +1,2 @@
# No program will work without a working CPU reset vector
*
+9
View File
@@ -0,0 +1,9 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
// $FFFC - CPU Reset Vector
// Uncontrovertial, as it is a CPU requirement, and nothing else.
.word hw_entry_reset
+65
View File
@@ -0,0 +1,65 @@
// #LAYOUT# STD * #TAKE
// #LAYOUT# X16 * #IGNORE
// #LAYOUT# * KERNAL_0 #TAKE
// #LAYOUT# * * #IGNORE
// Detect video system (PAL/NTSC), use method by Graham, as it is 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:
lda #$01
skip_2_bytes_trash_nvz
// FALLTROUGH
setup_ntsc:
lda #$00
// FALLTROUGH
setup_pal_ntsc_end:
sta TVSFLG
// FALLTROUGH
setup_irq_timer: // entry point needed by UP9600 and CIA1 burst mod support
// Sets up IRQ timer in CIA1 to ~1/60th of a second,
// depending on the detected video system
// Retrieve video system (0 - NTSC, 1 - PAL), assume PAL for unknown values
ldx TVSFLG
beq !+
ldx #$01
!:
// Setup interval for timer A in CIA1
lda irq_timing_lo, x
sta CIA1_TIMALO // $DC04
lda irq_timing_hi, x
sta CIA1_TIMAHI // $DC05
rts