00001 #ifndef _PA_16C
00002 #define _PA_16C
00003
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007
00014 #include "PA9.h"
00015
00016 #include "PA_Palette.h"
00017
00018
00019
00020 extern u16 *PA_Draw16[2];
00021 extern u32 *PA_Draw1632[2];
00022
00023 extern u32 Blank[130000>>2];
00024
00025 typedef struct{
00026 s32 NLetters;
00027 struct{
00028 s16 X, X2, Y;
00029 }Letter[2048];
00030 } LetterPos16c;
00031 extern LetterPos16c PA_16cLetterPos;
00032
00033
00034
00035 #define PA_LoadPal16c(palette, source) DMA_Copy(source, (void*)palette, 16, DMA_16NOW);
00036 #define PA_16cPos(x, y) (((x>>3)*26*8) + y + 8)
00037 ALWAYSINLINE void PA_16c8X8(u8 screen, s16 x, s16 y, u32 *image);
00038
00039 extern u32 *c16_tiles[10];
00040 extern u16 *c16_maps[10];
00041 extern u8 *pa16cdefaultsize[10];
00042 extern u8 c16policeheight[10];
00043
00044 ALWAYSINLINE void PA_16c8X8Color(u8 screen, s16 x, s16 y, u32 *image, u8 color){
00045 x += 8; y += 8;
00046 u16 temp = (x&7)<<2;
00047 u16 pos = PA_16cPos(x, y);
00048 PA_Draw1632[screen][pos] |= (image[0]<<temp)*color;
00049 PA_Draw1632[screen][pos+1] |= (image[1]<<temp)*color;
00050 PA_Draw1632[screen][pos+2] |= (image[2]<<temp)*color;
00051 PA_Draw1632[screen][pos+3] |= (image[3]<<temp)*color;
00052 PA_Draw1632[screen][pos+4] |= (image[4]<<temp)*color;
00053 PA_Draw1632[screen][pos+5] |= (image[5]<<temp)*color;
00054 PA_Draw1632[screen][pos+6] |= (image[6]<<temp)*color;
00055 PA_Draw1632[screen][pos+7] |= (image[7]<<temp)*color;
00056 pos += (26*8);
00057 temp = 32-temp;
00058 PA_Draw1632[screen][pos] |= (image[0]>>temp)*color;
00059 PA_Draw1632[screen][pos+1] |= (image[1]>>temp)*color;
00060 PA_Draw1632[screen][pos+2] |= (image[2]>>temp)*color;
00061 PA_Draw1632[screen][pos+3] |= (image[3]>>temp)*color;
00062 PA_Draw1632[screen][pos+4] |= (image[4]>>temp)*color;
00063 PA_Draw1632[screen][pos+5] |= (image[5]>>temp)*color;
00064 PA_Draw1632[screen][pos+6] |= (image[6]>>temp)*color;
00065 PA_Draw1632[screen][pos+7] |= (image[7]>>temp)*color;
00066 }
00067
00068
00069
00070 ALWAYSINLINE void PA_Plot8Pixels(u8 screen, u16 pos, u16 temp, u32 color){
00071 PA_Draw1632[screen][pos] |= (color<<temp);
00072 PA_Draw1632[screen][pos+(26*8)] |= (color>>(32-temp));
00073 }
00074
00075 ALWAYSINLINE void PA_16c16X16Letter(u8 screen, s16 x, s16 y, u8 letter, u8 size, u8 color)
00076 {
00077 u16 firstpos = ((letter&31)<<1)+((letter >> 5)<<7);
00078 PA_16c8X8Color(screen, x, y, (c16_tiles[size]+(c16_maps[size][firstpos]<<3)), color);
00079 PA_16c8X8Color(screen, x, y+8, (c16_tiles[size]+(c16_maps[size][firstpos+64]<<3)), color);
00080 firstpos ++;
00081 PA_16c8X8Color(screen, x+8, y, (c16_tiles[size]+(c16_maps[size][firstpos]<<3)), color);
00082 PA_16c8X8Color(screen, x+8, y+8, (c16_tiles[size]+(c16_maps[size][firstpos+64]<<3)), color);
00083 }
00084
00085 extern inline void PA_16c8X8Letter(u8 screen, s16 x, s16 y, u8 letter, u8 size, u8 color){
00086 PA_16c8X8Color(screen, x, y, (c16_tiles[size]+(c16_maps[size][letter]<<3)), color);
00087 }
00088
00089
00108 void PA_Init16cBgEx(u8 screen, u8 bg, u8 npalette);
00109
00110
00111
00123 extern inline void PA_Init16cBg(u8 screen, u8 bg){
00124 PA_Init16cBgEx(screen, bg, 0);
00125 }
00126
00127
00128
00129
00130
00139 extern inline void PA_16cErase(u8 screen){
00140 DMA_Copy(Blank, PA_Draw1632[screen], 26*8*34, DMA_32NOW)
00141 }
00142
00143
00144
00150 extern inline void PA_Dual16cErase(void){
00151 PA_16cErase(0); PA_16cErase(1);
00152 }
00153
00154
00166 extern inline void PA_InitComplete16c(u8 bg, void *Palette){
00167 PA_LoadPal16c(PAL_BG0, Palette);
00168 PA_LoadPal16c(PAL_BG1, Palette);
00169 PA_Init16cBg(0, bg); PA_Init16cBg(1, bg);
00170 }
00171
00172
00173
00174
00207 s16 PA_16cText(u8 screen, s16 basex, s16 basey, s16 maxx, s16 maxy, char* text, u8 color, u8 size, s32 limit);
00208
00209
00221 #define PA_16cCustomFont(c16_slot, c16_font){\
00222 c16_maps[c16_slot] = (u16*)(void*)c16_font##_Map; \
00223 c16_tiles[c16_slot] = (u32*)(void*)c16_font##_Tiles; \
00224 pa16cdefaultsize[c16_slot] = (u8*)c16_font##_Sizes; \
00225 c16policeheight[c16_slot] = c16_font##_Height;\
00226 }
00227
00228
00246 ALWAYSINLINE void PA_16cPutPixel(u8 screen, s16 x, s16 y, u32 color){
00247 x += 8; y += 8;
00248 u16 temp = (x&7)<<2;
00249 u16 pos = PA_16cPos(x, y);
00250 PA_Draw1632[screen][pos] |= (color<<temp);
00251 }
00252
00253
00271 ALWAYSINLINE void PA_16c8X4(u8 screen, s16 x, s16 y, u32 *image){
00272 x += 8; y += 8;
00273 u16 temp = (x&7)<<2;
00274 u16 pos = PA_16cPos(x, y);
00275 PA_Draw1632[screen][pos] |= (image[0]<<temp);
00276 PA_Draw1632[screen][pos+1] |= (image[1]<<temp);
00277 PA_Draw1632[screen][pos+2] |= (image[2]<<temp);
00278 PA_Draw1632[screen][pos+3] |= (image[3]<<temp);
00279 pos += (26*8);
00280 temp = 32-temp;
00281 PA_Draw1632[screen][pos] |= (image[0]>>temp);
00282 PA_Draw1632[screen][pos+1] |= (image[1]>>temp);
00283 PA_Draw1632[screen][pos+2] |= (image[2]>>temp);
00284 PA_Draw1632[screen][pos+3] |= (image[3]>>temp);
00285 }
00286
00287
00305 ALWAYSINLINE void PA_16c8X6(u8 screen, s16 x, s16 y, u32 *image){
00306
00307 x += 8; y += 8;
00308 u16 temp = (x&7)<<2;
00309 u16 pos = PA_16cPos(x, y);
00310 PA_Plot8Pixels(screen, pos, temp, image[0]);
00311 PA_Plot8Pixels(screen, pos+1, temp, image[1]);
00312 PA_Plot8Pixels(screen, pos+2, temp, image[2]);
00313 PA_Plot8Pixels(screen, pos+3, temp, image[3]);
00314 PA_Plot8Pixels(screen, pos+4, temp, image[4]);
00315 PA_Plot8Pixels(screen, pos+5, temp, image[5]);
00316 }
00317
00318
00336 ALWAYSINLINE void PA_16c8X8(u8 screen, s16 x, s16 y, u32 *image){
00337 x += 8; y += 8;
00338 u16 temp = (x&7)<<2;
00339 u16 pos = PA_16cPos(x, y);
00340 PA_Draw1632[screen][pos] |= (image[0]<<temp);
00341 PA_Draw1632[screen][pos+1] |= (image[1]<<temp);
00342 PA_Draw1632[screen][pos+2] |= (image[2]<<temp);
00343 PA_Draw1632[screen][pos+3] |= (image[3]<<temp);
00344 PA_Draw1632[screen][pos+4] |= (image[4]<<temp);
00345 PA_Draw1632[screen][pos+5] |= (image[5]<<temp);
00346 PA_Draw1632[screen][pos+6] |= (image[6]<<temp);
00347 PA_Draw1632[screen][pos+7] |= (image[7]<<temp);
00348 pos += (26*8);
00349 temp = 32-temp;
00350 PA_Draw1632[screen][pos] |= (image[0]>>temp);
00351 PA_Draw1632[screen][pos+1] |= (image[1]>>temp);
00352 PA_Draw1632[screen][pos+2] |= (image[2]>>temp);
00353 PA_Draw1632[screen][pos+3] |= (image[3]>>temp);
00354 PA_Draw1632[screen][pos+4] |= (image[4]>>temp);
00355 PA_Draw1632[screen][pos+5] |= (image[5]>>temp);
00356 PA_Draw1632[screen][pos+6] |= (image[6]>>temp);
00357 PA_Draw1632[screen][pos+7] |= (image[7]>>temp);
00358 }
00359
00360
00361
00362 ALWAYSINLINE void PA_16c16X8(u8 screen, s16 x, s16 y, u32 *image){
00363 x += 8; y += 8;
00364 u16 temp = (x&7)<<2;
00365 u16 pos = PA_16cPos(x, y);
00366 u8 i;
00367 for (i = 0; i < 2; i++){
00368 PA_Plot8Pixels(screen, pos, temp, image[0]);
00369 PA_Plot8Pixels(screen, pos+1, temp, image[1]);
00370 PA_Plot8Pixels(screen, pos+2, temp, image[2]);
00371 PA_Plot8Pixels(screen, pos+3, temp, image[3]);
00372 PA_Plot8Pixels(screen, pos+4, temp, image[4]);
00373 PA_Plot8Pixels(screen, pos+5, temp, image[5]);
00374 PA_Plot8Pixels(screen, pos+6, temp, image[6]);
00375 PA_Plot8Pixels(screen, pos+7, temp, image[7]);
00376 pos+=26*8;
00377 image+=8;
00378 }
00379 }
00380
00381
00382
00383 ALWAYSINLINE void PA_16c16X12(u8 screen, s16 x, s16 y, u32 *image){
00384
00385 x += 8; y += 8;
00386 u16 temp = (x&7)<<2;
00387 u16 pos = PA_16cPos(x, y);
00388 u8 i;
00389 for (i = 0; i < 2; i++){
00390 PA_Plot8Pixels(screen, pos, temp, image[0]);
00391 PA_Plot8Pixels(screen, pos+1, temp, image[1]);
00392 PA_Plot8Pixels(screen, pos+2, temp, image[2]);
00393 PA_Plot8Pixels(screen, pos+3, temp, image[3]);
00394 PA_Plot8Pixels(screen, pos+4, temp, image[4]);
00395 PA_Plot8Pixels(screen, pos+5, temp, image[5]);
00396 PA_Plot8Pixels(screen, pos+6, temp, image[6]);
00397 PA_Plot8Pixels(screen, pos+7, temp, image[7]);
00398 PA_Plot8Pixels(screen, pos+8, temp, image[16]);
00399 PA_Plot8Pixels(screen, pos+9, temp, image[17]);
00400 PA_Plot8Pixels(screen, pos+10, temp, image[18]);
00401 PA_Plot8Pixels(screen, pos+11, temp, image[19]);
00402 pos+=26*8;
00403 image+=8;
00404 }
00405 }
00406
00407 ALWAYSINLINE void PA_16c16X16(u8 screen, s16 x, s16 y, u32 *image){
00408
00409 x += 8; y += 8;
00410
00411 u16 temp = (x&7)<<2;
00412 u16 pos = PA_16cPos(x, y);
00413 u8 i;
00414 for (i = 0; i < 2; i++){
00415 PA_Plot8Pixels(screen, pos, temp, image[0]);
00416 PA_Plot8Pixels(screen, pos+1, temp, image[1]);
00417 PA_Plot8Pixels(screen, pos+2, temp, image[2]);
00418 PA_Plot8Pixels(screen, pos+3, temp, image[3]);
00419 PA_Plot8Pixels(screen, pos+4, temp, image[4]);
00420 PA_Plot8Pixels(screen, pos+5, temp, image[5]);
00421 PA_Plot8Pixels(screen, pos+6, temp, image[6]);
00422 PA_Plot8Pixels(screen, pos+7, temp, image[7]);
00423 PA_Plot8Pixels(screen, pos+8, temp, image[16]);
00424 PA_Plot8Pixels(screen, pos+9, temp, image[17]);
00425 PA_Plot8Pixels(screen, pos+10, temp, image[18]);
00426 PA_Plot8Pixels(screen, pos+11, temp, image[19]);
00427 PA_Plot8Pixels(screen, pos+12, temp, image[20]);
00428 PA_Plot8Pixels(screen, pos+13, temp, image[21]);
00429 PA_Plot8Pixels(screen, pos+14, temp, image[22]);
00430 PA_Plot8Pixels(screen, pos+15, temp, image[23]);
00431 pos+=26*8;
00432 image+=8;
00433 }
00434 }
00435
00436
00457 ALWAYSINLINE void PA_16c8Xi(u8 screen, s16 x, s16 y, u32 *image, u8 i)
00458 {
00459 x += 8; y += 8;
00460 u16 temp = ((x)&7)<<2;
00461 u16 temp2 = 32-temp;
00462 u16 pos = PA_16cPos(x, y);
00463 u16 pos2 = pos + 208;
00464 u8 j=0;
00465 while (j<i)
00466 {
00467 PA_Draw1632[screen][pos++] |= (image[j & 0x000F]<<temp);
00468 PA_Draw1632[screen][pos2++] |= (image[j & 0x000F]>>temp2);
00469 ++j;
00470 }
00471 }
00472
00473
00474
00475
00476
00477 extern inline void PA_16cLetter(u8 screen, s16 x, s16 y, char letter, u8 size, u8 color){
00478 if (c16policeheight[size]<=8) PA_16c8X8Letter(screen, x, y, letter, size, color);
00479
00480 else PA_16c16X16Letter(screen, x, y, letter, size, color);
00481
00482 }
00483
00484
00505 void PA_16cClearZone(u8 screen, s16 x1, s16 y1, s16 x2, s16 y2);
00506
00507
00508
00523 extern inline u8 PA_16cGetPixel(u8 screen, s16 x, s16 y){
00524 x += 8; y += 8;
00525 u16 temp = (x&7)<<2;
00526 u16 pos = PA_16cPos(x, y);
00527 return (PA_Draw1632[screen][pos]&(15<<temp))>>temp;
00528 }
00529
00530
00531
00532
00534
00535
00536
00537
00538 #ifdef __cplusplus
00539 }
00540 #endif
00541
00542
00543
00544
00545
00546
00547
00548
00549 #endif
00550
00551
00552
00553