フロントエンドコードをdecoderを使って実行しよう!
- page0063のdecoderを利用すれば、バックエンドコードの実装だけでフロントエンドコード変換もできてしまうらしい!
現状
ここに現状の動くデモがあります。
Load->StepInMsがおすすめ。Breakもできます。StepInもできます。
decoder自体の読み込みはできるようだが、実際にフロントエンドコード(app0023)を変換させると、配列の未定義部分を読みにいってしまう。
比較命令あたりの実装にミスがあるのが原因?もしくはポインタ周りか
多分バグは直りました!
- LMEMで読み込んだ値がfalseの時レジスタを更新しないようにしていたために0を読み込んでもR00に反映されず、decoderの命令解釈ループを終了できないのが原因でした。
- (なぜ終了条件に、実行前にP05に渡した、入力データの終端を使っていないのか少し不思議)
- 見つかってよかった…かなり時間を消費してしまいました。自分で引き起こしたので自業自得ですが(笑)。
できました!!
上記のデモも更新しました!今後はAPIを増やして、付属のアプリケーションをどんどん実行していけるようにしたいです。
フロントエンドコード動作確認済みのアプリ
以下のUNIXコマンドでテキスト化したものをテキストボックスにペーストしてLoad->Executeで実行できます!
od -tx1 -An [FileName]
フロントエンドコードを解読しよう!
- decoderを使うことになったけれど、フロントエンドコードを自力で読みたい人々のために残しておきます。
目的
WebCPU_VM(OSECPU-VMのJavaScriptによる実装)でフロントエンドコードを直接実行できるようにするために、バックエンドコードへ変換するための情報を集める。
- page0034[Q0014]で既に変換の方法は示されているのですが、この変換もJavaScriptで実装したいのです…。
参考になりそうなURL
- http://k.osask.jp/klog/?osecpu_0001
- http://osask.sourceforge.jp/w/634.html
- page0054
- 符号付きhh4エンコードの解説>(3) hh4のエンコードテーブル
現在の予想
- FrontEndCodeは、全体的にhh4エンコードを利用している
- しかも特殊形式のhh4を一部使っている?(リンク1を参照)
- ただしデータ部分はエンコードされていないみたい…
app0023(bball)の解読
まだ途中です…やっと命令境界がみえてきた!fcodeのおかげです。
:シグネチャ
05e1
:DATA(type:0x03, size:0x20)
ae3a0 == 2E 3 20
:データ本体
c4 64 bb 3d a4 1d 81 09
5a 05 35 11 17 2c 07 51
07 77 17 9c 35 b7 5a c3
81 bf a4 ab bb 8b c4 64
6 5 0 8f = 6 5 0 F
88 0 1 0 = 8 0 1 0
88 1 1 0 = 8 1 1 0
4 3 2 6 = 4 3 2 6
6 6 b8 88 = 6 6 38 8
88 2 2 0 = 8 2 2 0
88 3 2 0 = 8 3 2 0
4 95 4 5 aa = 4 15 4 5 2A
a5 4 0 1 = 25 4 0 1
4 95 4 bf ac 1 = 4 15 4 3F 2C 1
1 = 1
a5 4 87 2 = 25 4 7 2
4 5 3 85 = 4 5 3 5
1 = 1
現状の解析コード
****LoadFrontEndBinaryText****
2E:DATA(type:0x3, length:0x20); [C464BB3DA41D81095A053511172C07510777179C35B75AC381BFA4ABBB8BC464]
06:LOOP.Begin(R5, initBy:0x0, endUntil:0xF);
08:LMEM(R0, P1, reserved:0x0);
08:LMEM(R1, P1, reserved:0x0);
04-03:PLIMEM(P2, Offset:0x6);
06:LOOP.Begin(R6, initBy:0x38, endUntil:0x8);
08:LMEM(R2, P2, reserved:0x0);
08:LMEM(R3, P2, reserved:0x0);
04-15:SUB(R4, R5, x:0x2A);
25:CMPG(R4, R0, x:0x1);
04-15:SUB(R4, R3F, x:0x2C);
01:LABEL
01:LABEL
25:CMPG(R4, R7, x:0x2);
04-05:03:drawLine(mode:0x5);
01:LABEL
****LoadFrontEndBinaryText End****
疑問点メモ
- 4 95 4 5 aa = 4 15 4 5 2A
- 4 95 4 bf ac 1 = 4 15 4 3F 2C 1
- どうしてどちらも同じSUB[4-95]なのに引数の数が違うんだ!?
- SUBなど三項演算子の第三引数は符号付き拡張整数みたい
- 符号付きhh4の仕組みがよくわからない…単なる補数表現?
まだ作成中…
コメント欄(間違いの指摘や、情報を知っている方は教えてください!)
- おもしろそうなことをはじめましたね!・・・そうですね、符号付き整数についてはhh4の特殊形式と言えるかもしれません。 -- K 2013-08-17 (土) 21:43:50
- このWebCPU_VMって、もしかしてすでに結構動いていませんか?!すごい!! -- K 2013-08-17 (土) 21:50:36
- バックエンドはbballが動く最低限の機能は実装しました…でもフロントエンドコードの仕様が難しいです… -- hikarupsp 2013-08-17 (土) 21:52:59
- きっと5で始まるAPI呼出し命令が難しいんですよね?それ以外はどうですか?何とかなりそうな感じですか? -- K 2013-08-17 (土) 21:59:03
- page0062を見るとフロントエンドコードの切れ目が分かると思います。そこから勉強するのが早道かもしれません。 -- K 2013-08-17 (土) 22:00:30
- fcodeが役に立ってよかった!>まだ途中です…やっと命令境界がみえてきた!fcodeのおかげです。 -- K 2013-08-17 (土) 22:18:39
- 三項演算子は、基本的に第一項と第二項がレジスタで、第三項が拡張符号付き整数です。しかしこれでは、 R04=1-R04;が表現できません。このような時は、とりあえずR04=R3F-R04;のコードを出力した直後に、R3Fに入れたかった整数を拡張符号付き整数で記述します。>どうしてどちらも同じSUB[4-95]なのに引数の数が違うんだ!? -- K 2013-08-18 (日) 02:34:50
- 符号付き整数は、2桁以上なら普通の補数表現です。1桁の場合、7が使えないので、-1がうまく表現できません。ということで、1桁の場合は特別ルールになっています。>符号付きhh4の仕組みがよくわからない…単なる補数表現? -- K 2013-08-18 (日) 02:38:13
- 拡張符号付きhh4はpage0054の(3)が詳しいかも? -- K 2013-08-18 (日) 03:25:14
- WebCPU_VMの完成度が日に日に上がっている! -- K 2013-08-19 (月) 23:36:42
- page0063に参考になりそうなことを書きました! -- K 2013-08-21 (水) 13:51:41
- すごくがんばっているのが分かるので、できれば少しくらい手伝ってあげたい・・・今は時間がなくてごめんなさい! -- K 2013-09-12 (木) 00:54:06
- おめでとうございます! >(なぜ終了条件に、実行前にP05に渡した、入力データの終端を使っていないのか少し不思議) ちなみにこれは以前からの手抜きです・・・。 -- K 2013-09-15 (日) 06:38:43