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


16ビットマイコンボードの製作

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第31回]



●0 DIVIDEほかの処理プログラム

前回からの続きです。
0 DIVIDEの実際の処理プログラムです。
ことのついでに、そのほかのエラー処理プログラムも組み込みました。
またさらにそのほかの割込み処理プログラムもあわせて組み込みました。
下はその部分だけを取り出したプログラムリストです。

[00005]                     ORG=1800
[00006]                     ;;;
[00007]                         INT0PC=0000
[00008]                         INT0CS=0002
[00009]                         INT3PC=000C
[00010]                         INT5PC=0014
[00011]                         INT6PC=0018
[00012]                         INT7PC=001C
[00013]                         INT22PC=0088
[00014]                         INT22CS=008A
[00015]                     ;


[00181] 1876  B800F0            MOV AX,F000
[00182] 1879  BF0200            MOV DI,INT0CS
[00183] 187C  B108              MOV CL,08
[00184] 187E  8905          INTSET1:MOV [DI],AX
[00185] 1880  81C70400          ADD DI,0004
[00186] 1884  FEC9              DEC CL
[00187] 1886  75F6              JNZ INTSET1 <187E>
[00188] 1888  A38A00            MOV [INT22CS],AX
[00189] 188B  B8081D            MOV AX,*DIV0ER
[00190] 188E  A30000            MOV [INT0PC],AX
[00191] 1891  B88E1B            MOV AX,*BROUT
[00192] 1894  A30C00            MOV [INT3PC],AX
[00193] 1897  B8191D            MOV AX,*CDERR
[00194] 189A  A31400            MOV [INT5PC],AX
[00195] 189D  A31800            MOV [INT6PC],AX
[00196] 18A0  A31C00            MOV [INT7PC],AX
[00197] 18A3  B8371D            MOV AX,ROMCALL
[00198] 18A6  A38800            MOV [INT22PC],AX
[00199]                     ;


[00749]                     ;0 divide
[00750] 1D08  A384F0        DIV0ER:MOV [R_AX],AX
[00751] 1D0B  57                PUSH DI
[00752] 1D0C  BF231D            MOV DI,*DIV0T
[00753] 1D0F  32C0          DIV0ER2:XOR AL,AL
[00754] 1D11  E8FEF2            CALL DEDPCS <1012>
[00755] 1D14  5F                POP DI
[00756] 1D15  58                POP AX;PC
[00757] 1D16  E97AFE            JMP BROUT1 <1B93>
[00758]                     ;
[00759] 1D19  A384F0        CDERR:MOV [R_AX],AX
[00760] 1D1C  57                PUSH DI
[00761] 1D1D  BF2D1D            MOV DI,*CDERT
[00762] 1D20  EBED90            JMP DIV0ER2 <1D0F>
[00763]                     ;
[00764] 1D23  302064697669  DIV0T:"0 divide!"
              646521
[00765] 1D2C  0D                DB 0D
[00766]                     ;
[00767] 1D2D  636F64652065  CDERT:"code err!"
              727221
[00768] 1D36  0D                DB 0D
[00769]                     ;
[00770] 1D37  FFD0          ROMCALL:CALL AX
[00771] 1D39  CF                IRET

今回の作業のためにINTテーブルを確認していて、ひょっとするとINT 5h、INT 6h、INT 7hについても対策が必要かもしれないということに気が付きました。
AM188のINTテーブルは[第22回]に表があります。
INT 6hは未定義コードエラーですが、INT 7hも類似のエラーです。
INT 5hはよくわかりませんが、とにかく未処理の割込みが発生するとシステムがハングアップしてしまいますので、INT 5h〜INT 7hはまとめて未定義コードエラーとしました。
INT 3hはブレークポイントの処理ですが、これは簡単なプログラムではありませんから、今回は説明を割愛します。

今回特筆すべきはINT 22hです。
[第27回]で、ユーザープログラムはCS=0000のRAMエリアに置かれるので(そこは同時にDSのエリアでもある)、システムのプログラムが動作するROMエリア(CS=F000)にあるシステムサブルーチンをコールして利用することはできない、と書きました。
INT 22hはそのための対策です。
MSDOSではさまざまなシステムサブルーチンをコールするのにINT 21hを使っています。
それにならってINT 22hを使いました。
AXレジスタにシステムサブルーチンのアドレスを入れて、INT 22h(私が自作した8086アセンブラでは INT 22)を実行すると、CS=F000のROMサブルーチンが呼び出されます。
もっともこの方法ではAXそのものを使うサブルーチンは呼び出せません。
今回のシステムプログラムはもとはZ80の命令語で書いたプログラムがベースになっていますから、ALレジスタは使いますが、AHレジスタはほとんど使いません。
そこで最終的には、MSDOSと同じようにAHレジスタにインデックスb与えたうえで、INT 22を実行するように考えてみます。
そのインデックスbニともに、システムサブルーチンの機能一覧を近いうちにまとめるつもりです。

さて上のプログラムですが、Z80や8080のマシン語、アセンブラの知識経験をお持ちの方でしたら、難なく読めてしまいますでしょう。
そう。
8086のプログラムは難しくありません。
この機会にぜひ16ビットのマシン語プログラム(8086アセンブラ)に挑戦してみてくださいませ。

16ビットマイコンボードの製作[第31回]
2018.6.5upload

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