シミュレータ作りの準備


プチコンとの通信手段はかなり限定されているため、シミュレータをホストPC上に準備してそちらで十分にデバッグしてから実機でパフォーマンスを見る という開発スタイルを取ることになる。
描画はSDL2を使う。SDL2には最近emscriptenサポートが追加されたので、Webブラウザ上でも活用できる可能性が有る。

SDL2はSDL1と異なり、Render API群を使用することでDirectX/GLを使用した拡大回転縮小付きのblitを直ぐに使用できる(SDL_RenderCopyEx)。

必要な機能

命令表のページ( http://smileboom.com/special/ptcm3/reference/ )を眺めて、必要な命令をピックアップする。

不要。

必要なものは、=(代入) VAR INC DEC SWAP COPY(配列) COPY(DATA) SORT RSORT PUSH POP SHIFT UNSHIFT。
DIMはVARの別名で、teslawireではSTRICTモードしか使用しないのでVARを使う。プチコンにおけるINC/DECは参照と代入のsyntactic sugarであり、配列の添字を2度評価する。CHKVARは配列等を評価できないのでSTRICTモードでは通常役に立たない。

必要なものは、@(ラベル) GOTO IF-THEN-ELSE-ENDIF FOR-TO-STEP-NEXT WHILE-WEND REPEAT-UNTIL CONTINUE STOP ON-GOTO
CHKLABELはteslawireではユースケースが無い。IF-GOTOはsyntactic sugarで、特に使用する必要性は無い。GOSUB、ON-GOSUBは関数内で使用できないのでteslawireでは避ける。基本的に全てのサブルーチンはDEFで定義できる関数や手続きを使用する。

必要なものは、DEC COMMON-DEF END RETURN XON XOFF
CALLはセマンティクスがよくわからないので実装しない。多分遅い。興味深いことに、プチコンの手続きは多値の返却をサポートしている。ただし、可変長のarityをサポートしない(配列を使用する必要がある)。

必要なものは全て。DATA READ RESTORE
ゲームデータの記述にはDATAは使用しないが、細かいツールをシミュレータ上で検証するために必要。

必要なものは、OPTION-STRICT WAIT VSYNC REM
日付/時刻やダイアログ系は使用しない。

必要なものは、CLS COLOR LOCATE PRINT
コンソールはデバッグ目的にのみ使用する。このため、フォント定義やSCROLL、ATTR等はサポートしない。

必要なものは、BUTTON STICK MICSTART MICSTOP MICDATA MICSAVE
STICKの挙動はまだ理解できていないので実機検証が必要。マイク関連はフルサポートしたいがリサンプラがSDL2には無いので外部ライブラリを探してくる必要がある。ジャイロや加速度センサはteslawireでは使用しない。

必要なものは、LOAD SAVE USE
EXECは破壊的な実行なので多分使用しない。プログラムをモジュール化する場合は、USEとCOMMON DEFによる関数定義の組合せが好ましいように思える。

不要

必要なものは、XSCREEN(2に固定) DISPLAY VISIBLE BACKCOLOR
画面モードは2のみを使用する。3Dエミュレーションのためのデータ集めは後程。

必要なものは、GPAGE RGB GCLS GCOPY GLOAD GSAVE GFILL
いわゆるペイントルーチン群(GLINE等)は使用しない。ただし、GFILLは例外で、デバッグデータの書き込みに使用する。

必要なものは、SPPAGE SPDEF(変数による定義) SPSET SPCLR SPOFS SPHIDE SPROT SPSCALE SPCOLOR SPCHR
リンク、アニメ、内部変数は使用しない。また、ホーム位置の動的な変更も行わない。

必要なものは、BGPAGE BGSCREEN BGCLR BGHOME BGOFS BGROT BGSCALE BGPUT BGFILL BGCOPY BGLOAD BGSAVE

必要なものは、BEEP
デバッグ用に使用する。

後回し。

不要

全て必要。FLOOR ROUND CEIL ABS SGN MIN MAX RANDOMIZE RND RNDF SQR EXP LOG POW PI RAD DEG SIN COS TAN ASIN ACOS ATAN SINH COSH TANH
ひとまず有理数の範囲で結果が正しければOKということで。。

必要なものは、ASC CHR$ VAL STR$ HEX$ LEN MID$ LEFT$ RIGHT$ SUBST$
LENは文字列に分類されているが、実は配列変数にも適用可能。FORMAT$は多分不要。ちなみにVAL("nan")はNaNではなくゼロになる。また、プチコン3号の内部文字コードUnicodeであるため、ASC等でドキュメントされているASCIIコードは実際にはUnicodeである

必要なものは、PRGEDIT PRGGET$ PRGSET PRGINS PRGDEL PRGSIZE
PRGNAME$は不要。命令表ではPRGGET$に$サフィックスが付かないのは多分誤植。

必要なものは、CSRX CSRY CSRZ FREEMEM(ダミー) VERSION PRGLINE PRGSLOT RESULT MAINCNT MICPOS MICSIZE TRUE FALSE

次の一手

必要な手続きについて、挙動を検証するための小さなプログラムを書いていく。例えば、CHR$にUnicode範囲外の値を与えたらどうなるのか等。そもそもの使い方を理解していない手続きも多々あるので。。
シミュレータの実装をCでやるかnmoshでやるかは考え中。GCの影響を避けるためにはC(++)で書いた方が良いが、そもそも文字列変数に格納する文字等GCが必要なものも有る。