00001 #ifndef _PA_KEYS
00002 #define _PA_KEYS
00003
00004 #include "PA9.h"
00010
00011
00013
00014
00015
00016
00017
00018 typedef struct {
00019 bool A, B, X, Y, L, R, Up, Down, Right, Left, Start, Select;
00020 } PA_Pad;
00021
00022 typedef struct {
00023 bool Held, Released, Newpress, Newpress0;
00024 s16 X, Y, altX, altY, Pressure;
00025 } PA_Stylus;
00026
00027 extern PA_Stylus Stylus;
00028
00029 typedef struct {
00030 PA_Pad Held, Released, Newpress;
00031 } Pads;
00032
00033 extern Pads Pad;
00034 extern PA_Pad* PadPointer;
00035
00036
00037 typedef struct {
00038 bool Moving;
00039 u8 Sprite;
00040 s16 X, Y, Vx, Vy;
00041 u8 Time;
00042 } PA_movingsprite;
00043
00044 extern PA_movingsprite PA_MovedSprite;
00045
00046
00047 #define PA_BUTTONS (*(volatile u16*)0x04000130)
00048
00049 #ifndef REG_KEYCNT
00050 #define REG_KEYCNT (*(volatile u16*)0x04000132)
00051 #endif
00052
00053 #define BUTTON_A 1
00054 #define BUTTON_B 2
00055 #define BUTTON_SELECT 4
00056 #define BUTTON_START 8
00057 #define BUTTON_RIGHT 16
00058 #define BUTTON_LEFT 32
00059 #define BUTTON_UP 64
00060 #define BUTTON_DOWN 128
00061 #define BUTTON_R 256
00062 #define BUTTON_L 512
00063 #define BUTTON_X 1024
00064 #define BUTTON_Y 2048
00065
00066
00067
00068 extern u16 CompletePad, ExPad, TempPad;
00069 #define UPDATEPAD(type, pad) type.A = pad & BUTTON_A;\
00070 type.B = (pad & BUTTON_B) >> 1;\
00071 type.Select = (pad & BUTTON_SELECT) >> 2;\
00072 type.Start = (pad & BUTTON_START) >> 3;\
00073 type.Right = (pad & BUTTON_RIGHT) >> 4;\
00074 type.Left = (pad & BUTTON_LEFT) >> 5;\
00075 type.Up = (pad & BUTTON_UP) >> 6;\
00076 type.Down = (pad & BUTTON_DOWN) >> 7;\
00077 type.R = (pad & BUTTON_R) >> 8;\
00078 type.L = (pad & BUTTON_L) >> 9;\
00079 type.X = (pad & BUTTON_X) >> 10;\
00080 type.Y = (pad & BUTTON_Y) >> 11;
00081
00082 #define COPYPAD(new, old) new.A = old.A;\
00083 new.B = old.B;\
00084 new.Select = old.Select;\
00085 new.Start = old.Start;\
00086 new.Right = old.Right;\
00087 new.Left = old.Left;\
00088 new.Up = old.Up;\
00089 new.Down = old.Down;\
00090 new.R = old.R;\
00091 new.L = old.L;\
00092 new.X = old.X;\
00093 new.Y = old.Y;
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00125 void PA_UpdatePad(void);
00126
00127
00128
00135 void PA_UpdateStylus(void);
00136
00145 #define PA_MoveSprite(sprite) PA_MoveSpriteEx(PA_Screen, sprite, PA_GetSpriteLx(0, sprite), PA_GetSpriteLy(0, sprite))
00146
00147
00148
00166 bool PA_MoveSpriteEx(bool screen, u8 sprite, u8 lx, u8 ly);
00167
00168
00180 bool PA_MoveSpriteDistance(u8 sprite, u8 distance);
00181
00188 extern inline void PA_UpdateMoveSprite(void) {
00189 PA_MovedSprite.Time++;
00190 if ((PA_MovedSprite.Time > 2) || Stylus.Released) {
00191 PA_MovedSprite.Moving = 0;
00192 PA_MovedSprite.Time = 0;
00193 }
00194 }
00195
00196
00197
00213 extern inline bool PA_SpriteTouchedEx(u8 sprite, u8 lx, u8 ly){
00214 if ((Stylus.X > PA_GetSpriteX(PA_Screen, sprite)) && (Stylus.X < PA_GetSpriteX(PA_Screen, sprite) + lx)
00215 && (Stylus.Y > PA_GetSpriteY(PA_Screen, sprite)) && (Stylus.Y < PA_GetSpriteY(PA_Screen, sprite) + ly))
00216 return 1;
00217 else return 0;
00218 }
00219
00220
00221
00230 #define PA_SpriteTouched(sprite) PA_SpriteTouchedEx(sprite, PA_GetSpriteLx(PA_Screen, sprite), PA_GetSpriteLy(PA_Screen, sprite))
00231
00232
00233
00251 #define PA_StylusInZone(x1, y1, x2, y2) ((Stylus.X>=x1)&&(Stylus.Y>=y1)&&(Stylus.X<x2)&&(Stylus.Y<y2))
00252
00254
00255
00256 #endif