主にMSX関係のコンテンツが置いてあります。

SCCフラッシュカートリッジの作成

2212P003にFlash ROMを繋げる改造を見かけたので試しに自分も作ってみました。

だた、その改造に使うFlash ROMがもう廃番らしく、手に入りません。

似たようなスペックで他にないかと探すとSST39SF040というチップが目に止まり、とりあえずそれを使ってみることにしました。

ついでに、以前から作りたいと思っていた中継基板も作ってみました。

中継基板の方にカートリッジの有効/無効スイッチ、音量調節などを付けることで本体やカートリッジに細工せずともSCCの音量調節をしたり、カートリッジの後挿しをせずに済むようにするのが狙いです。

中継用の基板作成

昔はMSXに挿せる端子があるユニバーサル基板が売っていたと思うのですが、今は無さそうなので

ジャンクで売っていたこれを、

基板を取り出して、部品をすべて外して、

ピンを必要なサイズに切り取って、手持ちのユニバーサル基板と合体。カートリッジのコネクタはジャンク箱にあったMSX用のコネクタを流用しました。

基本的に単なる延長で、延長の途中に音声調整用の抵抗やスロット切り離しスイッチ等を付けただけの簡単なものです。

基板の左右に接着した木片は基板の支えになるように合わせましたが、機種によってスロット入り口の形状が微妙に異なるようで、 ピッタリには合わせられません。大きくズレるのを防ぐ程度です。

FCの基板はMSXのものより少し薄いので接触が甘いのがイマイチですが、色々試すにはこういうものを作っておくと便利ですね。

問題点

カートリッジの方はこんな感じです。DACとコンデンサが邪魔だったので基板裏へ移動させました(きちんとケースに収まります)。

最初はネットに書いてあった配線と同じようにしました(こちらなどを参考にしました)が、結果的にはそれでは上手くいきませんでした。

というのも、書き込みプログラムくらいは自分で作ろうとやってみたのですが(チップが異なるためか紹介されていたプログラムが使えなかったというのもあります)、データが上手く書き込めないのです。

Flash ROMはデータを1バイト書き込む前に、特定のアドレスへ特定のデータ(5555HにAAHなど)を手順通り書き込むことでその後1バイト書き込めるようになります。書き込み失敗の原因は、特定のデータを書き込むことでバンク切り替えが発生してしまうためでした。

その対処として、Flash ROMのA15とA12の配線を互いに入れ替えて接続し問題を回避することにします(他の解決方法もあるかもしれませんが)。

動作詳細

バンクは例えば4000H-5FFFHの範囲だと5000H-57FFHにバンクレジスタが出ています。5000H-57FFH間に書き込むとそれがバンクレジスタの設定となって、4000H-5FFFHのバンクが切り替わります。

最初に配線した状態でFlash ROMの5555HにAAHを書き込むには、(4000H-5FFFHにバンク2を出しているとして)MSXの5555HにAAHを書き込むので、バンクが変更されます。こうなるとまともにデータを書き込むことができません。

バンクレジスタが存在しない条件はアドレスA12が0のときです。一方、A15は4000H-7FFFHを使う限り0です。なので4000H-7FFFHを使う前提で入れ替えると、5555H(0101 0101 0101 0101B)がC555H(1100 0101 0101 0101B)となります。

Flash ROMのC555Hは(4000H-5FFFHをバンク6にすると)4555Hでアクセスできるので、そこにAAHを書き込んでもバンクは切り替わらず、Flash ROMから見ればアドレスバスを入れ替えているので5555Hとなりコマンドが発行できるという仕掛けです。

書き込みプログラム

書き込みプログラムは こちら です(Z80専用)。

Flash ROMがSST39SF040限定で、上記の通りA12とA15の配線を入れ替えている場合のみ使用可能です。

"FLASH ファイル名"で使えます。※ファイルは8KB単位でないと経過表示がバグりますがちゃんと書き込めます。

おまけ

ふと思いついたので中継基板で、MSXからのA12をNOTで反転したものと、MSXのWR#から分岐したものをNANDに入力、出力をコネクタのA12へ出してみました。

WR#からNAND間の配線にはスイッチとプルアップ抵抗を付けています。

スイッチONのときはA12は書き込みの時のみ強制1に。それ以外のときはA12のまま。

スイッチOFFのときはプルアップ抵抗によりWR#が無効となるので、A12のままです。

WR#が有効になってからアドレスを変更して、問題なく動作するのか疑問でしたが上手くいくみたいです。

簡単なロジックICの追加でSCCのないコナミバンクにも対応できました。

まとめ

これに自作ゲームを入れて遊ぶのも楽しそうです。

また、MSX1ROM使用時にMSX1風のパレットに変更するのも良さそうです。


パレット切り替えのサンプル(クリックで展開)
;-------------------------------------------------------------------------------
;msx1 color変更処理
;
;
;-------------------------------------------------------------------------------
org 4000h

;VDP ポート
port0: equ 98h
port1: equ 99h
port2: equ 9ah
port3: equ 9bh
;-------------------------------------------------------------------------------
;カートリッジヘッダ
id: db 'A','B'
init: dw start
statement: dw 0
device: dw 0
text: dw 0
reserve: dw 0,0,0

;-------------------------------------------------------------------------------
start:
ld b,16
ld hl,pdata

loop: ld d,(hl)
inc hl
ld e,(hl)
inc hl
call palwt
djnz loop
ret

;-------------------------------------------------------------------------------
;de=RBG,b=パレット番号+1
;d=0rrr0bbb e=00000ggg
palwt: di
;r16=パレット番号
ld a,b
dec a
out (port1),a
ld a,80h + 16
out (port1),a

;R,B書き込み
ld a,d
out (port2),a
ld a,e
;G書き込み
out (port2),a
ei
ret

;-------------------------------------------------------------------------------
;パレットデータ RB,0G
pdata: db 77h,07h ;15
db 55h,05h ;14
db 55h,03h ;13
db 21h,04h ;12
db 64h,06h ;11
db 53h,06h ;10
db 63h,04h ;9
db 62h,03h ;8
db 36h,05h ;7
db 52h,03h ;6
db 47h,03h ;5
db 37h,02h ;4
db 44h,06h ;3
db 33h,05h ;2
db 00,00 ;1
db 00,00 ;0

アセンブルしたファイルは ここ から。

※パレットデータはこちらのサイトにあるものを使用させていただきました。

元の色(画面直撮りなので参考程度で…)

パレット変更

ゲームによってはパレット変更後にパレットが初期化される物もあります。

このシャロムもそのタイプで、パレット変更を維持するために上記プログラムに少し手を入れています。