PA_Tile.h

Aller à la documentation de ce fichier.
00001 #ifndef _PA_Tile
00002 #define _PA_Tile
00003 
00004 // Extracts the size from PAGfx convertions
00005 extern inline u8 PA_GetPAGfxBgSize(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 
00013 // Extracts the size from PAGfx convertions
00014 extern inline u8 PA_GetPAGfxRotBgSize(u16 width)
00015 {
00016        u8 bg_size = 1; //256x256 by default
00017        if (width <= 128)    bg_size = 0;  
00018        else if (width <= 256)      bg_size = 1;  
00019        else if (width <= 512)      bg_size = 2;         
00020        else if (width <= 1024) bg_size = 3;             
00021        
00022        return bg_size;
00023 }
00024 
00031 //#include "../PA.h"
00032 
00033 
00034 
00036 // Système de Tiles
00038 
00039 
00040 //background memory offset macros
00041 #define CharBaseBlock(screen, n) (((n)*0x4000) + 0x6000000 + (0x200000 *  screen))
00042 #define ScreenBaseBlock(screen, n) (((n)*0x800) + 0x6000000 + (0x200000 *  screen))
00043 extern u32 PA_bgmap[2][4]; // Pointeur vers les maps, 4 maps par screen
00044 extern u8 tilesetchar[2][4];
00045 
00046 // Quantité de données à charger en fonction de la taille de la map...
00047 extern u16 bg_sizes[4];
00048 extern u8 bg_place[4];
00049 
00050 extern u16 *PA_DrawBg[2]; // Fond dessinable
00051 
00052 
00053 extern bool charblocks[2][70];
00054 extern u16 tilesetsize[2][4]; // Place utilisée pour chaque tileset
00055 extern u16 mapsize[2][4]; // Place utilisée pour chaque map
00056 extern u8 tilesetchar[2][4];  // Emplacement mémoire de chaque tileset
00057 extern u8 mapchar[2][4];  // Emplacement mémoire de chaque map
00058 
00059 extern u8 charsetstart[2];
00060 
00061 
00062 
00063 
00064 
00065 extern s32 PA_parallaxX[2][4];
00066 extern s32 PA_parallaxY[2][4];
00067 
00068 
00069 
00070 
00071 typedef struct {
00072        bool infscroll; // Passe à 1 si scrolling infini activé...
00073        u16* bg_map; // Map
00074 //     s32 x, y;
00075        s32 lx, ly;
00076        s32 scrollx, scrolly;
00077        s32 maxx; // 32 ou 64, en fonction de la largeur...
00078 //     s32 startx, starty;
00079 }scrollpositions;
00080 
00081 extern scrollpositions scrollpos[2][4]; // Pour chaque écran et pour chaque fond :)
00082 
00083 
00084 
00085 
00086 
00087 
00088 // Mode de couleur
00089 #define BG_COLOR16 0x00
00090 #define BG_COLOR256 0x80
00091 
00092 
00093 #define CHAR_SHIFT 2
00094 #define SCREEN_SHIFT 8
00095 #define WRAPAROUND 0x1
00096 
00097 #define SCREEN_TILES 24576  // Taille à convertir pour avoir un écran complet...
00098 
00099 
00100 //scrolling registers for background 0
00101 
00102 
00103 // Registre pour les controles de chaque écran
00104 
00105 #define REG_BGSCREEN0  0x04000000
00106 #define REG_BGSCREEN1  0x04001000
00107 #define REG_BGSCREEN(screen) (0x04000000 + (screen * 0x1000))
00108 
00109 #define REG_BGCNT(screen, bg_number) (0x4000008 + (screen * 0x1000) + (bg_number << 1))
00110 
00111 // Premier registre pour les scroll. On en déduit les autres en ajoutant pour le screen et le numéro du Bg
00112 #define REG_BGSCROLLX 0x4000010
00113 #define REG_BGSCROLLY 0x4000012
00114 
00115 
00116 // Tailles pour les Bg :
00117 #define BG_256X256 0
00118 #define BG_512X256 1
00119 #define BG_256X512 2
00120 #define BG_512X512 3
00121 
00122 #define BG_ROT_128X128 0
00123 #define BG_ROT_256X256 1
00124 #define BG_ROT_512X512 2
00125 #define BG_ROT_1024X1024 3
00126 
00127 void PA_LoadRotBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00128 
00129 
00130 //ALL_BUT() pour faire tout sauf...
00131 #define TILE_N 1023
00132 #define TILE_PAL 61440
00133 #define TILE_HFLIP 1024
00134 #define TILE_VFLIP 2048
00135 
00136 #define PA_BGXX(screen, bg) _REG32(0x4000008 + (0x1000 * screen) + (bg << 4))
00137 #define PA_BGXY(screen, bg) _REG32(0x400000C + (0x1000 * screen) + (bg << 4))
00138 #define PA_BGXPA(screen, bg) _REG16(0x4000000 + (0x1000 * screen) + (bg << 4))
00139 #define PA_BGXPB(screen, bg) _REG16(0x4000002 + (0x1000 * screen) + (bg << 4))
00140 #define PA_BGXPC(screen, bg) _REG16(0x4000004 + (0x1000 * screen) + (bg << 4))
00141 #define PA_BGXPD(screen, bg) _REG16(0x4000006 + (0x1000 * screen) + (bg << 4))
00142 
00143 
00144 
00145 
00146 
00158 void PA_ResetBgSys(void);
00159 
00182 void PA_InitBg(bool screen, u8 bg_select, u8 bg_size, bool wraparound, bool color_mode);
00183 //#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);}
00184 
00185 
00198 #define PA_HideBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) &= ~(0x100 << (bg_select))
00199 
00200 
00213 #define PA_ShowBg(screen, bg_select) _REG16(REG_BGSCREEN(screen)) |= (0x100 << (bg_select))
00214 
00215 
00225 #define PA_ResetBg(screen) _REG16(REG_BGSCREEN(screen)) &= ~(0xF00)
00226 
00227 
00228 
00244 #define PA_LoadBgTiles(screen, bg_select, bg_tiles) PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, SIZEOF_16BIT(bg_tiles))
00245 //#define PA_LoadBgTiles(screen, bg_select, bg_tiles) {DMA_Copy((void*)(bg_tiles), (void*)CharBaseBlock(screen, bg_select),SIZEOF_16BIT(bg_tiles), DMA_16NOW);}
00246 
00247 
00267 void PA_LoadBgTilesEx(bool screen, u8 bg_select, void* bg_tiles, u16 size);
00268 
00269 
00282 void PA_DeleteTiles(bool screen, u8 bg_select);
00283 
00284 
00297 void PA_DeleteMap(bool screen, u8 bg_select);
00298 
00299 
00300 
00313 extern inline void PA_DeleteBg(bool screen, u8 bg_select) {
00314        PA_HideBg(screen, bg_select);
00315        PA_DeleteTiles(screen, bg_select);
00316        PA_DeleteMap(screen, bg_select);
00317 }
00318 
00338 void PA_LoadBgMap(bool screen, u8 bg_select, void* bg_map, u8 bg_size);
00339 
00340 
00341 
00342 
00343 
00360 #define PA_LoadTiledBg(screen, bg_number, bg_name){\
00361        PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00362        PA_LoadSimpleBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, PA_GetPAGfxBgSize(bg_name##_Width, bg_name##_Height), 0, 1);}
00363 
00364 
00365 
00366 
00395 #define PA_LoadSimpleBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound, color_mode) {\
00396 PA_DeleteBg(screen, bg_select);\
00397 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00398 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00399 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00400 PA_BGScrollXY(screen, bg_select, 0, 0);}
00401 
00426 #define PA_LoadRotBg(screen, bg_select, bg_tiles, bg_map, bg_size, wraparound) {\
00427 PA_DeleteBg(screen, bg_select);\
00428 PA_LoadBgTiles(screen, bg_select, bg_tiles); \
00429 PA_LoadRotBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00430 PA_InitBg(screen, bg_select, bg_size, wraparound, 1);\
00431 PA_SetBgRot(screen, bg_select, 0, 0, 0, 0, 0, 256);\
00432 }
00433 
00434 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);
00435 
00467 #define PA_LoadBg(screen, bg_select, bg_tiles, tile_size, bg_map, bg_size, wraparound, color_mode) {\
00468 PA_LoadBgTilesEx(screen, bg_select, (void*)bg_tiles, tile_size); \
00469 PA_LoadBgMap(screen, bg_select, (void*)bg_map, bg_size); \
00470 PA_InitBg(screen, bg_select, bg_size, wraparound, color_mode);\
00471 PA_BGScrollXY(screen, bg_select, 0, 0);}
00472 
00473 
00474 
00490 #define PA_BGScrollX(screen, bg_number, x) _REG16(REG_BGSCROLLX + ((screen) * 0x1000) + ((bg_number) << 2)) = (x)&1023
00491 
00507 #define PA_BGScrollY(screen, bg_number, y) _REG16(REG_BGSCROLLY + ((screen) * 0x1000) + ((bg_number) << 2)) = (y)&1023
00508 
00509 
00510 
00511 
00530 #define PA_BGScrollXY(screen, bg_number, x, y) {PA_BGScrollX(screen, bg_number, x); PA_BGScrollY(screen, bg_number, y);}
00531 
00532 
00533 
00534 
00556 /*
00557 extern inline void PA_SetMapTile(bool screen, u8 bg_select, u16 x, u16 y, u16 tile_number) {
00558 u16 *PA_reg;
00559 PA_reg = (u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6));
00560 
00561        *PA_reg &= ALL_BUT(TILE_N);
00562        *PA_reg |= ((tile_number)&TILE_N);
00563 }*/
00564 #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);}
00565 
00566 
00588 #define PA_SetMapTileAll(screen, bg_select, x, y, tile_info) *(u16*)(PA_bgmap[screen][bg_select] + ((x) << 1) + ((y) << 6)) = tile_info
00589 
00590 
00591 
00592 
00614 extern inline void PA_SetLargeMapTile(bool screen, u8 bg_select, s32 x, s32 y, u32 tile_info) {
00615        u32 truex;
00616        u32 mapblock = 0;
00617        truex = x&31;
00618        mapblock = (x >> 5) << 11; // Permet d'avoir le bon block...
00619        
00620        *(u16*)(PA_bgmap[screen][bg_select] + ((truex) << 1) + ((y) << 6) + mapblock) = tile_info;
00621 }
00622 
00623 
00624 
00646 #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);}
00647 
00648 
00670 #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);}
00671 
00672 
00694 #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);}
00695 
00696 
00727 #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)
00728 
00729 
00730 
00743 #define PA_LoadTiledBitmap(screen, tiled_bitmap) PA_LoadBg(screen, 0, tiled_bitmap, SCREEN_TILES, bitmap, BG_256X256, 1, 1)
00744 
00745 
00746 
00765 #define PA_LoadPAGfxRotBg(screen, bg_select, bg_name, wraparound) {\
00766 PA_LoadBgPal(screen, bg_select, (void*)bg_name##_Pal); \
00767 PA_LoadRotBg(screen, bg_select, bg_name##_Tiles, bg_name##_Map, PA_GetPAGfxRotBgSize(bg_name##_Width), wraparound);\
00768 }
00769 
00770 
00771 
00772 
00773 
00801 #define PA_LoadLargeBg(screen, bg_select, bg_tiles, bg_map, color_mode, lx, ly) {\
00802 PA_LoadSimpleBg(screen, bg_select, bg_tiles, Blank, BG_512X256, 1, color_mode);\
00803 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00804 
00805 
00806 
00807 
00823 #define PA_LoadPAGfxLargeBg(screen, bg_number, bg_name){\
00824        PA_LoadBgPal(screen, bg_number, (void*)bg_name##_Pal); \
00825        PA_LoadLargeBg(screen, bg_number, bg_name##_Tiles, bg_name##_Map, 1, (bg_name##_Width) >> 3, (bg_name##_Height) >> 3);}
00826 
00827 
00828 
00859 #define PA_LoadLargeBgEx(screen, bg_select, bg_tiles, tile_size, bg_map, color_mode, lx, ly) {\
00860 PA_LoadBg(screen, bg_select, bg_tiles, tile_size, Blank, BG_512X256, 1, color_mode);\
00861 PA_InitLargeBg(screen, bg_select, lx, ly, (void*)bg_map);}
00862 
00863 
00864 
00865 
00881 void PA_InfLargeScrollX(bool screen, u8 bg_select, s32 x);
00882 
00883 
00899 void PA_InfLargeScrollY(bool screen, u8 bg_select, s32 y);
00900 
00901 
00902 
00921 extern inline void PA_InfLargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00922        PA_InfLargeScrollX(screen, bg_select, x);
00923        PA_InfLargeScrollY(screen, bg_select, y);
00924 }
00925 
00941 void PA_LargeScrollX(bool screen, u8 bg_select, s32 x);
00942 
00943 
00959 void PA_LargeScrollY(bool screen, u8 bg_select, s32 y);
00960 
00961 
00962 
00981 extern inline void PA_LargeScrollXY(bool screen, u8 bg_select, s32 x, s32 y){
00982        PA_LargeScrollX(screen, bg_select, x);
00983        PA_LargeScrollY(screen, bg_select, y);
00984 }
00985 
00986 
00987 
01009 extern inline void PA_InitParallaxX(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
01010         PA_parallaxX[screen][0] = bg0;
01011         PA_parallaxX[screen][1] = bg1;
01012         PA_parallaxX[screen][2] = bg2;
01013         PA_parallaxX[screen][3] = bg3;
01014 }
01015 
01037 extern inline void PA_InitParallaxY(bool screen, s32 bg0, s32 bg1, s32 bg2, s32 bg3) {
01038         PA_parallaxY[screen][0] = bg0;
01039         PA_parallaxY[screen][1] = bg1;
01040         PA_parallaxY[screen][2] = bg2;
01041         PA_parallaxY[screen][3] = bg3;
01042 }
01043 
01044 
01045 
01058 extern inline void PA_ParallaxScrollX(bool screen, s32 x){
01059 u8 i;
01060        for(i = 0; i < 4; i++) {
01061               if (PA_parallaxX[screen][i])  {
01062                      if(scrollpos[screen][i].infscroll) PA_InfLargeScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8); // Si bg en scrolling infini
01063                      else PA_BGScrollX(screen, i, (PA_parallaxX[screen][i] * x) >> 8); // Sinon scrolling normal
01064               }
01065        }
01066 }
01067 
01068 
01081 extern inline void PA_ParallaxScrollY(bool screen, s32 y){
01082 u8 i;
01083        for(i = 0; i < 4; i++) {
01084               if (PA_parallaxY[screen][i])  {
01085                      if(scrollpos[screen][i].infscroll) PA_InfLargeScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8); // Si bg en scrolling infini
01086                      else PA_BGScrollY(screen, i, (PA_parallaxY[screen][i] * y) >> 8); // Sinon scrolling normal
01087               }
01088        }
01089 }
01090 
01091 
01107 extern inline void PA_ParallaxScrollXY(bool screen, s32 x, s32 y){
01108        PA_ParallaxScrollX(screen, x);
01109        PA_ParallaxScrollY(screen, y);
01110 }
01111 
01112 
01113 
01129 extern inline void PA_SetBgPrio(bool screen, u8 bg, u8 prio) {
01130        _REG16(REG_BGCNT(screen, bg)) &= ~3;
01131        _REG16(REG_BGCNT(screen, bg)) |= prio;
01132 }
01133 
01134 
01135  // end of Backgrounds
01137 
01138 
01139 
01140 // Pas utilisé en direct par le programmaeur
01141 void PA_InitLargeBg(bool screen, u8 bg_select, s32 lx, s32 ly, void* bg_map);
01142 
01143 
01144 
01145 #endif
01146 

Généré le Wed Dec 14 14:15:00 2005 pour PAlib par  doxygen 1.3.9.1