ROM領域をRAMにCOPYして自由に利用
※ InternetExplorerなどのブラウザで、図が行ごとにずれて正常に表示されない場合は、メニューバーの表示→文字のサイズで文字の大きさを変更すると正常に表示できます。
【RAMROMとは】
ROMをRAMにCOPYして、ROMを切り放し、ROM前半にあるS3:やG:をユーザー用の
RAMとして解放し、また、ROMへのパッチ当ても可能に使用という目論見です。
RAMROMという名前は、パソコンの世界にはシャドウROMという同じ様な発想の
ものが存在しているという事を知らなかった当時に、命名したものですが、
ゼロから発想したものであり、ポケ通への郷愁もこめて、そのままの名前で
発表します。
【生い立ち】
工学社が運営していたポケット通信の;BBSE500のボードで、95-03-06 04:10:38に
しゃかんきょりたもつさんが#01920においてROMを書き換えできたら…という書き
込みをされました。
そこで、95-03-07 19:05:54に#01924において、私がRAMにROMをCOPYして切り替え
るという案を出したのが原点でした。
95-03-09 11:57:53に、Nmasuさんの、#01933における「PC-1480UはROMが128KBしか
無いので、簡単に出来るかも」という発言を受けて、95-03-10 19:17:52には、
#01946で私がPC-1480U版のRAMROMの原型となる回路の設計をUPLOADしました。
しかし、E500においては、ROMが256KBあり、何故かG:の容量は126KBで、ROM前半
128KBのごく最後の部分に何やらコードが含まれていて、同じ方法では出来ません。
それを煮詰め直して、95-04-01 18:34:49に;TECHE500のボードの#00048でPC-E500版
(汎用)のRAMROMの設計を発表したのが今回のRAMROMと同様の機能を持つものです。
(拙作SuperDELTA768KBで余るゲートを利用して1MbitSRAM2ケで実現するものでした)
時は流れ、A:\さんによりSmartMediaをRAMDISKとして使用する方法を開発、発表
されて、RAM増設のためにE500のメモリ空間を食いつくす必要も無くなりました。
そこで、今回はDELTAの類は実装せず、TOROさんのSCC音源をE500で鳴らせるMPLAY
などで必要になるメモリ空間は空けておいて、RAMDISKはSmartMediaのみとして、
S1:256KB化とRAMROMを1ケの4MbitSRAMだけで実現したE500を作ってみました。
本稿は、そのうちの「S1:256KB化とRAMROMを1ケの4MbitSRAMだけで実現」という
部分の設計を発表するものです。
なお、余談ですが今回のE500改造は、このほか、
・G式ブザーアンプ
・SmartMedia4MB
・RTC
・クロック切替え(4.0MHz/2.3MHz)
を実装しています。さらに外部として256KBのRAMカードとSCC音源,学習リモコン
が使えるようになっています(^_^)。
ブザーアンプとRTCについては別のコンテンツをご参照下さい。
【詳細仕様】
(1)COPYモード(COPY=1)でROMの全領域(&C0000〜&FFFFF)をReadするだけでRAMROMに
ROMのデータがCOPYされます。
これは、ハードプロテクトされていないときはROMの/CSである/CE2がRAMROMの
/WEへ接続されるため、&C0000〜&FFFFFアクセス時は、Read/Writeにかかわらず、
いつもRAMROMが書込み状態となるからです。RAMROMの/OEは1に固定されます。
これによって、256KBという大きなメモリデータをCOPYするために、一時的に
せよ、E500にとって巨大なメモリ空間を空けておかないといけないということが
無くなります。
(2)COPYモードでROMに対して書込みを行なうとRAMROMの方へ書きこまれます。
これは、本来GNDに接続されて常時アクティブになっているROMの/OEをCPUの
/RDと接続することで、書き込み命令中はデータを出力しないからです。
ROMの/OEがGNDのままだと書きこもうとしたデータとROMからのデータが
衝突しますが、これによって、データバスから流れてきたデータだけがRAMROM
へ書き込まれます。
(3)RAMROMモードにするとROMが切り離され、RAMROMがROMとして動作します。
これはRAMROMもーどではROMの/CS=1に固定されるということです。
(4)この時、ROMのシステム領域である&E0000〜&FFFFFは自動的にハード的にライト
プロテクトされ(RAMの/WE=1に固定される)、暴走しても内容が書き換わることは
ありません。
この自動プロテクトはハードプロテクトスイッチとは関係無く、RAMROMモード
にしただけで行なわれます。
(5)&C0000〜&DFFFFの領域はS3:があり、その中にはRAMFILE G:が存在するが、
この部分はユーザーが自由に使用することが出来る。
G:には使用しないようなエンジニアソフトウェアが満載されているが、これを
削除することが出来ます。
後述(10)の通り削除してしまっても、ライトプロテクト状態でCOPYモードにする
ことで、ROMにあるエンジニアソフトウェアを使用することは可能です。
G:は1セクタ64バイトとE:,F:などの1セクタ256バイトに対してかなり小さいので、
小さなファイルを置くのに適しています。
また、G:を削除して、S3:として使用すれば、S?:に置かなくてはならない、
JFP.DICやSCRNJPN.FNT,Qramfile.ASQなど、デバイスドライバの使用するかさばる
ファイルの置き場としても利用できます。
S3:は暴走で書きかえられない限り、オールリセットしても初期化されない利点
があります。
PC-E500の姉妹機であるPC-1480Uなどはエンジニアソフトウェアを装備しておらず、
この領域はROMにも割り当てられず空いていますので、この空間が使用可能に
なるご利益は大きいと思います。
(6)&C0000〜&DFFFFの領域はライトプロテクトスイッチを装備していますので、
暴走時などの完全な安全を保障できます(/PRT=0でプロテクト)。
(7)&80000〜&BFFFFはメインメモリであるS1:の領域ですので、ライトプロテクト
スイッチをどちらに設定していてもプロテクトがかからないようにします。
(8)また、/CE2=0の時(&C0000〜&DFFFFアクセス時)も、/CE0=0(&80000〜&BFFFFアク
セス時)の時もRAMの/CS=0にしてアクティブにならないといけません。
(9)RAMROMが何らかのトラブルで正常に動かなくなった場合、COPYモードにして
おけば従来どおりROMを使ってE500を利用できます。
(10)裏技的な方法なのですが、RAMROMはハードプロテクト中は、COPYモードにしても
書きこみが出来ない(内容が保護される)ことや、RAMROMはデータを出力しない
ことを利用して、/PRT=0の状態でCOPYスイッチをCOPYモードに切り替えることで、
RAMROMと、オリジナルROMという具合に、異なるバージョンのROMを切り替えて
使用するということさえ可能になります。
(ライトプロテクトを外してオリジナルROMをRead(単に使用するだけでもどこかの
ROMアドレスがReadされる)するとRAMROM領域が壊れますので注意して下さい)
【信号の意味】
信号名の前の"/"は、アクティブLowを意味します。
ライトプロテクトを可能にするためにハードスイッチで/PRTという信号を作り、
/PRT=0の時にプロテクトされるようにします(CPUの/WRに関わらずRAMの/WE=1)。
さらに、COPYモードとRAMROMモードを切り替えるために同様にCOPYという信号を
作り、COPY=1の時にCOPYモード、COPY=0でRAMROMモードになるものとします。
/CE0は&80000〜&BFFFFアクセス時、/CE2は&C0000〜&FFFFFアクセス時にLowとなる
CPUの信号です。/WRはCPUがWRITE動作をするときにLowとなる信号で、/RDはCPUが
READ動作を行うときにLOWとなる信号です。
参考までに、PC-E500シリーズのメモリアクセスの仕組み(タイミング)を以下に
示します。
図には示しませんが、アドレスは/CE?などに先だって確定し、データは/CE?などと
同時に出力されます。
/MRQは/CE?の何がアクティブになるときにも同時にLowになります。
クロック -+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+
(セラロック2.3MHz) | | | | | | | | | | | | | | | | |
+--+ +--+ +--+ +--+ +--+ +--+ +--+ +--+ +
/CE0〜/CE7のひとつ -------+ ラ イ ト +-----------+ リ ー ド +------
チップセレクト | | | |
(CE1のみ正論理) +-----------+ +-----------+
/WR(CPU13番pin) -------------+ +------------------------------
ライト | |
+-----+
/RD(CPU72番pin) -------------------------------+ +------
リード | |
+-----------+
/MRQ(CPU14番pin) -------+ +-----------+ +------
メモリリクエスト | | | |
+-----------+ +-----------+
すなわち、
┌──┬──┬──┬──────┬───────┬──┬──┬──────┐
│A19 │A18 │A17 │ A16〜A0 │ アドレス │/CE0│/CE2│ 備考 │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 0 │ 0 │ 0 │ Don't care │&00000〜&1FFFF│ 1 │ 1 │ │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 0 │ 0 │ 1 │ Don't care │&20000〜&3FFFF│ 1 │ 1 │ │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 0 │ 1 │ 0 │ Don't care │&40000〜&5FFFF│ 1 │ 1 │RAMCARD(S2:)│
├──┼──┼──┼──────┼───────┼──┼──┤CE1=1 │
│ 0 │ 1 │ 1 │ Don't care │&60000〜&7FFFF│ 1 │ 1 │(アクティブHigh)│
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 1 │ 0 │ 0 │ Don't care │&80000〜&9FFFF│ 0 │ 1 │ │
├──┼──┼──┼──────┼───────┼──┼──┤Mainメモリ(S1:)│(A)
│ 1 │ 0 │ 1 │ Don't care │&A0000〜&BFFFF│ 0 │ 1 │ │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 1 │ 1 │ 0 │ Don't care │&C0000〜&DFFFF│ 1 │ 0 │ROM前半(S3:)│(B)
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ 1 │ 1 │ 1 │ Don't care │&E0000〜&FFFFF│ 1 │ 0 │ROM後半(Sys)│(C)
└──┴──┴──┴──────┴───────┴──┴──┴──────┘
という仕様にPC-E500はなっています(ただし、A19はCPUから出力されていません)。
その他の/CS?については、ここでは関係ないので省略します。
詳細仕様より、RAMのライトイネーブル端子/WEは、
(A)では/PRTに関わらず、RAMの/WEはCPUの/WRに従う
(B)ではRAMROMモードでは、/PRT=1ならRAMの/WEはCPUの/WRに従う
/PRT=0なら 〃 常に/WE=1
(C)ではRAMROMモードでは、/PRTに関わらずRAMの/WE=1
とならなくてはいけません。
また、アウトプットイネーブル(/OE)に関しては、
COPYモード時 :(A)ではRAMの/OEとROMの/OEは、CPUの/RDに従う
(B),(C)では、常にRAMの/OE=1、ROMの/OEはCPUの/RDに従う
RAMROMモード時:(A),(B),(C)共に、RAMの/OEはCPUの/RDに従う
(A),(B),(C)共に、常にROMの/OE=1
ROMのチップセレクト(/CS)に関しては、
COPYモード時 :CPUの/CE2に従う
RAMROMモード時:/CE2に関わらず、常にROMの/CS=1
RAMのチップセレクトに関しては、
モードに関わらず、/CE0=0または/CE2=0の時にRAMの/CS=0
となれば仕様を満たすことが分かります。
【真理値表】
これらの仕様を真理値表として表現してみると以下のようになります。
┌──────────────┬────┐ ┌────────┬────┐
│ 入力 │ 出力 │ │ 入力 │ 出力 │
├──┬──┬──┬──┬──┼────┤ ├──┬──┬──┼────┤
│COPY│/CE2│A17 │/PRT│/WE │RAMの/WE│ │/RD │COPY│A18 │RAMの/OE│
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 0 │ 0 │ 0 │ 0 │ │ 0 │ 0 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 0 │ 0 │ 1 │ 1 │ │ 0 │ 0 │ 1 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 0 │ 1 │ 0 │ 0 │ │ 0 │ 1 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 0 │ 1 │ 1 │ 1 │ │ 0 │ 1 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 1 │ 0 │ 0 │ 0 │ │ 1 │ 0 │ 0 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 1 │ 0 │ 1 │ 1 │ │ 1 │ 0 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 1 │ 1 │ 0 │ 0 │ │ 1 │ 1 │ 0 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼──┼────┤
│ 0 │ 1 │ 1 │ 1 │ 1 │ 1 │ │ 1 │ 1 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ └──┴──┴──┴────┘
│ 0 │ 0 │ 0 │ 0 │ 0 │ 1 │
├──┼──┼──┼──┼──┼────┤ ┌─────┬────┐
│ 0 │ 0 │ 0 │ 0 │ 1 │ 1 │ │ 入力 │ 出力 │
├──┼──┼──┼──┼──┼────┤ ├──┬──┼────┤
│ 0 │ 0 │ 0 │ 1 │ 0 │ 0 │ │COPY│/CE2│ROMの/CS│
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 0 │ 0 │ 0 │ 1 │ 1 │ 1 │ │ 0 │ 0 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 0 │ 0 │ 1 │ 0 │ 0 │ 1 │ │ 0 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 0 │ 0 │ 1 │ 0 │ 1 │ 1 │ │ 1 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 0 │ 0 │ 1 │ 1 │ 0 │ 1 │ │ 1 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ └──┴──┴────┘
│ 0 │ 0 │ 1 │ 1 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ ┌─────┬────┐
│ 1 │ 1 │ 0 │ 0 │ 0 │ 0 │ │ 入力 │ 出力 │
├──┼──┼──┼──┼──┼────┤ ├──┬──┼────┤
│ 1 │ 1 │ 0 │ 0 │ 1 │ 1 │ │/CE0│/CE2│RAMの/CS│
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 1 │ 1 │ 0 │ 1 │ 0 │ 0 │ │ 0 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 1 │ 1 │ 0 │ 1 │ 1 │ 1 │ │ 0 │ 1 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 1 │ 1 │ 1 │ 0 │ 0 │ 0 │ │ 1 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼──┼────┤
│ 1 │ 1 │ 1 │ 0 │ 1 │ 1 │ │ 1 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ └──┴──┴────┘
│ 1 │ 1 │ 1 │ 1 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ┌──┬────┐
│ 1 │ 1 │ 1 │ 1 │ 0 │ 1 │ │入力│ 出力 │
├──┼──┼──┼──┼──┼────┤ ├──┼────┤
│ 1 │ 0 │ 0 │ 0 │ 0 │ 1 │ │/RD2│ROMの/OE│
├──┼──┼──┼──┼──┼────┤ ├──┼────┤
│ 1 │ 0 │ 0 │ 0 │ 1 │ 1 │ │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤ ├──┼────┤
│ 1 │ 0 │ 0 │ 1 │ 0 │ 0 │ │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤ └──┴────┘
│ 1 │ 0 │ 0 │ 1 │ 1 │ 0 │
├──┼──┼──┼──┼──┼────┤
│ 1 │ 0 │ 1 │ 0 │ 0 │ 1 │
├──┼──┼──┼──┼──┼────┤
│ 1 │ 0 │ 1 │ 0 │ 1 │ 1 │
├──┼──┼──┼──┼──┼────┤
│ 1 │ 0 │ 1 │ 1 │ 0 │ 0 │
├──┼──┼──┼──┼──┼────┤
│ 1 │ 0 │ 1 │ 1 │ 0 │ 0 │
└──┴──┴──┴──┴──┴────┘
これらを論理式で表すと、
RAMの/OE=OR(/RD,AND(COPY,A18))
ROMの/OE=/RD
ROMの/CS=NAND(COPY,NOT(/CE2))
RAMの/CS=AND(/CE0,/CE2)
RAMの/WE=NAND(NAND(/CE2,/WR),NAND(NOT(/CE2),COPY,NOT(/PRT)),
OR(OR(COPY,/CE2),NOT(OR(OR(/WR,A17),NOT(/PRT)))))
または、
RAMの/WE=OR(AND(OR(AND(NOT(COPY),/CE2),AND(COPY,/CE2)),/WR),
AND(OR(AND(NOT(/CE2),A17),NOR(/CE2,A17)),COPY,NOT(/PRT)),
AND(OR(COPY,/CE2,A17,NOT(/PRT),/WR),NOT(/CE2),NOT(COPY)))
となります。
【回路図】
真理値表を満足し、ゲートICの数を最小限におさえるように論理式を変形して
回路を考えてみると以下のようになります。
Vcc
|
R470k
入力信号 | 出力信号
| 13
+---| ̄ヽ12
/CE2 -----*---------------------------------------|2 |o-+
| +--|_ノ |
/WR -*---|------------------------------------+ 1 |
| | 1 2 |
| *--|>o----------------------------*--+ 5 |11
| | | +--| ̄ヽ6 +--| ̄ヽ8
COPY -|---|-------*-------------------------|-----|4 |o----|9 |o- RAMの/WE
| | 3 4 | | +--|_ノ +--|_ノ
/PRT -|-*-|--|>o--|-------------------------|--+ 3 |10
| | | | 8 __ | |
| | | *----ヽ \。__________ | |
| | *-------|----ノ / 10 | | 5 |
| | | | 9  ̄ ̄ +--|----| ̄ヽ。_|
| | | | 2 | +--|_ノ 6
| +-|-------|-----------------| ̄ヽ。_|_| 4
| | | 12 __ +--|_ノ 3 |
+---|-------|----ヽ \。__| 1 |
A17 -----|-------|----ノ / 13 | 13
| | 11  ̄ ̄ +---| ̄ヽ。____
| *-----------------------------|_ノ 3 |
| | 10 12 +------- ROMの/CS
+-------|------------------| ̄ヽ。_
/CE0 -------------|------------------|_ノ | 13 12
| 9 +---|>o--------------- RAMの/CS
|
| 5 6
+---|>o---+
| 6 __
9 8 +---ヽ \。___ 11 10
A18 -----------------|>o-------ノ / 4 | 3 __ +--|>o--- RAMの/OE
5  ̄ ̄ +----ヽ \。__|
+-------ノ / 1
| 2  ̄ ̄
/RD -----------------------------------*-------------------------- ROMの/OE
《凡例》
┌─────────┬─────────┬─────────┬──────┐
│ 74HC02(2入力NOR) │74HC00(2入力NAND) │74HC10(3入力NAND) │74HC04(NOT) │
├─────────┼─────────┼─────────┼──────┤
│ __ │ │ │ │
│ --ヽ \。__ │ --| ̄ヽ。__ │ --| ̄ヽ │ │
│ --ノ / │ --|_ノ │ --| |o-- │ --|>o-- │
│  ̄ ̄ │ │ --|_ノ │ │
└─────────┴─────────┴─────────┴──────┘
┌───┬─────┬─────┬─────┐
│ 接続 │ 数字 │ 配線屈折 │ 配線 │
├───┼─────┼─────┼─────┤
│ * │ ピン番号 │ + │ - 及び | │
└───┴─────┴─────┴─────┘
※ このほか、全てのICは7番ピンをGND,14番ピンをVCCに接続し、VccとGNDの間には
ICの出来る限り近くに0.1μFのセラミックコンデンサ(パスコン)を実装します。
※ 32KBのSRAMをはがして512KBのSRAMをつけるわけですが、この時、/OE,/WE,/CS,
A17と出来ればA15,A16,A18,Vccもランドにはんだ付けせずに足を水平に伸ばして
おいて下さい。浮かせたピンは上記の回路、または、CPUと接続する必要があり
ます。また、A17の下のランドはVccなので、これはSRAMの32番ピンと接続します。
RAMの/CSのランドは/CE0ですし、/WEのランドは/WRですので、この2箇所は
ランドからも配線を引き出します。
※ ROMに関しては/CSと/OEの足をランドから浮かせて、/CSのランドから/CE2を引き
出し、浮かせた足には作った信号を入力します。
※ スイッチの取付場所は、
・電池の蓋を開けてネジとA-B切替スイッチの間にCOPYスイッチ
(裏面はこちら)
・E500をキーキーボード側から見て左側の11pinオプションコネクタの下に
ライトプロテクトスイッチ
・同じく正面から見て右上の液晶濃度ボリュームの上、電池のプラス端子の
下あたりにクロック切替スイッチ
を取り付けました。
【/PRTおよびCOPY信号の作成】
Vcc
●
| SW
| _____
+―○ ○ ○―+―→/PRTまたはCOPY
L| | H >
+-VVV--+ >470kΩ
180kΩ >
|
_
////GND
スイッチが切り替わるときや、スイッチの故障で解放状態になったときに、
ICの入力信号が不安定にならないように(Lowに設定される)このような形に
しました。
【部品表】
74HC10(3ゲート入り3入力NAND) 1ケ
74HC04(6ゲート入り1入力NOT) 1ケ
74HC02(4ゲート入り2入力NOR) 1ケ
74HC00(4ゲート入り2入力NAND) 1ケ
M5M584000-10L(4MbitSRAM) 1ケ
超小型3Pスイッチ 2ケ
サンハヤト シール基板(ICB-061) 1枚…この上で上記回路を実装します。
0.1uFチップセラミックコンデンサ 4ケ
470kΩチップ抵抗 3ケ
180kΩチップ抵抗 2ケ
なお、これらのICは全てSOP(フラットパッケージ)のものを使用します。
ゲートIC(74HC??)およびSRAM,ROM,CPUのピン配置図を以下に示します。
4MbitSRAMのピン配置 CPU
+---------U--------+ +---------------------- ←切り欠き
| 1 A18 Vcc 32| | 30 1 \ 13:/WR
| 2 A16 A15 31| |31 100| 14:/MRQ
| 3 A14 A17 30| | | 46:A15
| 4 A12 /WE 29| | SC-62015 | 47:A16
| 5 A7 A13 28| | | 48:A17
| 6 A6 A8 27| | | 49:A18
| 7 A5 A9 26| |50 81| 66:/CE2
| 8 A4 A11 25| | 51 80 | 68:/CE0
| 9 A3 /OE 24| +-------------------------+ 72:/RD
|10 A2 A10 23|
|11 A1 /CS 22| ROM
|12 A0 D7 21| +-------------- ←切り欠き
|13 D0 D6 20| | 11 1 \
|14 D1 D5 19| |12 44|
|15 D2 D4 18| | | 6,16,17,39:GND
|16 GND D3 17| | LH-5320 | 7:Vcc
+------------------+ | | 38:/CS
| | 40:/OE
|22 34|
| 23 33 |
+-----------------+
14 13 12 11 10 9 8 14 13 12 11 10 9 8
| | | | | | | | | | | | | |
++-----+-----+-----+-----+-----+-----++ ++-----+-----+-----+-----+-----+-----++
|V +--+ | | +--+ | || |V +--+ +---+ | +--+ +---+ ||
|C | +------+ | | +------+ || |C | __ | | | __ | ||
|C | | | | | || |C +--o/ /--+ | +--o/ /--+ ||
| | +---| ̄ヽ。__| | +---| ̄ヽ。__|| | \ \----+ \ \----+|
| +-----|_ノ +-----|_ノ | |  ̄ ̄  ̄ ̄ |
|) 74HC00 | |) __ 74HC02 __ |
| | |+--o/ /----+ +--o/ /----+ |
|+-----| ̄ヽ。___ +-----| ̄ヽ。___ | || \ \--+ | | \ \--+ | |
|| +---|_ノ | | +---|_ノ | G| ||  ̄ ̄ | | |  ̄ ̄ | | G|
|| | | | | | N| || +------+ | | +------+ | N|
|| +---+ +--+ | +---+ +--+ D| || | +--+ | | +--+ D|
++-----+-----+-----+-----+-----+-----++ ++-----+-----+-----+-----+-----+-----++
| | | | | | | | | | | | | |
1 2 3 4 5 6 7 1 2 3 4 5 6 7
14 13 12 11 10 9 8 14 13 12 11 10 9 8
| | | | | | | | | | | | | |
++-----+-----+-----+-----+-----+-----++ ++-----+-----+-----+-----+-----+-----++
|V | | | | | || |V | | | | | ||
|C | | | | | || |C | | | | +--+ ||
|C +-|>o-+ +-|>o-+ +-|>o-+| |C | +--+ | | | ||
| | | | | | | +-| ̄ヽ ||
| | | +-| ̄ヽ | | +----| |o-+|
|) 74HC04 | |) +----| |o-+ +----------|_ノ |
| | | | +-|_ノ +--------| ̄ヽ |
| | |+--+ | 74HC10 | +----| |o-+ |
|+-|>o-+ +-|>o-+ +-|>o-+ G| || | +----+ | +-|_ノ | G|
|| | | | | | N| || | | +--+ | | N|
|| | | | | | D| || | | | | +--+ D|
++-----+-----+-----+-----+-----+-----++ ++-----+-----+-----+-----+-----+-----++
| | | | | | | | | | | | | |
1 2 3 4 5 6 7 1 2 3 4 5 6 7
【設定】
改造がすんで、配線をチェック後、E500の電源をONにして無事起動できたら設定を
行います。起動できないようなら、配線ミスがないか見直して下さい。
ROMからCOPYしたばかりのS3:およびRAMFILE G:はプロテクト属性のままになって
います。これではハード的には書込み可能でも、ソフト的に書込み出来ません。
まず、S3:のスロットヘッダのなかのプロテクトビットを解除します。
COPYモードでもRAMROMモードでもいいので、
POKE &COO11,&20
とやるとS3:は書込み可能になります。
次にG:ですが、
FILES "S3:"
とやると"RAMFILE.!"というファイルがただひとつ表示されると思いますが、
これがRAMFILE G:です。これがプロテクト属性になっていますので、BASICから
SET "S3:RAMFILE.!"," "
として、プロテクト属性を解除したら設定は完了です。
S3:およびG:を自由に書き換え出来るようになります。
【動作確認】
とりあえず、ライトプロテクトスイッチはOFFにしておいて、RAMROMモードで
FILES "G:"
とでもやって、"デモ.50#"が最後にあるのを確認してください。
次に
KILL "G:デモ.50#"
としてから、もう一度
FILES "G:"
としてみてください。さっきあった"デモ.50#"が消えていませんか?
消えていれば成功です(^_^)。
ついでにもう一つの機能、ROMへのパッチ当てをやってみます。BASICから
PEEK &FFFF0
としてみてください。ディスプレイに表示されるのはあなたのE500のROMバージョン
です。動作には関係無い部分ですので、書き換えてみます。
今度はCOPYモードにして、
POKE &FFFF0,&47
これで、ROMバージョンは嘘が書き込まれたことになります。
COPYスイッチはRAMROMモードに戻してください。
(戻さないと読み出す時に元のROMデータに書き戻される)
PEEK &FFFF0
として書いたアドレスを読みこんでみてください。今度は、71と表示されませんか?
(&47は十進数の71です)
うまく書き換わっていたら、あなたはROMにパッチを当てたことになります。
&47とは何かというと"G"の文字コードです。"G"が何を意味するか、それは内緒
です(笑)。
【ROMのCOPY】
COPYモードにおいて、ROM領域全てをReadする必要があります。
逆に、RAMROMのパッチの当てそこねなどで起動不能になっても、
いつでも簡単に元の状態に戻せるわけです。
全ての領域をReadするには、BASICであれば、
FOR I=&C0000 TO &FFFFF:A=PEEK I:NEXT:BEEP 3
とでもすればOKですが、時間が数十分かかると思います(^^;)。
(3.00MHzで22分)
RFSやPLINKなどが使えるのであれば、
SAVEM "A:ROM.TXT",&C0000,&FFFFF
とでもやった方がひとけた以上短い時間でReadが完了します。
(2.3MHz,19200bpsで2分42秒)
要するに、方法は何でも全てのROMアドレスをRead動作すればいいだけです。
機械語で行えば数秒で完了します。ソースコードを以下に示します。
3種類記載しますが、どれも同様の動作をするものです(XASM形式)。
なお、これらは;TECHE500でA:\さんが書いて下さったもの(ソース1)と
Ramatさんが書いて下さったもの(ソース2,3)です。
その節はお世話になり、ありがとうございました。
十数バイトの短い実行ファイルですので、アセンブラを持っていない人のために、
BASICから直接実行ファイルを書き込む方法も付けておきます。
※ これらのソースは、CALL &BF000 で実行できますが、機械語プログラム
ですので、機械語領域を確保してから実行して下さいね。
(例) 機械語領域を3KB(&000C00バイト)確保する場合:
POKE &BFE03,&1A,&FD,&B,&0,&C,&0:CALL &FFFD8
《ソース1》
org $BF000
MV X,100000H-0C0000H ;ループカウンタ(16bitで足りないのでXレジスタ使用)
MV Y,0C0000H ;アドレスの指定
L1:
MV A,[Y++]
DEC X
JRNZ L1
RETF
END
15BYTES(約3秒)
POKE &BF000,&C,0,0,4,&D,0,0,&C,&90,&25,&7C,4,&1B,6,7:CALL &BF000
《ソース2》
org $BF000
mv x,$C0000
loop: mv a,[x] ;MV A,[X++]を使わないのはフラグが変化しないため
inc x ;Z FLAGの設定
jrnz loop ;x=$00000でloopを抜ける
retf
end
※ 11BYTES(約3秒)
POKE &BF000,&C,0,0,&C,&90,4,&6C,4,&1B,6,7:CALL &BF000
《ソース3》
org $BF000
mv x,$C0000
loop: mv ba,[x++] ;2BYTESずつコピー
inc x
dec x ;Z FLAGの設定
jrnz loop
retf
end
※ 13BYTES(約2秒)
POKE &BF000,&C,0,0,&C,&92,&24,&6C,4,&7C,4,&1B,8,7:CALL &BF000
【テクニック】
なお、何らかのトラブルで、RAMROMのシステム領域が壊れて起動しなくなったら、
COPYモードで起動して、G:の領域以外をReadすることで、G:を壊さずに、
RAMROMの復旧が可能です(システム領域の変更は出荷状態に戻りますが)。
たとえば、S3:の"RAMFILE.!"というファイルが128990Bytesであったとします。
G:の大きさは
(128990+34)Bytes = 126KB
です。ここで、34は"RAMFILE.!"というファイルのブロックヘッダの大きさです。
また、S3:のスロットヘッダが&C0000から24Bytesありますので、G:の領域は、
&C0000+24+128990+34-1 = &DF817
のアドレスまでです。
従って、システム領域の復旧のためにReadすべきアドレスは、
&DF818〜&FFFFF
となります。
なお、S3:にはG:を除いて空き領域が約2KBありますが、ここにはファイルがない
だけで、何やらデータが書かれています。おそらく、この領域を使用すると、
具合の悪いことが起こると思いますので、S3:としてRAMROMを利用する場合は、
POKE &C0002,&3F ※ これはスロットヘッダのスロットサイズ指定です。
POKE &BFC0C,&3F ※ これはS1:のメモリブロック・デバイスのパラメータです。
リセットすると&40に戻ってしまいますので、ROMを解析
して、リセット時の値を&3Fに設定するように変更しない
限りは、リセットの度に行う必要があります。
のようにスロットヘッダを書き換えて、S3:の容量を128KBから126KBに変更して
おいた方が良いかと思います。そうしないと、最後の2KBの領域を空き領域として
使ってしまう恐れがあります。
なお、この設定の場合、S3:のアドレスは&C0000〜&DF7FFとなりますので、G:を
126KB使うことはできません。
スロットサイズは2KB単位でしか指定できず、RAMFILEは1KB単位でしか指定できない
ため、ファイルをおくことが出来ない領域までS3:にすることで、G:を126KB確保
しているのだと思われます(元々G:に入っているファイルは125KBを越えている)。
【バックアップ】
S3:領域(G:)のみ書き換えているときは、ファイル単位でも、"RAMFILE.!"ごとでも、
バックアップ方法やリストア方法は普通のファイルの場合と同じです。ROMに変更を
加えたなどで、ROM領域を全てバックアップしたい場合は、ROMのCOPYでも述べたよう
に、SAVEMを利用すれば出来ます。リストアは、COPYモードでライトプロテクトをOFF
してLOADMすれば、通常うまくいきます。通常でない場合は次項にて…(^^;)。
【課題】
別のバージョンのROMのCOPYが問題です。ROMイメージ丸ごとバックアップする要領で、
あるE500のROM領域をRFSを使ってA:,B:,C:ドライブへSAVEMすれば別バージョンのROM
コードは取り出せますが、これを違うROMバージョンのE500へCOPY(リストア)すると
なると、うまくいきません。
COPYモードでライトプロテクトをOFFした状態でLOADMだけが行われれば、うまく行く
はずなのですが、私の想像では、ROMのFCS(ファイルコントロールシステム)をLOADM
の中で呼んでいるのではないかと思われます。
このRAMROMの仕様はシステム領域のオートプロテクトを実装しているため、ROMのアド
レス領域をREADすればROMからデータが出力されRAMへ書き込まれ、WRITEすれば、ROM
はデータを出力せずに、RAMへは書き込もうとしたデータが書き込まれるわけです。
LOADMによって折角RAMへ書き込みずみのアドレスに、FCSのファンクションがあれば
どうなるでしょうか?当然ROMのFCSファンクションが出力されて、RAMのデータが書
き換えられてしまいます。
LOADMが完了した時点で、LOADM実行中にROMをリードしたアドレスだけが別バージョン
ROMの内容ではなく、実装されているROMのデータのRAMROMが出来上がってしまいます。
もしも、アクセスしたアドレスの内容が同一であれば問題は起こりません(だから、
バックアップの項目で解説した方法でリストアが出来る)。しかし、FCSの書かれて
いる位置がバージョンによらず同じであるという事はあまり考えられません。
ということは、RAMROMの中のプログラムは途中に変なサブルーチンが上書きされて、
正常に実行出来ないような状態になっているわけで、実際試したところ、Ver1のROMに
Ver7のROMをLOADMするとRAMROMモードでは起動もできなくなります。
対策としては、ROMのFCSなどのサブルーチンを呼ばずに、自前でLOADMする機械語
プログラムを作成するという方法が考えられます。
…が、どう作ればいいのかよく分からないので、棚上げになっています(^^;)。
どなたか、分かる方がおられたら、教えて下さいませm(__)m。