00001 #ifndef _PA_Tile
00002 #define _PA_Tile
00003
00004
00005 extern inline u8 PA_GePAGfxBgSize(u16 width, u16 height)
00006 {
00007 u8 bg_size = 0;
00008 if (height == 512) bg_size = 2;
00009 if (width == 512) bg_size ++;
00010 return bg_size;
00011 }
00012
00019
00020
00021
00022
00024
00026
00027
00028
00029 #define CharBaseBlock(screen, n) (((n)*0x4000) + 0x6000000 + (0x200000 * screen))
00030 #define ScreenBaseBlock(screen, n) (((n)*0x800) + 0x6000000 + (0x200000 * screen))
00031 extern u32 PA_bgmap[2][4];
00032 extern u8 tilesetchar[2][4];
00033
00034
00035 extern u16 bg_sizes[4];
00036 extern u8 bg_place[4];
00037
00038 extern u16 *PA_DrawBg[2];
00039
00040
00041 extern bool charblocks[2][70];
00042 extern u16 tilesetsize[2][4];
00043 extern u16 mapsize[2][4];
00044 extern u8 tilesetchar[2][4];
00045 extern u8 mapchar[2][4];
00046
00047 extern u8 charsetstart[2];
00048
00049
00050
00051
00052
00053 extern s32 PA_parallaxX[2][4];
00054 extern s32 PA_parallaxY[2][4];
00055
00056
00057
00058
00059 typedef struct {
00060 bool infscroll;
00061 u16* bg_map;
00062
00063 s32 lx, ly;
00064 s32 scrollx, scrolly;
00065 s32 maxx;
00066
00067 }scrollpositions;
00068
00069 extern scrollpositions scrollpos[2][4];
00070
00071
00072
00073
00074
00075
00076
00077 #define BG_COLOR16 0x00
00078 #define BG_COLOR256 0x80
00079
00080
00081 #define CHAR_SHIFT 2
00082 #define SCREEN_SHIFT 8
00083 #define WRAPAROUND 0x1
00084
00085 #define SCREEN_TILES 24576 // Taille à convertir pour avoir un écran complet...
00086
00087
00088
00089
00090
00091
00092
00093 #define REG_BGSCREEN0 0x04000000
00094 #define REG_BGSCREEN1 0x04001000
00095 #define REG_BGSCREEN(screen) (0x04000000 + (screen * 0x1000))
00096
00097 #define REG_BGCNT(screen, bg_number) (0x4000008 + (screen * 0x1000) + (bg_number << 1))
00098
00099
00100 #define REG_BGSCROLLX 0x4000010
00101 #define REG_BGSCROLLY 0x4000012
00102
00103
00104
00105 #define BG_256X256 0
00106 #define BG_512X256 1
00107 #define BG_256X512 2
00108 #define BG_512X512 3
00109
00110 #define BG_ROT_128X128 0
00111 #define BG_ROT_256X256 1
00112 #define BG_ROT_512X512 2
00113 #define BG_ROT_1024X1024 3
00114
00115 void PA_LoadRotBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00116
00117
00118
00119 #define TILE_N 1023
00120 #define TILE_PAL 61440
00121 #define TILE_HFLIP 1024
00122 #define TILE_VFLIP 2048
00123
00124 #define PA_BGXX(screen, bg) _REG32(0x4000008 + (0x1000 * screen) + (bg << 4))
00125 #define PA_BGXY(screen, bg) _REG32(0x400000C + (0x1000 * screen) + (bg << 4))
00126 #define PA_BGXPA(screen, bg) _REG16(0x4000000 + (0x1000 * screen) + (bg << 4))
00127 #define PA_BGXPB(screen, bg) _REG16(0x4000002 + (0x1000 * screen) + (bg << 4))
00128 #define PA_BGXPC(screen, bg) _REG16(0x4000004 + (0x1000 * screen) + (bg << 4))
00129 #define PA_BGXPD(screen, bg) _REG16(0x4000006 + (0x1000 * screen) + (bg << 4))
00130
00131
00132
00133
00134
00146 void PA_ResetBgSys(void);
00147
00170 void PA_InitBg(bool screen, u8 bg_select, u8 bg_size, bool wraparound, bool color_mode);
00171
00172
00173
00186 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select))
00187
00188
00201 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select))
00202
00203
00213 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00)
00214
00215
00216
00232 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles))
00233
00234
00235
00255 void PA_LoadBgTilesEx(bool screen, u8 bg_select, void* bg_tiles, u16 size);
00256
00257
00270 void PA_DeleteTiles(bool screen, u8 bg_select);
00271
00272
00285 void PA_DeleteMap(bool screen, u8 bg_select);
00286
00287
00288
00301 extern inline void PA_DeleteBg(bool screen, u8 bg_select) {
00302 PA_HideBg(screen, bg_select);
00303 PA_DeleteTiles(screen, bg_select);
00304 PA_DeleteMap(screen, bg_select);
00305 }
00306
00326 void PA_LoadBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00327
00328
00329
00330
00331
00348 #define PA_LoadTiledBg(screen, bg_number, bg_name){\
00349 PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00350 PA_LoadSimpleBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, PA_GePAGfxBgSize(bg_name##_Width, bg_name##_Height), 0, 1);}
00351
00352
00353
00354
00383 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\
00384 PA_DeleteBg(screen, bg_select);\
00385 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00386 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00387 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00388 PA_BGScrollXY(screen, bg_select, 0, 0);}
00389
00414 #define PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound) {\
00415 PA_DeleteBg(screen, bg_select);\
00416 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00417 PA_LoadRotBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00418 PA_InitBg(screen, bg_select, bg_size, wraparound, 1);\
00419 PA_SetBgRot(screen, bg_select, 0, 0, 0, 0, 0, 256);\
00420 }
00421
00422 void PA_SetBgRot(bool screen, u8 bg_select, s32 x_scroll, s32 y_scroll, s32 x_rotcentre, s32 y_rotcentre, s16 bg_angle, s32 bg_zoom);
00423
00455 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\
00456 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \
00457 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00458 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00459 PA_BGScrollXY(screen, bg_select, 0, 0);}
00460
00461
00462
00478 #define PA_BGScrollX(screen, bg_number, x) _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023
00479
00495 #define PA_BGScrollY(screen, bg_number, y) _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023
00496
00497
00498
00499
00518 #define PA_BGScrollXY(screen, bg_number, x, y) {PA_BGScrollX(screen, bg_number, x); PA_BGScrollY(screen, bg_number, y);}
00519
00520
00521
00522
00544
00545
00546
00547
00548
00549
00550
00551
00552 #define PA_SetMapTile(screen, bg_select, x, y, tile_number) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_N); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((tile_number)&TILE_N);}
00553
00554
00576 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) = tile_info
00577
00578
00579
00580
00602 extern inline void PA_SetLargeMapTile(bool screen, u8 bg_select, s32 x, s32 y, u32 tile_info) {
00603 u32 truex;
00604 u32 mapblock = 0;
00605 truex = x&31;
00606 mapblock = (x >> 5) << 11;
00607
00608 *(u16*)(PA_bgmap[screen][bg_select] + ((truex) << 1) + ((y) << 6) + mapblock) = tile_info;
00609 }
00610
00611
00612
00634 #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);}
00635
00636
00658 #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);}
00659
00660
00682 #define PA_SetMapTilePal(screen, bg_select, x, y, palette_number) {*(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) &= ALL_BUT(TILE_PAL); *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) |= ((palette_number) << 12);}
00683
00684
00715 #define PA_SetMapTileEx(screen, bg_select, x, y, tile_number, hflip, vflip, palette_number) *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) = (tile_number) + ((hflip) << 10) + ((vflip) << 11) + ((palette_number) << 12)
00716
00717
00718
00731 #define PA_LoadTiledBitmap(screen, tiled_bitmap) PA_LoadBg(screen, 0, tiled_bitmap, SCREEN_TILES, bitmap, BG_256X256, 1, 1)
00732
00733
00734
00735
00736
00737
00738
00739
00767 #define PA_LoadLargeBg(screen, bg_select, bg_tiles, bg_map, color_mode, lx, ly) {\
00768 PA_LoadSimpleBg(screen, bg_select, bg_tiles, Blank, BG_512X256, 1, color_mode);\
00769 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00770
00771
00772
00773
00789 #define PA_LoadPAGfxLargeBg(screen, bg_number, bg_name){\
00790 PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00791 PA_LoadLargeBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, 1, (bg_name##_Width) >> 3, (bg_name##_Height) >> 3);}
00792
00793
00794
00825 #define PA_LoadLargeBgEx(screen, bg_select, bg_tiles, tile_size, bg_map, color_mode, lx, ly) {\
00826 PA_LoadBg(screen, bg_select, bg_tiles, tile_size, Blank, BG_512X256, 1, color_mode);\
00827 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00828
00829
00830
00831
00847 void PA_InfLargeScrollX(bool screen, u8 bg_select, s32 x);
00848
00849
00865 void PA_InfLargeScrollY(bool screen, u8 bg_select, s32 y);
00866
00867
00868
00887 extern inline void PA_InfLargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00888 PA_InfLargeScrollX(screen, bg_select, x);
00889 PA_InfLargeScrollY(screen, bg_select, y);
00890 }
00891
00907 void PA_LargeScrollX(bool screen, u8 bg_select, s32 x);
00908
00909
00925 void PA_LargeScrollY(bool screen, u8 bg_select, s32 y);
00926
00927
00928
00947 extern inline void PA_LargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00948 PA_LargeScrollX(screen, bg_select, x);
00949 PA_LargeScrollY(screen, bg_select, y);
00950 }
00951
00952
00953
00975 extern inline void PA_InitParallaxX(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
00976 PA_parallaxX[screen][0] = bg0;
00977 PA_parallaxX[screen][1] = bg1;
00978 PA_parallaxX[screen][2] = bg2;
00979 PA_parallaxX[screen][3] = bg3;
00980 }
00981
01003 extern inline void PA_InitParallaxY(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
01004 PA_parallaxY[screen][0] = bg0;
01005 PA_parallaxY[screen][1] = bg1;
01006 PA_parallaxY[screen][2] = bg2;
01007 PA_parallaxY[screen][3] = bg3;
01008 }
01009
01010
01011
01024 extern inline void PA_ParallaxScrollX(bool screen, s32 x){
01025 u8 i;
01026 for(i = 0; i < 4; i++) {
01027 if (PA_parallaxX[screen][i]) {
01028 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8);
01029 else PA_BGScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8);
01030 }
01031 }
01032 }
01033
01034
01047 extern inline void PA_ParallaxScrollY(bool screen, s32 y){
01048 u8 i;
01049 for(i = 0; i < 4; i++) {
01050 if (PA_parallaxY[screen][i]) {
01051 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8);
01052 else PA_BGScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8);
01053 }
01054 }
01055 }
01056
01057
01073 extern inline void PA_ParallaxScrollXY(bool screen, s32 x, s32 y){
01074 PA_ParallaxScrollX(screen, x);
01075 PA_ParallaxScrollY(screen, y);
01076 }
01077
01078
01079
01095 extern inline void PA_SetBgPrio(bool screen, u8 bg, u8 prio) {
01096 _REG16(REG_BGCNT(screen, bg)) &= ~3;
01097 _REG16(REG_BGCNT(screen, bg)) |= prio;
01098 }
01099
01100
01101
01103
01104
01105
01106
01107 void PA_InitLargeBg(bool screen, u8 bg_select, s32 lx, s32 ly, void* bg_map);
01108
01109
01110
01111 #endif
01112