mirror of https://github.com/falsovsky/z80.git
Separar as rotinas em ficheiros diferentes para incluir só o que interessa
This commit is contained in:
parent
68ddbe88d2
commit
5655a98af2
|
|
@ -0,0 +1,16 @@
|
|||
; Rotina de delay variavel, conforme o valor definido em A antes de a chamar
|
||||
; Ripada do Paradise Café
|
||||
delay
|
||||
push bc
|
||||
delay_start
|
||||
ld c, 20
|
||||
delay_loop2
|
||||
ld b, 0
|
||||
delay_loop1
|
||||
djnz delay_loop1 ; b--, se b != 0 corre novamente o loop1
|
||||
dec c ; c--
|
||||
jr nz, delay_loop2 ; Se c != 0 corre o loop2
|
||||
dec a ; a--
|
||||
jr nz, delay_start ; Se a != 0 volta ao inicio da rotina
|
||||
pop bc
|
||||
ret
|
||||
|
|
@ -55,136 +55,9 @@ mainloop
|
|||
exit
|
||||
pop bc ; Tira o BC da Stack
|
||||
ret ; Sai para o BASIC
|
||||
|
||||
; Rotina de delay variavel, conforme o valor definido em A antes de a chamar
|
||||
; Ripada do Paradise Café
|
||||
delay
|
||||
push bc
|
||||
delay_start
|
||||
ld c, 20
|
||||
delay_loop2
|
||||
ld b, 0
|
||||
delay_loop1
|
||||
djnz delay_loop1 ; b--, se b != 0 corre novamente o loop1
|
||||
dec c ; c--
|
||||
jr nz, delay_loop2 ; Se c != 0 corre o loop2
|
||||
dec a ; a--
|
||||
jr nz, delay_start ; Se a != 0 volta ao inicio da rotina
|
||||
pop bc
|
||||
ret
|
||||
|
||||
; Rotina de scroll de texto da direita para a esquerda pixel a pixel
|
||||
scrolla
|
||||
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
|
||||
scrolla_0
|
||||
ld (tmpScroll1), hl ; Guarda o valor de HL em tmp1
|
||||
call scrolla_1 ; Scrolla
|
||||
ld hl, (tmpScroll1) ; 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, scrolla_0 ; Se C != 0 corre novamente o Loop1
|
||||
ret
|
||||
;INCLUDE "scroll_pc.asm"
|
||||
INCLUDE "scroll_pixel.asm"
|
||||
INCLUDE "delay.asm"
|
||||
|
||||
; Segunda rotina
|
||||
scrolla_1
|
||||
ld hl, (tmpScroll1) ; Le o argumento tmp1 para HL
|
||||
|
||||
; Soma $1F ao endereço para começar no fim da linha, tudo à direita
|
||||
push bc
|
||||
;ld bc, 1Fh
|
||||
ld bc, 20h
|
||||
adc hl, bc
|
||||
|
||||
; Guarda o endereço do fim da linha em (ultimoaddr)
|
||||
ld b, h
|
||||
ld c, l
|
||||
ld (ultimoaddr), bc
|
||||
pop bc
|
||||
|
||||
ld b, 1Fh ; Numero de vezes que a rotina vai correr
|
||||
ld b, 21h ; Numero de vezes que a rotina vai correr
|
||||
|
||||
|
||||
; Loop2
|
||||
scrolla_2
|
||||
ld a, (hl)
|
||||
rla
|
||||
ld (hl), a
|
||||
dec hl
|
||||
djnz scrolla_2
|
||||
|
||||
ld hl, (ultimoaddr)
|
||||
ld a, (hl)
|
||||
rra
|
||||
ld (hl), a
|
||||
ret
|
||||
|
||||
; Antiga
|
||||
|
||||
; Rotina de scroll de texto da direita para a esquerda
|
||||
; Ripada do Paradise Café
|
||||
scrollaPC
|
||||
ld hl, videoAddr ; Endereço de Memoria Video a ser manipulado
|
||||
ld c, 8 ; Numero de vezes que a rotina vai correr
|
||||
; 8 porque é o numero de pixels a scrollar
|
||||
|
||||
; Loop1
|
||||
scrollaPC_0
|
||||
ld (tmpScroll1), hl ; Guarda o valor de HL em tmp1
|
||||
call scrollaPC_1 ; Scrolla
|
||||
ld hl, (tmpScroll1) ; 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, scrollaPC_0 ; Se C != 0 corre novamente a Loop1
|
||||
ret
|
||||
|
||||
; Segunda rotina
|
||||
scrollaPC_1
|
||||
ld hl, (tmpScroll1) ; Le o argumento tmp1 para HL
|
||||
ld b, 1Fh ; Numero de vezes que a rotina vai correr
|
||||
; $1F porque cada linha tem 32 bytes
|
||||
|
||||
ld d, h ; DE = HL
|
||||
ld e, l ;
|
||||
|
||||
ld a, (hl) ; Le o valor dos 8 pixeis no endereço definido em HL
|
||||
ld (tmpScroll2), a ; Guarda o valor em tmp2
|
||||
; Isto vai guardar o valor dos 8 pixels mais à
|
||||
; esquerda, que posteriormente vão ser postos o
|
||||
; mais à direita
|
||||
|
||||
; Loop2
|
||||
scrollaPC_2
|
||||
inc hl ; Incrementa a posicao na memoria grafica definida
|
||||
; em HL
|
||||
|
||||
ld a, (hl) ; Le o valor dos proximos 8 pixeis
|
||||
ld (de), a ; Guarda-os na posição anterior
|
||||
inc de ; Incrementa DE, fica com o mesmo valor de HL
|
||||
djnz scrollaPC_2 ; b--, se b != corre novamente o Loop2
|
||||
|
||||
ld a, (tmpScroll2) ; Le o valor dos 8 pixeis guardados inicialmente
|
||||
ld (de), a ; Mete-os na posição mais à direita
|
||||
ret
|
||||
|
||||
end start
|
||||
|
|
|
|||
|
|
@ -1,19 +1,15 @@
|
|||
delay EQU 07596H
|
||||
delay_loop1 EQU 0759BH
|
||||
delay_loop2 EQU 07599H
|
||||
delay_start EQU 07597H
|
||||
delay EQU 075CAH
|
||||
delay_loop1 EQU 075CFH
|
||||
delay_loop2 EQU 075CDH
|
||||
delay_start EQU 075CBH
|
||||
exit EQU 07594H
|
||||
mainloop EQU 07580H
|
||||
mystr EQU 07530H
|
||||
printa_ate_255 EQU 07575H
|
||||
scrolla EQU 075A5H
|
||||
scrollaPC EQU 075D9H
|
||||
scrollaPC_0 EQU 075DEH
|
||||
scrollaPC_1 EQU 075ECH
|
||||
scrollaPC_2 EQU 075F7H
|
||||
scrolla_0 EQU 075AAH
|
||||
scrolla_1 EQU 075B8H
|
||||
scrolla_2 EQU 075CCH
|
||||
scrolla EQU 07596H
|
||||
scrolla_0 EQU 0759BH
|
||||
scrolla_1 EQU 075A9H
|
||||
scrolla_2 EQU 075BDH
|
||||
start EQU 0756DH
|
||||
tmpScroll1 EQU 07568H
|
||||
tmpScroll2 EQU 0756CH
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -28,14 +28,14 @@
|
|||
<Settings>
|
||||
<ScorePanel>
|
||||
<Alignment>1</Alignment>
|
||||
<Layout>0</Layout>
|
||||
<Layout>1</Layout>
|
||||
<Show>false</Show>
|
||||
<AllowOverlap>false</AllowOverlap>
|
||||
<XOverlap>0</XOverlap>
|
||||
<YOverlap>0</YOverlap>
|
||||
</ScorePanel>
|
||||
<ScreenLayout>
|
||||
<DontIntersectTiles>false</DontIntersectTiles>
|
||||
<DontIntersectTiles>true</DontIntersectTiles>
|
||||
<SnapToGrid>true</SnapToGrid>
|
||||
<GridWidth>8</GridWidth>
|
||||
<GridHeight>8</GridHeight>
|
||||
|
|
@ -82,6 +82,9 @@
|
|||
</Settings>
|
||||
<Files>
|
||||
<File>game.asm</File>
|
||||
<File>scroll_pixel.asm</File>
|
||||
<File>delay.asm</File>
|
||||
<File>scroll_pc.asm</File>
|
||||
</Files>
|
||||
</CodeEditor>
|
||||
</TommyGunProject>
|
||||
|
|
|
|||
|
|
@ -28,14 +28,14 @@
|
|||
<Settings>
|
||||
<ScorePanel>
|
||||
<Alignment>1</Alignment>
|
||||
<Layout>0</Layout>
|
||||
<Layout>1</Layout>
|
||||
<Show>false</Show>
|
||||
<AllowOverlap>false</AllowOverlap>
|
||||
<XOverlap>0</XOverlap>
|
||||
<YOverlap>0</YOverlap>
|
||||
</ScorePanel>
|
||||
<ScreenLayout>
|
||||
<DontIntersectTiles>false</DontIntersectTiles>
|
||||
<DontIntersectTiles>true</DontIntersectTiles>
|
||||
<SnapToGrid>true</SnapToGrid>
|
||||
<GridWidth>8</GridWidth>
|
||||
<GridHeight>8</GridHeight>
|
||||
|
|
@ -82,6 +82,9 @@
|
|||
</Settings>
|
||||
<Files>
|
||||
<File>game.asm</File>
|
||||
<File>scroll_pixel.asm</File>
|
||||
<File>delay.asm</File>
|
||||
<File>scroll_pc.asm</File>
|
||||
</Files>
|
||||
</CodeEditor>
|
||||
</TommyGunProject>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,53 @@
|
|||
; Rotina de scroll de texto da direita para a esquerda
|
||||
; Ripada do Paradise Café
|
||||
scrollaPC
|
||||
ld hl, videoAddr ; Endereço de Memoria Video a ser manipulado
|
||||
ld c, 8 ; Numero de vezes que a rotina vai correr
|
||||
; 8 porque é o numero de pixels a scrollar
|
||||
|
||||
; Loop1
|
||||
scrollaPC_0
|
||||
ld (tmpScroll1), hl ; Guarda o valor de HL em tmp1
|
||||
call scrollaPC_1 ; Scrolla
|
||||
ld hl, (tmpScroll1) ; 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, scrollaPC_0 ; Se C != 0 corre novamente a Loop1
|
||||
ret
|
||||
|
||||
; Segunda rotina
|
||||
scrollaPC_1
|
||||
ld hl, (tmpScroll1) ; Le o argumento tmp1 para HL
|
||||
ld b, 1Fh ; Numero de vezes que a rotina vai correr
|
||||
; $1F porque cada linha tem 32 bytes
|
||||
|
||||
ld d, h ; DE = HL
|
||||
ld e, l ;
|
||||
|
||||
ld a, (hl) ; Le o valor dos 8 pixeis no endereço definido em HL
|
||||
ld (tmpScroll2), a ; Guarda o valor em tmp2
|
||||
; Isto vai guardar o valor dos 8 pixels mais à
|
||||
; esquerda, que posteriormente vão ser postos o
|
||||
; mais à direita
|
||||
|
||||
; Loop2
|
||||
scrollaPC_2
|
||||
inc hl ; Incrementa a posicao na memoria grafica definida
|
||||
; em HL
|
||||
|
||||
ld a, (hl) ; Le o valor dos proximos 8 pixeis
|
||||
ld (de), a ; Guarda-os na posição anterior
|
||||
inc de ; Incrementa DE, fica com o mesmo valor de HL
|
||||
djnz scrollaPC_2 ; b--, se b != corre novamente o Loop2
|
||||
|
||||
ld a, (tmpScroll2) ; Le o valor dos 8 pixeis guardados inicialmente
|
||||
ld (de), a ; Mete-os na posição mais à direita
|
||||
ret
|
||||
|
|
@ -0,0 +1,57 @@
|
|||
; Rotina de scroll de texto da direita para a esquerda pixel a pixel
|
||||
scrolla
|
||||
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
|
||||
scrolla_0
|
||||
ld (tmpScroll1), hl ; Guarda o valor de HL em tmp1
|
||||
call scrolla_1 ; Scrolla
|
||||
ld hl, (tmpScroll1) ; 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, scrolla_0 ; Se C != 0 corre novamente o Loop1
|
||||
ret
|
||||
|
||||
; Segunda rotina
|
||||
scrolla_1
|
||||
ld hl, (tmpScroll1) ; Le o argumento tmp1 para HL
|
||||
|
||||
; Soma $1F ao endereço para começar no fim da linha, tudo à direita
|
||||
push bc
|
||||
;ld bc, 1Fh
|
||||
ld bc, 20h
|
||||
adc hl, bc
|
||||
|
||||
; Guarda o endereço do fim da linha em (ultimoaddr)
|
||||
ld b, h
|
||||
ld c, l
|
||||
ld (ultimoaddr), bc
|
||||
pop bc
|
||||
|
||||
ld b, 1Fh ; Numero de vezes que a rotina vai correr
|
||||
ld b, 21h ; Numero de vezes que a rotina vai correr
|
||||
|
||||
|
||||
; Loop2
|
||||
scrolla_2
|
||||
ld a, (hl)
|
||||
rla
|
||||
ld (hl), a
|
||||
dec hl
|
||||
djnz scrolla_2
|
||||
|
||||
ld hl, (ultimoaddr)
|
||||
ld a, (hl)
|
||||
rra
|
||||
ld (hl), a
|
||||
ret
|
||||
Loading…
Reference in New Issue