83 lines
2.1 KiB
ArmAsm
83 lines
2.1 KiB
ArmAsm
; Function defined on pp272-273 of C64 Programmers Reference Guide
|
|
ramtas:
|
|
; 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
|
|
ramtas_l1:
|
|
STA $00,Y
|
|
INY
|
|
BNE ramtas_l1
|
|
ramtas_l2:
|
|
;; 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 ramtas_l2
|
|
|
|
; allocate cassette buffer
|
|
;; "Mapping the C128", p61
|
|
lda #<$033C
|
|
STA cassette_buffer_ptr+0
|
|
lda #>$033C
|
|
STA cassette_buffer_ptr+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 $D018
|
|
|
|
; 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 $DD02
|
|
ORA #$03
|
|
STA $DD02
|
|
LDA $DD00
|
|
ORA #$03
|
|
STA $DD00
|
|
|
|
;; 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 MEMSIZ
|
|
;; "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 MEMSIZ+0
|
|
;; Try to modify $8000, if it fails then RAM ends at $7FFF, else $9FFF
|
|
lda $8000
|
|
eor #$FF
|
|
tax
|
|
eor #$FF
|
|
stx $8000
|
|
cmp $8000
|
|
beq ramtas_32K_RAM
|
|
sta $8000
|
|
ldx #$A0
|
|
stx MEMSIZ+1
|
|
jmp ramtas_RAM_sized
|
|
ramtas_32K_RAM:
|
|
sta $8000 ; in case RAM is hiding beneath a ROM
|
|
ldx #$80
|
|
stx MEMSIZ+1
|
|
;; Fall through
|
|
ramtas_RAM_sized:
|
|
|
|
rts
|