64K境界解決

どうにも64K境界について、理由が分からなかったので、はりぼてWikiで質問してみた。
そこで、Kさんから回答を頂いて、それを元に調べてみた。


とりあえず、犯人は、DMACでした。


DMACは、Intel 8237 互換の物らしいです。
これらは、元々、8085と組み合わせて使うように設計されていた物のようで、
本来は64K以上のメモリに対応していなかったようです。
それを、64K以上のメモリにも対応させるよう変更したわけですが、
ここで、上位ビットを保持する部品を後付で追加したようです。
これを「ページレジスタ」と呼んでいるようですが、
これは、DMACとは、独立して取り付けられているようです。苦笑
何となく「付け焼刃」的な対応にも思いますが、まぁ、しょうがないですね。
そういうわけで、DMACの「アドレスレジスタ」だけをインクリメントし続け、
「ページレジスタ」の値を変更しないまま処理を続けると、
64K境界を超えた際、つまり、0xFFFFの次の処理で、0x0000を処理してしまうと... (^^;;;
何だかなぁ...


ちなみに、「ページレジスタ」は、8ビット長らしく、
「アドレスレジスタ」の16ビットと合わせて、最大16Mまでしかアドレス出来ないそうです。
これも、何だかなぁ... って感じですね。


でも、まぁ、20年以上前の仕様を、未だに引きずっているわけで、
当時だったら、これで十分以上だっただろうから、
それを、現在の視点で語ろうとする方が、無理があるんだろうなぁ...


調べついでに、勉強になった内容としては、
これらの制約に対する対策の一つとして、64K境界を跨がないバッファを用意して、
そのバッファを介して読み書きする方法について。
これ、自分でも、ちょっと考えてみたんだけど、二度手間みたいでダメかなぁ...
とイマイチ自信が持てなかったんだけど、
どうやら、それほど、悪い考え方ではなかったのかな?
まぁ、無駄な処理と言えば、確かに無駄なんだろうけど、
64K境界のチェックとかが必要なくなるので、実際の読み書きはシンプルになる気がする。
そう思うなら、試してみろ!!、だよな。(^^;;;