new2009
2009年 クロス・アセンブラを作る
2009年大改修を終え、復活したTANACOM-1 に最初にやった事は、クロス・アセンブラを作る事でした。
私は、Windows上のC言語は苦手でしたので、ご存知の方も多少おられると思いますが、プログラム言語HSP( Hot Soup Processor )というものを使い、アセンブラを作りました。
テキストエディタで、TANACOM-1 のアセンブラ・ソースを書き、それをクロス・アセンブラに通し、マシン語に翻訳させます。
30年前に毎日パチパチ打ち込んでいたカセットテープ用IPL をアセンブルした画面は、
そして、結果のリファレンスは、
;
; TANACOM-1 カセットIPLローダー 往年のローダー
;
ORG 0x1b00
1B00 : 0000 L 0,0
1B01 : 1121 ST 0,cmtAD ;スタートアドレス格納
1B02 : 091E L 1,cmtLONG ;大きさ-1格納
1B03 : 191F ST 1,cmtNOW
1B04 : 9113 cmtL2 BAL cmtIN ;1波読み込む
1B05 : C104 BNP cmtL2 ;スタート1を待つ
;
1B06 : F7F1 cmtL4 CNT 16 ;1ワード読み込み
1B07 : 9113 cmtL3 BAL cmtIN ;1波読み込む
1B08 : 0922 L 1,ReadWD
1B09 : F609 SL R1.Carry
1B0A : 1922 ST 1,ReadWD
1B0B : 8907 B_cnt cmtL3 ;繰り返し
1B0C : 0122 L 0,ReadWD
1B0D : 091F L 1,cmtNOW
1B0E : 1721 ST 0,Ix,Id,cmtAD ;データを格納
1B0F : 4801 S 1,1
1B10 : 191F ST 1,cmtNOW
1B11 : B106 BNM cmtL4
1B12 : 80FF B 0x0FF ;FORSEのスタートへジャンプ
1B13 : :
1B13 : cmtIN ; 1波読み込みサブルーチン
1B13 : 1920 ST 1,cmtRET ;戻りアドレスを保管
1B14 : 0000 L 0,0
1B15 : F60A cmtL5 SL R1.Sin ;Sinより取り込み
1B16 : 5801 N 1,1
1B17 : A115 BNZ cmtL5 ;0 -> 1を検出
1B18 : 2001 cmtL6 A 0,1 ;波形長をカウントアップ
1B19 : F60A SL R1.Sin ;Sinより取り込み
1B1A : 5801 N 1,1
1B1B : D118 BZ cmtL6 ;1 -> 0を検出
1B1C : 7032 C 0,0x32 ;識位置と比較、結果はCarryに
1B1D : 8320 B Id,cmtRET ;リターン
;
1B1E : 06D0 cmtLONG DW 0x06D0 ; FORSE1.8Kの大きさ-1
1B1F : cmtNOW DS 1
1B20 : cmtRET DS 1
1B21 : cmtAD DS 1
1B22 : ReadWD DS 1
と、なります。
30年前は、すべて、紙の上でやるハンド・アセンブルだったんですがねー。
FORSEなど2Kword( 4Kbyte )のアセンブルなんて、大変しんどくて、二度とやろうとは思いません。
でも当時は、8080、Z-80、6800、6502、最初はみんなハンド・アセンブルです。
マイコン雑誌には、アセンブル後のバイナリーがリストとして掲載されていましたので、皆さんその16進データを、定規を当て当て、手入力していました。
当時、本当はアセンブラも作りたかったのですが、2パス(リストを読み込んで訳し、その作業を2回繰り返して、全体の翻訳を完成させる)方式をやるためには、読み書きがやり安い外部記憶装置が必要でした。
TANACOM-1 には、外部記憶は、カセットテープしかなかったので、2パスの作業は困難でした(出来ないことは無いが現実的では無かった)。
ところが30年後、WindowsXP上で、クロス・アセンブルが出来るなんて、夢のようです。
クロス・アセンブラと同時に、
- Windows上で、TANACOM-1 のRAMを読み書きするRAMモニタ( 9600ボーのシリアル通信 )
- クロス逆アセンブラ
を作りました。
この逆アセンブラのお陰で、当時のマシン語をソースリストに戻せるようになり、それを編集して、再アセンブルが可能となります。
さらなる夢は、クロス C コンパイラですが、その前に、FORSE の完全ソース化とバージョンアップもやりたいところです。
まだ、やりたい事いっぱいです・・・!