00001 #ifndef _PA_Tile
00002 #define _PA_Tile
00003
00004
00011
00012
00013
00014
00016
00018
00019
00020
00021 #define CharBaseBlock(screen, n) (((n)*0x4000) + 0x6000000 + (0x200000 * screen))
00022 #define ScreenBaseBlock(screen, n) (((n)*0x800) + 0x6000000 + (0x200000 * screen))
00023 extern u32 PA_bgmap[2][4];
00024 extern u8 tilesetchar[2][4];
00025
00026
00027 extern u16 bg_sizes[4];
00028 extern u8 bg_place[4];
00029
00030 extern u16 *PA_DrawBg[2];
00031
00032
00033 extern bool charblocks[2][70];
00034 extern u16 tilesetsize[2][4];
00035 extern u16 mapsize[2][4];
00036 extern u8 tilesetchar[2][4];
00037 extern u8 mapchar[2][4];
00038
00039 extern u8 charsetstart[2];
00040
00041
00042
00043
00044
00045 extern s32 PA_parallaxX[2][4];
00046 extern s32 PA_parallaxY[2][4];
00047
00048
00049
00050
00051 typedef struct {
00052 bool infscroll;
00053 u16* bg_map;
00054
00055 s32 lx, ly;
00056 s32 scrollx, scrolly;
00057 s32 maxx;
00058
00059 }scrollpositions;
00060
00061 extern scrollpositions scrollpos[2][4];
00062
00063
00064
00065
00066
00067
00068
00069 #define BG_COLOR16 0x00
00070 #define BG_COLOR256 0x80
00071
00072
00073 #define CHAR_SHIFT 2
00074 #define SCREEN_SHIFT 8
00075 #define WRAPAROUND 0x1
00076
00077 #define SCREEN_TILES 24576 // Taille à convertir pour avoir un écran complet...
00078
00079
00080
00081
00082
00083
00084
00085 #define REG_BGSCREEN0 0x04000000
00086 #define REG_BGSCREEN1 0x04001000
00087 #define REG_BGSCREEN(screen) (0x04000000 + (screen * 0x1000))
00088
00089 #define REG_BGCNT(screen, bg_number) (0x4000008 + (screen * 0x1000) + (bg_number << 1))
00090
00091
00092 #define REG_BGSCROLLX 0x4000010
00093 #define REG_BGSCROLLY 0x4000012
00094
00095
00096
00097 #define BG_256X256 0
00098 #define BG_512X256 1
00099 #define BG_256X512 2
00100 #define BG_512X512 3
00101
00102 #define BG_ROT_128X128 0
00103 #define BG_ROT_256X256 1
00104 #define BG_ROT_512X512 2
00105 #define BG_ROT_1024X1024 3
00106
00107 void PA_LoadRotBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00108
00109
00110
00111 #define TILE_N 1023
00112 #define TILE_PAL 61440
00113 #define TILE_HFLIP 1024
00114 #define TILE_VFLIP 2048
00115
00116 #define PA_BGXX(screen, bg) _REG32(0x4000008 + (0x1000 * screen) + (bg << 4))
00117 #define PA_BGXY(screen, bg) _REG32(0x400000C + (0x1000 * screen) + (bg << 4))
00118 #define PA_BGXPA(screen, bg) _REG32(0x4000000 + (0x1000 * screen) + (bg << 4))
00119 #define PA_BGXPB(screen, bg) _REG32(0x4000002 + (0x1000 * screen) + (bg << 4))
00120 #define PA_BGXPC(screen, bg) _REG32(0x4000004 + (0x1000 * screen) + (bg << 4))
00121 #define PA_BGXPD(screen, bg) _REG32(0x4000006 + (0x1000 * screen) + (bg << 4))
00122
00123
00124
00125
00126
00127
00139 void PA_ResetBgSys(void);
00140
00163 void PA_InitBg(bool screen, u8 bg_select, u8 bg_size, bool wraparound, bool color_mode);
00164
00165
00166
00179 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select))
00180
00181
00194 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select))
00195
00196
00206 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00)
00207
00208
00209
00225 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles))
00226
00227
00228
00248 void PA_LoadBgTilesEx(bool screen, u8 bg_select, void* bg_tiles, u16 size);
00249
00250
00263 void PA_DeleteTiles(bool screen, u8 bg_select);
00264
00265
00278 void PA_DeleteMap(bool screen, u8 bg_select);
00279
00280
00281
00294 extern inline void PA_DeleteBg(bool screen, u8 bg_select) {
00295 PA_HideBg(screen, bg_select);
00296 PA_DeleteTiles(screen, bg_select);
00297 PA_DeleteMap(screen, bg_select);
00298 }
00299
00319 void PA_LoadBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00320
00321
00322
00351 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\
00352 PA_DeleteBg(screen, bg_select);\
00353 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00354 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00355 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00356 PA_BGScrollXY(screen, bg_select, 0, 0);}
00357
00382 #define PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound) {\
00383 PA_DeleteBg(screen, bg_select);\
00384 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00385 PA_LoadRotBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00386 PA_InitBg(screen, bg_select, bg_size, wraparound, 1);\
00387 PA_SetBgRot(screen, bg_select, 0, 0, 0, 0, 0, 256);\
00388 }
00389
00390 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);
00391
00423 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\
00424 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \
00425 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00426 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00427 PA_BGScrollXY(screen, bg_select, 0, 0);}
00428
00429
00430
00446 #define PA_BGScrollX(screen, bg_number, x) _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023
00447
00463 #define PA_BGScrollY(screen, bg_number, y) _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023
00464
00465
00466
00467
00486 #define PA_BGScrollXY(screen, bg_number, x, y) {PA_BGScrollX(screen, bg_number, x); PA_BGScrollY(screen, bg_number, y);}
00487
00488
00489
00490
00512
00513
00514
00515
00516
00517
00518
00519
00520 #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);}
00521
00522
00544 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) = tile_info
00545
00546
00547
00548
00570 extern inline void PA_SetLargeMapTile(bool screen, u8 bg_select, s32 x, s32 y, u32 tile_info) {
00571 u32 truex;
00572 u32 mapblock = 0;
00573 truex = x&31;
00574 mapblock = (x >> 5) << 11;
00575
00576 *(u16*)(PA_bgmap[screen][bg_select] + ((truex) << 1) + ((y) << 6) + mapblock) = tile_info;
00577 }
00578
00579
00580
00602 #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);}
00603
00604
00626 #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);}
00627
00628
00650 #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);}
00651
00652
00683 #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)
00684
00685
00686
00699 #define PA_LoadTiledBitmap(screen, tiled_bitmap) PA_LoadBg(screen, 0, tiled_bitmap, SCREEN_TILES, bitmap, BG_256X256, 1, 1)
00700
00701
00702
00703
00704
00705
00706
00707
00735 #define PA_LoadLargeBg(screen, bg_select, bg_tiles, bg_map, color_mode, lx, ly) {\
00736 PA_LoadSimpleBg(screen, bg_select, bg_tiles, Blank, BG_512X256, 1, color_mode);\
00737 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00738
00739
00740
00741
00772 #define PA_LoadLargeBgEx(screen, bg_select, bg_tiles, tile_size, bg_map, color_mode, lx, ly) {\
00773 PA_LoadBg(screen, bg_select, bg_tiles, tile_size, Blank, BG_512X256, 1, color_mode);\
00774 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00775
00776
00777
00778
00794 void PA_InfLargeScrollX(bool screen, u8 bg_select, s32 x);
00795
00796
00812 void PA_InfLargeScrollY(bool screen, u8 bg_select, s32 y);
00813
00814
00815
00834 extern inline void PA_InfLargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00835 PA_InfLargeScrollX(screen, bg_select, x);
00836 PA_InfLargeScrollY(screen, bg_select, y);
00837 }
00838
00854 void PA_LargeScrollX(bool screen, u8 bg_select, s32 x);
00855
00856
00872 void PA_LargeScrollY(bool screen, u8 bg_select, s32 y);
00873
00874
00875
00894 extern inline void PA_LargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00895 PA_LargeScrollX(screen, bg_select, x);
00896 PA_LargeScrollY(screen, bg_select, y);
00897 }
00898
00899
00900
00922 extern inline void PA_InitParallaxX(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
00923 PA_parallaxX[screen][0] = bg0;
00924 PA_parallaxX[screen][1] = bg1;
00925 PA_parallaxX[screen][2] = bg2;
00926 PA_parallaxX[screen][3] = bg3;
00927 }
00928
00950 extern inline void PA_InitParallaxY(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
00951 PA_parallaxY[screen][0] = bg0;
00952 PA_parallaxY[screen][1] = bg1;
00953 PA_parallaxY[screen][2] = bg2;
00954 PA_parallaxY[screen][3] = bg3;
00955 }
00956
00957
00958
00971 extern inline void PA_ParallaxScrollX(bool screen, s32 x){
00972 u8 i;
00973 for(i = 0; i < 4; i++) {
00974 if (PA_parallaxX[screen][i]) {
00975 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8);
00976 else PA_BGScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8);
00977 }
00978 }
00979 }
00980
00981
00994 extern inline void PA_ParallaxScrollY(bool screen, s32 y){
00995 u8 i;
00996 for(i = 0; i < 4; i++) {
00997 if (PA_parallaxY[screen][i]) {
00998 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8);
00999 else PA_BGScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8);
01000 }
01001 }
01002 }
01003
01004
01020 extern inline void PA_ParallaxScrollXY(bool screen, s32 x, s32 y){
01021 PA_ParallaxScrollX(screen, x);
01022 PA_ParallaxScrollY(screen, y);
01023 }
01024
01025
01026
01042 extern inline void PA_SetBgPrio(bool screen, u8 bg, u8 prio) {
01043 _REG16(REG_BGCNT(screen, bg)) &= ~3;
01044 _REG16(REG_BGCNT(screen, bg)) |= prio;
01045 }
01046
01047
01048
01050
01051
01052
01053
01054 void PA_InitLargeBg(bool screen, u8 bg_select, s32 lx, s32 ly, void* bg_map);
01055
01056
01057
01058 #endif
01059