| 1 | #define VBATT_DEFAULT_MIN (4550) |
|---|
| 2 | #define VBATT_DEFAULT_MAX (5150) |
|---|
| 3 | |
|---|
| 4 | #include "lolevel.h" |
|---|
| 5 | #include "platform.h" |
|---|
| 6 | #include "core.h" |
|---|
| 7 | #include "keyboard.h" |
|---|
| 8 | |
|---|
| 9 | /* Ours stuff */ |
|---|
| 10 | extern long link_bss_start; |
|---|
| 11 | extern long link_bss_end; |
|---|
| 12 | extern void boot(); |
|---|
| 13 | extern void mykbd_task(long ua, long ub, long uc, long ud, long ue, long uf); |
|---|
| 14 | |
|---|
| 15 | |
|---|
| 16 | static int stop_hooking; |
|---|
| 17 | |
|---|
| 18 | static void (*taskprev)( |
|---|
| 19 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 20 | long p5, long p6, long p7, long p8, long p9); |
|---|
| 21 | |
|---|
| 22 | static void (*taskfsprev)( |
|---|
| 23 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 24 | long p5, long p6, long p7, long p8, long p9); |
|---|
| 25 | |
|---|
| 26 | |
|---|
| 27 | |
|---|
| 28 | void spytask(long ua, long ub, long uc, long ud, long ue, long uf) |
|---|
| 29 | { |
|---|
| 30 | core_spytask(); |
|---|
| 31 | } |
|---|
| 32 | |
|---|
| 33 | |
|---|
| 34 | static void task_start_hook( |
|---|
| 35 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 36 | long p5, long p6, long p7, long p8, long p9) |
|---|
| 37 | { |
|---|
| 38 | _CreateTask("SpyTask", 0x19, 0x2000, spytask, 0); |
|---|
| 39 | |
|---|
| 40 | taskprev(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 ); |
|---|
| 41 | } |
|---|
| 42 | |
|---|
| 43 | |
|---|
| 44 | |
|---|
| 45 | static void task_fs( |
|---|
| 46 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 47 | long p5, long p6, long p7, long p8, long p9) |
|---|
| 48 | { |
|---|
| 49 | remount_filesystem(); |
|---|
| 50 | taskfsprev(p0, p1, p2, p3, p4, p5, p6, p7, p8, p9 ); |
|---|
| 51 | } |
|---|
| 52 | |
|---|
| 53 | |
|---|
| 54 | static void capt_seq_hook( |
|---|
| 55 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 56 | long p5, long p6, long p7, long p8, long p9) |
|---|
| 57 | { |
|---|
| 58 | capt_seq_task(); |
|---|
| 59 | } |
|---|
| 60 | |
|---|
| 61 | |
|---|
| 62 | static void movie_record_hook( |
|---|
| 63 | long p0, long p1, long p2, long p3, long p4, |
|---|
| 64 | long p5, long p6, long p7, long p8, long p9) |
|---|
| 65 | { |
|---|
| 66 | movie_record_task(); |
|---|
| 67 | } |
|---|
| 68 | |
|---|
| 69 | |
|---|
| 70 | static int my_ncmp(const char *s1, const char *s2, long len) |
|---|
| 71 | { |
|---|
| 72 | int i; |
|---|
| 73 | for (i=0;i<len;i++){ |
|---|
| 74 | if (s1[i] != s2[i]) |
|---|
| 75 | return 1; |
|---|
| 76 | } |
|---|
| 77 | return 0; |
|---|
| 78 | } |
|---|
| 79 | |
|---|
| 80 | void createHook (void *pNewTcb) |
|---|
| 81 | { |
|---|
| 82 | char *name = (char*)(*(long*)((char*)pNewTcb+0x34)); |
|---|
| 83 | long *entry = (long*)((char*)pNewTcb+0x74); |
|---|
| 84 | |
|---|
| 85 | // always hook first task creation |
|---|
| 86 | // to create SpyProc |
|---|
| 87 | if (!stop_hooking){ |
|---|
| 88 | taskprev = (void*)(*entry); |
|---|
| 89 | *entry = (long)task_start_hook; |
|---|
| 90 | stop_hooking = 1; |
|---|
| 91 | } else { |
|---|
| 92 | // hook/replace another tasks |
|---|
| 93 | if (my_ncmp(name, "tSwitchChe", 10) == 0){ |
|---|
| 94 | *entry = (long)mykbd_task; |
|---|
| 95 | } |
|---|
| 96 | if (my_ncmp(name, "tInitFileM", 10) == 0){ |
|---|
| 97 | taskfsprev = (void*)(*entry); |
|---|
| 98 | *entry = (long)task_fs; |
|---|
| 99 | } |
|---|
| 100 | |
|---|
| 101 | if (my_ncmp(name, "tCaptSeqTa", 10) == 0){ |
|---|
| 102 | *entry = (long)capt_seq_hook; |
|---|
| 103 | } |
|---|
| 104 | |
|---|
| 105 | if (my_ncmp(name, "tMovieRecT", 10) == 0){ |
|---|
| 106 | *entry = (long)movie_record_hook; |
|---|
| 107 | } |
|---|
| 108 | |
|---|
| 109 | core_hook_task_create(pNewTcb); |
|---|
| 110 | } |
|---|
| 111 | } |
|---|
| 112 | |
|---|
| 113 | void deleteHook (void *pTcb) |
|---|
| 114 | { |
|---|
| 115 | core_hook_task_delete(pTcb); |
|---|
| 116 | } |
|---|
| 117 | |
|---|
| 118 | void startup() |
|---|
| 119 | { |
|---|
| 120 | long *bss = &link_bss_start; |
|---|
| 121 | long *ptr; |
|---|
| 122 | |
|---|
| 123 | // sanity check |
|---|
| 124 | if ((long)&link_bss_end > (MEMISOSTART + MEMISOSIZE)){ |
|---|
| 125 | started(); |
|---|
| 126 | shutdown(); |
|---|
| 127 | } |
|---|
| 128 | |
|---|
| 129 | // initialize .bss senment |
|---|
| 130 | while (bss<&link_bss_end) |
|---|
| 131 | *bss++ = 0; |
|---|
| 132 | |
|---|
| 133 | // fill memory with this magic value so we could see what |
|---|
| 134 | // parts of memory were or not used |
|---|
| 135 | |
|---|
| 136 | // update: |
|---|
| 137 | // this seems to be required for unknown reason |
|---|
| 138 | // or else sryproc startup will fail from |
|---|
| 139 | // time to time... |
|---|
| 140 | #if 0 |
|---|
| 141 | for (ptr=(void*)MEMBASEADDR;((long)ptr)<MEMISOSTART;ptr+=4){ |
|---|
| 142 | ptr[0]=0x55555555; |
|---|
| 143 | ptr[1]=0x55555555; |
|---|
| 144 | ptr[2]=0x55555555; |
|---|
| 145 | ptr[3]=0x55555555; |
|---|
| 146 | } |
|---|
| 147 | #endif |
|---|
| 148 | |
|---|
| 149 | boot(); |
|---|
| 150 | } |
|---|
| 151 | |
|---|
| 152 | long get_vbatt_min() |
|---|
| 153 | { |
|---|
| 154 | return 4550; |
|---|
| 155 | } |
|---|
| 156 | |
|---|
| 157 | long get_vbatt_max() |
|---|
| 158 | { |
|---|
| 159 | return 5150; |
|---|
| 160 | } |
|---|
| 161 | |
|---|
| 162 | static const struct { |
|---|
| 163 | int zp, fl; |
|---|
| 164 | } fl_tbl[] = { |
|---|
| 165 | { 0, 6000 }, |
|---|
| 166 | { 11, 6400 }, |
|---|
| 167 | { 41, 12100 }, |
|---|
| 168 | { 64, 21300 }, |
|---|
| 169 | { 86, 41600 }, |
|---|
| 170 | { 105, 61400 }, |
|---|
| 171 | { 128, 72000 }, |
|---|
| 172 | }; |
|---|
| 173 | #define NUM_FL (sizeof(fl_tbl)/sizeof(fl_tbl[0])) |
|---|
| 174 | #define CF_EFL 6000 |
|---|
| 175 | |
|---|
| 176 | const int zoom_points = 129; |
|---|
| 177 | |
|---|
| 178 | int get_effective_focal_length(int zp) { |
|---|
| 179 | return (CF_EFL*get_focal_length(zp))/1000; |
|---|
| 180 | } |
|---|
| 181 | |
|---|
| 182 | int get_focal_length(int zp) { |
|---|
| 183 | int i; |
|---|
| 184 | |
|---|
| 185 | if (zp<fl_tbl[0].zp) |
|---|
| 186 | return fl_tbl[0].fl; |
|---|
| 187 | else if (zp>fl_tbl[NUM_FL-1].zp) |
|---|
| 188 | return fl_tbl[NUM_FL-1].fl; |
|---|
| 189 | else |
|---|
| 190 | for (i=1; i<NUM_FL; ++i) { |
|---|
| 191 | if (zp==fl_tbl[i-1].zp) |
|---|
| 192 | return fl_tbl[i-1].fl; |
|---|
| 193 | else if (zp==fl_tbl[i].zp) |
|---|
| 194 | return fl_tbl[i].fl; |
|---|
| 195 | else if (zp<fl_tbl[i].zp) |
|---|
| 196 | return fl_tbl[i-1].fl+(zp-fl_tbl[i-1].zp)*(fl_tbl[i].fl-fl_tbl[i-1].fl)/(fl_tbl[i].zp-fl_tbl[i-1].zp); |
|---|
| 197 | } |
|---|
| 198 | return fl_tbl[NUM_FL-1].fl; |
|---|
| 199 | } |
|---|
| 200 | |
|---|
| 201 | int get_zoom_x(int zp) { |
|---|
| 202 | return get_focal_length(zp)*10/fl_tbl[0].fl; |
|---|
| 203 | } |
|---|
| 204 | |
|---|
| 205 | static struct { |
|---|
| 206 | int hackmode; |
|---|
| 207 | int canonmode; |
|---|
| 208 | } modemap[] = { |
|---|
| 209 | { MODE_AUTO, 5 }, |
|---|
| 210 | { MODE_P, 1 }, |
|---|
| 211 | { MODE_TV, 3 }, |
|---|
| 212 | { MODE_AV, 2 }, |
|---|
| 213 | { MODE_M, 0 }, |
|---|
| 214 | { MODE_PORTRAIT, 6 }, |
|---|
| 215 | { MODE_NIGHT, 8 }, |
|---|
| 216 | { MODE_LANDSCAPE, 7 }, |
|---|
| 217 | { MODE_VIDEO_STD, 16 }, |
|---|
| 218 | { MODE_STITCH, 15 }, |
|---|
| 219 | { MODE_MY_COLORS, 4 }, |
|---|
| 220 | { MODE_SCN_NIGHT, 14 }, |
|---|
| 221 | { MODE_SCN_INDOOR, 13 }, |
|---|
| 222 | { MODE_SCN_FOLIAGE, 9 }, |
|---|
| 223 | { MODE_SCN_SNOW, 10 }, |
|---|
| 224 | { MODE_SCN_BEACH, 11 }, |
|---|
| 225 | { MODE_SCN_FIREWORK, 12 }, |
|---|
| 226 | }; |
|---|
| 227 | #define MODESCNT (sizeof(modemap)/sizeof(modemap[0])) |
|---|
| 228 | |
|---|
| 229 | int mode_get() { |
|---|
| 230 | int mode, i, t=0xFF; |
|---|
| 231 | mode = (playrec_mode==1)?MODE_REC:MODE_PLAY; |
|---|
| 232 | mode |= (physw_copy[1] & 0x00000001)?0:MODE_SCREEN_OPENED; |
|---|
| 233 | mode |= (physw_copy[1] & 0x00000002)?0:MODE_SCREEN_ROTATED; |
|---|
| 234 | |
|---|
| 235 | t=0xFF; |
|---|
| 236 | _GetPropertyCase(PROPCASE_SHOOTING_MODE, &t, 4); |
|---|
| 237 | for (i=0; i<MODESCNT; ++i) { |
|---|
| 238 | if (modemap[i].canonmode == t) { |
|---|
| 239 | return (mode | (modemap[i].hackmode & MODE_SHOOTING_MASK)); |
|---|
| 240 | } |
|---|
| 241 | } |
|---|
| 242 | return (mode); |
|---|
| 243 | } |
|---|