Benvenuto Visitatore!  / Create an account

Valutazione discussione:
  • 1 voto(i) - 5 media
  • 1
  • 2
  • 3
  • 4
  • 5
[Gba] Offset Attributes
#1
Prima di Procedere con la spiegazione vera e propria di questo tutorial
è necessario conoscere questi termini, o perlomeno farsi un idea.

Bit = Unita elementare della memoria, può essere a livello logico basso o alto, "0" o "1"
Byte = 8-bit (esempio: 10010110)
Half-word = 16-bit, o 2-byte (esempio: 10010110-00110101)
Word = 32-bit, o 4-byte (10010110-00110101-00101011-11101001)

Nonostante una ricerca approfondita dal mio compare Kirito (<3), reperibile al seguente link Click Me Hard, ho voluto dare anche io un piccolo contributo Smile
Oggi vi parlerò come lavorare sugli offset/memorie che lavorano con il sistema binario.
Un esempio Può essere la memoria I/O che lavora solo con il sistema binario, oppure altri offset che andremo a vedere successivamente.

Prendiamo come esempio lo stato di un pokemon.
Esso è gestito dal sistema binario dove i "bit" sono a livello alto, quindi 1, al verificarsi o meno di una determinata condizione di stato.
Questi sono i possibili eventi che potremmo far "attivare":

Citazione:0-2 SLP Sleep
3 PSN Poison
4 BRN Burn
5 FRZ Freeze
6 PAR Paralysis
7 PSN Bad Poison
L'offset in questione è questo: 0x030043B0
Se ci dirigiamo all'offset citato precedentemente, in condizioni normali, quindi senza aver subito cambiamenti di stato, dovremmo trovare i byte settati su "00-00".
Bene, ora dovremmo lavorare con il sistema binario. Convertendo i due byte dall'esadecimale al binario avremmo "0-0".
Se il byte convertito in binario dovesse essere meno di 8 bit, aggiungiamo tanti 0 fino ad arrivare appunto a 8 bit:
Esempio: 10011 --> 000-10011

Essendo una Half-word a 16 bit che gestisce le condizioni di stato (praticamente ogni offset che lavora con il binario lavorerà a 16bit), ogni parte sarà costituita da 8 bit in questo modo:
Citazione:00 00
7 6 5 4 3 2-0 15 14 13 12 11 10 9 8
0 0 0 0 0 000 0 0 0 0 0 0 0 0
Per attivare determinate eventi è necessario mettere a 1 i bit.
Per esempio se vogliamo congelare il nostro pokemon dovremo mettere a "1" il 5 bit, relativo al congelamento (vedi sopra):
Citazione:20
7 6 5 4 3 2-0
0 0 1 0 0 000
Ora avremmo il nostro numero binario: 00100000, Convertiamolo in Hex dovremmo avere come numero, il valore 20.
Bene una volta sovrascritto tramite un wbto:
writebytetooffset 0x20 0x030043B0
o una routine ASM avremmo il pokemon congelato:
Citazione:.THUMB
.ALIGN 2

PUSH {R0-R1,LR}
LDR R0, .POKEMON_DATA /*dati inerenti al pokemon in squadra*/
MOV R1, #0x20 /*stato congelato*/
STRB R1,[R0]
pop {R0-R1,PC}

.ALIGN 2
.POKEMON_DATA: .word 0x030043B0
[Immagine: 9zoglj.png]

OAM
L'OAM, è un "livello" dove vengono caricati gli OBJ. Gli OBJ possiamo definirli come oggetti i quali hanno determinate proprietà.
Gli OBJ in sintesi possono essere gli sprite (pokemon, ow o qualunque cosa non riguardi i tileset). Ogni OBJ ha delle proprietà riassunti in 6 byte (+2) e iniziando dall'offset 700000:
[POS_Y][ATTRIBUTE_1][POS_X][ATTRIBUTE_2][START_TILE][ATTRIBUTE_3]+[byte_1][byte_2]
Quindi il secondo OBJ inizierà dall'offset 700008, il terzo 700010 e cosi via.

