sbc09 に付いていたので。stack base の言語で、PostScript の先祖です。Moore が作ったもの。Stack base ってのは Java のbyte codeも同じ。Javaの先祖でもあるな。
compiler 込みな言語かつ、自身の書き換えが可能な「最初の reflective な言語」です。実装もcompact。天文所とかでマイクロコンピュータでの望遠鏡制御とかに使われていたらしい。
1 1 + .
が「1と1を足して表示する」。日本語と同じってわけですね。1 1 で二つ1をstackにpushして、+ でstack top に2が入り、それを . で表示します。Java のbyte codeもこんな感じ。
:でプログラムに名前を付けて、それが辞書に登録されます。この辺はPostScriptがそのままパクった。
おそるべきことにアセンブラのソースコードそのものもforthとして記述できる。
CODE KEY ( --- c)
JSR 0
CLRA
STD ,--S
NEXT
END-CODE
とかが書いてあって、これをそのままforthのcross assembblerがバイナリに変更して、forth interpreterそのものを作るってわけ。
ところが、出力コードは
JMP [,Y++]
とかの塊なので、os9用にPICにするのは不可能。なので、前田さんが言ってたように level 2 で64k 確保して動かす方式を使ってみました。
sbc09 のIO routineって、address 0 からなのな。その辺を設定して S rec format の forth kernel をloadする感じ。
実際に実行してみると、ほとんどは stack のお手玉をやってる感じでくそ遅そう。JIT compiler でもあれば。もちろん、8bit CPUでは無理ですが。
x=0f9d y=8000 u=1d55 s=7bfc a=1c b=1b cc=80 dp=00 pc=155C: BD 04 0C JSR $040C
x=0f9d y=8000 u=1d55 s=7bfa a=1c b=1b cc=80 dp=00 pc=040C: EF A3 STU ,--Y
x=0f9d y=7ffe u=1d55 s=7bfa a=1c b=1b cc=80 dp=00 pc=040E: EE E1 LDU ,S++
x=0f9d y=7ffe u=155f s=7bfc a=1c b=1b cc=80 dp=00 pc=0410: 37 80 PULU PC
x=0f9d y=7ffe u=1561 s=7bfc a=1c b=1b cc=80 dp=00 pc=14D6: BD 04 0A JSR $040A
x=0f9d y=7ffe u=1561 s=7bfa a=1c b=1b cc=80 dp=00 pc=040A: 37 80 PULU PC
x=0f9d y=7ffe u=1563 s=7bfa a=1c b=1b cc=80 dp=00 pc=07D1: EC F4 LDD [,S]
x=0f9d y=7ffe u=1563 s=7bfa a=1d b=55 cc=80 dp=00 pc=07D3: ED E4 STD ,S
x=0f9d y=7ffe u=1563 s=7bfa a=1d b=55 cc=80 dp=00 pc=07D5: 37 80 PULU PC
x=0f9d y=7ffe u=1565 s=7bfa a=1d b=55 cc=80 dp=00 pc=0523: EC E1 LDD ,S++
x=0f9d y=7ffe u=1565 s=7bfc a=1d b=55 cc=80 dp=00 pc=0525: ED A3 STD ,--Y
x=0f9d y=7ffc u=1565 s=7bfc a=1d b=55 cc=80 dp=00 pc=0527: 37 80 PULU PC
x=0f9d y=7ffc u=1567 s=7bfc a=1d b=55 cc=80 dp=00 pc=054E: 1F 40 TFR S,D
x=0f9d y=7ffc u=1567 s=7bfc a=7b b=fc cc=80 dp=00 pc=0550: ED E3 STD ,--S
入力行の処理の辺りで手間取りましたが、久しぶりにS record入力とかを書いたのが面白かった。
forthの実装は、もう少し調べてみるかな。
OS9:sbc09 ../../../examples_forth/kernel09
Welcome to Forth
sbc09 ../../../examples_forth/kernel09
Error -13 sbc09
Welcome to Forth
: OUTMATH \ Output a mathematical calculation
." We will now calculate: (2 + 3) * 5" CR
2 3 + 5 *
." This equals: " . CR ;
OK
OUTMATH
We will now calculate: (2 + 3) * 5
This equals: 25
OK
2 3 + 5 *
OK
.
25 OK
No comments:
Post a Comment