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
前へ
次へ
ホームページトップへ戻る