Ho una sensazione di dejavu, ovvero argomento gia' trattato.
Il kernal durante il reset gia' fa' un minimo di controllo sulla RAM, da $033c a $a000 - cioe' finche' non incontra la ROM del BASIC, purtroppo: il resto della RAM non lo controlla - e questo lo si vede dal numero di "bytes free" nel messaggio di avvio. Se si vede un numero diverso da 38911, quella e' la locazione di ram "rovinata" (meno 2049)
Si puo' effettuare manualmente in ogni momento, e' una routine non distruttiva:
sys64863
ready.
?pE(643)+pE(644)*256
40960
se non si ottiene 40960, il numero che viene stampato e' la locazione danneggiata, cioe' dove non riesce a scrivere e rileggere 2 valori di prova ($55 e $AB) (*)
Un tester per TUTTA la memoria $0800-FFFF invece si implementa facilmente, do' per scontato che almeno la memoria fino a $07ff sia funzionante, altrimenti il C64 non sarebbe nemmeno utilizzabile.
Asm naturalmente, non ci penso nemmeno ad implementarlo in basic, non avrebbe nemmeno senso visto che un prg basic occupa ram sia come programma che come variabili, oltre che impiegarci dei giorni a fare quest'operazione.
Se va tutto bene, stampa ALL OK!, altrimenti la locazione danneggiata e fa flashare il bordo in un ciclo infinito.
*=$0334
sei
inc $01
lda #$08
sta $fc
ldy #0
sty $fb
loop
lda ($fb),y
pha
lda #$55
jsr test
bne errore
lda #$aa
jsr test
bne errore
pla
sta ($fb),y
iny
bne loop
inc $fc
bne loop
dec $01
cli
lda #<allok
ldy #>allok
jmp $ab1e
test
sta ($fb),y
cmp ($fb),y
rts
errore
lda $fc
jsr conv
stx erroraddress
sta erroraddress+1
tya
jsr conv
stx erroraddress+2
sta erroraddress+3
pla
jsr conv
stx errorbyte
sta errorbyte+1
dec $01
lda #<errorstr
ldy #>errorstr
jsr $ab1e
infinite
inc $d020
jmp infinite
conv
pha
lsr
lsr
lsr
lsr
jsr dhex
tax
pla
and #$0f
dhex
ora #$30
cmp #$3a
bcc noth
adc #6
noth
rts
allok
byte "ALL OK!",0
errorstr
byte "$"
erroraddress
byte "0000"
byte "=$"
errorbyte
byte "00",0
(*) il secondo valore dovrebbe essere $AA per correttezza, ma un baco di implementazione nel kernal fa si' che venga scritto $AB quindi il bit 0 di ogni byte viene sempre verificato da acceso e mai da spento.
.C:fd5f A2 3C LDX #$3C
.C:fd61 A0 03 LDY #$03
.C:fd63 86 B2 STX $B2
.C:fd65 84 B3 STY $B3
.C:fd67 A8 TAY
.C:fd68 A9 03 LDA #$03
.C:fd6a 85 C2 STA $C2
.C:fd6c E6 C2 INC $C2
.C:fd6e B1 C1 LDA ($C1),Y
.C:fd70 AA TAX
.C:fd71 A9 55 LDA #$55
.C:fd73 91 C1 STA ($C1),Y
.C:fd75 D1 C1 CMP ($C1),Y
.C:fd77 D0 0F BNE $FD88
.C:fd79 2A ROL A <<<<< qua doveva essere ASL
.C:fd7a 91 C1 STA ($C1),Y
.C:fd7c D1 C1 CMP ($C1),Y
.C:fd7e D0 08 BNE $FD88
.C:fd80 8A TXA
.C:fd81 91 C1 STA ($C1),Y