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が動いているので、共通のプログラムが書けて良いかも。)
モニタに戻って、$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が動いているので、共通のプログラムが書けて良いかも。)
0 件のコメント:
コメントを投稿