00001 #ifndef _PA_Main
00002 #define _PA_Main
00003
00004 #ifdef __cplusplus
00005 extern "C" {
00006 #endif
00007
00008
00009 #include "../../PA_Config.h"
00010
00011
00012 #ifdef USE_8BITTEXT
00013 #define TEXT_ALLSIZES
00014 #endif
00015
00016
00017 #include <nds.h>
00018 #include <nds/memory.h>
00019 #include <nds/bios.h>
00020 #include <malloc.h>
00021
00022 extern bool PA_Screen;
00023
00024 typedef struct {
00025 u8 NoIdea;
00026 u8 Year;
00027 u8 Month;
00028 u8 Day;
00029 u8 NoIdea2;
00030 u8 Hour;
00031 u8 Minutes;
00032 u8 Seconds;
00033 } RTC;
00034 extern RTC PA_RTC;
00035
00036 extern inline void PA_WaitForVBL(void);
00037
00038 extern s16 PA_ScreenSpace;
00039
00040 #define BG_GFX1 0x6000000
00041 #define BG_GFX2 0x6200000
00042 #define SPRITE_GFX1 0x6400000
00043 #define SPRITE_GFX2 0x6600000
00044
00045
00046
00047 #define REG_DMA3SRC *(volatile u32*)0x040000D4
00048 #define REG_DMA3DST *(volatile u32*)0x040000D8
00049 #define REG_DMA3CNT *(volatile u32*)0x040000DC
00050 #define DMA_ON 0x80000000
00051 #define DMA_NOW 0x00000000
00052 #define DMA_16 0x00000000
00053 #define DMA_32 0x04000000
00054 #define DMA_16NOW (DMA_ON | DMA_NOW | DMA_16)
00055 #define DMA_32NOW (DMA_ON | DMA_NOW | DMA_32)
00056 #define DMA_Copy(source, dest, count, mode) {REG_DMA3SRC = (u32)source; REG_DMA3DST = (u32)dest; REG_DMA3CNT = (count) | (mode);}
00057
00058 #define DMA_Clear(dest, count, mode) {REG_DMA3SRC = (u32)Blank; REG_DMA3DST = (u32)dest; REG_DMA3CNT = (count) | (mode);}
00059
00060 #define DMA_Force(ulVal,dest, count, mode) {REG_DMA3SRC=(u32)&ulVal; REG_DMA3DST = (u32)dest; REG_DMA3CNT = (count) |(mode) | DMA_SRC_FIX;}
00061
00062
00063 #define BACKLIGHT(screen) BIT(2+screen)
00064
00065
00066
00067
00068
00069
00070
00071 #include <stdarg.h>
00072 #include <string.h>
00073
00074 #include "gbfs.h"
00075 #include "gba-jpeg-decode.h"
00076 #include "Sound9.h"
00077
00078
00079 #define _REG8 *(volatile u16 *)
00080 #define _REG16 *(volatile u16 *)
00081 #define _REG32 *(volatile u32 *)
00082
00083 #include "arm9/vidfile.h"
00084 #include "arm9/PA_Sprite.h"
00085 #include "arm9/PA_SpriteDual.h"
00086 #include "arm9/PA_Sound.h"
00087 #include "arm9/PA_Micro.h"
00088 #include "arm9/PA_Draw.h"
00089 #include "arm9/PA_Interrupt.h"
00090 #include "arm9/PA_Keys.h"
00091
00092 #include "arm9/PA_Timer.h"
00093
00094 #ifdef TEXT_ALLSIZES
00095 #include "arm9/PA_API.h"
00096 #endif
00097
00098 #include "arm9/PA_Math.h"
00099 #include "arm9/PA_Palette.h"
00100 #include "arm9/PA_PaletteDual.h"
00101 #include "arm9/PA_Save.h"
00102 #include "arm9/PA_FS.h"
00103 #include "arm9/PA_GBFS.h"
00104 #include "arm9/PA_SpecialFx.h"
00105
00106 #include "arm9/PA_Tile.h"
00107 #include "arm9/PA_TileDual.h"
00108
00109 #include "arm9/PA_FAT.h"
00110
00111 #ifdef USE_KEYBOARD
00112 #include "arm9/PA_Keyboard.h"
00113 #endif
00114
00115 #include "arm9/PA_Text.h"
00116 #include "arm9/PA_Window.h"
00117
00118 #include "arm9/PA_Mode7.h"
00119
00120 #ifdef USE_3D
00121 #include "arm9/PA_3D.h"
00122 #endif
00123
00124
00125 #include "arm9/PA_IA.h"
00126 #include "arm9/PA_Reco.h"
00127
00128 #define SWITCH_SCREENS (1<<15)
00129
00130
00131
00132 #define N_HBLS 263
00133
00134
00135
00144
00145 extern u32 Blank[130000>>2];
00146
00147
00148
00149
00150
00151
00153
00155
00156 #define SIZEOF_8BIT(x) (sizeof(x))
00157 #define SIZEOF_16BIT(x) (sizeof(x)>>1)
00158 #define SIZEOF_32BIT(x) (sizeof(x)>>2)
00159
00160
00161
00162
00163 #define CODE_IN_IWRAM __attribute__ ((section (".iwram"), long_call))
00164 #define IN_IWRAM __attribute__ ((section (".iwram")))
00165 #define CODE_IN_EWRAM __attribute__ ((section (".ewram"), long_call))
00166 #define IN_EWRAM __attribute__ ((section (".ewram")))
00167 #define PACKED __attribute__ ((packed))
00168
00169
00170
00171
00172
00173
00174
00175
00176 void PA_jpeg_GetImageSize(char* name, int* width, int* height);
00177 void PA_jpeg_BltImage(char* name, u16* vram, int output_width, int output_height);
00178
00179 extern const s16 PA_SIN[512];
00180
00181
00182
00183 typedef struct {
00184 u8 Color;
00185 u8 BdayMonth;
00186 u8 BdayDay;
00187 u8 AlarmHour;
00188 u8 AlarmMinute;
00189 u8 Name[21];
00190 u8 NameLength;
00191 u8 Message[53];
00192 u8 MessageLength;
00193 u8 Language;
00194 } infos;
00195 extern infos PA_UserInfo;
00196
00197 #define INFO_COLOR *(u8*)0x027FFC82
00198 #define INFO_BDAY_MONTH *(u8*)0x027FFC83
00199 #define INFO_BDAY_DAY *(u8*)0x027FFC84
00200 #define INFO_ALARM_HOUR *(u8*)0x027FFCD2
00201 #define INFO_ALARM_MINUTE *(u8*)0x027FFCD3
00202 #define INFO_NAME *(u8*)0x027FFC86
00203 #define INFO_NAME_LENGTH *(u8*)0x027FFC9A
00204 #define INFO_MESSAGE *(u8*)0x027FFC9C
00205 #define INFO_MESSAGE_LENGTH *(u8*)0x027FFCD0
00206 #define INFO_LANGUAGE *(u8*)(0x027FFCE4)
00207
00208
00220 void PA_Init(void);
00221
00222
00223
00235 extern inline void PA_SetVideoMode(bool screen, u8 mode) {
00236 (*(vuint32*)(0x04000000 + (0x1000 * screen))) &= ~7;
00237 (*(vuint32*)(0x04000000 + (0x1000 * screen))) |= mode;
00238 }
00239
00240
00241
00247 void PA_UpdateUserInfo(void);
00248
00249
00255 void PA_UpdateRTC(void);
00256
00257
00265 void PA_LoadSplash(void);
00266
00267
00273 void PA_NeoSplash(void);
00274
00275
00276
00282 extern inline void PA_WaitForVBL(void){
00283 swiWaitForVBlank();
00284 }
00285
00286
00287
00293 extern inline void PA_SwitchScreens(void) {
00294 POWER_CR ^= SWITCH_SCREENS;
00295 PA_Screen = !PA_Screen;
00296 }
00297
00298
00304 extern inline void PA_InitCPUMeter() {
00305 PA_CPU = 0;
00306 PA_MaxCPU = 0;
00307 PA_lines = 0;
00308 PA_VBLCount = 0;
00309 PA_nVBLs = 0;
00310 }
00311
00312
00313
00314
00315
00321 #define PA_LidClosed() (IPC->buttons>>7)
00322
00323
00329 extern inline bool PA_CheckLid(void) {
00330
00331 if (!PA_LidClosed()) return 0;
00332 else {
00333 u16 power_cr = POWER_CR;
00334 POWER_CR = 0;
00335
00336
00337 while(PA_LidClosed()) PA_WaitForVBL();
00338
00339
00340 POWER_CR = power_cr;
00341 return 1;
00342 }
00343
00344 }
00345
00346
00347
00348
00349
00377 void PA_Splash(void* tiles0, void* map0, void* tiles1, void* map1, s16 color0, s16 color1, s16 time);
00378
00379
00391 extern inline void PA_SetScreenLight(bool screen, bool light){
00392 IPC->aux &= ~(1<<(2+screen));
00393 IPC->aux |= light<<(2+screen);
00394 }
00395
00396
00408 extern inline void PA_SetLedBlink(bool blink, bool speed){
00409 IPC->aux &= ~(3<<4);
00410 IPC->aux |= (blink + (speed<<1))<<4;
00411 }
00412
00413
00414
00415
00417
00418
00419 void PA_Nothing(void);
00420
00421
00422 #ifdef __cplusplus
00423 }
00424 #endif
00425 #endif
00426
00427
00428