ラベル SBC8080 の投稿を表示しています。 すべての投稿を表示
ラベル SBC8080 の投稿を表示しています。 すべての投稿を表示

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年近く前に、信じられないぐらい機能的には貧弱なコンピュータ上でこれらの言語が動いていたことを思い返すと、感無量です。

2019年4月27日土曜日

SBC8080でGAME80がようやく動作

SBC8080でGAME80がようやく動作しました


4月20日のブログでGAME80が動作しませんと書きましたが、ようやく動作しました。
INCH, OUTCH, ROLCATルーチンを色々と書き直してみたり、入力したバイナリリストを何回も見直してみたりしましたが、結果は変わりません。
ついにはSBC8080付属のモニタの逆アセンブル機能を用いて、リストをプリントアウトして読もうとしてみたりしましたが、やっぱり原因はわかりません。

ただ、TeraTermの改行の送信コードをCRからLFに変えると、改行が多くなりすぎるものの一応動作することを見つけていたので、プログラム内での改行コードの扱いに関係しているという見当をつけてリストを眺めていました。

そんな時に、元記事中の変更する可能性のあるデータ(表1)の中に、CRコードが0Ahであると書かれているのに気づきました。(もっとちゃんと読んでおくべきでした...)
ということで、アドレス8C77hの値を0Ahから0Dhに変更することで無事に動作しました。


起動手順

メモリダンププログラムを入力してみました

その実行画面


追加変更した箇所


INCHルーチンはモニタの割り込みを使用した入力ルーチンを利用したので、ROLCATルーチンは不要となりました。

以下に変更・追加箇所を記しておきます。
************************************************
変更箇所
(1)8C77 0D
(2)8C96 CD 7C 00     CALL  007C
(3)8C99 C3 9F 8C     JMP    OUTCH
(4)8C9C C9 00 00     RET NOP NOP
(5)8797 CD 96 8C
    87A2 CD 96 8C
追加箇所
OUTCH 8C9F F5 PUSH PSW
             A0 DB 01 IN 01H
             A2 E6 01 ANI 01H
             A4 CA A0 8C JZ 8CB9
             A7 F1 POP PSW
             A8 D3 00 OUT 00H
             AA C9 RET
************************************************

動作したという報告だけでは、ああそうですかという話でしかないので、まだ変更すべき点がありますが(配置アドレスの変更、プログラムの格納アドレスの変更、第1・第2スタックの変更などSBC8080に合わせる改造が必要)、とりあえず現行のもののバイナリリストと逆アセンブルしたリストOneDriveに上げておきます。

[4月30日訂正]逆アセンブルしたリストまで公開するのはまずかったと思いますので、バイナリリストのみの公開に変更しました。

次は、MicroPascal80かな。


2019年4月20日土曜日

SBC8080にGAME80をインプリメントの試み

SBC8080にGAME80をインプリメントしようとしたのですが...


まず、せっかくSBC8080を製作したので、ソフトを作ってみようとしたのですが、PALO ALTO TINY BASICはメモリをアクセスできないようです(本当か?)。
68系の電大版BASICやGAME68ではできるので、できて当たり前だと思っていましたが、なぜでしょうか。
ならばモニタでと思いましたが、このモニタのアセンブラや逆アセンブル機能はとても便利ですが、メモリ中のバイナリを表示・変更する機能がないようです(私が使い方を知らないだけ?)。

80系のプログラムの経験はほとんどないので、モニタを自作するなんてとても無理ですので、言語を入れるしかないということで、候補に挙げたのがGAME80とMicroPascalです。

まずGAME80ですが、高岡洋一さんによってTK-80BS用に作成されたもので、ASCII誌の1979年1月号に掲載されました。(私はENCYCLOPEDIA ASCII 第3巻に載っていたものを入力しました。)
プログラムは$8600~$8C88で、その後ろにSBC8080用のI/OルーチンをくっつけてROMの$7800からに、そして転送プログラムを$7F00からに焼いて実行してみましたが、正常に動作しません。(I/Oルーチン等は下に記述しておきました。)

正常に動作しない実行画面

画面のように、:が表示された後に入力を受け付けるのですが、入力後は改行されずに行頭に戻るだけです。さらに入力は受け付けるのですが、重ね書きになるだけです。
モニタに戻って、$8E00からを見てみると先頭の$8E00が$FFのままで、入力したプログラムは保存されていません。

GAME80本体のリストは2度確認しましたし、とても見やすい印刷ですので入力ミスはないと思うのですが。。。8080のプログラム経験がないので、自信はないのですが、I/OルーチンのうちINCHとOUTCHについては動作確認をしたつもりです。

というわけで、どこが間違っているのか分からず、中断状態です。
ネットには、SBC8080でGAME80を動作させておられる方が見えますので、できるはずだとは思いますが、私の手に余っています。アドバイスいただけるとありがたいです。
下に、追加変更箇所を記しておきます。

