SC3K-ZERO(1)
2023.06.04
シン・ESP32評価ボードは開発中ですが、ESP32を使ってSC-3000エミュレータは構築できます。ベースになるSG-1000のエミュレータはこちらを参考にさせていただきました。
・EMWiRES
http://www.emwires.com/ESP32USB/#ESP06
esp_8_bitを参考に作られたものだと想像します。SC-3000にグレードアップするにはキーボードを追加するだけです。USBキーボードI/Fはスイッチサイエンスさんで販売されている「かんたんUSBホスト」を使っています(現在は売り切れになっていますので入荷待ちとなるようです)。
まずはesp_8_bitの回路図を使ってビデオ出力とオーディオ出力端子を取り付けます。その後、SG-1000エミュレータであるESP_8_BIT_MINUSスケッチを使ってESP32へプログラムを転送します。ゲームなどのファイルも用意してフラッシュへアップロードしておきます。Wiiリモコンがコントローラになっていますのでこのリモコンで操作します。起動後、リモコンでファイルが選択できれば大成功です。ここまでできれば第一段階は終了です。どこにも詳しい説明がなかったので成功するまでに時間がかかりました。とはいえ、SG-1000のエミュレータがESP32で実現しますので満足度はかなり高いです。
・EMWiRES
http://www.emwires.com/ESP32USB/#ESP06
esp_8_bitを参考に作られたものだと想像します。SC-3000にグレードアップするにはキーボードを追加するだけです。USBキーボードI/Fはスイッチサイエンスさんで販売されている「かんたんUSBホスト」を使っています(現在は売り切れになっていますので入荷待ちとなるようです)。
まずはesp_8_bitの回路図を使ってビデオ出力とオーディオ出力端子を取り付けます。その後、SG-1000エミュレータであるESP_8_BIT_MINUSスケッチを使ってESP32へプログラムを転送します。ゲームなどのファイルも用意してフラッシュへアップロードしておきます。Wiiリモコンがコントローラになっていますのでこのリモコンで操作します。起動後、リモコンでファイルが選択できれば大成功です。ここまでできれば第一段階は終了です。どこにも詳しい説明がなかったので成功するまでに時間がかかりました。とはいえ、SG-1000のエミュレータがESP32で実現しますので満足度はかなり高いです。
SC-3000 BASIC(3)
2023.04.01
SC-3000エミュレータではスプライトでMAG2が表示できないことがわかりました。しかし、16x16は問題なく表示できます。そこで今回は16x16のスプライトを表示してみました。8x8のスプライトを2倍にして表示すると粗さが目立ちますが16x16はもう少し細かく表示できますので実用的です。プログラムはこんな感じです。プログラム上、MAG値は変化しますが表示の大きさは変わりません。結果として対応可能なMAGは0,1です。疑似的にMAG2が可能でMAG3には対応できません。
10 M=1
20 SCREEN 2,2:CLS
30 MAG M:C=RND(1)*13+1
40 CURSOR 10,10:PRINT CHR$(17);"MSG";M
50 FOR Y=0 TO 191 STEP 4
60 PATTERN S#0,"00193F3C1C0D0F7B"
70 PATTERN S#1,"0C0F0F0F07031B07"
80 PATTERN S#2,"00CCFE9E9CD878EC"
90 PATTERN S#3,"1AFAF8F0EC7C3800"
100 Y1=Y:GOSUB 200
110 PATTERN S#0,"00193F3C1C0D0F1B"
120 PATTERN S#1,"2C2F0F071B1F0E00"
130 PATTERN S#2,"00CCFF9E9CD878EF"
140 PATTERN S#3,"18F8F8F8F0606C70"
150 Y1=Y+2:GOSUB 200
160 NEXT Y
170 M=M+2:IF M>3 THEN M=1
180 GOTO 20
200 SPRITE 0,(120,Y1),0,C
210 SPRITE 0,(120,Y1+1),0,C
220 RETURN

10 M=1
20 SCREEN 2,2:CLS
30 MAG M:C=RND(1)*13+1
40 CURSOR 10,10:PRINT CHR$(17);"MSG";M
50 FOR Y=0 TO 191 STEP 4
60 PATTERN S#0,"00193F3C1C0D0F7B"
70 PATTERN S#1,"0C0F0F0F07031B07"
80 PATTERN S#2,"00CCFE9E9CD878EC"
90 PATTERN S#3,"1AFAF8F0EC7C3800"
100 Y1=Y:GOSUB 200
110 PATTERN S#0,"00193F3C1C0D0F1B"
120 PATTERN S#1,"2C2F0F071B1F0E00"
130 PATTERN S#2,"00CCFF9E9CD878EF"
140 PATTERN S#3,"18F8F8F8F0606C70"
150 Y1=Y+2:GOSUB 200
160 NEXT Y
170 M=M+2:IF M>3 THEN M=1
180 GOTO 20
200 SPRITE 0,(120,Y1),0,C
210 SPRITE 0,(120,Y1+1),0,C
220 RETURN

SC-3000 BASIC(2)
2023.03.29
VDP(9918)関係のファイルを覗いてみるとMAGのビットを参照していないことが判明しました。内部にスプライトを2倍に拡大する処理がないので設定しても拡大表示しません。ゲームがターゲットなのであれば仕方ない気もします。8x8のスプライトが16x16の拡大表示できないのでスプライトは16x16で作成することになります。
SC-3000 BASIC(1)
2023.03.28
BASICプログラムを学ぶためにMSXのサンプルを参考にしながら打ち込んでみました。スプライト表示ができる単純なものです。がおもわぬ課題を見つけてしまいました。MAG命令を使ってスプライトの種類を指定するのですが値を変更しても効果がありません。例えばMAGに2を設定すると1ドットが2ビットで表示されるのでスプライトは2倍の大きさになるはずです。しかし、1ドットは1ビットのままです。ためしにエミュレータで実行してみるとちゃんと2倍の大きさになりました。うーん、これはVDPプログラムになにかしらの問題があるのかもしれません。他にもなにか課題があるのかもしれませんので、BASICのプログラムを通じて調査していきたいと思います。プログラムはこんな感じです。
100 M=2
110 SCREEN 2,2:CLS:MAG M
120 COLOR 15,4,(1,1)-(255,191),4
130 CURSOR 10,10:PRINT CHR$(17);"MAG";M
140 PATTERN S#0,"0E1D1F1F0E0810E0"
150 FOR I=0 TO 31
160 X=RND(1)*240:Y=RND(1)*176:C=RND(1)*15
170 GOSUB 200
180 NEXT I
190 GOTO 190
200 SPRITE I,(X,Y),0,C
210 RETURN

100 M=2
110 SCREEN 2,2:CLS:MAG M
120 COLOR 15,4,(1,1)-(255,191),4
130 CURSOR 10,10:PRINT CHR$(17);"MAG";M
140 PATTERN S#0,"0E1D1F1F0E0810E0"
150 FOR I=0 TO 31
160 X=RND(1)*240:Y=RND(1)*176:C=RND(1)*15
170 GOSUB 200
180 NEXT I
190 GOTO 190
200 SPRITE I,(X,Y),0,C
210 RETURN
