From 0865fb9d39f9a043c529aece3892a2505b72277f Mon Sep 17 00:00:00 2001 From: IniKiwi Date: Mon, 11 Jul 2022 09:21:36 +0200 Subject: [PATCH] + d'opcodes --- CMakeLists.txt | 3 + build/Pongfirs.g1a | Bin 0 -> 3548 bytes build/RIEN.G1A | Bin 1708 -> 1728 bytes build/gravity.txt | 18742 ++++++++++++++++++++++++++++++ build/output.txt | 1080 +- build/pong.txt | 1774 +++ ressources/charset/char_maj.png | Bin 0 -> 210 bytes src/cpu.c | 60 +- src/cpu.h | 9 +- src/display.c | 23 +- src/display.h | 3 +- src/instructions/instructions.h | 13 + src/instructions/jmp.c | 31 +- src/instructions/logic.c | 15 + src/instructions/mov.c | 2 +- src/instructions/movl.c | 6 +- src/instructions/movw.c | 12 + src/instructions/operations.c | 23 + src/instructions/shift.c | 45 + src/instructions/system.c | 11 + src/main.c | 2 +- src/memory.c | 1 + src/memory.h | 16 + src/syscall.c | 6 +- src/syscall.h | 6 +- src/syscall/bdisp.c | 4 + src/syscall/malloc.c | 26 + src/syscall/text.c | 20 +- 28 files changed, 21361 insertions(+), 572 deletions(-) create mode 100644 build/Pongfirs.g1a create mode 100644 build/gravity.txt create mode 100644 build/pong.txt create mode 100644 ressources/charset/char_maj.png create mode 100644 src/instructions/logic.c create mode 100644 src/memory.c create mode 100644 src/memory.h create mode 100644 src/syscall/malloc.c diff --git a/CMakeLists.txt b/CMakeLists.txt index 73bf302..7810bf7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -11,12 +11,15 @@ set(SRCS src/instructions/movw.c src/instructions/shift.c src/instructions/operations.c + src/instructions/logic.c src/instructions/jmp.c src/syscall/bdisp.c src/syscall/text.c + src/syscall/malloc.c src/display.c src/instructions/system.c src/log.c + src/memory.c ) find_package(SDL2 REQUIRED) diff --git a/build/Pongfirs.g1a b/build/Pongfirs.g1a new file mode 100644 index 0000000000000000000000000000000000000000..859c7289c496ce319fabe2c623ad85557f0308d9 GIT binary patch literal 3548 zcmeH~eQZK2Tn2)V6pRTOpKGf=MMt3Avk_1VKj|tvruW;rWe0w5D>Be z@sPHG0}Y$4rwEj?Nk!FUiGkLr5>o$|TJ0kQL8q#n6y9sIk7g*19fPL9XiNN-)E1%`Rl9aBNs;vnZLo`+!vY5g5@wuwWH<7yVu{{ znKwXkTyyrH;}CLjPG_^z>ExQ7Zr3)1sM<=JynKPCHul~iH+n`$uwh6RFB+!X0W5Qz zUh<+m#1cX|!kG-{|9}3I9T@!1z=3~0zI0}#PbGK<(m@MH5ByStGMYpYWKqQJu0@Wccc63j6x5A0=YtjYjY}!B-OZ-YO3mU2b^+dj(}M z6SFpv;B5h~NzpBjTn8f+7-?!UYAa9;P=PpYKgbP$7BB!+kjq2FX{-R~8XD$t!#wmY zXWW}zWkx(BjB%}YQhX~g=W1@T9_Lw0*#W(!1n{WHtVa; z`YN$csS_DD6)hFcLwODY0B(An1-R+`oy_CATgmfYIa-KL}GvahVgdB$u zj8WZ4Z}G87cA9OW*uhSw+i=h5%$r;^i3E*OJ-BZ#9E zkY7g}X;6qM(&s?BVFC@pJyW~N<_m4qu*&8NZDQ9d`%a-vb`;w5g+iOGDYSLvg*K`z zw5dfu6G!1hAZ6-E5T+i}epATgGqtl$*4FcgZ3(8-EmG>`&q9WMXSv&GDP6-BXYm^Fa$j;WI*5R|tSx5)f2DKJmx?L;IS+<>{`uU09B3(1o{vCAR zkSvaAgU6-gVv+k=R69g?MEUa&u_Z2lmdr?EP~4wV4MLC28xV*4UVO;wXUQ;BN`D&Z z2h#W)^}m8MH2@ocy6$0}%mD80uR8mEE^(c{OxKFfo%4mQe zdnNJBvd;Jty{@BG>Xf>CbvMaZzh~Y)Nq#as)z)4&Nu3`uKR-!MwN6r)g!V>}U@-5F zKEd+6N9q>yvy+tIhJL~%Igb<$uOTk*br9uO@NNvG+2lOIPT$e8@AmhwzhJMhKluyt zGlwsUUa@tgy=w>T-SJWCV9!W?ibZy z=|$*Btay^ZvX8oHFx$=RCk<*XUzh7OTD1RVLA*xZsCn-}O!I#E`O2JbK76fa;&_4> zxO7i*14+eFSKtF{gIp8a@O|Qo+49Uc5X#^^H8di08I;Q!;Ox&30s8oO*2$H|z&20p zO_ZD>+En>t$J%brUD+FA7ESDvQaK&zmizzi z%la!?T)Sp1vgb$j_O8qc=L7Y!G_@7qka2=dLcK6;?(k#Ni{~gd@QJ2vtxV5m!rI(< z?)&tVCb*zB!MiLjQ5|b!P4>N))uXh)=lcoqy!MYdWimS(<+sgdaK7qSPia=nvp%m! z;f;`6O^D}YAFo#B@9pr?PuKE#A%28XD*AXIXfx$6RG-tZB;3^TlbIK)ql=&|;C%Bt zOWnn%2zkB^%m9DQ-J80*h%3QuADFeQE&4p$GKcCnxu0=vwiLHp-SmGKXR}Z#LS+Qf zwFE9ZY=!RuV%2-2!d2)eI}2^v zTxb*PR@v(dZL+J-Mpdiq>Oz~khtCPX-$O8sh%0>?q0r9Ezj&aJ2dec)KsnHiD>pv` z^w)qW;09cPbA|66u-^b$fGvP0@52)2{Tj4w2jJHT+L~)aWuU{IhwMND^!YZ(UoQJz z0sRbc8aNC582s7wKt2b+PoEHu;pc!1`tqD1ALtzb#2E4duwJNTIfgdScL1%xv%oXJ ncI^9ip7A%vuZ&+DKeQ~yA^R)nB02=|n3sX|vpNA1^Yr;Uo-XKB literal 0 HcmV?d00001 diff --git a/build/RIEN.G1A b/build/RIEN.G1A index 2be74d9e8ef14120f53b213cdd2939366f54fcdf..693b116e9879736af457f36df98777e0d0e69203 100644 GIT binary patch delta 267 zcmZ3(dw^GB)tbHQCv?o}<@x^}2><>2|Np0bJHxBh6D4%m%=HY7O^h~rtz@h}z<>lU zGdgQCZ~_Gkn1%G8`72!(sQ=^4&A@qy|0#+-_W~vc zPCxFH&&i*ZEjoWaV612HS7YGL`vx{^27>{M3xfe$3y_uo(m+1*3kIOR%f^%An6BD( z0QoC`_y!Q~=wN)nz#*UjbOQ?qP%TiLZ4D4_0pblnyn{mkY~~LJ1Ew;d`V*TAnDZHV aOMp@-3_H!QmuS@!_dF#rG@ZA^^- delta 240 zcmX@WyM|X{)tbHQCv?o}<@x^}2!;Or|Nk?1Hp8N%i4r<&#(IWE2BsUmRx+lpVL$?x z8J)EmIDrBNO#d$P)cW%b6>9wh4#(mL&sur4ubSudisplay = malloc(sizeof(display_t)); display_init(status->display); display_clear(status->display); - display_update(status->display); + status->malloc.lo_mem = 0x08100000 + 32768; + status->malloc.hi_mem = 0x08100000 + 524288 - 16384; + status->malloc.margin = 0x200; + status->malloc.allocs = 0; + status->malloc.mallocs = malloc(0); } int cpu_run(cpu_status_t* status){ @@ -55,7 +59,7 @@ int cpu_run(cpu_status_t* status){ } uint32_t cpu_read32(cpu_status_t* status, uint32_t addr){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ uint32_t ret; ret = decode(status->ram[addr-0x08100000+3], status->ram[addr-0x08100000+2], status->ram[addr-0x08100000+1], status->ram[addr-0x08100000]); return ret; @@ -72,7 +76,7 @@ uint32_t cpu_read32(cpu_status_t* status, uint32_t addr){ } uint16_t cpu_read16(cpu_status_t* status, uint32_t addr){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ uint16_t ret; //ret = (uint16_t)status->ram[addr-0x08100000]; ret = status->ram[addr-0x08100000+1]; @@ -97,7 +101,7 @@ uint16_t cpu_read16(cpu_status_t* status, uint32_t addr){ } uint8_t cpu_read8(cpu_status_t* status, uint32_t addr){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ uint8_t ret; ret = status->ram[addr-0x08100000]; return ret; @@ -120,7 +124,7 @@ uint8_t cpu_read8(cpu_status_t* status, uint32_t addr){ } void cpu_write32(cpu_status_t* status, uint32_t addr, uint32_t data){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ unsigned char bytes[4]; status->ram[addr-0x08100000] = (data >> 24) & 0xFF; @@ -128,9 +132,9 @@ void cpu_write32(cpu_status_t* status, uint32_t addr, uint32_t data){ status->ram[addr-0x08100000+2] = (data >> 8) & 0xFF; status->ram[addr-0x08100000+3] = data & 0xFF; } - else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ + /*else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ memcpy(&status->rom[addr-0x00300200], &addr, 4); - } + }*/ else if(addr >=0x01100000 && addr <= 0x01100000+8192){ status->vram[addr-0x01100000] = (data >> 24) & 0xFF; status->vram[addr-0x01100000+1] = (data >> 16) & 0xFF; @@ -143,24 +147,24 @@ void cpu_write32(cpu_status_t* status, uint32_t addr, uint32_t data){ } void cpu_write16(cpu_status_t* status, uint32_t addr, uint16_t data){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ memcpy(&status->ram[addr-0x08100000],&data, 2); } - else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ + /*else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ memcpy(&status->rom[addr-0x00300200], &addr, 2); - } + }*/ else{ log_mem_write_error(status, addr); } } void cpu_write8(cpu_status_t* status, uint32_t addr, uint8_t data){ - if(addr >=0x08100000 && addr <= 0x08100000+32768*8){ + if(addr >=0x08100000 && addr <= 0x08100000+524288){ status->ram[addr-0x08100000] = data; } - else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ + /*else if(addr >=0x00300200 && addr <= 0x00300200+status->program_size){ status->rom[addr-0x00300200] = data; - } + }*/ else if(addr >=0x01100000 && addr <= 0x01100000+8192){ status->vram[addr-0x01100000] = data; } @@ -182,13 +186,13 @@ 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 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,status->pr, + /*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(nibble[0] == 0b1110) instruction_mov_imm_r(status); @@ -207,6 +211,7 @@ int cpu_execute(cpu_status_t* 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); else if(nibble[0] == 0b0010 && nibble[3] == 0b0001) instruction_movw_r_ar(status); + else if(nibble[0] == 0b0110 && nibble[3] == 0b0101) instruction_movw_arp_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); @@ -216,9 +221,13 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0000 && nibble[3] == 0b1100) instruction_movb_r0_r_r(status); else if(nibble[0] == 0b0000 && nibble[3] == 0b0100) instruction_movb_r_r0_r(status); else if(nibble[0] == 0b1100 && nibble[1] == 0b0100) instruction_movb_disp_gbr_r0(status); - else if(nibble[0] == 0b1000 && nibble[1] == 0b0000) instruction_movw_r0_disp_r(status); + else if(nibble[0] == 0b1000 && nibble[1] == 0b0000) instruction_movb_r0_disp_r(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); + else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b0001) instruction_shlr_r(status); + else if(nibble[0] == 0b0100 && nibble[2] == 0b0000 && nibble[3] == 0b1001) instruction_shlr2_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); @@ -231,15 +240,20 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0100 && nibble[2] == 0b0001 && nibble[3] == 0b0101) instruction_cmp_pl_r(status); else if(nibble[0] == 0b1000 && nibble[1] == 0b1000) instruction_cmp_eq_imm_r0(status); else if(nibble[0] == 0b0011 && nibble[3] == 0b0110) instruction_cmp_hi_r_r(status); + else if(nibble[0] == 0b0011 && nibble[3] == 0b0011) instruction_cmp_ge_r_r(status); + else if(nibble[0] == 0b0000 && nibble[3] == 0b0111) instruction_mull_r_r(status); + else if(nibble[0] == 0b0011 && nibble[3] == 0b0000) instruction_cmp_eq_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[2] == 0b0000 && nibble[2] == 0b0000 && nibble[3] == 0b1011) instruction_rts(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[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); @@ -247,8 +261,13 @@ int cpu_execute(cpu_status_t* status){ else if(nibble[0] == 0b0100 && nibble[2] == 0b0010 && nibble[3] == 0b0010) instruction_stsl_pr_amr(status); else if(nibble[0] == 0b0000 && nibble[1] == 0b0000 && nibble[2] == 0b0000 && nibble[3] == 0b1000) instruction_clrt(status); else if(nibble[0] == 0b0100 && nibble[2] == 0b0010 && nibble[3] == 0b0110) instruction_ldsl_arp_pr(status); + else if(nibble[0] == 0b0100 && nibble[2] == 0b0001 && nibble[3] == 0b0110) instruction_ldsl_arp_macl(status); + else if(nibble[0] == 0b0000 && nibble[2] == 0b0001 && nibble[3] == 0b1010) instruction_sts_macl_r(status); - else{status->pc += 2; printf("\e[33munkdown opcode, skipping...\e[39m\n");return 1;} + 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{ printf("\e[33mpc: %8x unkdown opcode, skipping...\e[39m\n",status->pc);status->pc += 2;return 1;} return 0; } @@ -259,10 +278,11 @@ int cpu_run_from(cpu_status_t* status, uint32_t addr){ while (status->pc-0x00300200 < status->program_size){ if(cpu_execute(status)){ + printf("err\n"); total_error++; } total_executions++; - if(total_executions > 150000){ + if(total_executions > 100000000){ break; } } diff --git a/src/cpu.h b/src/cpu.h index cad3fb7..9f82dac 100644 --- a/src/cpu.h +++ b/src/cpu.h @@ -1,6 +1,7 @@ #include #include #include +#include #pragma once typedef struct{ @@ -13,8 +14,8 @@ typedef struct{ uint32_t gbr; uint8_t* rom; - uint8_t ram[32768*8]; // 0x08100000 - uint8_t vram[8192]; + uint8_t ram[524288]; // 0x08100000 + uint8_t vram[8192]; // 0x01100000 uint32_t program_size; @@ -25,6 +26,8 @@ typedef struct{ uint32_t cursor_x; uint32_t cursor_y; + malloc_table_t malloc; + display_t* display; }cpu_status_t; @@ -37,6 +40,8 @@ uint32_t cpu_read32(cpu_status_t*, uint32_t); uint16_t cpu_read16(cpu_status_t*, uint32_t); uint8_t cpu_read8(cpu_status_t*, uint32_t); +void display_update(display_t* display, cpu_status_t* status); + void cpu_write32(cpu_status_t* status, uint32_t addr, uint32_t data); void cpu_write16(cpu_status_t* status, uint32_t addr, uint16_t data); void cpu_write8(cpu_status_t* status, uint32_t addr, uint8_t data); \ No newline at end of file diff --git a/src/display.c b/src/display.c index 8fc917b..8b555bc 100644 --- a/src/display.c +++ b/src/display.c @@ -1,4 +1,5 @@ #include +#include void display_pixel_on(display_t* display, int x, int y){ SDL_SetRenderDrawColor(display->renderer, 70,65,69,255); @@ -24,8 +25,26 @@ void display_clear(display_t* display){ SDL_SetRenderDrawColor(display->renderer, 179,204,174,255); SDL_RenderClear(display->renderer); } + +#define HIGH_BIT(b) ((b & 0x80) >> 7) -void display_update(display_t* display){ +void display_update(display_t* display, cpu_status_t* status){ + uint8_t screen[8*1024]; + for(int i=0; i<1024;i++){ + uint8_t byte = status->vram[i]; + for(int b=0; b<8;b++){ + screen[i*8+b] = HIGH_BIT(byte >> b); + } + } + for(int i=0; i<64;i++){ + for(int b=0; b<128;b++){ + if(screen[i*128+b] == 1){ + display_pixel_on(display, b, i); + } else { + display_pixel_off(display, b, i); + } + } + } SDL_RenderPresent(display->renderer); } @@ -33,4 +52,4 @@ 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); -} \ No newline at end of file +} diff --git a/src/display.h b/src/display.h index 91013d4..bc92299 100644 --- a/src/display.h +++ b/src/display.h @@ -10,5 +10,4 @@ typedef struct{ void display_pixel_on(display_t* display, int x, int y); void display_pixel_off(display_t* display, int x, int y); void display_clear(display_t* display); -void display_update(display_t* display); -void display_init(display_t* display); \ No newline at end of file +void display_init(display_t* display); diff --git a/src/instructions/instructions.h b/src/instructions/instructions.h index f6689b7..18e09d6 100644 --- a/src/instructions/instructions.h +++ b/src/instructions/instructions.h @@ -21,6 +21,7 @@ void instruction_movw_r0_disp_r(cpu_status_t* status); void instruction_movw_disp_r_r0(cpu_status_t* status); void instruction_movw_disp_pc_r0 (cpu_status_t* status); void instruction_movw_r_ar(cpu_status_t* status); +void instruction_movw_arp_r(cpu_status_t* status); void instruction_movb_ar_r(cpu_status_t* status); void instruction_movb_r_ar(cpu_status_t* status); @@ -33,6 +34,10 @@ void instruction_movb_disp_gbr_r0(cpu_status_t* status); void instruction_movb_r0_disp_r(cpu_status_t* status); void instruction_roctl_r(cpu_status_t* status); +void instruction_shar_r(cpu_status_t* status); +void instruction_shll2_r(cpu_status_t* status); +void instruction_shlr_r(cpu_status_t* status); +void instruction_shlr2_r(cpu_status_t* status); void instruction_div1_r_r(cpu_status_t* status); void instruction_add_r_r(cpu_status_t* status); @@ -45,6 +50,9 @@ void instruction_extuw_r_r(cpu_status_t* status); void instruction_cmp_pl_r(cpu_status_t* status); void instruction_cmp_eq_imm_r0(cpu_status_t* status); void instruction_cmp_hi_r_r(cpu_status_t* status); +void instruction_cmp_ge_r_r(cpu_status_t* status); +void instruction_mull_r_r(cpu_status_t* status); +void instruction_cmp_eq_r_r(cpu_status_t* status); void instruction_jmp_r(cpu_status_t* status); void instruction_bsr_lbl(cpu_status_t* status); @@ -54,6 +62,7 @@ void instruction_bf_lbl(cpu_status_t* status); void instruction_bra_lbl(cpu_status_t* status); void instruction_bt_lbl(cpu_status_t* status); void instruction_bts_lbl(cpu_status_t* status); +void instruction_bfs_lbl(cpu_status_t* status); void instruction_nop(cpu_status_t* status); void instruction_stsl_mash_amr(cpu_status_t* status); @@ -61,4 +70,8 @@ void instruction_stsl_macl_amr (cpu_status_t* status); void instruction_stsl_pr_amr(cpu_status_t* status); void instruction_clrt(cpu_status_t* status); void instruction_ldsl_arp_pr(cpu_status_t* status); +void instruction_ldsl_arp_macl(cpu_status_t* status); +void instruction_sts_macl_r(cpu_status_t* status); +void instruction_tst_r_r(cpu_status_t* status); +void instruction_or_r_r(cpu_status_t* status); \ No newline at end of file diff --git a/src/instructions/jmp.c b/src/instructions/jmp.c index 09a7a50..9a091ef 100644 --- a/src/instructions/jmp.c +++ b/src/instructions/jmp.c @@ -133,8 +133,35 @@ void instruction_bts_lbl(cpu_status_t* status){ else disp = (0xFFFFFF00 | cpu_read8(status,status->pc+1)); - if (status->t == 1) + 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); + } + else status->pc += 4; -} \ No newline at end of file +} + +void instruction_bfs_lbl(cpu_status_t* status){ + int d = cpu_read8(status,status->pc+1); + int disp; + unsigned int temp; + temp = status->pc; + + status->pc += 2; + cpu_execute(status); + status->pc = temp; + + if ((d & 0x80) == 0) + disp = (0x000000FF & d); + else + disp = (0xFFFFFF00 | d); + + 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); + } + else + status->pc += 4; +} + diff --git a/src/instructions/logic.c b/src/instructions/logic.c new file mode 100644 index 0000000..b77b091 --- /dev/null +++ b/src/instructions/logic.c @@ -0,0 +1,15 @@ +#include + +void instruction_tst_r_r(cpu_status_t* status){ + if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]) == 0) + status->t = 1; + else + status->t = 0; + + status->pc += 2; +} + +void instruction_or_r_r(cpu_status_t* status){ + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] |= status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]; + status->pc += 2; +} \ No newline at end of file diff --git a/src/instructions/mov.c b/src/instructions/mov.c index 2c34dfe..816898d 100644 --- a/src/instructions/mov.c +++ b/src/instructions/mov.c @@ -2,7 +2,7 @@ #include void instruction_mov_r_r(cpu_status_t* status) { - status->r[HI_NIBBLE(cpu_read8(status,status->pc))] = status->r[LO_NIBBLE(cpu_read8(status,status->pc+1))]; + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]; status->pc += 2; } diff --git a/src/instructions/movl.c b/src/instructions/movl.c index 1814d30..5cd5ccc 100644 --- a/src/instructions/movl.c +++ b/src/instructions/movl.c @@ -36,18 +36,18 @@ void instruction_movl_r_amr(cpu_status_t* status){ void instruction_movl_disp_r_r(cpu_status_t* status){ long disp = (0x0000000F & (long)LO_NIBBLE(cpu_read8(status,status->pc+1))); - status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] = cpu_read32(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] + (disp << 2)); + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = cpu_read32(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] + (disp << 2)); status->pc += 2; } void instruction_movl_r_disp_r(cpu_status_t* status){ long disp = (0x0000000F & (long)LO_NIBBLE(cpu_read8(status,status->pc+1))); - cpu_write32(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] + (disp << 2), status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]); + cpu_write32(status, status->r[LO_NIBBLE(cpu_read8(status,status->pc))] + (disp << 2), status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]); status->pc += 2; } void instruction_movl_r0_r_r(cpu_status_t* status){ - status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] = cpu_read32(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] + status->r[0]); + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = cpu_read32(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] + status->r[0]); status->pc += 2; } diff --git a/src/instructions/movw.c b/src/instructions/movw.c index d8f9389..11ac471 100644 --- a/src/instructions/movw.c +++ b/src/instructions/movw.c @@ -37,3 +37,15 @@ void instruction_movw_r_ar(cpu_status_t* status){ status->pc += 2; } +void instruction_movw_arp_r(cpu_status_t* status){ + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = cpu_read16(status, status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]); + if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x8000) == 0) + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x0000FFFF; + else + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] |= 0xFFFF0000; + + if (LO_NIBBLE(cpu_read8(status,status->pc)) != HI_NIBBLE(cpu_read8(status,status->pc+1))) + status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))] += 2; + + status->pc += 2; +} \ No newline at end of file diff --git a/src/instructions/operations.c b/src/instructions/operations.c index d5737ca..af91c37 100644 --- a/src/instructions/operations.c +++ b/src/instructions/operations.c @@ -118,5 +118,28 @@ void instruction_cmp_hi_r_r(cpu_status_t* status){ else status->t = 0; + status->pc += 2; +} + +void instruction_cmp_ge_r_r(cpu_status_t* status){ + if ((long)status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >= (long)status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]) + status->t = 1; + else + status->t = 0; + + status->pc += 2; +} + +void instruction_mull_r_r(cpu_status_t* status){ + status->macl = status->r[LO_NIBBLE(cpu_read8(status,status->pc))] * status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]; + status->pc += 2; +} + +void instruction_cmp_eq_r_r(cpu_status_t* status){ + if (status->r[LO_NIBBLE(cpu_read8(status,status->pc))] == status->r[HI_NIBBLE(cpu_read8(status,status->pc+1))]) + status->t = 1; + else + status->t = 0; + status->pc += 2; } \ No newline at end of file diff --git a/src/instructions/shift.c b/src/instructions/shift.c index a36679f..2919136 100644 --- a/src/instructions/shift.c +++ b/src/instructions/shift.c @@ -20,4 +20,49 @@ void instruction_roctl_r(cpu_status_t* status){ status->t = 0; status->pc += 2; +} + +void instruction_shar_r(cpu_status_t* status){ + long temp; + + if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x00000001) == 0) + status->t = 0; + else + status->t = 1; + + if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x80000000) == 0) + temp = 0; + else + temp = 1; + + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 1; + + if (temp == 1) + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] |= 0x80000000; + else + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x7FFFFFFF; + + status->pc += 2; +} + +void instruction_shll2_r(cpu_status_t* status){ + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] <<= 2; + status->pc += 2; +} + +void instruction_shlr_r(cpu_status_t* status){ + if ((status->r[LO_NIBBLE(cpu_read8(status,status->pc))] & 0x00000001) == 0) + status->t = 0; + else + status->t = 1; + + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 1; + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x7FFFFFFF; + status->pc += 2; +} + +void instruction_shlr2_r(cpu_status_t* status){ + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] >>= 2; + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] &= 0x3FFFFFFF; + status->pc += 2; } \ No newline at end of file diff --git a/src/instructions/system.c b/src/instructions/system.c index c14869a..e0bb85f 100644 --- a/src/instructions/system.c +++ b/src/instructions/system.c @@ -33,4 +33,15 @@ void instruction_ldsl_arp_pr(cpu_status_t* status){ status->pr = cpu_read32(status, status->r[LO_NIBBLE(cpu_read8(status,status->pc))]); status->r[LO_NIBBLE(cpu_read8(status,status->pc))] += 4; status->pc += 2; +} + +void instruction_ldsl_arp_macl(cpu_status_t* status){ + status->macl = cpu_read32(status,status->r[LO_NIBBLE(cpu_read8(status,status->pc))]); + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] += 4; + status->pc += 2; +} + +void instruction_sts_macl_r(cpu_status_t* status){ + status->r[LO_NIBBLE(cpu_read8(status,status->pc))] = status->macl; + status->pc += 2; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 341455d..901145c 100644 --- a/src/main.c +++ b/src/main.c @@ -16,7 +16,7 @@ int main(int argc, char **argv){ cpu_status_t* status; status = malloc(sizeof(cpu_status_t)); cpu_setup_addin(status, argv[1]); - status->r[15] = 0x08100200; + status->r[15] = 0x08100000 + 524288 - 32768/4; printf("(ram read test) 0x08100000: %8x\n",cpu_read32(status,0x08100000)); cpu_write32(status,0x08100004, 0x00560000); printf("(ram write test) 0x00560000 at 0x08100004. result: %8x\n", cpu_read32(status,0x08100004)); diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..b8d67a0 --- /dev/null +++ b/src/memory.c @@ -0,0 +1 @@ +#include \ No newline at end of file diff --git a/src/memory.h b/src/memory.h new file mode 100644 index 0000000..ac528f1 --- /dev/null +++ b/src/memory.h @@ -0,0 +1,16 @@ +#include +#pragma once + +typedef struct{ + uint32_t size; + uint32_t addr; +} malloc_info_t; + +typedef struct{ + int allocs; + malloc_info_t* mallocs; + + uint32_t lo_mem; + uint32_t hi_mem; + uint32_t margin; +} malloc_table_t; \ No newline at end of file diff --git a/src/syscall.c b/src/syscall.c index a4daf8e..86ae430 100644 --- a/src/syscall.c +++ b/src/syscall.c @@ -3,10 +3,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, 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); status->pc = status->pr; } \ No newline at end of file diff --git a/src/syscall.h b/src/syscall.h index 520030f..b0024cf 100644 --- a/src/syscall.h +++ b/src/syscall.h @@ -5,5 +5,9 @@ int syscall_handle(cpu_status_t* status, uint32_t origin); void syscall_bdisp_allclr_ddvram(cpu_status_t* status); +void syscall_get_vram_address(cpu_status_t* status); -void syscall_locate(cpu_status_t* status); \ No newline at end of file +void syscall_locate(cpu_status_t* status); +void syscall_print(cpu_status_t* status); + +void syscall_malloc(cpu_status_t* status); \ No newline at end of file diff --git a/src/syscall/bdisp.c b/src/syscall/bdisp.c index 1b5dc0f..675af8f 100644 --- a/src/syscall/bdisp.c +++ b/src/syscall/bdisp.c @@ -4,4 +4,8 @@ void syscall_bdisp_allclr_ddvram(cpu_status_t* status){ for(int i=0; i< 1024;i++){ status->vram[i] = 0; } +} + +void syscall_get_vram_address(cpu_status_t* status){ + status->r[0]=0x01100000; } \ No newline at end of file diff --git a/src/syscall/malloc.c b/src/syscall/malloc.c new file mode 100644 index 0000000..7a2df25 --- /dev/null +++ b/src/syscall/malloc.c @@ -0,0 +1,26 @@ +#include + +void syscall_malloc(cpu_status_t* status){ + printf("\e[32mmalloc %ul bytes\e[39m\n", status->r[4]); + + uint32_t size = status->r[4]; + if(status->malloc.allocs == 0){ + status->r[0] = status->malloc.lo_mem; + } + else{ + int addr = status->malloc.lo_mem; + int hi = 0; + int hi_id = 0; + for(int i=0; i < status->malloc.allocs; i++){ + if(status->malloc.mallocs[i].addr > hi){ + hi = status->malloc.mallocs[i].addr; + hi_id = i; + } + } + addr = hi + status->malloc.mallocs[hi_id].size + status->malloc.margin; + status->r[0] = addr; + } + status->malloc.allocs++; + status->malloc.mallocs = realloc(status->malloc.mallocs, status->malloc.allocs * sizeof(malloc_info_t)); + status->malloc.mallocs[status->malloc.allocs - 1] = (malloc_info_t){size,status->r[0]}; +} \ No newline at end of file diff --git a/src/syscall/text.c b/src/syscall/text.c index 41290c0..91865d0 100644 --- a/src/syscall/text.c +++ b/src/syscall/text.c @@ -1,9 +1,27 @@ #include +#include +#include void syscall_locate(cpu_status_t* status){ int x = status->r[4]; int y = status->r[5]; status->cursor_x = (x-1)*6; - status->cursor_y = (y-1)*6; + status->cursor_y = (y-1)*8; +} + +void syscall_print(cpu_status_t* status){ + int i = 0; + while(1){ + int c = cpu_read8(status, status->r[4]+i); + printf("%c",c); + int e = floor((status->cursor_y*128+status->cursor_x+i*6)/8); + status->vram[e] = 0b10000000; + i++; + if(c == 0x00){ + printf("\n"); + break; + } + } + display_update(status->display, status); } \ No newline at end of file