z80/scroller/scroll_pc.asm

54 lines
2.2 KiB
NASM

; Rotina de scroll de texto da direita para a esquerda
; Ripada do Paradise Café
scrollaPC
ld hl, videoAddr ; Endereço de Memoria Video a ser manipulado
ld c, 8 ; Numero de vezes que a rotina vai correr
; 8 porque é o numero de pixels a scrollar
; Loop1
scrollaPC_0
ld (tmpScroll1), hl ; Guarda o valor de HL em tmp1
call scrollaPC_1 ; Scrolla
ld hl, (tmpScroll1) ; Le o valor de tmp1 para HL
inc h ; Incrementa H, mas como estamos a trabalhar com um
; endereço de 16bits, na realidade vai adicionar
; $100 a HL
; Isto vai fazer com que a segunda rotina seja
; chamada com os seguintes endereços em tmp1
; videoAddr, videoAddr+$100 videoAddr+$200,
; ..., videoAddr+$700
dec c ; Decrementa o contador C
jr NZ, scrollaPC_0 ; Se C != 0 corre novamente a Loop1
ret
; Segunda rotina
scrollaPC_1
ld hl, (tmpScroll1) ; Le o argumento tmp1 para HL
ld b, 1Fh ; Numero de vezes que a rotina vai correr
; $1F porque cada linha tem 32 bytes
ld d, h ; DE = HL
ld e, l ;
ld a, (hl) ; Le o valor dos 8 pixeis no endereço definido em HL
ld (tmpScroll2), a ; Guarda o valor em tmp2
; Isto vai guardar o valor dos 8 pixels mais à
; esquerda, que posteriormente vão ser postos o
; mais à direita
; Loop2
scrollaPC_2
inc hl ; Incrementa a posicao na memoria grafica definida
; em HL
ld a, (hl) ; Le o valor dos proximos 8 pixeis
ld (de), a ; Guarda-os na posição anterior
inc de ; Incrementa DE, fica com o mesmo valor de HL
djnz scrollaPC_2 ; b--, se b != corre novamente o Loop2
ld a, (tmpScroll2) ; Le o valor dos 8 pixeis guardados inicialmente
ld (de), a ; Mete-os na posição mais à direita
ret