From 05d9596915d08276a8ba4356e4eecd985e641087 Mon Sep 17 00:00:00 2001 From: IniKiwi Date: Mon, 15 Aug 2022 13:52:31 +0200 Subject: [PATCH] more syscalls more opcodes bugfix enable/disiable log --- src/cpu.c | 36 +++++++++++++++++---------------- src/cpu.h | 8 ++++++-- src/display.c | 10 +++++++-- src/instructions/instructions.h | 3 ++- src/instructions/jmp.c | 18 ++++++++--------- src/instructions/logic.c | 5 +++++ src/main.c | 2 +- src/syscall.c | 13 ++++++------ src/syscall.h | 1 + src/syscall/bdisp.c | 4 ++++ 10 files changed, 62 insertions(+), 38 deletions(-) diff --git a/src/cpu.c b/src/cpu.c index 1b1d53b..560aa69 100644 --- a/src/cpu.c +++ b/src/cpu.c @@ -199,21 +199,24 @@ int cpu_execute(cpu_status_t* status){ status->r[0],status->r[1],status->r[2],status->r[3], status->r[4],status->r[5],status->r[6],status->r[15] );*/ - printf("pc: %8x %02x%02x pr: %8x r0: %8x r1: %8x r2: %8x r3: %8x r4: %8x r5: %8x r6: %8x r7: %8x r8: %8x r9: %8x r15: %08x\n", - status->pc,cpu_read8(status,status->pc),cpu_read8(status,status->pc+1), status->pr, - status->r[0],status->r[1],status->r[2],status->r[3], - status->r[4],status->r[5],status->r[6], - status->r[7],status->r[8],status->r[9], - status->r[15] - ); - + if(status->log){ + printf("pc: %8x %02x%02x pr: %8x r0: %8x r1: %8x r2: %8x r3: %8x r4: %8x r5: %8x r6: %8x r7: %8x r8: %8x r9: %8x r15: %08x\n", + status->pc,cpu_read8(status,status->pc),cpu_read8(status,status->pc+1), status->pr, + status->r[0],status->r[1],status->r[2],status->r[3], + status->r[4],status->r[5],status->r[6], + status->r[7],status->r[8],status->r[9], + status->r[15] + ); + } + + if(nibble[0] == 0b0110 && nibble[3] == 0b0011) instruction_mov_r_r(status); //else if(cpu_read8(status,status->pc) == 0x7f && cpu_read8(status,status->pc+1) == 0x04) status->pc += 2; else if(nibble[0] == 0b1110) instruction_mov_imm_r(status); else if(nibble[0] == 0b0000 && nibble[2] == 0b0010 && nibble[3] == 0b1001) instruction_movt_r(status); else if(nibble[0] == 0b0110 && nibble[3] == 0b1000) instruction_swapb_r_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b0111) instruction_mova_disp_pc_r0(status); - + else if(nibble[0] == 0b1101) instruction_movl_disp_pc_r(status); else if(nibble[0] == 0b0110 && nibble[3] == 0b0010) instruction_movl_ar_r(status); else if(nibble[0] == 0b0010 && nibble[3] == 0b0010) instruction_movl_r_ar(status); @@ -224,7 +227,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0000 && nibble[3] == 0b1110) instruction_movl_r0_r_r(status); else if(nibble[0] == 0b0000 && nibble[3] == 0b0110) instruction_movl_r_r0_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b0110) instruction_movl_disp_gbr_r0(status); - + // good else if(nibble[0] == 0b1000 && nibble[1] == 0b0001) instruction_movw_r0_disp_r(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b0101) instruction_movw_disp_r_r0(status); else if(nibble[0] == 0b1001) instruction_movw_disp_pc_r0(status); @@ -235,7 +238,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0000 && nibble[3] == 0b1101) instruction_movw_r0_r_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b0101) instruction_movw_disp_gbr_r0(status); else if(nibble[0] == 0b0000 && nibble[3] == 0b0101) instruction_movw_r_r0_r(status); - + else if(nibble[0] == 0b0110 && nibble[3] == 0b0000) instruction_movb_ar_r(status); else if(nibble[0] == 0b0010 && nibble[3] == 0b0000) instruction_movb_r_ar(status); else if(nibble[0] == 0b0110 && nibble[3] == 0b0100) instruction_movb_arp_r(status); @@ -246,7 +249,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b1100 && nibble[1] == 0b0100) instruction_movb_disp_gbr_r0(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b0000) instruction_movb_r0_disp_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b0000) instruction_movb_r0_disp_gbr(status); - + else if(nibble[0] == 0b0100 && nibble[2] == 0b0010 && nibble[3] == 0b0100) instruction_roctl_r(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0010 && nibble[3] == 0b0001) instruction_shar_r(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b1000) instruction_shll2_r(status); @@ -262,7 +265,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0100 && nibble[2] == 0b0001 && nibble[3] == 0b1001) instruction_shlr8_r(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b0101) instruction_rotr_r(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b0100) instruction_rotl_r(status); - + else if(nibble[0] == 0b0011 && nibble[3] == 0b0100) instruction_div1_r_r(status); else if(nibble[0] == 0b0011 && nibble[3] == 0b1100) instruction_add_r_r(status); else if(nibble[0] == 0b0111) instruction_add_imm_r(status); @@ -290,19 +293,17 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0011 && nibble[3] == 0b0101) instruction_dmulul_r_r(status); else if(nibble[0] == 0b0110 && nibble[3] == 0b1010) instruction_negc_r_r(status); - else if(nibble[0] == 0b0100 && nibble[2] == 0b0010 && nibble[3] == 0b1011) instruction_jmp_r(status); else if(nibble[0] == 0b1011) instruction_bsr_lbl(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b1011) instruction_jsr_ar(status); else if(nibble[0] == 0b0000 && nibble[1] == 0b0000 && nibble[2] == 0b0000 && nibble[3] == 0b1011) instruction_rts(status); - else if(cpu_read8(status,status->pc) == 0x00 && cpu_read8(status,status->pc+1) == 0x0b) instruction_rts(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b1011 ) instruction_bf_lbl(status); else if(nibble[0] == 0b1010) instruction_bra_lbl(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b1001 ) instruction_bt_lbl(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b1101 ) instruction_bts_lbl(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b1111 ) instruction_bfs_lbl(status); else if(nibble[0] == 0b0000 && nibble[2] == 0b0010 && nibble[3] == 0b0011) instruction_braf_r(status); - + else if(nibble[0] == 0b0000 && nibble[1] == 0b0000 && nibble[2] == 0b0000 && nibble[3] == 0b1001) instruction_nop(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b0010) instruction_stsl_mash_amr(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0001 && nibble[3] == 0b0010) instruction_stsl_macl_amr(status); @@ -315,7 +316,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0000 && nibble[2] == 0b0001 && nibble[3] == 0b0010) instruction_stc_gbr_r(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b0110) instruction_ldsl_arm_mach(status); else if(nibble[0] == 0b0000 && nibble[2] == 0b0000 && nibble[3] == 0b1010) instruction_sts_mach_r(status); - + else if(nibble[0] == 0b0010 && nibble[3] == 0b1000) instruction_tst_r_r(status); else if(nibble[0] == 0b0010 && nibble[3] == 0b1011) instruction_or_r_r(status); else if(nibble[0] == 0b0010 && nibble[3] == 0b1001) instruction_and_r_r(status); @@ -323,6 +324,7 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b1100 && nibble[1] == 0b1001) instruction_and_imm_r0(status); else if(nibble[0] == 0b0110 && nibble[3] == 0b0111) instruction_not_r_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b1011) instruction_or_imm_r0(status); + else if(nibble[0] == 0b1100 && nibble[1] == 0b1010) instruction_xor_imm_r0(status); else{ printf("\e[33mpc: %8x unkdown opcode, skipping...\e[39m\n",status->pc);status->pc += 2;exit(1);return 1;} return 0; diff --git a/src/cpu.h b/src/cpu.h index b0ea0f3..85b53ae 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -5,7 +5,7 @@ #pragma once typedef struct{ - uint32_t r[16]; + int32_t r[16]; uint32_t pc; uint32_t pr; uint32_t sr; @@ -15,7 +15,7 @@ typedef struct{ uint8_t* rom; uint8_t ram[524288]; // 0x08100000 - uint8_t vram[8192]; // 0x01100000 + uint8_t vram[1024]; // 0x01100000 uint32_t program_size; @@ -31,6 +31,10 @@ typedef struct{ display_t* display; uint32_t ipr[9]; + + uint8_t saved_disps[5][1024]; + + bool log; }cpu_status_t; int cpu_setup_addin(cpu_status_t*, char*); diff --git a/src/display.c b/src/display.c index d908ced..7881bd4 100644 --- a/src/display.c +++ b/src/display.c @@ -14,7 +14,7 @@ void display_set_data_register(display_t* display, uint8_t value, cpu_status_t* if(display->register_selector == 8){ if(value==4){display->x=0;SDL_RenderPresent(display->renderer);return;} display->line = value-128; - printf("\e[35mline to %d\e[39m\n", value-128+1); + if(status->log) printf("\e[35mline to %d\e[39m\n", value-128+1); } if(display->register_selector == 10){ for(int b=0;b<8;b++){ @@ -65,6 +65,12 @@ void display_update(display_t* display, cpu_status_t* status){ int x = (i%16)*8+b; display_pixel_on(display, x , y); } + else{ + int nb = b+1; + int y = i/16; + int x = (i%16)*8+b; + display_pixel_off(display, x , y); + } } } @@ -74,6 +80,6 @@ void display_update(display_t* display, cpu_status_t* status){ void display_init(display_t* display){ SDL_Init( SDL_INIT_VIDEO ); display->window = SDL_CreateWindow("nemu", 100, 100, 3*128, 3*64, SDL_WINDOW_SHOWN); - display->renderer = SDL_CreateRenderer(display->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC); + display->renderer = SDL_CreateRenderer(display->window, -1, NULL); display_clear(display); } diff --git a/src/instructions/instructions.h b/src/instructions/instructions.h index a43850b..7afb54a 100644 --- a/src/instructions/instructions.h +++ b/src/instructions/instructions.h @@ -115,4 +115,5 @@ void instruction_and_r_r(cpu_status_t* status); void instruction_xor_r_r(cpu_status_t* status); void instruction_and_imm_r0(cpu_status_t* status); void instruction_not_r_r(cpu_status_t* status); -void instruction_or_imm_r0(cpu_status_t* status); \ No newline at end of file +void instruction_or_imm_r0(cpu_status_t* status); +void instruction_xor_imm_r0(cpu_status_t* status); \ No newline at end of file diff --git a/src/instructions/jmp.c b/src/instructions/jmp.c index 91a863d..9a39f7c 100644 --- a/src/instructions/jmp.c +++ b/src/instructions/jmp.c @@ -11,7 +11,7 @@ void instruction_jmp_r(cpu_status_t* status){ status->pc = temp; if(status->r[LO_NIBBLE(cpu_read8(status,temp))] != 0x80010070){ status->pc = a; - printf("\e[34mpc: %8x jump to %08x (r%02d)\e[39m\n", temp, status->r[LO_NIBBLE(cpu_read8(status,temp))],LO_NIBBLE(cpu_read8(status,temp))); + if(status->log) printf("\e[34mpc: %8x jump to %08x (r%02d)\e[39m\n", temp, status->r[LO_NIBBLE(cpu_read8(status,temp))],LO_NIBBLE(cpu_read8(status,temp))); } else{ syscall_handle(status, temp); @@ -38,7 +38,7 @@ void instruction_bsr_lbl(cpu_status_t* status){ status->pr = status->pc + 4; status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bsr) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bsr) to %08x \e[39m\n", temp, status->pc); } @@ -58,7 +58,7 @@ void instruction_jsr_ar(cpu_status_t* status){ else{ status->pr = temp + 4; status->pc = a; - printf("\e[34mpc: %8x jump (jsr) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (jsr) to %08x \e[39m\n", temp, status->pc); } } @@ -73,7 +73,7 @@ void instruction_rts(cpu_status_t* status){ status->pc = pr; - printf("\e[34mpc: %8x jump (rts) to %08x \e[39m\n", temp, status->pr); + if(status->log) printf("\e[34mpc: %8x jump (rts) to %08x \e[39m\n", temp, status->pr); } void instruction_bf_lbl(cpu_status_t* status){ @@ -86,7 +86,7 @@ void instruction_bf_lbl(cpu_status_t* status){ if (status->t == 0){ status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bf) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bf) to %08x \e[39m\n", temp, status->pc); } else status->pc += 2; @@ -108,7 +108,7 @@ void instruction_bra_lbl(cpu_status_t* status){ status->pc = temp; status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bra) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bra) to %08x \e[39m\n", temp, status->pc); } void instruction_bt_lbl(cpu_status_t* status){ @@ -121,7 +121,7 @@ void instruction_bt_lbl(cpu_status_t* status){ if (status->t == 1){ status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bt) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bt) to %08x \e[39m\n", temp, status->pc); } else status->pc += 2; @@ -143,7 +143,7 @@ void instruction_bts_lbl(cpu_status_t* status){ if (status->t == 1){ status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bt/s) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bt/s) to %08x \e[39m\n", temp, status->pc); } else @@ -167,7 +167,7 @@ void instruction_bfs_lbl(cpu_status_t* status){ if (status->t == 0){ status->pc = status->pc + 4 + (disp << 1); - printf("\e[34mpc: %8x jump (bf/s) to %08x \e[39m\n", temp, status->pc); + if(status->log) printf("\e[34mpc: %8x jump (bf/s) to %08x \e[39m\n", temp, status->pc); } else status->pc += 4; diff --git a/src/instructions/logic.c b/src/instructions/logic.c index 55d0d72..3a03221 100644 --- a/src/instructions/logic.c +++ b/src/instructions/logic.c @@ -37,4 +37,9 @@ void instruction_not_r_r(cpu_status_t* status){ void instruction_or_imm_r0(cpu_status_t* status){ status->r[0] |= (0x000000FF & (long)cpu_read8(status,status->pc+1)); status->pc += 2; +} + +void instruction_xor_imm_r0(cpu_status_t* status){ + status->r[0] ^= (0x000000FF & (long)cpu_read8(status,status->pc+1)); + status->pc += 2; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 500c160..6e097be 100644 --- a/src/main.c +++ b/src/main.c @@ -17,7 +17,7 @@ int main(int argc, char **argv){ status = malloc(sizeof(cpu_status_t)); cpu_setup_addin(status, argv[1]); status->r[15] = 0x08100000 + 524288; - + status->log = false; cpu_run_from(status, 0x00300200); diff --git a/src/syscall.c b/src/syscall.c index 5954730..f4c99ee 100644 --- a/src/syscall.c +++ b/src/syscall.c @@ -5,11 +5,12 @@ int syscall_handle(cpu_status_t* status, uint32_t origin){ uint32_t id = status->r[0]; printf("\e[32mpc: %8x syscall %8x\e[39m\n", origin, (uint32_t)status->r[0]); if(id == 0x3fa) NULL; - if(id == 0x144) syscall_bdisp_allclr_ddvram(status); - if(id == 0x807) syscall_locate(status); - if(id == 0x808) syscall_print(status); - if(id == 0x135) syscall_get_vram_address(status); - if(id == 0xacd) syscall_malloc(status); - if(id == 0x90f) syscall_getkey(status); + else if(id == 0x144) syscall_bdisp_allclr_ddvram(status); + else if(id == 0x807) syscall_locate(status); + else if(id == 0x808) syscall_print(status); + else if(id == 0x135) syscall_get_vram_address(status); + else if(id == 0xacd) syscall_malloc(status); + else if(id == 0x90f) syscall_getkey(status); + else if(id == 0x028) syscall_bdisp_putdisp_dd(status); status->pc = status->pr; } \ No newline at end of file diff --git a/src/syscall.h b/src/syscall.h index 8387529..e4a17d0 100644 --- a/src/syscall.h +++ b/src/syscall.h @@ -5,6 +5,7 @@ int syscall_handle(cpu_status_t* status, uint32_t origin); void syscall_bdisp_allclr_ddvram(cpu_status_t* status); +void syscall_bdisp_putdisp_dd(cpu_status_t* status); void syscall_get_vram_address(cpu_status_t* status); void syscall_locate(cpu_status_t* status); diff --git a/src/syscall/bdisp.c b/src/syscall/bdisp.c index 675af8f..a898ef1 100644 --- a/src/syscall/bdisp.c +++ b/src/syscall/bdisp.c @@ -6,6 +6,10 @@ void syscall_bdisp_allclr_ddvram(cpu_status_t* status){ } } +void syscall_bdisp_putdisp_dd(cpu_status_t* status){ + display_update(status->display,status); +} + void syscall_get_vram_address(cpu_status_t* status){ status->r[0]=0x01100000; } \ No newline at end of file