La importancia de no saltar de páginaLa documentación del 6502/6510 dice que LDA $FFFF,x y STA $FFFF,x tardan 4 ciclos... salvo que se salta de página, y ahí tarda 5 ciclos.
(
http://unusedino.de/ec64/technical/aay/c64/blda.htm )
La verdad que nunca le presté atención a ese detalle hasta hace unos días atras cuando noté que por alguna razón la "raster bar" no estaba sincronizada.
No entendia bien porque, hasta que me di cuenta que estaba haciendo el "salto de página" cuando accedia a esa memoria. Asi que lo único que tuve que hacer es poner los colores en la direccion para que haya salto de página.
El salto de página es algo así como:
*=$0800
ldx #00
loop:
lda colores,x
sta $d800,x
inx
cpx #16
bne loop
*=$5f8
colores: .byte 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16
El color 8, salta de página... va la página $0500 a las $0600, y eso hace que esa operación tarde un ciclo más.
Respecto a esto, algo que aprendí a querer, son los segmentos del ca65... al principio me parecian que agregaban complejidad innecesaria, pero ahora que el proyecto se agrando, puedo mapear los segmentos a los lugares que necesito sin tener que cambiar el código. Asi es como se ven mis segmentos ahora, donde tengo en memoria 2 partes del juego: la pantalla del menu principal, y la pantalla del about
SEGMENTS {
SIDMUSIC: load = RAM, type = rw, start = $1000, optional = yes, define = yes;
#
# About:
# GFX $2000 - $2710 (Koala)
# CHARSET $4800 - $4fff
#
ABOUT_GFX: load = RAM, type = rw, start = $2000, optional = yes, define = yes;
ABOUT_CHARSET: load = RAM, type = rw, start = $4800, optional = yes, define = yes;
ABOUT_CODE: load = RAM, type = rw, start = $5000, optional = yes, define = yes;
ABOUT_DATA: load = RAM, type = rw, start = $6000, optional = yes, define = yes;
#
# Main Screen:
# SCREEN $8400 - $87FE
# CHARSET $8800 - $8FFF
#
MAIN_CODE: load = RAM, type = rw, start = $7000, optional = yes, define = yes;
MAIN_SCREEN: load = RAM, type = rw, start = $8400, optional = yes, define = yes;
MAIN_CHARSET: load = RAM, type = rw, start = $8800, optional = yes, define = yes;
}
de esta manera, si quiero cambiar la posición de algunos segmentos porque necesito usar la memoria de una manera diferente, solo tengo que editar un solo archivo en vez de editar varios.