SBC8080(CPUボード+SUBボード)でmicroPASCAL80が走りました
4月27日のブログで、SBC8080でGAME80が動作したと報告しましたが、それを見てくださったskyriverさんが、CP/M80上でGAME80インタプリタだけでなく、コンパイラも走らせました。それを参考にして、私のSBC8080でもコンパイラを走らせることができました。
GAMEIIIは68系で使用していましたが、アセンブラよりも手軽にコンピュータを自由にあやつれるのはとても魅力的ですが、プログラムの可読性がいまいちだなと思うのは私だけでしょうか。(私が慣れることができなかっただけ?)その頃はUCSD PASCALにあこがれていましたね。
GAMEIIIより1年半ほど後に、丸山定信さんによりASCII誌(1980年1月号)にmicroPASCAL80が発表された時は、68系の私はうらやましくてただ指を銜えて見ているだけでした。
ようやく11月号に河崎道明さんによってmicroPASCAL68が発表され、当然私も5KB近いバイナリを頑張って入力しました。今でも、私の自作6802基板で動いています。
今回、SBC8080基板を製作し、GAME80が動いたので、当時あこがれていたmicroPASCAL80も走らせてみることにしました。
丸山さんの発表ではソースリストも掲載されていたのでアドレス変更も含めて楽勝だと思ったのですが、当時の放電プリンタの文字には悩まされましたね。
動くことは動くのですが、変数の代入ができないという変な状況に悩まされましたが、何回も見直した結果、ソースの入力間違いが一文字あるのをようやく見つけ、それを訂正して無事に動作しました。
ということで、GAME80インタプリタ, GAME80コンパイラ, microPASCAL80の3つをSBC8080SUBボード上のROMに入れ、モニタから自作のLoadコマンドで選択・実行する形で仕上げました。
(1)GAME80インタプリタ 元がソースでなくバイナリなのでそのままのアドレス8600hからのバイナリファイルをROMの7800hからに収めるようにHEXファイルに変換します。→ GAME80-7800.hex
(2)GAME80コンパイラ 元はGAME80のプログラムですからGAME80インタプリタの動作中に読み込めばよいのですが、その手間を省くために、予めメモリ中の保存形式に変換してROMに収めておき、メモリのA000hからに転送します。ROMの6000hからに収めるようにHEXファイルに変換します。保存形式への変換は前回のブログで公開した
[5月25日訂正]変換用のプログラムはCvtMotHexBin.exeではなくChglno.exeです。
(3)microPASCAL80インタプリタ 元がソースですのでオリジナルの2000hからの開始アドレスを8000hに変えてアセンブルします。できたバイナリをROMの4800hからに収めるようにHEXファイルに変換します。→ MPas80-4800.hex
(4)Loader ソースは7F00hからですので、そのままアセンブルしてHEXファイルに変換します。 → LOADER.hex
(保存形式への変換、HEX形式への変換には前回のブログで公開した自作のChglno.exe, CvtMotHexBin.exeを使っています。)
![]() |
ROM中の配置図 |
[5月16日訂正]上図中のGAME80インタプリタとGAME80コンパイラの位置が入れ替わっています。正しくは、コンパイラが6000hからで、インタプリタが7800hからです。
これら4つのHEXファイルを、SBC8080のdatapck中のPTBEXSA.HEXファイルの後ろにつけてROM用ファイルの出来上がりです。
各ファイルの変更点をまとめておきます。
(1)GAME80 4月27日公開の「SBC8080でGAME80がようやく動作しました」に書いた通りです。
(2)GAME80C skyriverさんのブログにありますような変更・修正を加えます。
(3)MPas80 以下に変更・追加部分を示します。
オリジナル
2792 32D9 CDC003 BREAK: CALL PLIN
2793 32DC FE03 CPI 03H
2794 32DE C0 RNZ
2795 32DF C30320 JMP START2
2796 ;
2797 32E2 CDB903 GETCH: CALL GETCHR
2798 32E5 CAE232 JZ GETCH
2799 32E8 C3DC32 JMP BREAK+3
変更・追加部分
2793 92D9 CDFA92 BREAK: CALL PLIN
2794 92DC FE03 CPI 03H
2795 92DE C0 RNZ
2796 92DF C30380 JMP START2
2797 ;
2798 92E2 CDF792 GETCH: CALL GETCHR
2799 ; JZ GETCH
2800 92E5 00 NOP
2801 92E6 00 NOP
2802 92E7 00 NOP
2803 92E8 C3DC92 JMP BREAK+3
2804
2805 ;++++++++++++++++++++++++++++++++++++++
2806 ;* I/O ROUTINE
2807
2808 92EB F5 PUTCHR: PUSH PSW
2809 92EC DB01 PUT0 IN 01H
2810 92EE E601 ANI 01H
2811 92F0 CAEC92 JZ PUT0
2812 92F3 F1 POP PSW
2813 92F4 D300 OUT 00H
2814 92F6 C9 RET
2815
2816 92F7 C37C00 GETCHR: JMP 007CH
2817
2818 92FA 3E00 PLIN: MVI A,00H
2819 92FC C9 RET
(1),(2),(4)のいずれも、入力ルーチンはモニタ内のルーチンを使用しています。
下の画像は、起動・動作の様子です。例として入力したプログラムはmicroPASCAL68の記事中の階乗の計算プログラムです。
起動・動作画面 |
これで68基板と同様にGAMEとmicroPASCALという2つの言語が使えるようになりましたので、8080の機械語に触れずにSBC8080で遊ぶことができそうです。
(1)GAME80のバイナリとHEXファイル
(2)GAME80Cのメモリ保存形式に変換したものとそのHEXファイル
(3)MPas80のバイナリとそのHEXファイル
(4)LoaderのソースとバイナリのHEXファイル
と、これらを1つにまとめたものをOneDriveに上げておきます。
今となっては、誰でもが普通に高級言語が使えますので、GAMEやMicroPascalにそれ程の魅力は感じられないかとは思いますが、40年近く前に、信じられないぐらい機能的には貧弱なコンピュータ上でこれらの言語が動いていたことを思い返すと、感無量です。