00001 #ifndef _PA_BGTILES
00002 #define _PA_BGTILES
00003
00004
00005
00006 #include <nds.h>
00007 #include "PA_General.h"
00008
00009
00010 #define BG_TILEDBG 2
00011 #define BG_ROTBG 3
00012 #define BG_LARGEMAP 4
00013 #define BG_INFINITEMAP 5
00014
00015 void PA_EasyBgLoadEx(u8 screen, u8 bg_number, u32 *Infos, void *Tiles, u32 TileSize, void *Map, u32 MapSize, void *Palette);
00016
00017
00018
00019 extern inline u8 PA_GetPAGfxBgSize(u16 width, u16 height)
00020 {
00021 u8 bg_size = 0;
00022 if (height == 512) bg_size = 2;
00023 if (width == 512) bg_size ++;
00024 return bg_size;
00025 }
00026
00027
00028 extern inline u8 PA_GetPAGfxRotBgSize(u16 width)
00029 {
00030 u8 bg_size = 1;
00031 if (width <= 128) bg_size = 0;
00032 else if (width <= 256) bg_size = 1;
00033 else if (width <= 512) bg_size = 2;
00034 else if (width <= 1024) bg_size = 3;
00035
00036 return bg_size;
00037 }
00038
00039
00040 typedef u8 (*EasyBgPixels)(u8, u8, s32, s32);
00041
00042 extern EasyBgPixels PA_EasyBgPixel[6];
00043
00053
00054
00056
00057
00058
00059 #define CharBaseBlock(screen, n) (((n)*0x4000) + 0x6000000 + (0x200000 * screen))
00060 #define ScreenBaseBlock(screen, n) (((n)*0x800) + 0x6000000 + (0x200000 * screen))
00061
00062
00063 typedef struct{
00064 void *Tiles;
00065 void *Map;
00066 void *Palette;
00067 u32 TileSize, MapSize;
00068 u32 Type, Width, Height;
00069 } PA_BgDefaultInfos;
00070
00071
00072 typedef struct{
00073
00074
00075
00076 u32 tilesetsize;
00077 u16 mapsize;
00078
00079 u8 mapchar;
00080
00081
00082 u32 Map;
00083 u8 TileSetChar;
00084
00085 u32 NTiles;
00086 u32 *TilePos;
00087 void *Tiles;
00088
00089 PA_BgDefaultInfos Infos;
00090
00091 s32 ScrollX, ScrollY;
00092
00093 u8 BgMode;
00094 } PA_BgInfos;
00095 extern PA_BgInfos PA_BgInfo[2][4];
00096
00097 extern u8 charblocks[2][70];
00098
00099
00100
00101
00102
00103 extern u16 *PA_DrawBg[2];
00104
00105 extern u16 bg_sizes[4];
00106 extern u8 bg_place[4];
00107
00108
00109 extern u8 charsetstart[2];
00110 extern s32 PA_parallaxX[2][4];
00111 extern s32 PA_parallaxY[2][4];
00112
00113
00114
00115
00116
00117 typedef struct {
00118 u8 infscroll;
00119 u16* bg_map;
00120
00121 s32 lx, ly;
00122 s32 scrollx, scrolly;
00123 s32 maxx;
00124
00125 }scrollpositions;
00126
00127 extern scrollpositions scrollpos[2][4];
00128
00129
00130
00131
00132
00133
00134
00135 #define BG_COLOR16 0x00
00136 #define BG_COLOR256 0x80
00137
00138
00139 #define CHAR_SHIFT 2
00140 #define SCREEN_SHIFT 8
00141 #define WRAPAROUND 0x1
00142
00143 #define SCREEN_TILES 24576 // Taille à convertir pour avoir un écran complet...
00144
00145
00146
00147
00148
00149
00150
00151 #define REG_BGSCREEN0 0x04000000
00152 #define REG_BGSCREEN1 0x04001000
00153 #define REG_BGSCREEN(screen) (0x04000000 + (screen * 0x1000))
00154
00155 #define REG_BGCNT(screen, bg_number) (0x4000008 + (screen * 0x1000) + (bg_number << 1))
00156
00157
00158 #define REG_BGSCROLLX 0x4000010
00159 #define REG_BGSCROLLY 0x4000012
00160
00161
00162
00163 #define BG_256X256 0
00164 #define BG_512X256 1
00165 #define BG_256X512 2
00166 #define BG_512X512 3
00167
00168
00169
00170
00171 #define TILE_N 1023
00172 #define TILE_PAL 61440
00173 #define TILE_HFLIP 1024
00174 #define TILE_VFLIP 2048
00175
00176
00177
00178
00179
00191 void PA_ResetBgSys(void);
00192
00193
00203 void PA_ResetBgSysScreen(u8 screen);
00204
00227 void PA_InitBg(u8 screen, u8 bg_select, u8 bg_size, u8 wraparound, u8 color_mode);
00228
00229
00230
00243 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select))
00244
00245
00258 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select))
00259
00260
00270 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00)
00271
00272
00273
00289 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles))
00290
00291
00292
00312 void PA_LoadBgTilesEx(u8 screen, u8 bg_select, void* bg_tiles, u32 size);
00313
00314
00330 void PA_ReLoadBgTiles(u8 screen, u8 bg_select, void* bg_tiles);
00331
00332
00345 void PA_DeleteTiles(u8 screen, u8 bg_select);
00346
00347
00360 void PA_DeleteMap(u8 screen, u8 bg_select);
00361
00362
00363
00376 extern inline void PA_DeleteBg(u8 screen, u8 bg_select) {
00377 PA_HideBg(screen, bg_select);
00378 PA_DeleteTiles(screen, bg_select);
00379 PA_DeleteMap(screen, bg_select);
00380 }
00381
00401 void PA_LoadBgMap(u8 screen, u8 bg_select, void* bg_map, u8 bg_size);
00402
00403
00404
00405
00406
00423 #define PA_LoadTiledBg(screen, bg_number, bg_name){\
00424 PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00425 PA_LoadSimpleBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, PA_GetPAGfxBgSize(bg_name##_Info[1], bg_name##_Info[2]), 0, 1);}
00426
00427
00428
00429
00458 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\
00459 PA_DeleteBg(screen, bg_select);\
00460 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00461 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00462 PA_InitBg(screen, bg_select, bg_size, 0, color_mode);\
00463 PA_BGScrollXY(screen, bg_select, 0, 0);}
00464
00465
00466
00467
00499 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\
00500 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \
00501 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00502 PA_InitBg(screen, bg_select, bg_size, 0, color_mode);\
00503 PA_BGScrollXY(screen, bg_select, 0, 0);}
00504
00505
00506
00522 extern inline void PA_BGScrollX(u8 screen, u8 bg_number, s32 x) {
00523 PA_BgInfo[screen][bg_number].ScrollX = (x)&1023;
00524 _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023;
00525 }
00526
00542 extern inline void PA_BGScrollY(u8 screen, u8 bg_number, s32 y) {
00543 PA_BgInfo[screen][bg_number].ScrollY = (y)&1023;
00544 _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023;
00545 }
00546
00547
00548
00567 extern inline void PA_BGScrollXY(u8 screen, u8 bg_number, s32 x, s32 y) {
00568 PA_BGScrollX(screen, bg_number, x);
00569 PA_BGScrollY(screen, bg_number, y);
00570 }
00571
00572
00573
00574
00596 extern inline void PA_SetMapTile(u8 screen, u8 bg_select, s16 x, s16 y, s16 tile_number) {
00597 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) &= ~(TILE_N);
00598 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) |= ((tile_number)&TILE_N);
00599 }
00600
00601
00623 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) = (tile_info)
00624
00625
00626
00627
00628
00650 extern inline void PA_SetLargeMapTile(u8 screen, u8 bg_select, s32 x, s32 y, u32 tile_info) {
00651 u32 truex;
00652 u32 mapblock = 0;
00653 truex = x&31;
00654 mapblock = ((x >> 5) << 11) + ((y >> 5) << 12);
00655
00656 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((truex) << 1) + ((y&31) << 6) + mapblock) = tile_info;
00657 }
00658
00659
00660
00682 #define PA_SetMapTileHflip(screen, bg_select, x, y, hflip) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_HFLIP); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((hflip) << 10);}
00683
00684
00706 #define PA_SetMapTileVflip(screen, bg_select, x, y, vflip) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_VFLIP); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((vflip) << 11);}
00707
00708
00730 #define PA_SetMapTilePal(screen, bg_select, x, y, palette_number) {*(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_PAL); *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) |= ((palette_number) << 12);}
00731
00732
00763 extern inline void PA_SetMapTileEx(u8 screen, u8 bg_select, s16 x, s16 y, u16 tile_number, u8 hflip, u8 vflip, u8 palette_number) {
00764 *(u16*)(PA_BgInfo[screen][bg_select].Map + ((x) << 1) + ((y) << 6)) = (tile_number) + ((hflip) << 10) + ((vflip) << 11) + ((palette_number) << 12);
00765 }
00766
00767
00768
00769
00770
00771
00772
00773
00774
00775
00791 extern inline void PA_SetBgPrio(u8 screen, u8 bg, u8 prio) {
00792 _REG16(REG_BGCNT(screen, bg)) &= ~3;
00793 _REG16(REG_BGCNT(screen, bg)) |= prio;
00794 }
00795
00796 extern inline void PA_CreateBgFromTiles(u8 screen, u8 bg_select, u8 bg_tiles, void *bg_map, u8 bg_size){
00797 PA_LoadBgMap(screen, bg_select, bg_map, bg_size);
00798 scrollpos[screen][bg_select].infscroll = 0;
00799 PA_BgInfo[screen][bg_select].Map = ScreenBaseBlock(screen, PA_BgInfo[screen][bg_select].mapchar);
00800 PA_BgInfo[screen][bg_select].TileSetChar = PA_BgInfo[screen][bg_tiles].TileSetChar;
00801 PA_BgInfo[screen][bg_select].tilesetsize = PA_BgInfo[screen][bg_tiles].tilesetsize;
00802
00803 _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select));
00804 _REG16(REG_BGCNT(screen, bg_select)) = bg_select | (bg_size << 14) |(PA_BgInfo[screen][bg_select].mapchar << SCREEN_SHIFT) | (1 << 13) | (PA_BgInfo[screen][bg_select].TileSetChar << 2) | (1 << 7);
00805 PA_BGScrollXY(screen, bg_select, 0, 0);
00806 }
00807
00808
00809
00832 extern inline void PA_SetBgPrioSeq(u8 screen, u8 priority0, u8 priority1, u8 priority2, u8 priority3)
00833 {
00834 PA_SetBgPrio(screen, priority0, 0);
00835 PA_SetBgPrio(screen, priority1, 1);
00836 PA_SetBgPrio(screen, priority2, 2);
00837 PA_SetBgPrio(screen, priority3, 3);
00838 }
00839
00840
00841
00842
00854 extern inline void PA_ClearBg(u8 screen, u8 bg_select){
00855 u8 i, j;
00856 for (i = 0; i < 32; i++) for (j = 0; j < 32; j++) PA_SetMapTileAll(screen, bg_select, i, j, 0);
00857 }
00858
00859
00860
00861
00862
00877 #define PA_EasyBgLoad(screen, bg_number, bg_name) PA_BgInfo[screen][bg_number].BgMode = bg_name##_Info[0];\
00878 PA_StoreEasyBgInfos(screen, bg_number, bg_name##_Info[0], bg_name##_Info[1], bg_name##_Info[2], (void*)bg_name##_Tiles, SIZEOF_16BIT(bg_name##_Tiles), (void*)bg_name##_Map, SIZEOF_16BIT(bg_name##_Map), (void*)bg_name##_Pal);\
00879 if(PA_BgInfo[screen][bg_number].BgMode == BG_TILEDBG){ PA_LoadTiledBg(screen, bg_number, bg_name);}\
00880 else{PA_LoadPAGfxLargeBg(screen, bg_number, bg_name);}
00881
00882
00883
00884
00885
00901 void PA_EasyBgScrollX(u8 screen, u8 bg_number, s32 x);
00902
00903
00904
00920 void PA_EasyBgScrollY(u8 screen, u8 bg_number, s32 y);
00921
00922
00941 extern inline void PA_EasyBgScrollXY(u8 screen, u8 bg_number, s32 x, s32 y){
00942 PA_EasyBgScrollX(screen, bg_number, x);
00943 PA_EasyBgScrollY(screen, bg_number, y);
00944 }
00945
00946
00965 extern inline u8 PA_EasyBgGetPixel(u8 screen, u8 bg_number, s32 x, s32 y){
00966 return PA_EasyBgPixel[PA_BgInfo[screen][bg_number].Infos.Type](screen, bg_number, x, y);
00967 }
00968
00969
00988 extern inline u16 PA_EasyBgGetPixelCol(u8 screen, u8 bg_number, s32 x, s32 y){
00989 return ((u16*)(PA_BgInfo[screen][bg_number].Infos.Palette))[PA_EasyBgGetPixel(screen, bg_number, x, y)];
00990 }
00991
00992
00993
00994
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007 u8 PAEasyBgGetPixelTiled(u8 screen, u8 bg_number, s32 x, s32 y);
01008
01009 u8 PAEasyBgGetPixelLarge(u8 screen, u8 bg_number, s32 x, s32 y);
01010
01011 u8 PAEasyBgGetPixelInf(u8 screen, u8 bg_number, s32 x, s32 y);
01012
01013 u8 PANoPixel(u8 screen, u8 bg_number, s32 x, s32 y);
01014
01015 extern inline void PA_UpdateBgTile(u8 screen, u8 bg_select, u16 tilepos, void *tile){
01016 tilepos = tilepos << 4;
01017 u32 *tilecopy = (u32*)tile;
01018 u8 i;
01019 for (i = 0; i < 16; i++)
01020 PA_BgInfo[screen][bg_select].TilePos[tilepos+i] = tilecopy[i];
01021 }
01022
01023 void PA_StoreEasyBgInfos(u8 screen, u8 bg_number, u32 Type, u32 Width, u32 Height, void *Tiles, u32 TileSize, void *Map, u32 MapSize, void *Palette);
01024
01025
01026 #endif
01027