アセンブラの生産性
昔、アセンブラの生産性を画期的に上げる開発環境、というのを作ったことがありました。
MZ-80という8bitパソコン用で、CPUはZ80でした。
アセンブラの何がいやかって、1命令でできることが限られているので、すぐ縦に長いリストになってしまい、見通しがとても悪いことです。
1行に、複数のニーモニックを並べられたらいいのに。
さらに、どうせ「足す」とか「移動」とか「比較」とかしかしないのに、ニーモニックが長ったらしい。
ちょうどそのころ、GAME言語というのがありまして。
GOTOは#、CALLは! という具合に、なんでも記号化してしまうのですが、これを応用すればいいんじゃないかと。
たとえば、BASICの
10 for i=1 to 10: next i: print “end”
を普通にZ80のアセンブラで書くと、
LD C,10
LD A,1
LABEL1:
INC A
CP A,C
JRNZ LABEL1
LD DE,LABEL2
CALL xxx (←システムコール)
HALT
LABEL2: DB “end”, 0
とかになるわけですが、これを私の作ったシステムで書くと
10 C,10 A,1
20 +A ;A,C #N20
30 P,^40 !xxx %HALT
40 “end” $0
とかになるわけです。ほら、行数少ないから見通しがいいし、無駄なニーモニックがなくレジスタや数値が前面に出てわかりやすいでしょ?
(言語仕様ちゃんと覚えてないので、細部は違ったかも。LDは書かない、という仕様が画期的! と自分では思っていた)
(BASICやGAMEみたく、行番号があるんです)
(^ は、行番号の場所をアドレスと見なす指定。PはDEレジスタを示す)
某パソコン誌に投稿したのですが、紙面掲載には至らず。
まあ、MZ-80Bというのもすでにマイナーだった時期ですし、PC-8001用だったらひょっとして、と思わなくもないのですが。
それはともかく、アセンブラの生産性って、このときから全然進化してないような気がするのですが……。
アセンブラで書く必要なんかないからいい、ってことなんでしょうかね?
それとも私のこの処理系、わかりやすくなってないですか?
よし、bizzfizzも書いてみましょう!
……あでも、z80って割り算命令ないから、「3で割り切れるかどうか」の判定ってどうやればいいんだろう。