mirror of https://github.com/falsovsky/z80.git
80 lines
3.1 KiB
NASM
80 lines
3.1 KiB
NASM
;videoAddr equ 4840h ; Endereço de Memoria Video da Linha 10
|
|
;videoAddr equ 4940h ; Faz o mesmo, tenho de entender porque
|
|
|
|
addractual1 db 0,0
|
|
ultimoaddr db 0,0
|
|
|
|
; Rotina de scroll de texto da direita para a esquerda pixel a pixel
|
|
; O endereço inicial tem de vir em HL
|
|
scroll_esquerda
|
|
; ld hl, videoAddr ; 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_esquerda_0
|
|
ld (addractual1), hl ; Guarda o valor de HL em tmp1
|
|
call scroll_esquerda_1 ; Scrolla
|
|
ld hl, (addractual1) ; 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_esquerda_0; Se C != 0 corre novamente o Loop1
|
|
ret
|
|
|
|
; Segunda rotina
|
|
scroll_esquerda_1
|
|
ld hl, (addractual1) ; Le o argumento tmp1 para HL
|
|
|
|
push bc
|
|
ld bc, $1f ; Soma $1f ao endereço para começar
|
|
adc hl, bc ; no fim da linha, tudo à direita
|
|
; Cada linha tem 32 bytes
|
|
|
|
ld (ultimoaddr), hl ; Guarda o endereço do fim da linha
|
|
pop bc
|
|
|
|
ld b, $20 ; Numero de vezes que vai correr
|
|
|
|
; Vai começar por fazer um rotate left à coluna mais à direita, e
|
|
; guarda o bit que se perde na carry, que vai ser usado como o
|
|
; bit 0 do proximo rotate left que for executado.
|
|
|
|
; Se no rotate da coluna mais à esquerda se perdeu alguma coisa,
|
|
; então é para passar para a coluna mais a direita.
|
|
; Se depois do ultimo rotate o carry estiver definido, faz-se um
|
|
; OR ao bit 0 da coluna mais à direita.
|
|
|
|
; Loop2
|
|
scroll_esquerda_2
|
|
ld a, (hl) ; Faz um rotate left aos 8 pixels no
|
|
rla ; endereço de video ram em HL, o bit
|
|
; perdido fica na carry
|
|
ld (hl), a ; Actualiza
|
|
dec hl ; Anda uma coluna para a esquerda
|
|
djnz scroll_esquerda_2 ; Se ainda nao chegou ao fim, repete
|
|
|
|
ld hl, (ultimoaddr) ; Le o valor do endereço da coluna
|
|
ld a, (hl) ; mais à direita, em A
|
|
|
|
; Se não tem carry significa que não perdeu pixel nenhum
|
|
; no ultimo rotate, então não é preciso passar nada para
|
|
; a coluna mais à direita porque já tem o bit 0 a 0 devido
|
|
; ao rotate inicial.
|
|
jr nc, scroll_esquerda_sem_carry ; Não tem carry? vai para o fim
|
|
|
|
; Se tem carry é porque se perdeu um pixel no ultimo
|
|
; rotate, então tem de se settar o bit 0 do coluna mais
|
|
; à direita a 1
|
|
or $1 ; bit 0 = 1
|
|
scroll_esquerda_sem_carry
|
|
ld (hl), a ; Actualiza
|
|
ret
|