z80/scroller1/scroll_direita.asm

54 lines
2.1 KiB
NASM

;videoAddr2 equ 4820h ; Linha 9
;videoAddr2 equ 4920h ; Faz o mesmo, tenho de entender porque
addractual2 db 0,0
primeiroaddr db 0,0
; Rotina de scroll de texto da esquerda para a direita pixel a pixel
; O endereço inicial tem de vir em HL
scroll_direita
; ld hl, videoAddr2 ; Endereço de Memoria Video a ser manipulado
ld c, $8 ; Numero de vezes que a rotina vai correr
; 8 é o numero de linhas de pixeis a scrollar
; Loop1
scroll_direita_0
ld (addractual2), hl ; Guarda o valor de HL em tmp1
call scroll_direita_1 ; Scrolla
ld hl, (addractual2) ; 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, scroll_direita_0 ; Se C != 0 corre novamente o Loop1
ret
; Segunda rotina
scroll_direita_1
ld hl, (addractual2) ; Le o argumento tmp1 para HL
ld (primeiroaddr), hl
ld b, $20 ; Numero de vezes que vai correr
; Loop2
scroll_direita_2
ld a, (hl) ; Faz um rotate right aos 8 pixels no
rra ; endereço de video ram em HL, o bit
; perdido fica na carry
ld (hl), a ; Actualiza
inc hl ; Anda uma coluna para a direita
djnz scroll_direita_2 ; Se ainda nao chegou ao fim, repete
ld hl, (primeiroaddr) ; Le o valor do endereço da coluna
ld a, (hl) ; mais à esquerda, em A
jr nc, scroll_direita_sem_carry ; Não tem carry? vai para o fim
or $80 ; bit 7 = 1
scroll_direita_sem_carry
ld (hl), a ; Actualiza
ret