初期の、というか大抵のmk2SR、66SRに搭載されているROMで、なぜか2階建てのROMがあります。
親子亀みたいに、ROMの上にROMを実装しているものです(ピギーバックという)。
mk2SR だと IC6、66SRだと IC9 です。
なぜわざわざこういう事をしているかですが、どうも不具合対応のようです。
ROMなのでプログラムが入っているワケですが、そのプログラムに致命的なバグがあったので、急遽EPROMを使って改修したのだと思います。
ちゃんとバグなしの、普通のROMのmk2SR/66SRも存在するようです(うちのmk2SR/66SRは、両方とも親子亀でした)。
バグありの方は、型番が HN613256 N63 で、バグなしの方は、HN613256 N95 です。
N63とかN95とかいうのはマスク番号と呼ばれるもので、マスクROMの場合はROMのバージョン番号のようなものです。
で、面白そうなので、どんなバグだったのかを調べてみました。
そのままでは調べられないので、ちょっと加工します。
これがその親子亀のROMです。見づらいですが2階建てです。

さらにソケットに挿して3階建てにします。そして、上のマスクROMからのみ出力がるように加工します。

後は通常通り、saver3で吸い出し、普通のROMと比較しました。
修正された箇所は、音声合成のルーチンです(SYSROM2.64の0x4000〜)。
FD周りが修正されたのかと思ったのですが、音声合成のルーチンが変更されています。
比較した結果ですが、処理が増えている場所があり、その影響でアドレスがずれたりしていました。
しかし、本質的には、5箇所のようです。
1)66-BASIC と SR-BASIC の区別方法の修正(0x4016〜0x401C)
音声合成ルーチンは、66-BASICでもSR-BASICでも、同じものが使われるようです。この際、どちらのBASICで動いているかの区別をしているような
のですが、その判別方法に問題があったようです。
修正前は、アドレス0x0000のデータが0xC3ならばSR-BASICと判断してます。完全に間違いですが(^^;)...
2)0x40D5〜0x40FFが0x00に変更されている
修正前は何かのプログラムが入っています。
CALL 0x0ADC とか、LD HL,(37C1H) とかあるので、どうもROMではない他のソフトのルーチンが入っているように思えます。
CP/Mのプログラムかなぁ...
3)何かのルーチンで分岐条件が一つ削除されている(0x42D5〜0x42D8)
詳細はよく分かりません。
4)0x43A8の後に処理が追加されている
追加されている処理は、66-BASICの時のリード側のバンク切り替え処理です。
SR-BASICでは、リード側のバンク切り替えは、ポート0x60〜0x67で行いますが、66-BASICでは、ポート0xF0、0xF1で行います。
66-BASICでの、リードのバンク切り替え処理を追加しているみたいです。
5)0x56B2〜0x56BFが0x00に変更されている。
修正前は何かのプログラムが入っています。
こっちは音声合成処理の一部のようなんですが、未使用なので上記4)の処理を追加するために削除されたようですね。
多分...66-BASICでの音声合成のテストが不十分だったのか、工程的に後回しだったために、かなり後に発見されたバグのようですね...
コードに直すと、2AH,C1H,37Hになりますが、別の場所から途中のC1Hのアドレスへジャンプするようなコードになっているのではないかと思われます。そうすると、POP BC:SCFになるのですが、1バイト2AHを追加してHLに代入することで無効化しているのです。JRだと2バイト必要ですからROM全体だと数十バイトの節約に繋がります。
全くP6に関係ない話でスミマセン
と思ったのですが、今回はそのパターンではないようです。
この後に、HLを操作する命令が続くので、普通に37C1Hを読んでいるようです。
このパターンは、P6の場合はエラーコードを代入するルーチンでありますね。最初何の事か分からなかった記憶があります。