Osserviamo i vari bit inerenti algli attributi 1 dell'oam:
Citazione:0-7 Y-Coordinate (0-255)
8 Rotation/Scaling Flag (0=Off, 1=On)
When Rotation/Scaling used (Attribute 0, bit 8 set):
9 Double-Size Flag (0=Normal, 1=Double)
When Rotation/Scaling not used (Attribute 0, bit 8 cleared):
9 OBJ Disable (0=Normal, 1=Not displayed)
10-11 OBJ Mode (0=Normal, 1=Semi-Transparent, 2=OBJ Window, 3=Prohibited)
12 OBJ Mosaic (0=Off, 1=On)
13 Colors/Palettes (0=16/16, 1=256/1)
14-15 OBJ Shape (0=Square,1=Horizontal,2=Vertical,3=Prohibited)
Prendiamo come esempio l'ow del nostro player, all'offset 7000000. (Se siete in una mappa dove l'unico OAM è il player, altrimenti potrebbe capitare che all'offset 700000 ci sono gli attributi relativi ad un altro OAM)
Recandoci all'offset citato precedentemente dovremmo trovarci i seguenti byte:
38-80
Non ci resta che seguire il procedimento precedente:

Citazione:38 80
7-0 15-14 13 12 11-10 9 8
00111000 10 0 0 00 0 0
In questo caso il byte che ci interessa è quello inerente ai bit dal 15 all'8. Possiamo notare che è a 10 (2 in HEX, DEC)
corrispondente all'evento della forma dell'obj ovvero quella verticale.
Per rendere per esempio l'ow del player "pixxelloso" è necessario attivare il bit inerente all'effetto mosaico,
utilizzato per esempio quando camminiamo con un pokemon avvelenato sgranando lo sfondo.

Citazione:90
15-14 13 12 11-10 9 8
10 0 1 00 0 0
Ora dobbiamo settare i parametri relativi allo "sgranulamento". L'offset che controlla questo aspetto è questo: 0x0400004C
Citazione:0-3 BG Mosaic H-Size (minus 1)
4-7 BG Mosaic V-Size (minus 1)
8-11 OBJ Mosaic H-Size (minus 1)
12-15 OBJ Mosaic V-Size (minus 1)
16-31 Not used
Basterà settare la grandezza dei pixel, relativi naturalmente all'OBJ quindi gli utlimi 8 bit e dovremmo aver ricavato i seguenti byte da sovrascrivere:
Citazione:writebytetooffset 0x90 0x02020005
writebytetooffset 0x22 0x0400004D
PS: Non essendo possibile modificare gli attributi direttamente nella memoria 07 (OAM) dobbiamo cercare l'offset relativo agli OAM nella RAM.
Proviamo ora ad attivare la modalità semi-trasparente del nostro player:
Citazione:84
15-14 13 12 11-10 9 8
10 0 0 01 0 0
Ora entrano in gioco due parametri: La luminosità e il livello di semi-trasparenza. Questi due aspetti vengo controllati ai seguenti offset:
0x4000052 per il livello di semi-trasparenza:
Citazione:0-4 EVA Coefficient (1st Target) (0..16 = 0/16..16/16, 17..31=16/16)
5-7 Not used
8-12 EVB Coefficient (2nd Target) (0..16 = 0/16..16/16, 17..31=16/16)
13-15 Not used
e 0x4000054 per la luminosità:
Citazione:0-4 EVY Coefficient (Brightness) (0..16 = 0/16..16/16, 17..31=16/16)
5-31 Not used
In questo caso utilizzando solo 4 bit i valori che potremmo utilizzare andranno da 0000 a 1111, 0-15, 0-F.
Una volta svolti tutti i passaggi dovremmo avere dei byte simili a questi:
Citazione:writebytetooffset 0x84 0x02020005
writebytetooffset 0x06 0x04000053 //luminosità
writebytetooffset 0x0F 0x04000055 //semi-trasparenza
[Immagine: 2d8qr9z.png]
 Mi Piace Ricevuti: 
Stygian, Flygon, Explosion100 like this post
Cita messaggio
#2
Se potesse interessare dopo tanto smanettare (perché sono un nabbo nel mondo dell'asm, altrimenti ci avrei messo 1 minuto...), ho trovato l'offset dello stato del Pokemon anche per Fire Red (U), dato che quello postato da Andrea è per Ruby.
- offset primo Pokémon in squadra: 020242D4
dopo qualche byte troviamo anche quello per il secondo...
- offset secondo Pokémon in squadra: 02024338
e così procediamo per tutti gli altri che abbiamo in squadra.
[Immagine: 51ppxl.png] [Immagine: 1zlgf2o.png] [Immagine: http1t.png] [Immagine: 2i1cze0.png] [Immagine: 122knxf.png] [Immagine: veu3h5.png] [Immagine: 33u6d86.png]
 Mi Piace Ricevuti: 
Flygon likes this post
Cita messaggio
#3
Sì, in generale possiamo dire che sono 6 slot distanti tra di loro 64 byte (Hex).
.
 Mi Piace Ricevuti: 
Cita messaggio




Utenti che stanno guardando questa discussione: 1 Ospite(i)