* buntan-pc #1
-(by [[K]], 2024.11.05)
** (0)
-説明ページはいつかどこかにできると思うので、ここでは省略。
// https://github.com/buntan-pc/
** 2024.11.05 Tue #0
-[memo]uchanさんが作っているCPUの命令一覧
--https://github.com/uchan-nos/comproc/blob/main/src/cpu/cpu.sv#L26-L94
|#0000|NOP();|
|#0001|PUSH_i16(imm);|
|#0002|LD_fp16(disp);|
|#0003|ST_fp16(disp);|
|#0004|INC();|
|#0005|EQ();|
|#0006|JZ(ll);|
|#0007|LL(ll);|
-0から9までを表示
{
enum { var_i };
PUSH_i16(0); ST_fp16(var_i * 2);
LL(0); // local-label
LD_fp16(var_i * 2); sys_putDec();
LD_fp16(var_i * 2); INC(); ST_fp16(var_i * 2);
LD_fp16(var_i * 2); PUSH_i16(10); EQ(); JZ(0);
}
** 2024.11.06 Wed #0
-1から10までの和を計算
{
enum { var_s, var_i };
PUSH_i16(0); ST_fp16(var_s * 2);
PUSH_i16(1); ST_fp16(var_i * 2);
LL(0); // local-label
LD_fp16(var_s * 2); LD_fp16(var_i * 2); ADD(); ST_fp16(var_s * 2);
LD_fp16(var_i * 2); INC(); ST_fp16(var_i * 2);
LD_fp16(var_i * 2); PUSH_i16(11); EQ(); JZ(0);
LD_fp16(var_s * 2); sys_putDec();
}
-emu.c
#include <stdio.h>
void buntan_src();
int main()
{
// void func(int *sp, uint8_t *fp)
printf("{\nint i, j;\n");
buntan_src();
printf("}\n");
return 0;
}
void PUSH_i16(int imm) { printf(" *--sp = %d;\n", imm); }
void LD_fp16(int disp) { printf(" *--sp = ((int16_t *) fp)[%d];\n", disp); }
void ST_fp16(int disp) { printf(" ((int16_t *) fp)[%d] = *sp++;\n", disp); }
void INC() { printf(" (*sp)++;\n"); }
void EQ() { printf(" i = (*sp == sp[1]); *++sp = i;\n"); }
void JZ(int ll) { printf(" i = *sp++; if (i == 0) goto ll%d;\n", ll); }
void LL(int ll) { printf("ll%d:\n", ll); }
void ADD() { printf(" i = *sp + sp[1]; *++sp = i;\n"); }
void sys_putDec() { printf(" printf(\"%%d \", *sp++);\n"); }
//void LD_fp16(int disp) { printf(" *--sp = fp[%d] | fp[%d] << 8;\n", disp, disp + 1); }
//void ST_fp16(int disp) { printf(" i = *sp++; fp[%d] = i & 255; fp[%d] = (i >> 8) & 255;\n", disp, disp + 1); }
void buntan_src()
-runtime.c
#include <stdio.h>
#include <stdint.h>
void func(int *sp, uint8_t *fp);
int main()
{
int st[16]; uint8_t mem[4096];
func(&st[16], mem);
return 0;
}
void func(int *sp, uint8_t *fp)
-VC++での実行例:
prompt>cl /FI emu.c test.c
prompt>test.exe > test_1.c
prompt>cl /FI runtime.c test_1.c
prompt>test_1.exe
55
--gccだったら -include でできると思う。
** 2024.11.07 Thu #0
-この作り方で色々応用ができそうな気はするが、問題点としてCコンパイラがないといけない。
-軽量なCインタプリタがあれば、それでもよさそうな気はする。・・・簡単に作れるだろうか?
-軽量なCインタプリタがあれば、これも解決できそうな気はする。・・・簡単に作れるだろうか?
-easy-Cに手を加えれば、できるかもしれない??