PB-SIM(高速)及び PokecomGO(fast)対応

PB-100 BASICが機械語のエミュレートをするだなんて、いつの間にそんなに「上から」になったのか? 

「8 ビットマイコンでエミュレートされた仮想 4 ビットコンピュータ GMC-4 を、 Windows でエミュレートされた PB-SIM がエミュレートする」 ・・・ボクは一体何者で一体何を実行しようとしているのだ?と、PB 自身がツイートしそうな、シャレで作 ったエミュレータです。

恐るべき鈍足・・・無意味? いいえ、意味を求めてはいけません。。 

<学研マイコン GMC-4 について> 

GMC-4 は 4 ビットプロセッサを使用したワンボードマイ コン。学研の大人の科学マガジン vol.24 の付録で、 1981 年発売の学研電子ブロック FX シリーズの一つであ る FX-マイコン R-165 のマイコンユニットと互換性がある。 80ニブル(40バイト)のプログラムメモリ(00~4F番地) と、16 ニブル(8 バイト)のデータメモリ(50~5F 番地)の RAM を持ち、この領域に機械語やデータを入力すること により 2 進 LED,7 セグメント LED,スピーカー等を制御 する。 

https://ja.wikipedia.org/wiki/GMC-4 

大人の科学マガジン付録の中身は実はシンセサイザ用のマイコンで、GMC-4 という仮想アーキテクチャをエミュ レートしているらしい。どうりで4ビットのくせに音楽関係がリッチなわけだ。。 

<Windows 版 GMC-4 シミュレータについて>

 GMC-4 には Windows で動作するシミュレータが幾つかあり、下記はその一例。(配布自由とのこと)

 http://dansan.air-nifty.com/blog/gmc4-simulator.html 

概要 

・本プログラムは GMC-4 用のプログラムを PB 上で動作させるエミュレータ(のつもり)です。 

・GMC-4 プログラムは、16 進数のダンプリストをプログラム中で$文字変数に与える形で入力します。 

・GMC-4 のメインメモリとデータメモリに対しては、PB の配列変数を割り当てます。 

・GMC-4 の7セグメント LED 及び2進表示 LED は、PB の液晶表示で代用します。 

・音は出ませんので、PB 画面上の擬音表示で代用します。

PB-SIM高速及び Pokecom GO(fast)専用とし、余りにも遅いので PB 実機は推奨しません。 

操作方法 

・プログラムを入力してください。 

・RUN モードで DEFM 85[EXE] と入力し変数エリアを確保して下さい。(PokecomGO のみ。 PB-SIM では不要) 

・ [P0]を実行してください。最初に GMC-4 プログラムを読み込んで配列変数に書き込むため、少し時 間が掛かります。完了すると画面に2進 LED を表示し、GMC-4 プログラムのエミュレーションが、0番 地からスタートします。 

・プログラムカウンタ(GMC-4 の実行アドレス)が 5FH(=95)を超えると、STOP を表示してエミュレー タが終了します。

GMC-4 としての入出力 

キー入力(KA 命令) 

KA 命令によるキー入力は 0~F までが有効です。

それ以外はエラーか不定(GMC-4 プログラムとし ての「暴走」)になります。 

表示

 7セグメント LED・・・PB 液晶画面の0桁目に表示します。 

2進 LED・・・PB 液晶画面の2~8桁目に表示します。”〇” が消灯を、”*”が点灯を示します。 

BEEP 音

 音は出さず、擬音表示で表現します。 

エンド音(CAL ENDS)・・・PB 画面右端に一定時間”END"と表示します。 

エラー音(CAL ERRS)・・・PB 画面右端に一定時間”ERR"と表示します。

 短音(CAL SHTS)・・・PB 画面右端に一定時間”Pi"と表示します。 

長音(CAL LONS)・・・PB 画面右端に一定時間”Pii"と表示します。

 A レジスタで指定した音階(CAL SUND)・・・PB 画面右端に一定時間”P??"と表示します。

GMC-4 プログラムの入力 

・空いているプログラムバンク[P2]~[P8]に、$へ代入する文字列として 16 進数で記載します。 

・書式は下記の通り。最初は 00H 番地で、16 ニブル(8 バイト)ずつ記載し、最後は 5FH 番地です。 

