|
以前から不思議に思っているのですがね。
レジスタの値の特定のビットを「1」にしたり「0」にしたりするときに、なんで「AND」や「OR」が多用されるんでしょうか?
ちゃんとビット操作用の命令「SET」「RES」があるのに。
例えば、PSG#15の初期状態が「11001111B」だったとしますね。いわゆるジョイスティックポートBが使用されている状態。
で、8番端子を「H」にしたいときは「OR 00100000B」とするんでしたっけ。
でも、値がレジスタAに入っているとして「SET 5,A」でもいいんでしょ?
事前に「CS EQU 5」と定義しておけば「SET CS,A」でもいいはず。
なんでこだわっているかと言うと、
CS EQU 5
CLK EQU 3
DI EQU 2
と抽象化しておきたいのです。
16進数でANDやORするより、「SET CS,A」のほうが「CSをHにしたな」と分かりやすいでしょ? それに、気が変わって「ジョイスティックポートAを使おう」と思ったり、ピン割り当てを変えようと思ったら、
CS EQU 4
CLK EQU 1
DI EQU 0
などと定義を書き換えるだけで済みます。ANDやORを使っていると、該当箇所を探し出して書き換えないといけません。
とはいえ、端子をひとつずつ制御する前提ですけどね。
「SET」や「RES」では、「OR 00101100B」のように一挙に変更することはできません。
実は、愛用の「MSX-DOSスーパーハンドブック」のASM.COMが2進数を扱えないという事情もありましてね。いまだに2進数をパッと16進数に置き換えられないし、ANDだっけ?ORだっけ?と混乱することもあったりして(自爆)
あ、そうそう。このASM.COMを愛用する理由をもうひとつ書いておきます。
M80などのアセンブラが信用ならないのです。MSX-DOS(1)版とMSX-DOS2版で挙動が若干違うし、MSX-DOS2版でCOMファイルを作るとリダイレクトやパイプの機能を勝手に付け加えて肥大化しちゃう。
ターミナルソフト「mabterm」で有名な馬淵さんから「それはライブラリの問題で、気に入らなければライブラリに手を入れればいい」と言われちゃいましたが、そんなことできるほど優秀なアタマではありません。アホをバカにしないでください(笑)。
それだけではありません。
MSXには「できるだけBIOSを使う」という不文律?があって直接I/Oを叩いていいのはVDPだけとなっています。でもね、PSG関連のBIOS「WRTPSG」の本体部分(1102H〜)を見ると、
DI
OUT (PSG.LW),A
PUSH AF
LD A,E
OUT (PSG.DW),A
EI
POP AF
RET
ほれほれ、勝手に割り込み許可してRETしてるでしょ!
M80とかMSX-Cとか使ってると、素知らぬ顔してこういうコードを吐き出してくるのです。「だって、BIOSを使うのがキマリだも〜ん。」
こういうのを見ると、MSXのBASIC-ROMを書き換えてやりたくなります。
なんか、今日は愚痴ばかりになりました。「私はASM.COMから進化しません!」宣言みたいな部分もw
SDカードアクセスのコーディングに向けて、肩をグルグル回している状態とご理解ください<(_ _)>ペコリ
|
過去の投稿日別表示
-
詳細
2014年12月09日
全1ページ
[1]
コメント(4)
全1ページ
[1]




