diff --git a/scroller2/main.tap b/scroller2/main.tap index 5170fe2..9b3dee4 100644 Binary files a/scroller2/main.tap and b/scroller2/main.tap differ diff --git a/scroller2/scroll_esquerda.asm b/scroller2/scroll_esquerda.asm index 6c41c97..7b10ad6 100644 --- a/scroller2/scroll_esquerda.asm +++ b/scroller2/scroll_esquerda.asm @@ -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 - - dec c ; Decrementa o contador C - jr nz, scroll_esquerda_0; Se C != 0 corre novamente o Loop1 + ld (linha_actual), a + + dec c ; Decrementa o contador C + 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 - ; Cada linha tem 32 bytes - - ld (ultimoaddr), hl ; Guarda o endereço do fim da linha - pop bc + add hl, bc ; no fim da linha, tudo à direita + ; Cada linha tem 32 bytes + 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 a, (hl) ; Le o valor da linha do #UDG#1 + rla ; Rotate + ld (hl), a ; Actualiza - ld hl, (ultimoaddr) ; Le o valor do endereço da coluna - ld a, (hl) ; mais à direita, em A + 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