void alarm_update(void) { unsigned char val = 23; if (al_cursor_pos) val = 59; if (keyboard_Up(KEY1) || keyboard_TimePressed(KEY1,KEYBOARD_TIMEPRESSED)) { if (alarm_time_toSet[al_cursor_pos]<val) alarm_time_toSet[al_cursor_pos]++; else alarm_time_toSet[al_cursor_pos]=0; } else if (keyboard_Up(KEY2) || keyboard_TimePressed(KEY2,KEYBOARD_TIMEPRESSED)) { if (alarm_time_toSet[al_cursor_pos]) alarm_time_toSet[al_cursor_pos]--; else alarm_time_toSet[al_cursor_pos] = val; } else if (keyboard_TimeUp(KEY4,KEYBOARD_TIMEOUT)) { Display_mode = MODE_PARAMS; keyboard_Reset(); } else if (keyboard_Up(KEY4)) al_cursor_pos++; else if (keyboard_Up(KEY3)) { alarm_time[0] = alarm_time_toSet[0]; alarm_time[1] = alarm_time_toSet[1]; alarm_enabled = 1; mem_Write(0x0009,&alarm_enabled,1); mem_Write(0x000A,alarm_time,2); Display_mode = MODE_PARAMS; keyboard_Reset(); } if (al_cursor_pos==2) al_cursor_pos = 0; al_time--; if (!al_time) { al_time = AL_TIME; al_flush = ~al_flush; } }
u32 services_SyncRequest(handleinfo* h, bool *locked) { u32 i; // Lookup which requested service in table. for(i=0; i<ARRAY_SIZE(services); i++) { if(services[i].subtype == h->subtype) return services[i].fnSyncRequest(); } if (h->subtype == SERVICE_DIRECT) { if (h->misc[0] & HANDLE_SERV_STAT_ACKING) { mem_Write(h->misc_ptr[0], arm11_ServiceBufferAddress() + 0x80, 0x200); h->misc[0] &= ~(HANDLE_SERV_STAT_ACKING | HANDLE_SERV_STAT_SYNCING); *locked = false; return 0; } else { if (!(h->misc[0] & HANDLE_SERV_STAT_SYNCING)) mem_Read(h->misc_ptr[0], arm11_ServiceBufferAddress() + 0x80, 0x200); h->misc[0] |= HANDLE_SERV_STAT_SYNCING; *locked = true; return 0; } } ERROR("invalid handle.\n"); arm11_Dump(); PAUSE(); return 0; }
u32 services_WaitSynchronization(handleinfo* h, bool *locked) { if (h->misc[0] & HANDLE_SERV_STAT_SYNCING) { mem_Write(h->misc_ptr[0], arm11_ServiceBufferAddress() + 0x80, 0x200); *locked = false; } else*locked = true; return 0; }
u32 svc_serverWaitSynchronization(handleinfo* h, bool *locked) { handleinfo* hi = handle_Get(h->misc[0]); if (hi == NULL) { *locked = 1; return 0; } if (hi->misc[0] & HANDLE_SERV_STAT_SYNCING) { mem_Write(hi->misc_ptr[0], arm11_ServiceBufferAddress() + 0x80, 0x80); //todo *locked = 0; return 0; } else { *locked = 1; return 0; } }
static u32 rawromfs_Read(file_type* self, u32 ptr, u32 sz, u64 off, u32* read_out) { *read_out = 0; if((off >> 32) || (off >= romfs_sz) || ((off+sz) >= romfs_sz)) { ERROR("Invalid read params.\n"); return -1; } if(fseek64(in_fd, romfs_off + off, SEEK_SET) == -1) { ERROR("fseek failed.\n"); return -1; } u8* b = malloc(sz); if(b == NULL) { ERROR("Not enough mem.\n"); return -1; } u32 read = fread(b, 1, sz, in_fd); ctr_aes_context ctx; if (loader_encrypted) { u8* temp = calloc(sz + (off & 0xF) + (sz & 0xF), sizeof(u8)); memcpy(temp + (off & 0xF), b, sz); ncch_extract_prepare(&ctx, &loader_h, NCCHTYPE_ROMFS, loader_key); ctr_add_counter(&ctx, (u32)((0x1000 + off) / 0x10)); //this is from loader ctr_crypt_counter(&ctx, temp, temp, sz + (off & 0xF)); memcpy(b, temp + (off & 0xF), sz); free(temp); } if(mem_Write(b, ptr, read) != 0) { ERROR("mem_Write failed.\n"); free(b); return -1; } *read_out = read; free(b); return 0; // Result }
static u32 sharedextdfile_Read(file_type* self, u32 ptr, u32 sz, u64 off, u32* read_out) { FILE* fd = self->type_specific.sharedextd.fd; *read_out = 0; if(off >> 32) { ERROR("64-bit offset not supported.\n"); return -1; } if(fseek(fd, off, SEEK_SET) == -1) { ERROR("fseek failed.\n"); return -1; } u8* b = malloc(sz); if(b == NULL) { ERROR("Not enough mem.\n"); return -1; } u32 read = fread(b, 1, sz, fd); if(read == 0) { ERROR("fread failed\n"); free(b); return -1; } if(mem_Write(b, ptr, read) != 0) { ERROR("mem_Write failed.\n"); free(b); return -1; } *read_out = read; free(b); return 0; // Result }