* 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に手を加えれば、できるかもしれない??

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS