Thursday, 3 January 2019

Forth の続き

今日はしばらく Forth いじっていたんですが、

  わからなった Forth の構文がだんだん読めるようになってくる

わけなんですが...

  だんだん、人間でなくなっていくような気もする...

まぁ、Forth は魂売らないとダメ的なところは当時から言われていたんですけどね。

word tableの構造は、

2byte next entry address
1byte word len | 0x80
n byte name
exec code
... next entry

みたいになっていて、実行コードがいきなり書かれてます。byte code じゃないんだよね。code のところには、

jsr nest
code adr word1
code adr word2
unnest

みたいな感じで、最初だけ本当の実行コードが入ってる。nest のroutineが、コードを指してるポインタ(6809ではU)を実行stack(Y上にある)にセーブして、

jsr nest の次のコードを呼び出す。で、word1 で呼び出されたコードは、実行の最後に

pulu pc

で、word2 を呼び出す方式。最後に unnest がよばれると、実行stackから前のUを復帰して、そこから実行するようになってます。なるほどね。

辞書引きながら上のコードを生成するのは難しくない。でも、

  極めて技術的な感じ

はする。まぁ、それが面白いし、それが限界なのかな。

で、だんだん...

: HASH ( c-addr u #threads --- n)
\G Compute the hash function for the name c-addr u with the indicated number
\G of threads.
>R OVER C@ 1 LSHIFT OVER 1 > IF ROT CHAR+ C@ 2 LSHIFT XOR ELSE ROT DROP
THEN XOR
R> 1- AND

とか読めるようになってしまう... これはやばい。

No comments: