2018.8.4
前へ
次へ
ホームページトップへ戻る


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

前へ
次へ
ホームページトップへ戻る