追加変更した箇所


◎入出力ルーチン
元のプログラムはTK-80BS用なので以下の3つのルーチンを書き換える。
GETCH $8C96 入力→A
PUTCH $8C99 A→出力
SENSE $8C9C キーが押されていたらキャリーセット、
押されていなければクリア
解説に従って、
BREAKルーチン($8797,$87A1)を CALL $8C96(CALL GETCH)に変更
(文中では$87A1とあるがリストでは$87A2だった)

◎ワークエリア等(とりあえず変更なし)
内容 アドレス データ
プログラム先頭番地 8607 8E00
RAM終了アドレス          8612 9FFF
RUBOUTコード 8C72 08
DELETEコード 8C4F 7F
CRコード 8C77 0A
JOB一時停止コード 87A0 20
JOB打ち切りコード 879B 21
第1スタック                  8618 8E00
                                        875F   
第2スタック                  861B 8DC4

◎メモリマップ(とりあえず変更なし)
8600 - 8C98 GAME80インタプリタ
8C99 - 8CFF I/O その他ルーチン
8D00 -    87 変数 その他
    88 -    89 第2スタックポインタ
    8A -    D3 入力バッファ
      第2スタック
    D4 -    FE 第1スタック
8E00 - プログラム格納域

************************************************
追加箇所
(1)SENSE 8C9C F3 DI
      9D DB 01 IN 01
      9F E6 02 ANI 02
      A1 CA A8 8C JZ 8CA8
      A4 37 STC
      A5 C3 AA 8C JMP 8CAA
      A8 37 STC
      A9 3F CMC
      AA FB EI
      AB C9 RET

(2)INCH   8CAC F3 DI
      AD DB 01 IN 01H
      AF E6 02 ANI 02H
      B1 CA AD 8C JZ 8CAD
      B4 DB 00 IN 00H
      B6 FB EI
      B7 C9 RET

(3)OUTCH 8CB8 F5 PUSH PSW
      B9 DB 01 IN 01H
      BB E6 01 ANI 01H
      BD CA B9 8C JZ 8CB9
      C0 F1 POP PSW
      C1 D3 00 OUT 00H
      C3 C9 RET

変更箇所
(1)8C96 CD AC 8C     CALL  INCH
(2)8C99 C3 B8 8C     JMP    OUTCH
(3)8C9C SENSE
(4)8797 CD 96 8C
   87A2 CD 96 8C

************************************************
以上のルーチンをROMの$7800~$7EFFに保存し、
起動プログラムで$8600からに転送し、起動する。

起動プログラムはROMの$7F00からに置く
             7F00 21 00 78         LXI H,7800H
  03 11 00 86         LXI D,8600H
  06 01 00 F9         LXI B,F900H
  09 7E MOV A,M
  0A 12 STAX D
  0B 23 INX H
  0C 13 INX D
  0D 0C INR C
  0E C2 09 7F         JNZ 7F09
  11 04 INR B
  12 C2 09 7F         JNZ 7F09
  15 C3 00 86         JMP 8600
以上

動作させるまでの道は遠いみたいです。
MicroPascalはソースが公開されているのでこちらをインプリメントした方が速いかなあ。(6802基板でMicroPascal68が動いているので、共通のプログラムが書けて良いかも。)


2019年4月12日金曜日

番外編(その2)i8080Aなどをいただいたので...

とあるところからi8080Aや周辺ICをいただきました



いただいたIC群

80系のセラミックIC

68系のセラミックIC

いただいたICは
80系:INTEL i8080A(2個)、NEC D8080A、iP8031(3個)、ZILOG Z80A
   MOSTEK MK3880N(3個)、RCA CDP1802AE
   iP8228(3個)、iP8212(3個)、iP8224(2個)、uPB8224(2個)など
68系:HITACHI HD6801、FUJITSU MBL6803(4個)
   Motorola MC6830L7、MC6830P8、MC6850L、MC6810AL

CPUだけでなく、周辺ICもセラミック製がいくつもありました。
セラミックICを使ったことはほとんどなかったので、これは作ってみるしかないということで、早速SBC8080基板を入手して製作しました。
(68系にしか手を出さないことにしているのに、、、またやってしまった。。。)

製作したSBC8080 CPU+SUBボード

セラミックICが目立ってる!

サンプルを走らせてみた


1976年製のCPUなので40年以上も前のICですが、ちゃんと動くということに結構感激。
これで何をするという計画もないので、とりあえず製作しただけで自己満足状態ですが、できればBASIC以外の言語を走らせてみたいなと。

68系のICは何かそれらしい活用法を考えようと思っていますが、他にもやってみたいことがあるのでいつになりますやら。(大昔、とても欲しかったMIKBUGが入っているMC6830Lですが、今となってはただの飾りになりそう。)