※ 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備考    │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&00000〜&1FFFF│            │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&20000〜&3FFFF│            │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&40000〜&5FFFFRAMCARD(S2:)│
├──┼──┼──┼──────┼───────┼──┼──┤CE1=1       │
│ Don't care&60000〜&7FFFF(アクティブHigh)│
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&80000〜&9FFFF│            │
├──┼──┼──┼──────┼───────┼──┼──┤Mainメモリ(S1:)(A)Don't care&A0000〜&BFFFF│            │
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&C0000〜&DFFFFROM前半(S3:)(B)
├──┼──┼──┼──────┼───────┼──┼──┼──────┤
│ Don't care&E0000〜&FFFFFROM後半(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/CE2A17 /PRT/WE RAMの/WE│  │/RD COPYA18 RAMの/OE│
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
││  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
│ │  ││
├──┼──┼──┼──┼──┼────┤  ├──┼──┼──┼────┤
││  │ │
├──┼──┼──┼──┼──┼────┤  └──┴──┴──┴────┘
│ │
├──┼──┼──┼──┼──┼────┤     ┌─────┬────┐
│ │     │  入力    出力  │
├──┼──┼──┼──┼──┼────┤     ├──┬──┼────┤
││     │COPY/CE2ROMの/CS│
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     │ │
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     │ │
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     ││
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     │ 1 │ 1 │   1   │
├──┼──┼──┼──┼──┼────┤     └──┴──┴────┘
││     
├──┼──┼──┼──┼──┼────┤     ┌─────┬────┐
│ │     │  入力    出力  │
├──┼──┼──┼──┼──┼────┤     ├──┬──┼────┤
││     │/CE0/CE2RAMの/CS│
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
││     ││
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     │ │
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     │ │
├──┼──┼──┼──┼──┼────┤     ├──┼──┼────┤
│ │     ││
├──┼──┼──┼──┼──┼────┤     └──┴──┴────┘
│ │     
├──┼──┼──┼──┼──┼────┤        ┌──┬────┐
│ │        │入力出力  │
├──┼──┼──┼──┼──┼────┤        ├──┼────┤
│ │        │/RD2ROMの/OE│
├──┼──┼──┼──┼──┼────┤        ├──┼────┤
│ │        │ │
├──┼──┼──┼──┼──┼────┤        ├──┼────┤
│ │        │ │
├──┼──┼──┼──┼──┼────┤        └──┴────┘
│ │
├──┼──┼──┼──┼──┼────┤
│ │
├──┼──┼──┼──┼──┼────┤
││
├──┼──┼──┼──┼──┼────┤
│ │
├──┼──┼──┼──┼──┼────┤
│ │
└──┴──┴──┴──┴──┴────┘
これらを論理式で表すと、

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。


					
				
【SNAPEM(*0)でキャプチャしたE500のLCD画面】
HMF(*1)でG:のファイルを表示中

デモ.50#が無くなってLAB6.BASという見慣れないファイルがおかれているのが分かります。
SIモニタ(*2)で&FFFF0を表示中

バージョン番号があり得ない&H47になっているのが分かります。
(*0)Aesop・M750さん作のキャプチャソフトSnap them! Ver0.40
(*1)HiMさん作のファイラHMFiler Ver2.11
(*2)PJ'89.12月号掲載の石山正太郎さん作の機械語モニタSIMON Ver1.00
素晴らしいFSWを公開して下さった皆さんに感謝いたしますm(__)m


ポケコンのページへ戻る  
趣味のページに戻る  
トップページに戻る  
目次に戻る