Mappatura dei banchi di memoria | |||||||||
VRAMCNT | A (128K) | B (128K) | C (128K) | D (128K) | E (64K) | F (16K) | G (16K) | H (32K) | I (16K) |
$4000240 | $4000241 | $4000242 | $4000243 | $4000244 | $4000245 | $4000246 | $4000248 | $4000249 | |
LCD mode | 128K | 128K | 128K | 128K | 64K | 16K | 16K | 32K | 16K |
Main BG-VRAM (max 512K) |
128K | 128K | 128K | 128K | 64K | 16K | 16K | - | - |
Main OBJ-VRAM (max 256K) |
128K | 128K | - | - | 64K | 16K | 16K | - | - |
Sub BG-VRAM (max 128K) |
- | - | 128K | - | - | - | - | 32K | 16K |
Sub OBJ-VRAM (max 128K) |
- | - | - | 128K | - | - | - | - | 16K |
Main BG Extended Palette | - | - | - | - | 32K (*) | 16K | 16K | - | - |
Main OBJ Extended Palette | - | - | - | - | - | 16K | 16K | - | - |
Sub BG Extended Palette | - | - | - | - | - | - | - | 32K | - |
Sub OBJ Extended Palette | - | - | - | - | - | - | - | - | 8K (*) |
Texture/Rear-plane | 128K | 128K | 128K | 128K | - | - | - | - | - |
Texture Palette | - | - | - | - | 64K | 16K | 16K | - | - |
ARM7 CPU Access | - | - | 128K | 128K | - | - | - | - | - |
Le tabelle seguenti mostrano invece le costanti utilizzate per la designazione dei diversi banchi e i loro possibili utilizzi:
Banco |
VRAM/VRAM_A |
Registro |
VRAM_A_CR |
Dimensione |
128 KB |
LCD mode | VRAM_A_LCD |
Main BG-VRAM | VRAM_A_MAIN_BG_0x06000000 = VRAM_A_MAIN_BG VRAM_A_MAIN_BG_0x06020000 VRAM_A_MAIN_BG_0x06040000 VRAM_A_MAIN_BG_0x06060000 |
Main OBJ-VRAM | VRAM_A_MAIN_SPRITE_0x06400000 = VRAM_A_MAIN_SPRITE VRAM_A_MAIN_SPRITE_0x06420000 |
Texture | VRAM_A_TEXTURE_SLOT0 = VRAM_A_TEXTURE VRAM_A_TEXTURE_SLOT1 VRAM_A_TEXTURE_SLOT2 VRAM_A_TEXTURE_SLOT3 |
Banco |
VRAM_B |
Registro |
VRAM_B_CR |
Dimensione |
128 KB |
LCD mode | VRAM_B_LCD |
Main BG-VRAM | VRAM_B_MAIN_BG_0x06000000 VRAM_B_MAIN_BG_0x06020000 = VRAM_B_MAIN_BG VRAM_B_MAIN_BG_0x06040000 VRAM_B_MAIN_BG_0x06060000 |
Main OBJ-VRAM | VRAM_B_MAIN_SPRITE VRAM_B_MAIN_SPRITE_0x06420000 = VRAM_B_MAIN_SPRITE |
Texture | VRAM_B_TEXTURE_SLOT0 VRAM_B_TEXTURE_SLOT1 = VRAM_B_TEXTURE VRAM_B_TEXTURE_SLOT2 VRAM_B_TEXTURE_SLOT3 |
Banco |
VRAM_C |
Registro |
VRAM_C_CR |
Dimensione |
128 KB |
LCD mode | VRAM_C_LCD |
Main BG-VRAM | VRAM_C_MAIN_BG_0x06000000 VRAM_C_MAIN_BG_0x06020000 VRAM_C_MAIN_BG_0x06040000 = VRAM_C_MAIN_BG VRAM_C_MAIN_BG_0x06060000 |
Sub BG-VRAM | VRAM_C_SUB_BG_0x06200000 = VRAM_C_SUB_BG |
Texture | VRAM_C_TEXTURE_SLOT0 VRAM_C_TEXTURE_SLOT1 VRAM_C_TEXTURE_SLOT2 = VRAM_C_TEXTURE VRAM_C_TEXTURE_SLOT3 |
ARM7 CPU Access | VRAM_C_ARM7_0x06000000 = VRAM_C_ARM7 VRAM_C_ARM7_0x06020000 |
Banco |
VRAM_D |
Registro |
VRAM_D_CR |
Dimensione |
128 KB |
LCD mode | VRAM_D_LCD |
Main BG-VRAM | VRAM_D_MAIN_BG_0x06000000 VRAM_D_MAIN_BG_0x06020000 VRAM_D_MAIN_BG_0x06040000 VRAM_D_MAIN_BG_0x06060000 = VRAM_D_MAIN_BG |
Sub Obj-VRAM | VRAM_D_SUB_SPRITE |
Texture | VRAM_D_TEXTURE_SLOT0 VRAM_D_TEXTURE_SLOT1 VRAM_D_TEXTURE_SLOT2 VRAM_D_TEXTURE_SLOT3 = VRAM_D_TEXTURE |
ARM7 CPU Access | VRAM_D_ARM7_0x06000000 VRAM_D_ARM7_0x06020000 = VRAM_D_ARM7 |
Banco |
VRAM_E |
Registro |
VRAM_E_CR |
Dimensione |
64 KB |
LCD mode | VRAM_E_LCD |
Main BG-VRAM | VRAM_E_MAIN_BG |
Main Obj-VRAM | VRAM_E_MAIN_SPRITE |
Main BG Extended Palette |
VRAM_E_BG_EXT_PALETTE |
Texture | VRAM_E_TEX_PALETTE |
Banco |
VRAM_F |
Registro |
VRAM_F_CR |
Dimensione |
16 KB |
LCD mode | VRAM_F_LCD |
Main BG-VRAM | VRAM_F_MAIN_BG_0x06000000 = VRAM_F_MAIN_BG VRAM_F_MAIN_BG_0x06004000 VRAM_F_MAIN_BG_0x06010000 VRAM_F_MAIN_BG_0x06014000 |
Main Obj-VRAM | VRAM_F_MAIN_SPRITE_0x06400000 = VRAM_F_MAIN_SPRITE VRAM_F_MAIN_SPRITE_0x06404000 VRAM_F_MAIN_SPRITE_0x06410000 VRAM_F_MAIN_SPRITE_0x06414000 |
Main BG Extended Palette | VRAM_F_BG_EXT_PALETTE VRAM_F_BG_EXT_PALETTE_SLOT01 VRAM_F_BG_EXT_PALETTE_SLOT23 |
Main OBJ Extended Palette | VRAM_F_SPRITE_EXT_PALETTE |
Texture Palette | VRAM_F_TEX_PALETTE |
Banco |
VRAM_G |
Registro |
VRAM_G_CR |
Dimensione |
16 KB |
LCD mode | VRAM_G_LCD |
Main BG-VRAM | VRAM_G_MAIN_BG_0x06000000 = VRAM_G_MAIN_BG VRAM_G_MAIN_BG_0x06004000 VRAM_G_MAIN_BG_0x06010000 VRAM_G_MAIN_BG_0x06014000 |
Main Obj-VRAM | VRAM_G_MAIN_SPRITE_0x06400000 = VRAM_G_MAIN_SPRITE VRAM_G_MAIN_SPRITE_0x06404000 VRAM_G_MAIN_SPRITE_0x06410000 VRAM_G_MAIN_SPRITE_0x06414000 |
Main BG Extended Palette | VRAM_G_BG_EXT_PALETTE VRAM_G_BG_EXT_PALETTE_SLOT01 VRAM_G_BG_EXT_PALETTE_SLOT23 |
Main OBJ Extended Palette | VRAM_G_SPRITE_EXT_PALETTE |
Texture Palette | VRAM_G_TEX_PALETTE |
Banco |
VRAM_H |
Registro |
VRAM_H_CR |
Dimensione |
32 KB |
LCD mode | VRAM_H_LCD |
Sub BG-VRAM | VRAM_H_SUB_BG |
Sub BG Extended Palette | VRAM_H_SUB_BG_EXT_PALETTE |
Banco |
VRAM_I |
Registro |
VRAM_I_CR |
Dimensione |
16 KB |
LCD mode | VRAM_I_LCD |
Sub BG-VRAM | VRAM_I_SUB_BG_0x06208000 |
Sub Obj-VRAM | VRAM_I_SUB_SPRITE |
Sub Obj Extended Palette | VRAM_I_SUB_SPRITE_EXT_PALETTE |
Si noti che uno stesso banco di memoria, ad esempio il banco VRAM_A, oltre ad avere delle costanti diverse a seconda della tipologia di utilizzo (VRAM_A_LCD per la modalità framebuffer, VRAM_A_BG per i background, VRAM_A_SPRITE per gli sprite, ecc.), presenta le stesse costanti con degli "strani" valori associati:
VRAM_A_BG_0x06000000 VRAM_A_BG_0x06020000 VRAM_A_BG_0x06040000 VRAM_A_BG_0x06060000
La loro presenza è presto spiegata: i banchi di memoria vengono mappati su una zona virtuale di memoria che parte dall'indirizzo $06000000; d'altra parte essi hanno anche dimensioni differenti. Occorre quindi prestare attenzione che due o più banchi non vadano ad occupare la stessa zona di memoria; i diversi tipi di costante indicano il punto di partenza del banco ($06000000, $06020000, $06040000 o $06060000) e servono appunto per "spostare più in là" un banco, per evitare che "pesti i piedi" ad un altro banco di VRAM. Senza stare ad impazzire più di tanto, esiste un utilissimo sito che mette a disposizione un'applicazione web che ci aiuterà ad impostare correttamente la mappatura dei banchi di memoria.
Basi per tiles, bitmap e mappe
Il motore 2d del Nintendo DS è organizzato in modo tale da sfruttare la memoria video a disposizione in due modi differenti: o per la visualizzazione di bitmap, o per la visualizzazione di tiles, che vengono ricomposte a video tramite mappe. Questo concetto è valido sia per gli sfondi, sia - con leggere differenze, come vedremo - per gli sprites, e si riflette nell'organizzazione dei banchi di memoria, che sono suddivisi internamente in blocchi, detti basi. Di conseguenza le basi possono essere di tre tipologie differenti:
L'aspetto interessante è rappresentato dal fatto che le 16 basi di tipo bmp condividono la stessa locazione di memoria delle 16 basi di tipo char; a loro volta, le 32 basi di tipo map condividono la stessa locazione di memoria con le prime 4 basi di tipo bmp o char.
Per questo motivo il programmatore deve prestare la massima attenzione ad eventuali sovrapposizioni (overlapping), che potrebbero causare strani errori nella visualizzazione delle immagini sullo schermo. Anche in questo caso ci viene in aiuto il sito visto in precedenza, con un'ulteriore applicazione web che aiuta ad impostare correttamente le basi. L'immagine mostra una schematizzazione delle basi di memoria e delle loro possibili sovrapposizioni.
Per commenti e chiarimenti: http://www.lazaruspascal.it/index.php?topic=78.0