mirror of https://github.com/falsovsky/z80.git
Documentar
This commit is contained in:
parent
cbc735fd08
commit
0af417f765
Binary file not shown.
|
@ -1,20 +1,20 @@
|
|||
addractual1 db 0,0
|
||||
ultimoaddr db 0,0
|
||||
aids2 db 0
|
||||
scroll_addr db 0,0 ; Endereço da linha a scrollar - na coluna 0
|
||||
linha_actual db 0 ; Linha actual
|
||||
ultima_addr db 0,0 ; Endereço da coluna mais à direita da linha actual
|
||||
|
||||
; 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 c, $8 ; Numero de vezes que a rotina vai correr
|
||||
; 8 é o numero de linhas de pixeis a scrollar
|
||||
|
||||
ld a, 0
|
||||
ld (aids2), a
|
||||
ld (linha_actual), a ; Começa na linha 0
|
||||
|
||||
; 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
|
||||
scroll_esquerda_loop
|
||||
ld (scroll_addr), hl ; Guarda o valor de HL (argumento da rotina)
|
||||
call scrolla_linha ; Scrolla uma linha
|
||||
ld hl, (scroll_addr) ; 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
|
||||
|
@ -24,59 +24,68 @@ scroll_esquerda_0
|
|||
; videoAddr, videoAddr+$100 videoAddr+$200,
|
||||
; ..., videoAddr+$700
|
||||
|
||||
ld a, (aids2)
|
||||
ld a, (linha_actual) ; Incrementa a linha actual
|
||||
inc a
|
||||
ld (aids2), a
|
||||
ld (linha_actual), a
|
||||
|
||||
dec c ; Decrementa o contador C
|
||||
jr nz, scroll_esquerda_0; Se C != 0 corre novamente o Loop1
|
||||
jr nz, scroll_esquerda_loop ; Se C != 0 corre novamente o Loop1
|
||||
ret
|
||||
|
||||
; Segunda rotina
|
||||
scroll_esquerda_1
|
||||
ld hl, (addractual1) ; Le o argumento tmp1 para HL
|
||||
|
||||
; Scrolla a linha que estiver em scroll_addr
|
||||
scrolla_linha
|
||||
push bc
|
||||
ld hl, (scroll_addr) ; Le linha a scrollar
|
||||
ld bc, $1f ; Soma $1f ao endereço para começar
|
||||
adc hl, bc ; no fim da linha, tudo à direita
|
||||
add 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 (ultima_addr), hl ; Guarda o endereço do fim da linha
|
||||
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.
|
||||
|
||||
; Depois faz-se um rotate left à mesma linha do UDG#1 guardado na
|
||||
; rotina do "scroll_text.asm".
|
||||
; Se a carry estiver definida faz-se um OR ao bit 0 da coluna mais
|
||||
; à direita da linha.
|
||||
|
||||
; Loop2
|
||||
scroll_esquerda_2
|
||||
scrolla_linha_loop
|
||||
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 a, (aids2)
|
||||
djnz scrolla_linha_loop ; Se ainda nao chegou ao fim, repete
|
||||
; Já processou tudo ate à esquerda, vamos passar o resto do
|
||||
; UDG#1
|
||||
ld a, (linha_actual) ; Le a linha actual para A
|
||||
ld d, $0
|
||||
ld e, a
|
||||
ld hl, udg_start
|
||||
add hl, de
|
||||
ld a, (hl)
|
||||
rla
|
||||
ld (hl), a
|
||||
ld e, a ; DE = 0|A
|
||||
ld hl, udg_start ; Endereço onde começa o UDG#1
|
||||
add hl, de ; Soma a linha actual
|
||||
|
||||
ld hl, (ultimoaddr) ; Le o valor do endereço da coluna
|
||||
ld a, (hl) ; mais à direita, em A
|
||||
ld a, (hl) ; Le o valor da linha do #UDG#1
|
||||
rla ; Rotate
|
||||
ld (hl), a ; Actualiza
|
||||
|
||||
ld hl, (ultima_addr) ; 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
|
||||
jr nc, scrolla_linha_fim ; 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
|
||||
scrolla_linha_fim
|
||||
ld (hl), a ; Actualiza
|
||||
pop bc
|
||||
ret
|
||||
|
|
Loading…
Reference in New Issue