head 1.1; branch 1.1.1; access ; symbols start:1.1.1.1 PAlibDoc:1.1.1; locks ; strict; comment @# @; 1.1 date 2005.11.02.08.30.23; author jandujar; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 2005.11.02.08.30.23; author jandujar; state Exp; branches ; next ; desc @@ 1.1 log @Initial revision @ text @
00001 #ifndef _PA_Tile 00002 #define _PA_Tile 00003 00004 00011 //#include "../PA.h" 00012 00013 00014 00016 // Système de Tiles 00018 00019 00020 //background memory offset macros 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]; // Pointeur vers les maps, 4 maps par screen 00024 extern u8 tilesetchar[2][4]; 00025 00026 // Quantité de données à charger en fonction de la taille de la map... 00027 extern u16 bg_sizes[4]; 00028 extern u8 bg_place[4]; 00029 00030 extern u16 *PA_DrawBg[2]; // Fond dessinable 00031 00032 00033 extern bool charblocks[2][70]; 00034 extern u16 tilesetsize[2][4]; // Place utilisée pour chaque tileset 00035 extern u16 mapsize[2][4]; // Place utilisée pour chaque map 00036 extern u8 tilesetchar[2][4]; // Emplacement mémoire de chaque tileset 00037 extern u8 mapchar[2][4]; // Emplacement mémoire de chaque map 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; // Passe à 1 si scrolling infini activé... 00053 u16* bg_map; // Map 00054 // s32 x, y; 00055 s32 lx, ly; 00056 s32 scrollx, scrolly; 00057 s32 maxx; // 32 ou 64, en fonction de la largeur... 00058 // s32 startx, starty; 00059 }scrollpositions; 00060 00061 extern scrollpositions scrollpos[2][4]; // Pour chaque écran et pour chaque fond :) 00062 00063 00064 00065 00066 00067 00068 // Mode de couleur 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 //scrolling registers for background 0 00081 00082 00083 // Registre pour les controles de chaque écran 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 // Premier registre pour les scroll. On en déduit les autres en ajoutant pour le screen et le numéro du Bg 00092 #define REG_BGSCROLLX 0x4000010 00093 #define REG_BGSCROLLY 0x4000012 00094 00095 00096 // Tailles pour les Bg : 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 //ALL_BUT() pour faire tout sauf... 00111 #define TILE_N 1023 00112 #define TILE_PAL 61440 00113 #define TILE_HFLIP 1024 00114 #define TILE_VFLIP 2048 00115 00116 00117 00129 void PA_ResetBgSys(void); 00130 00153 void PA_InitBg(bool screen, u8 bg_select, u8 bg_size, bool wraparound, bool color_mode); 00154 //#define PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode) { PA_bgmap[screen][bg_select] = ScreenBaseBlock(screen, ((bg_select + 1) << 3) - bg_place[bg_size]);_REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select)); _REG16(REG_BGCNT(screen, bg_select)) = ((bg_select) | (bg_size << 14) |((((bg_select + 1) << 3) - bg_place[bg_size]) << SCREEN_SHIFT) | (wraparound << 13) | ((bg_select) << 2)) + (color_mode << 7);} 00155 00156 00169 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select)) 00170 00171 00184 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select)) 00185 00186 00196 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00) 00197 00198 00199 00215 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles)) 00216 //#define PA_LoadBgTiles(screen, bg_select, bg_tiles) {DMA_Copy((void*)(bg_tiles), (void*)CharBaseBlock(screen, bg_select),SIZEOF_16BIT(bg_tiles), DMA_16NOW);} 00217 00218 00238 void PA_LoadBgTilesEx(bool screen, u8 bg_select, void* bg_tiles, u16 size); 00239 00240 00253 void PA_DeleteTiles(bool screen, u8 bg_select); 00254 00255 00268 void PA_DeleteMap(bool screen, u8 bg_select); 00269 00270 00271 00284 extern inline void PA_DeleteBg(bool screen, u8 bg_select) { 00285 PA_HideBg(screen, bg_select); 00286 PA_DeleteTiles(screen, bg_select); 00287 PA_DeleteMap(screen, bg_select); 00288 } 00289 00309 void PA_LoadBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size); 00310 00311 00312 00341 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\ 00342 PA_DeleteBg(screen, bg_select);\ 00343 PA_LoadBgTiles(screen, bg_select, bg_tiles); \ 00344 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \ 00345 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\ 00346 PA_BGScrollXY(screen, bg_select, 0, 0);} 00347 00372 #define PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound) {\ 00373 PA_DeleteBg(screen, bg_select);\ 00374 PA_LoadBgTiles(screen, bg_select, bg_tiles); \ 00375 PA_LoadRotBgMap(screen, bg_select, (void*)bg_map, bg_size); \ 00376 PA_InitBg(screen, bg_select, bg_size, wraparound, 1);\ 00377 PA_SetBgRot(screen, bg_select, 0, 0, 0, 0, 0, 256);\ 00378 } 00379 00380 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); 00381 00413 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\ 00414 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \ 00415 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \ 00416 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\ 00417 PA_BGScrollXY(screen, bg_select, 0, 0);} 00418 00419 00420 00436 #define PA_BGScrollX(screen, bg_number, x) _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023 00437 00450 #define PA_GetBGScrollX(screen, bg_number) ((_REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2))) &1023) 00451 00467 #define PA_BGScrollY(screen, bg_number, y) _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023 00468 00469 00470 00471 00484 #define PA_GetBGScrollY(screen, bg_number) ((_REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2))) &1023) 00485 00504 #define PA_BGScrollXY(screen, bg_number, x, y) {PA_BGScrollX(screen, bg_number, x); PA_BGScrollY(screen, bg_number, y);} 00505 00506 00507 00508 00530 /* 00531 extern inline void PA_SetMapTile(bool screen, u8 bg_select, u16 x, u16 y, u16 tile_number) { 00532 u16 *PA_reg; 00533 PA_reg = (u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)); 00534 00535 *PA_reg &= ALL_BUT(TILE_N); 00536 *PA_reg |= ((tile_number)&TILE_N); 00537 }*/ 00538 #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);} 00539 00540 00562 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) = tile_info 00563 00564 00565 00566 00588 extern inline void PA_SetLargeMapTile(bool screen, u8 bg_select, s32 x, s32 y, u32 tile_info) { 00589 u32 truex; 00590 u32 mapblock = 0; 00591 truex = x&31; 00592 mapblock = (x >> 5) << 11; // Permet d'avoir le bon block... 00593 00594 *(u16*)(PA_bgmap[screen][bg_select] + ((truex) << 1) + ((y) << 6) + mapblock) = tile_info; 00595 } 00596 00597 00598 00620 #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);} 00621 00622 00644 #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);} 00645 00646 00668 #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);} 00669 00670 00701 #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) 00702 00703 00704 00717 #define PA_LoadTiledBitmap(screen, tiled_bitmap) PA_LoadBg(screen, 0, tiled_bitmap, SCREEN_TILES, bitmap, BG_256X256, 1, 1) 00718 00719 00720 00721 00722 00723 00724 00725 00753 #define PA_LoadLargeBg(screen, bg_select, bg_tiles, bg_map, color_mode, lx, ly) {\ 00754 PA_LoadSimpleBg(screen, bg_select, bg_tiles, Blank, BG_512X256, 1, color_mode);\ 00755 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);} 00756 00757 00758 00759 00790 #define PA_LoadLargeBgEx(screen, bg_select, bg_tiles, tile_size, bg_map, color_mode, lx, ly) {\ 00791 PA_LoadBg(screen, bg_select, bg_tiles, tile_size, Blank, BG_512X256, 1, color_mode);\ 00792 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);} 00793 00794 00795 00796 00812 void PA_InfLargeScrollX(bool screen, u8 bg_select, s32 x); 00813 00814 00830 void PA_InfLargeScrollY(bool screen, u8 bg_select, s32 y); 00831 00832 00833 00852 extern inline void PA_InfLargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){ 00853 PA_InfLargeScrollX(screen, bg_select, x); 00854 PA_InfLargeScrollY(screen, bg_select, y); 00855 } 00856 00872 void PA_LargeScrollX(bool screen, u8 bg_select, s32 x); 00873 00874 00890 void PA_LargeScrollY(bool screen, u8 bg_select, s32 y); 00891 00892 00893 00912 extern inline void PA_LargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){ 00913 PA_LargeScrollX(screen, bg_select, x); 00914 PA_LargeScrollY(screen, bg_select, y); 00915 } 00916 00917 00918 00940 extern inline void PA_InitParallaxX(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) { 00941 PA_parallaxX[screen][0] = bg0; 00942 PA_parallaxX[screen][1] = bg1; 00943 PA_parallaxX[screen][2] = bg2; 00944 PA_parallaxX[screen][3] = bg3; 00945 } 00946 00968 extern inline void PA_InitParallaxY(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) { 00969 PA_parallaxY[screen][0] = bg0; 00970 PA_parallaxY[screen][1] = bg1; 00971 PA_parallaxY[screen][2] = bg2; 00972 PA_parallaxY[screen][3] = bg3; 00973 } 00974 00975 00976 00989 extern inline void PA_ParallaxScrollX(bool screen, s32 x){ 00990 u8 i; 00991 for(i = 0; i < 4; i++) { 00992 if (PA_parallaxX[screen][i]) { 00993 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8); // Si bg en scrolling infini 00994 else PA_BGScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8); // Sinon scrolling normal 00995 } 00996 } 00997 } 00998 00999 01012 extern inline void PA_ParallaxScrollY(bool screen, s32 y){ 01013 u8 i; 01014 for(i = 0; i < 4; i++) { 01015 if (PA_parallaxY[screen][i]) { 01016 if(scrollpos[screen][i].infscroll) PA_InfLargeScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8); // Si bg en scrolling infini 01017 else PA_BGScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8); // Sinon scrolling normal 01018 } 01019 } 01020 } 01021 01022 01038 extern inline void PA_ParallaxScrollXY(bool screen, s32 x, s32 y){ 01039 PA_ParallaxScrollX(screen, x); 01040 PA_ParallaxScrollY(screen, y); 01041 } 01042 01043 01044 01060 extern inline void PA_SetBgPrio(bool screen, u8 bg, u8 prio) { 01061 _REG16(REG_BGCNT(screen, bg)) &= ~3; 01062 _REG16(REG_BGCNT(screen, bg)) |= prio; 01063 } 01064 01065 01066 // end of Backgrounds 01068 01069 01070 01071 // Pas utilisé en direct par le programmaeur 01072 void PA_InitLargeBg(bool screen, u8 bg_select, s32 lx, s32 ly, void* bg_map); 01073 01074 01075 01076 #endif 01077