Questo Forum utilizza i Cookies
Questo Forum fa uso di Cookies per memorizzare le informazioni di login se sei registrato o sulla tua ultima visita se non siete registrati. I Cookies sono piccoli documenti di testo memorizzati sul vostro computer; i Cookies impostati dal Forum possono essere utilizzati solo su questo sito e non costituiscono rischio per la sicurezza. I Cookies su questo forum servono anche a monitorare gli argomenti specifici che hai letto. Si prega di confermare se accettare o rifiutare i Cookies impostati.

Un cookie verrà memorizzato nel browser indipendentemente dalla scelta, per evitare che il Forum faccia nuovamente questa domanda. Sarete in grado di modificare le impostazioni dei cookies in qualsiasi momento tramite il link a piè di pagina

Rispondi 
[Gb] ASM Testo Colorato/Differenziato in battaglia
80C
['e…™t…™ s…™:]
******
Offline

Messaggi: 1,867
Registrato: 12-06-2014
Reputazione: 27
Mi Piace Ricevuti: 1212
Pok√©Money: 2,724.01‚āĪ
Messaggio: #1
Smile ASM Testo Colorato/Differenziato in battaglia
AVVISO: Il seguente tutorial tratta di ASM GB e contiene paroloni e concetti non immediati. Si consiglia di consultare le guide basilari per l'ASM (Pandocs, Scavenger Hunt, ASM School, etc.) per essere iniziati a questo aspetto.
----------------

Di seguito è illustrato un estratto della routine ASM da me creata per espandere il testo in una hack GB e renderlo in grafica .2bpp a 4 colori (potenzialmente colorato).
Inoltre, il codice è in grado di poter far caricare un differente tipo di grafica in base ad una condizione pre-stabilita da una flag (in questo caso la flag che definisce se avviene una lotta pokémon o meno).

Inoltre è presente un estratto su come differenziare potenzialmente tale testo in base a condizioni in corso, in base all'accenzione di una flag. A quel punto, l'unico limite è la fantasia -- ad esempio, si può far caricare un testo differente in lotta o in mappe buie o addirittura fare testi completamente nuovi in base ad una nuova flag pre-fissata (Braille) come ho fatto io, ma dato che sono le flag a gestire l'opzione di caricamento in VRAM le oprzioni sono pressoché illimitate, ad es: caricare grafica di testo diversa in base al tileset corrente, se un pokémon è avvelenato, etc. etc.

La condizione sine qua non è quello di caricare la flag desiderata in un registro (registro a ad esempio), ed avviare una funzione di compare con un bit di quella flag -- ad esempio bit 0,a -- nel caso di flag che contengono valori 0/1 (come dati di progresso, progressi di gioco, bitmask etc.) per poi avviare un jump condizionato (ad esempio jp z o jr z, jp nz e così via).
Riguardo flag che contengono valori esadecimali è necessario invece caricare il valore di quella flag in un registro ( ad esempio ld a,(d700) ), caricare quel valore in un altro registro (ld b,a), caricare una valuta di riferimento in a (es: ld a,xx dove xx=numero esadecimale) e poi avviare il jump condizionato -- in questo caso si può fare anche facendo riferimento alla flag "carry" (flag c) oltre che la flag "zero" (flag z) per poter fare sì che il jump avvenga entro un certo range (attenzione, la carry flag non è inclusiva del valore con cui la comparazione avviene).


PREMESSA 0: Caricare grafica in VRAM, se fatto maldestramente, può essere pericoloso, e può danneggiare l'hardware se si programma male.
Motivo per cui con l' LCD spento, per copiare grafica, si utilizza la funzione FarCopyData (o FarCopyDataDouble per sprites .1bpp), mentre ad LCD acceso si utilizza CopyVideoData (o CopyVideoDataDouble per le sprites .1bpp).
Il bit 7 della flag [rLCDC] contiene informazione sull'accensione dell LCD, se quella flag è 0 l'LCD è spento, viceversa se è 1 l'LCD è acceso.
Questo avviene poiché il GameBoy non può trasferire tutta la grafica in un colpo solo ad LCD acceso, ma solo durante lo stadio di VBlank del GameBoy (è lunga da spiegare), quindi deve procedere a blocchi (tempi di caricamento). Quando caricate grafica, fate riferimento alla funzione originale e a questa componente cruciale indispensabile per il corretto funzionamento.


PREMESSA 1: Per poter far funzionare i colori è necessario cambiare la grafica dei testi da .1bpp a .2bpp, ossia da monocromatica a grafica .2bpp a 4 colori.
PREMESSA 2: Il codice riporato, sebbene scritto in ASM Z80, non è stato inserito in una ROM decompilata in Disassembly, ma codificata in HEX (esadecimale) byte per byte alla vecchia maniera, e dunque sono necessari degli adattamenti per poterla utilizzare in una disassembly.
PREMESSA 3: Data la mole della funzione, è necessario far sì che la funzione originale, ospitata nel Bank00, chiami la nuova funzione presso un altro Bank -- questo è possibile in 2 modi, o chiamando la funzione BankSwitch e caricando gli opportuni dati nei vari registri (pointer in hl, bank in b, etc.) oppure (meglio ancora) modificando la ROM per inserire un Vettore rst che include la funzione. Il vantaggio è che i Vettori rst chiamano la funzione ad essa associata con un solo byte, risparmiando spazio.
-----------------------
; original
; copies the tile patterns for letters and numbers into VRAM
LoadFontTilePatterns: ; 3680 (0:3680)
ld a,[rLCDC]
bit 7,a ; is the LCD enabled?
jr nz,.lcdEnabled
.lcdDisabled
ld hl,FontGraphics
ld de,$8800
ld bc,$400
ld a,BANK(FontGraphics)
jp FarCopyDataDouble ; if LCD is off, transfer all at once
.lcdEnabled
ld de,FontGraphics
ld hl,$8800
ld bc,(BANK(FontGraphics) << 8 | $80)
jp CopyVideoDataDouble ; if LCD is on, transfer during V-blank
---
; mod

; copies the tile patterns for letters and numbers into VRAM
LoadFontTilePatterns: ; 3680 (0:3680)
ld hl,LoadFontTilePatterns_
ld b,Bank(LoadFontTilePatterns_)
call BankSwitch
; rst BankSwitch -- se avete modificato un vettore rst per chiamare BankSwitch eliminate la linea con il call ed impiegate questa

; copies the tile patterns for letters and numbers into VRAM
LoadFontTilePatterns_: ;
ld a,[rLCDC]
bit 7,a ; is the LCD enabled?
jr nz,.lcdEnabled
.lcdDisabled
ld a,[$W_ISINBATTLE] ;flag, original 0xd057
cp a,$0
jr z,.nobattlelcdDisabled
ld de,$8800
ld bc,$400
ld hl,FontGraphicsBattle
ld a,BANK(FontGraphicsBattle)
jp FarCopyData ; if LCD is off, transfer all at once
.nobattlelcdDisabled
ld de,$8800
ld bc,$400
ld hl,FontGraphics
ld a,BANK(FontGraphics)
jp FarCopyData ; if LCD is off, transfer all at once
.lcdEnabled
ld a,[$W_ISINBATTLE] ;flag 0xd057
cp a,$0
jr z,.nobattlelcdEnabled
ld hl,$8800
ld de,FontGraphicsBattle
ld bc,(BANK(FontGraphicsBattle) << 8 | $80)
jp CopyVideoData ; if LCD is on, transfer during V-blank
.nobattlelcdEnabled
ld hl,$8800
ld de,FontGraphics
ld bc,(BANK(FontGraphics) << 8 | $80)
jp CopyVideoData ; if LCD is on, transfer during V-blank

-------------
Nota bene 1: CopyVideoDataDouble è stato sotutuito con CopyVideoData in modo tale da poter caricare grafica .2bpp anziché .1bpp, lo stesso con CopyDataDouble e CopyData.

Nota Bene 2: Se si vogliono caricare quantità maggiori di dati in WRAM è necessario modificare la quantità da caricare in hl (nel caso di CopyVideoData) o in de (nel caso di FarCopyData).

Nota Bene 3: il codice sovrastante è scritto in maniera tale da poter differenziare i testi nel caso della battaglia: durante la battaglia grafica differente verrà caricata.

Nota Bene 4: ovviamente l'intenzione non è quella di fare copia/incolla del codice ma di studiarlo, e di studiare in particolare la maniera in cui viene attuata la differenziazione. Wink
------------

POKEMON GRAPE (FINAL) DISPONIBILE! CLICCA IL BANNER!
[Immagine: tumblr_npqfq38PKG1tp2yqno3_400.png]
(Questo messaggio è stato modificato l'ultima volta il: 23-01-2020 06:14 PM da 80C.)
23-01-2020 06:10 PM
Sito Web Cerca Cita
 Mi piace ricevuti da: Bonnox , Flygon , Andrea , IvanFGK , Half shadow
Rispondi 




Utente(i) che stanno guardando questa discussione: 1 Ospite(i)
Powered by MyBB, © 2002-2020 MyBB Group. Copyright ¬© | 2020 Pok√©mon Hacking