more syscalls

more opcodes
bugfix
enable/disiable log
This commit is contained in:
IniKiwi 2022-08-15 13:52:31 +02:00
parent 02cc56efa7
commit 05d9596915
10 changed files with 62 additions and 38 deletions

View File

@ -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;

View File

@ -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*);

View File

@ -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);
}

View File

@ -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);
void instruction_or_imm_r0(cpu_status_t* status);
void instruction_xor_imm_r0(cpu_status_t* status);

View File

@ -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;

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}