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 で動作するシミュレータが幾つかあり、下記はその一例。(配布自由とのこと)
概要
・本プログラムは 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 エミュレータ 説明書
![](https://www.google.com/images/icons/product/drive-32.png)
GMC-4用RPG NGA48 説明書
![](https://www.google.com/images/icons/product/drive-32.png)
NGA-48 プログラム・リスト
![](https://www.google.com/images/icons/product/drive-32.png)
NGA-48 フローチャート
![](https://www.google.com/images/icons/product/drive-32.png)
プログラム・リストの入力について
[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