Hola.
El sábado volví a entrar en los foros, y revisé mi mensaje otra vez. Lo vi "bien", pero mirándolo un poco "de lejos", noté algo extraño: "¿por qué estoy restando 1 a los bits de los tercios, y luego lo vuelvo a sumar si se trata del mismo caso?"
Esto es una sospecha de que quizás se puede hacer algo mejor.
Esta mañana, al despertarme, mi cerebro me tenía preparada una sorpresa: había encontrado la solución.
Ahora bien, como estaba medio dormido, era domingo, y no tenía nada que hacer, me volví a dormir, y cuando más tarde me levanté, ya ni me acordaba de este tema...
... hasta que he visto tus mensajes, esta noche, y me he acordado de que había encontrado otra solución, más corta y rápida.
Es casi la misma de antes, pero ahora nos ahorramos varios ciclos (los correspondientes a 3 instrucciones menos), algo fundamental en un rutina tan importante.
Código: Seleccionar todo
calc_next_vram:
; Calcula la siguiente posición en VRAM del scanline inmediatamente inferior
; formato de una dirección VRAM:
; hl = 010TTSSS RRRCCCCC
;
; TT : tercio de pantalla (0-3)
; SSS : scanline dentro de la fila de carácter (0-7)
; RRR : fila de carácter dentro del tercio (0-7)
; CCCCC : columna (0-31)
;
; IN : hl = dirección en VRAM
; OUT : hl = dirección en VRAM siguiente
;
; modifica:
; registros: a, hl
; flags: c, z
; siguiente scanline
inc h ; 010TTSSS++
ld a, h
and %111 ; ¿00000SSS?
ret nz ; salir, aún no llegó a %000
; aquí llegamos con SSS==0, y con TT (tercio) incrementado
; siguiente fila
ld a, l ; RRRCCCCC
add a, %00100000 ; RRR++
ld l, a
; si hay acarreo, entonces deberíamos saltar al tercio siguiente,
; pero ya lo hicimos antes en el desborde de scanline,
; así que ya hemos terminado y salimos
ret c
; pero si no, debemos mantenernos en el tercio anterior,
; por lo que debemos deshacer el incremento hecho antes
ld a, h ; 010TTSSS
sub %00001000 ; TT--
ld h, a
ret
Ya me dirás qué tal; no lo he probado.
Sobre el tema del operando
add NN, eso depende del programa ensamblador que estés utilizando.
Por ejemplo, en este hilo:
Adventures in ZX Spectrum Dev el ensamblador que está usando el autor (el
sjasmplus) sí que lo admite.