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.33; author jandujar; state Exp; branches 1.1.1.1; next ; 1.1.1.1 date 2005.11.02.08.30.33; author jandujar; state Exp; branches ; next ; desc @@ 1.1 log @Initial revision @ text @ PA_lib: Fichier source de PA_Tile.h

PA_Tile.h

Aller à la documentation de ce fichier.
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 

Généré le Fri Oct 28 23:18:13 2005 pour PA_lib par  doxygen 1.3.9.1
@ 1.1.1.1 log @Initial import of PalibDoc, begin on PAlib0.64b @ text @@