From 5655a98af2871a6f20cfa0dca399eba876abbdef Mon Sep 17 00:00:00 2001 From: Pedro de Oliveira Date: Sun, 10 Aug 2014 22:37:26 +0100 Subject: [PATCH] =?UTF-8?q?Separar=20as=20rotinas=20em=20ficheiros=20difer?= =?UTF-8?q?entes=20para=20incluir=20s=C3=B3=20o=20que=20interessa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scroller/delay.asm | 16 +++++ scroller/game.asm | 133 +------------------------------------- scroller/game.map | 20 +++--- scroller/game.tap | Bin 331 -> 290 bytes scroller/project.bak | 7 +- scroller/project.xml | 7 +- scroller/scroll_pc.asm | 53 +++++++++++++++ scroller/scroll_pixel.asm | 57 ++++++++++++++++ 8 files changed, 147 insertions(+), 146 deletions(-) create mode 100644 scroller/delay.asm create mode 100644 scroller/scroll_pc.asm create mode 100644 scroller/scroll_pixel.asm diff --git a/scroller/delay.asm b/scroller/delay.asm new file mode 100644 index 0000000..17a2f47 --- /dev/null +++ b/scroller/delay.asm @@ -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 \ No newline at end of file diff --git a/scroller/game.asm b/scroller/game.asm index 29ab6ef..465f332 100644 --- a/scroller/game.asm +++ b/scroller/game.asm @@ -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 diff --git a/scroller/game.map b/scroller/game.map index feb5b8b..2a67a30 100644 --- a/scroller/game.map +++ b/scroller/game.map @@ -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 diff --git a/scroller/game.tap b/scroller/game.tap index b3f20eb3c7a79ae9e03ca3e8c239e7930016fc13..b75e8ad1f11b27b48f2fb5202c050c31597879fa 100644 GIT binary patch delta 65 zcmV-H0KWgr0-^$tZV0IWFm(WcDyxxpSQ?gfJ^{_jbvg)K{s1WK!O0;&NDc@hXm!o0 Xk@qSP#SRn(01*BSAo)EY^ufsoDEAp1 delta 106 zcmZ3)bed^G9>*mHgHncuz$+8WA~ctl+A*G;R%*o&^N&H}&B2pL`9# 1 - 0 + 1 false false 0 0 - false + true true 8 8 @@ -82,6 +82,9 @@ game.asm + scroll_pixel.asm + delay.asm + scroll_pc.asm diff --git a/scroller/project.xml b/scroller/project.xml index aa64abe..ccbc4fa 100644 --- a/scroller/project.xml +++ b/scroller/project.xml @@ -28,14 +28,14 @@ 1 - 0 + 1 false false 0 0 - false + true true 8 8 @@ -82,6 +82,9 @@ game.asm + scroll_pixel.asm + delay.asm + scroll_pc.asm diff --git a/scroller/scroll_pc.asm b/scroller/scroll_pc.asm new file mode 100644 index 0000000..24c1bff --- /dev/null +++ b/scroller/scroll_pc.asm @@ -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 diff --git a/scroller/scroll_pixel.asm b/scroller/scroll_pixel.asm new file mode 100644 index 0000000..21dee4b --- /dev/null +++ b/scroller/scroll_pixel.asm @@ -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