Eeeem, Dionisoooo que le vas a liar al pobre!! ¿Código automodificable para empezar con ensamblador? ¡¡Eso es una locura!!
El problema de ese código es que sólo funcionaría en RAM, por lo que si lo pruebas en ROM no iría ni patrás.
Vamos a ver el código de j4mk3:
ld HL,du ; Cargo posicion inicial del Array (posicion RAM etiqueta "du")
ld A,(di) ; Cargo variable que me hace de puntero (posicion RAM etiqueta "di")
ld C,A ; Lo preparao en BC para hacer la suma
xor B ; B a zero
add HL,BC
ld A,(HL) ; Cargo el valor que quiero de la posicion du(di) del Array
;Aqui van instrucciones que modifican el dato
ld (HL),A ; Guardo el resultado de nuevo en el Array
Mal... La instrucción XOR B no pone B a cero, sino que hace lo siguiente (transcrito en BASIC para que me entiendas):
a=a XOR b
por lo que no tiene el efecto que necesitas. ¿Quieres velocidad? Lo más sencillo sería alinear la tabla en una dirección en RAM que tuviera el byte bajo a cero, así, si la tabla es de, como mucho, 256 bytes, el acceso es rapidísimo y sencillísimo. Por ejemplo, imagina que la tabla está situada en $C000, tú lo que harías (en BASIC) sería:
HL=&HC000
A=OFFSET
C=A
B=0
HL=HL+BC
A=PEEK(HL)
REM MODIFICO DATO
POKE HL,A
Pero se puede optimizar como sigue:
H=&HC0
A=OFFSET
L=A
A=PEEK(HL)
REM MODIFICO DATO
POKE HL,A
Algo que, en ensamblador, sería:
ld h,$C0
ld a,[offset]
ld l,a
ld a,[hl]
; MODIFICO DATO
ld [hl],a
De esta forma te ahorras la suma de 16 bits, que es bastante costosa. Por cierto, tú conoces a Humphrey de las BCN parties, ¿no?
Saludos
--
SapphiRe