2019年5月14日火曜日

SBC8080でmcroPASCAL80を走らせる

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ファイルに変換します。保存形式への変換は前回のブログで公開したCvtMotHexBin.exeを使っています。→ GAME80C-6000.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

(4)Loader 公開するファイル中にソースも入れてあります。(転送ルーチンは、松本吉彦著「私だけのマイコン 設計&製作」中の8080の解説から借用しました。)
(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年近く前に、信じられないぐらい機能的には貧弱なコンピュータ上でこれらの言語が動いていたことを思い返すと、感無量です。

4 件のコメント:

  1.  こんにちは
     microPASCAL80をCP/M-80でも動かしてみました。
     私はmicroPASCAL80を使ったことが無いのでCP/M上で問題なく動いているか細かくは確認できていません^^;
     CP/M-80環境であれば、他のPASCALやCが使えるので今回はここまでにしようと思います。

     下記はアセンブルと起動のログです。オープニングメッセージがコマンド入力行を上書きしてしまうので'*'を2個減らして先頭にCR,LFを追加しました。


    b>a:m80 =mpas80/l

    No Fatal error(s)

    b>a:l80 mpas80,mpas80/e/n

    Link-80 3.44 09-Dec-81 Copyright (c) 1981 Microsoft

    Data 0100 1431 < 4913>

    44297 Bytes Free
    [0000 1431 20]

    b>mpas80
    ** MICRO PASCAL ** VER 2.2

    READY.
    >B
    WRITE("HELLO",/).

    >G/
    HELLO

    READY.
    >

    返信削除
    返信
    1. skyriverさんは言語を作れる方なので、このmicroPASCALにはさほど魅力を感じられないと思いますね。私は以前のブログにも書きましたが、いつかは言語を作りたいと昔から思っており、丸山さんの記事中の構文図を見て、これを元にして自分のPASCAL言語を作りたいと思った記憶がありますので、思い入れがあります。(今となっては、特に使い易いというわけではないのですが。)情けないことに、コンパイラの本を何冊読んでも良く分からないことが多く、未だに作れません。
      skyriverさんのpicleインタプリタとコンパイラをpicに書き込んで使ってみているところです。このような言語が作れるなんてとても羨ましいです。さらに、このpicleがCP/Mのシステム作りに役立っているなんて本当にスゴイです。
      私はCP/M-68Kを走らせてみたいのですが、CP/Mの経験がないので、まずCP/M-80を動かしてから68Kをと思っていますので、skyriverさんのCP/Mシステムを2つとも真似させていただこうと思っています。よろしくお願いいたします。

      削除
  2. はじめまして
    microPASCAL80がとても良くて感激しました(作者とOld68fun様とskyriver様に感謝します)
    Old68fun様とskyriver様の書き込みを参考に私もmicroPASCAL80をCP/M-80で動かしました
    CP/M版ではファイルのロード・セーブができます
    このCP/M版へのbsdiffの差分ファイルを公開します

    ダウンロード
    https://ux.getuploader.com/nana4/download/4

    パッチの当て方
    >bspatch MPAS80.bin MPAS80C.COM MPAS80.bsdiff

    返信削除
    返信
    1. ブログを見ていただきましてありがとうございます。
      私は68系の人間なので80系はほとんど全く分からないのですが、skyriverさんや他の方々のブログなどを頼りに何とか動作させることができています。
      公開された差分ファイルを早速ダウンロードさせていただきました。これから(四苦八苦しながら?)動かしてみたいと思います。ありがとうございました。

      削除