・行の長さと行数は固定です。空いている番地には"F"を記載して下さい。 


[P3] 

1 REM Winker 

2 $="ED81ECA0E10F11F1":GOSUB #9 

3 $="F80ECB1D7F08F00E":GOSUB #9 

4 $="D81ECA6E10F30F00":GOSUB #9 

5 $="80ECBFDFF27F1FFF":GOSUB #9 

6 $="FFFFFFFFFFFFFFFF":GOSUB #9 

7 $="FFFFFFFFFFFFFF00":GOSUB #9 

8 RETURN 


・メインプログラム[P0]の行番号20 に、実行したい GMC-4 プログラムバンクの番号を記載します。 


20 GOSUB #3 

サンプル・プログラム 

プログラム・リストには、あらかじめ3つのサンプルプログラムを含めています。お好みのものをものを[P0]20行で指定してください。

Night Rider 

米国ドラマ「ナイトライダー」に出てくるドリームカー「ナイト 2000」の前面ランプの再現です。 PB エミュレータでは激遅ですが、Windows シミュレータ及び GMC-4 実機ではそれっぽいです。 

Winker 

最近増えてきた自動車のシーケンシャル・ウィンカーの再現です。 何かキーを押すと、左右逆転します。 

NGA48 

世界最小(48 バイト)と NUAO が自負する RPG です。詳細は別添の説明書を参照してください。 PB でちゃんと動きますが、遅すぎてゲームになっていないので、是非 GMC-4 実機か Windows シミュレータでプレイして下さい。(笑 

変数アサイン

GMC-4 エミュレータ 説明書

GMC-4 EMU PB 説明書.pdf

GMC-4用RPG NGA48 説明書

NGA48 説明書 R02.pdf

NGA-48  プログラム・リスト

NGA48 R02.pdf

NGA-48 フローチャート

NGA48 flowchart.pdf

プログラム・リストの入力について

[P0]

10 VAC

20 GOSUB #2

30 PRINT CSR 2;"\CI\CI\CI\CI\CI\CI\CI";

50 J=0

100 GOSUB P(J)*100+200

110 J=J+1:PRINT CSR 9;"   ";

115 IF J>95;STOP:END

120 GOTO 100


199 REM KA

200 F=1:$=KEY:IF $="";RETURN

210 F=0:IF $="F";A=15:RETURN

220 IF $="E";A=14:RETURN

225 IF $="D";A=13:RETURN

230 IF $="C";A=12:RETURN

235 IF $="B";A=11:RETURN

240 IF $="A";A=10:RETURN

245 A=VAL($):RETURN


299 REM AO

300 F=1:$="0123456789ABCDEF":$=MID(A+1,1)

305 PRINT CSR 0;$;:RETURN


399 REM CH

400 F=1:E=A:A=B:B=E:E=C:C=D:D=E:RETURN


499 REM CY

500 F=1:E=A:A=C:C=E:RETURN


599 REM AM

600 F=1:P(80+C)=A:RETURN


699 REM MA

700 F=1:A=P(80+C):RETURN


799 REM M+

800 F=0:A=P(80+C)+A

810 IF A>15;A=A-16:F=1

815 RETURN


899 REM M-

900 F=0:A=P(80+C)-A

910 IF A<0;A=A+16:F=1

915 RETURN


999 REM TIA

1000 F=1:J=J+1:A=P(J):RETURN


1099 REM AIA

1100 F=0:J=J+1:A=A+P(J)

1110 IF A>15;A=A-16:F=1

1115 RETURN


1199 REM TIY

1200 F=1:J=J+1:C=P(J):RETURN


1299 REM AIY

1300 F=0:J=J+1:C=C+P(J)

1310 IF C>15;C=C-16:F=1

1315 RETURN


1399 REM CIA

1400 F=1:J=J+1:IF A=P(J);F=0

1410 RETURN


1499 REM CIY

1500 F=1:J=J+1:IF C=P(J);F=0

1510 RETURN


1599 REM E*

1600 J=J+1:IF F=1 THEN 1610+5*P(J)

1605 RETURN


1609 REM CAL RSTO

1610 PRINT CSR 0;" ";:RETURN


1614 REM CAL SETR

1615 IF C<7;PRINT CSR 8-C;"*";

1616 RETURN


1619 REM CAL RSTR

1620 IF C<7;PRINT CSR 8-C;"\CI";

1621 RETURN


1624 REM NOP

1625 RETURN 


1629 REM CAL CMPL

1630 A=15-A:RETURN


1634 REM CAL CHNG

1635 E=A:A=G:G=E:E=B:B=H:H=E

1637 E=C:C=M:M=E:E=D:D=N:N=E:RETURN


1639 REM CAL SIFT 

1640 F=0:A=A/2:IF FRAC A=0;F=1

1642 A=INT A:RETURN


1644 REM CAL ENDS

1645 PRINT CSR 9;"END";:E=200:GOSUB #1:RETURN


1649 REM CAL ERRS

1650 PRINT CSR 9;"ERR";:E=200:GOSUB #1:RETURN


1654 REM CAL SHTS

1655 PRINT CSR 9;"Pi ";:E=50:GOSUB #1:RETURN


1659 REM CAL LONS

1660 PRINT CSR 9;"Pii";:E=200:GOSUB #1:RETURN


1664 REM CAL SUND

1665 PRINT CSR 9;"P??";:E=100:GOSUB #1:RETURN


1669 REM CAL TIMR

1670 E=A*10:GOSUB #1:RETURN


1674 REM CAL DSPR

1675 E=P(95)*16+P(94):$="":FOR I=6 TO 0 STEP -1

1676  IF FRAC(INT(E/2^I)/2)<>0;$=$+"*":GOTO 1678

1677  $=$+"\CI"

1678 NEXT I:PRINT CSR 2;$;:RETURN


1679 REM CAL DEM-

1680 P(80+C)=P(80+C)-A:IF P(80+C)>0;C=C-1:RETURN

1681 P(80+C)=P(80+C)+10:C=C-1:P(80+C)=1:RETURN 


1684 REM CAL DEM+

1685 E=0:P(80+C+E)=P(80+C+E)+A

1686 IF P(80+C+E)<10;C=C-1:RETURN

1687 P(80+C+E)=P(80+C+E)-10

1688 E=E-1:IF C+E<0;E=15-C

1689 P(80+C+E)=P(80+C+E)+1:GOTO 1686


1699 REM JUMP

1700 IF F=0;F=1:J=J+2:RETURN

1705 E=16*P(J+1)+P(J+2):J=E-1:RETURN


[P1]

1 FOR E=E TO 0 STEP -1:NEXT E:RETURN


[P2]

1 REM NightRider

2 $="80ECAF5E6F184AE5":GOSUB #9

3 $="E6984F1F4AE5E64E":GOSUB #9

4 $="DC7F0080ECAE56F3":GOSUB #9

5 $="A4AF564F424AF569":GOSUB #9

6 $="14EDC7F26F00FFFF":GOSUB #9

7 $="FFFFFFFFFFFFFF07":GOSUB #9

8 RETURN


[P3]

1 REM Winker

2 $="ED81ECA0E10F11F1":GOSUB #9

3 $="F80ECB1D7F08F00E":GOSUB #9

4 $="D81ECA6E10F30F00":GOSUB #9

5 $="80ECBFDFF27F1FFF":GOSUB #9

6 $="FFFFFFFFFFFFFFFF":GOSUB #9

7 $="FFFFFFFFFFFFFF00":GOSUB #9

8 RETURN


[P4]

1 REM NGA48

2 $="EDAD53E130F09C0F":GOSUB #9

3 $="198164F1E7F094EA":GOSUB #9

4 $="8461E420F48E92E4":GOSUB #9

5 $="AC7F5281641AD5C7":GOSUB #9

6 $="F00E7F452191F20F":GOSUB #9

7 $="26827E81F3903000":GOSUB #9

8 RETURN


[P9]

100 FOR I=0 TO 15

110 A$=MID(I+1,1)

120 IF A$="A";P(E)=10:GOTO 190

130 IF A$="B";P(E)=11:GOTO 190

140 IF A$="C";P(E)=12:GOTO 190

150 IF A$="D";P(E)=13:GOTO 190

160 IF A$="E";P(E)=14:GOTO 190

170 IF A$="F";P(E)=15:GOTO 190

180 P(E)=VAL(A$)

190 E=E+1:NEXT I

200 RETURN