Vai al commento




Offset Attributes


Post raccomandati

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 :)

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":

 

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:

 

      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):

      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:

.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

 

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:

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:

 

      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.

 

        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

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:

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:

            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:

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à :

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:

writebytetooffset 0x84 0x02020005

writebytetooffset 0x06 0x04000053 //luminosità 

writebytetooffset 0x0F 0x04000055 //semi-trasparenza

 

2d8qr9z.jpg

Link al commento
Condividi su altre piattaforme

Archiviata

La discussione è ora archiviata e chiusa ad ulteriori risposte.

  • Utenti nella discussione   0 utenti

    • Nessun utente registrato sta visualizzando questa pagina.
×
×
  • Crea...