Files
open-roms/c64/kernal/ramtas_real.s
T
2019-09-11 23:48:09 +02:00

92 lines
2.2 KiB
ArmAsm

//
// Official Kernal routine, described in:
//
// - [RG64] C64 Programmer's Reference Guide - page 291
// - [CM64] Compute's Mapping the Commodore 64 - page 237
//
// CPU registers that has to be preserved (see [RG64]): none
//
ramtas_real:
// C64 Programmer's Reference guide p291:
// Clear $0000-$0101, $0200-$03ff
// PGS: $0000, $0001 are CPU IO ports, so shouldn't get written to
ldy #$02
lda #$00
!:
sta $00,y
iny
bne !-
!:
// 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.
sta $0300,Y
sta $0200,Y
iny
bne !-
// Allocate cassette buffer
// "Mapping the C64", p237
lda #<$033C
sta TAPE1+0
lda #>$033C
sta TAPE1+1
// set screen address to $0400
// https://www.c64-wiki.com/wiki/Screen_RAM
// Since we are setting $D018, we also make sure we are using the
// ROM character set (C64 Programmer's Reference Guide p322)
lda #$14
sta VIC_YMCSB
// Make sure we have the correct VIC-II memory bank for the screen to really be at $0400
// and not $4400, $8400 or $C400
// https://www.c64-wiki.com/wiki/VIC_bank#Selecting_VIC_banks
lda CIA2_DDRA
ora #$03
sta CIA2_DDRA
lda CIA2_PRA
ora #$03
sta CIA2_PRA
// 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
// Work out RAM size and put in MEMSTR and MEMSIZK
// "Compute's Mapping the 64", p54
// http://unusedino.de/ec64/technical/project64/mapping_c64.html
ldx #>$0800
stx MEMSTR+1
ldx #$00
stx MEMSTR+0
stx MEMSIZK+0
// Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF
ldx $8000
inx
stx $8000
cpx $8000
bne ramtas_32K_RAM
dex
stx $8000
ldx #$A0
stx MEMSIZK+1
bne !+ // always non-zero, saves one byte
ramtas_32K_RAM:
dex
stx $8000 // case there is RAM under the ROM
ldx #$80
stx MEMSIZK+1
!:
rts