16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第65回]
●CMとDMをセグメント指定可能に
現在の8086BASICのマシン語コマンドはDS=0000のユーザーメモリ範囲をアクセスするようになっています。
物理メモリアドレスの00000〜0FFFFの範囲です。
ですけれど。
前回はせっかく512KBもの容量のメモリを搭載するのだから、DS=0000以外の、ぶっちゃけて言えば512KBのRAMの全アドレス範囲(物理メモリアドレスの00000〜7FFFF)をアクセスできるようにしたい…、と書きました。
そのように思いついたからには、できることならばやってしまいましょう。
で。
さっそくそのように機能拡張してしまいました。
従来のDMコマンドの書式は、
DM aaaa,bbbb
です。
aaaaは開始アドレスでbbbbは終了アドレスです。
機能拡張後の書式は、
DM aaaa,bbbb[dddd]
です。
[dddd]はセグメントベースアドレスです。
省略した場合には従来と同じDS=0000でのメモリアドレス範囲の指定となります。
テスト中の画像です。
一番上のDM 0000,003Fは従来と同じ働きになります。
RAMの物理メモリアドレス00000〜0003Fの内容を表示しています。
次のDM 0000,003F[1000]は、セグメントベースアドレス1000の0000〜003F(物理メモリアドレス10000〜1003F)の内容を表示しています。
次のDM 0000,003F[2000]は、セグメントベースアドレス2000の0000〜003F(物理メモリアドレス20000〜2003F)の内容を表示させたはずだったのですが、ちょっと問題があることがわかりました(このことについては後ほど書きます)。
そしてもう一度[セグメントベースアドレス]を省略して従来と同じDM 0000,003Fを実行しました。
[セグメントベースアドレス]を省略しても直前のセグメント指定の影響はうけません。
機能拡張後のDMコマンドはCS領域(プログラムROM領域)の表示も可能になりました。
DM 0100,015F[F000]はセグメントベースアドレスF000のブログラムROM領域の0100〜015Fの内容を表示しています。
ROMの0100〜にはシステムプログラムが書かれています。
下にその部分のプログラムリスト(アセンブルリスト)の一部を示します。
上のDMの表示内容と一致していることがわかります。
[00052] ; AM188 MONITOR [00053] ; [00054] ORG=0100 [00055] ; [00056] 0100 EB1090 START0:JMP START01 <0112> [00057] ; [00058] 0103 E9B007 JMP SINSB;06a0 of ndmon4 <08B6> [00059] 0106 E9C305 JMP REMOTE <06CC> [00060] 0109 E9D007 JMP NDSOUT22 <08DC> [00061] 010C E94408 JMP NDSINSB;ndmon4 sinsb 078d <0953> [00062] 010F E98807 JMP SOUTSB;ndmon4p sout 067C <089A> [00063] ; [00064] ;AM188 INIT [00065] 0112 BAA0FF START01:MOV DX,FFA0;umcs [00066] 0115 B8BCE0 MOV AX,E0BC;128k,no wait [00067] 0118 EF OUT DX,AX [00068] 0119 BAA2FF MOV DX,FFA2;lmcs [00069] 011C B8BC1F MOV AX,1FBC;no wait [00070] 011F EF OUT DX,AX [00071] 0120 BA78FF MOV DX,FF78;pdir1 [00072] 0123 B8FEFF MOV AX,FFFE;pcs0 active [00073] 0126 EF OUT DX,AX [00074] 0127 BAA8FF MOV DX,FFA8;mpcs need this! [00075] 012A B8BF80 MOV AX,80BF [00076] 012D EF OUT DX,AX [00077] 012E BAA4FF MOV DX,FFA4;pacs [00078] 0131 B87600 MOV AX,0076;i/o base address=0000 2 wait [00079] 0134 EF OUT DX,AX [00080] 0135 B080 MOV AL,80;all port out ******** for test [00081] 0137 E683 OUT 83,AL;82C55 [00082] ; |
上の画面ではCMコマンドも実行しています。
CMコマンドのルールもDMコマンドと同じです。
従来のCMコマンドの書式は、
CM aaaa
です。
aaaaは開始アドレスです。
機能拡張後の書式は、
CM aaaa[dddd]
です。
[dddd]はセグメントベースアドレスです。
省略した場合には従来と同じDS=0000でのメモリアドレスの指定となります。
セグメントベースアドレスの指定は1000、F000のように切りのよい数値でなければならないということはありません。
ただそうすることが必要な場合を除いて、セグメントベースアドレスは0000、1000、2000、3000、…のように下3桁が000であるような値を指定したほうがわかりやすいと思います。
下は「切りのよくない」セグメントベースアドレスの指定例です。
上はセグメントベースアドレス=F000の0100〜017FをDMコマンドで表示しました。
次にセグメントベースアドレス=F030の0100〜017FをDMコマンドで表示しました。
セグメントベースアドレスに端数があると、物理メモリアドレスがちょっとわかりにくくなってしまいます。
上のDMの実行に対してその3行下からの表示になると思ったのですが、まるで中身が違いますねえ。
はて?
おお、そうでした。
うっかりミスでした。
ここはDM 0100,017F[F003]とすべきでした。
DM 0100,017F[F003]を実行したところ、今度は3行下からの表示になりました。
0100,017F[F000]の物理メモリアドレスはF0100〜F017Fで、
0100,017F[F003]の物理メモリアドレスはF0130〜F01AFです。
0100,017F[F030]の物理メモリアドレスはF0400〜F047Fでした。
そのようにセグメントベースアドレスには制約はありませんが、この例のように端数のついたベースアドレスを指定しても分かりにくくなるだけで、とりたててメリットはありません。
セグメントについては簡単にですが[第5回]で説明していますので、ご参照ください。
16ビットマイコンボードの製作[第65回]
2018.8.4upload
前へ
次へ
ホームページトップへ戻る