Já funciona mas não está perfeito :-D

This commit is contained in:
Pedro de Oliveira 2014-08-12 04:56:18 +01:00
parent 2441814043
commit 45244d168d
4 changed files with 43 additions and 16 deletions

View File

@ -7,6 +7,9 @@ k_cur equ $5c5b ; Contem a posição do cursor - TODO: Usar isto
; Depois de meter a 10,6 (y,x) fica com
; $5d16
LINHA10 equ $4840
aids db $0
start
xor a ; O mesmo que LD a, 0
ld (tv_flag), a ; Directs rst 10h output to main screen.
@ -16,11 +19,24 @@ start
call clear_screen ; Limpa o ecrã
call scroll_text
mainloop
ld a, $0
ld (last_k), a ; Limpa o valor da ultima tecla pressionada
ld a, (aids)
cp $8
jr nz, s_e
call scroll_text
ld a, 0
ld (aids), a
s_e
ld hl, LINHA10
call scroll_esquerda
ld a, (aids)
inc a
ld (aids), a
ld a, $1
call delay ; Chama a rotina de delay(1)
@ -36,5 +52,6 @@ exit
INCLUDE "delay.asm"
INCLUDE "clear.asm"
INCLUDE "scroll_text.asm"
INCLUDE "scroll_esquerda.asm"
end start

Binary file not shown.

View File

@ -1,16 +1,15 @@
;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
aids2 db 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
ld a, 0
ld (aids2), a
; Loop1
scroll_esquerda_0
ld (addractual1), hl ; Guarda o valor de HL em tmp1
@ -25,6 +24,10 @@ scroll_esquerda_0
; videoAddr, videoAddr+$100 videoAddr+$200,
; ..., videoAddr+$700
ld a, (aids2)
inc a
ld (aids2), a
dec c ; Decrementa o contador C
jr nz, scroll_esquerda_0; Se C != 0 corre novamente o Loop1
ret
@ -43,15 +46,6 @@ scroll_esquerda_1
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
@ -61,6 +55,15 @@ scroll_esquerda_2
dec hl ; Anda uma coluna para a esquerda
djnz scroll_esquerda_2 ; Se ainda nao chegou ao fim, repete
ld a, (aids2)
ld d, $0
ld e, a
ld hl, udg_start
add hl, de
ld a, (hl)
rla
ld (hl), a
ld hl, (ultimoaddr) ; Le o valor do endereço da coluna
ld a, (hl) ; mais à direita, em A

View File

@ -1,4 +1,4 @@
text db "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin commodo metus sed orci fermentum, id mattis quam suscipit.", 0
text db "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin commodo metus sed orci fermentum, id mattis quam suscipit OI VIVA O BENFICA!!", 0
chars equ $5c36 ; Endereço 256 ($100) bytes abaixo da fonte (2 bytes)
; Contem $3c00 inicialmente
@ -17,6 +17,13 @@ text_pos db 0,0
char_pos db 0
scroll_text
ld a, 22
rst $10
ld a, 0
rst $10
ld a, 0
rst $10
; Verificar se o valor de text_pos já foi alguma vez alterado
ld a, (text_pos) ; Le o primeiro byte
cp 0 ; Se for 0 é a primeira vez senão
@ -61,7 +68,7 @@ scroll_text_loop
pop hl ; Tira a posição na string da stack
inc hl ; Anda para a frente
ld a, (hl) ; Le o proximo valor
cp 0 ; Se for 0 estamos no fim da string
cp $0 ; Se for 0 estamos no fim da string
jr z, reset ; Reset à posição
jr the_end ; Continua
reset
@ -80,4 +87,4 @@ copia_para_udg_loop
inc hl ; Incrementa ambos
inc de
djnz copia_para_udg_loop ; b--, se b != 0 salta
ret
ret