16ビットマイコンボードの製作
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
いつか使ってみるつもりで入手してそのまま置いてあった16ビットCPUのことを思い出しました。
AMD社のAM188です。
その名の通り、CPUコアは80188互換の16ビットCPUです。
そのAM188を使った16ビットマイコンボードの製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
[第71回]
●8086版BASICシステムサブルーチン
昨日はZ80用ZB3BASICのシステムサブルーチンをUPしました。
今回はその8086版です。
アドレス1000から始まるメモリ領域にはZB3BASICでコールしている基本的なサブルーチンがまとめてあります。
8086版BASICは現在も作成作業中ですが、もともとZB3BASICをもとにして8086版BASICを作成してきましたので、8086用のシステムサブルーチンもアドレス、機能についてはZ80用ZB3BASICと同じです。
システムサブルーチンのエントリアドレスはアドレス1000を先頭に3バイトのJMP命令になっているため、各サブルーチンが3バイト毎に並んでいます。
そこのところもZ80用と変わりません。
表中記載のないものや、機能の欄にx印のついているものは、ずっと以前にZB3BASICのもとになったBASICシステムでは機能していたものの、現在は機能していないサブルーチンです。
そのところもZ80用と同じです。
ただプログラムそのものは、もちろん8086の命令で全部書き換えてありますから、機能は同じでも使用レジスタはZ80用とは全く異なります。
アドレス | サブルーチン名(ニーモニック) | 機能 | 使用レジスタ |
1000 | ROMST | 8086版BASICにエントリする。全ての設定が初期化される | |
1003 | |||
1006 | SCEDT | x | |
1009 | |||
100C | SCRL | x | |
100F | CLR | 画面クリア | AL |
1012 | |||
1015 | ADISP | ALレジスタの値(ASCIIコード)を画面に表示する | AL |
1018 | DEDP | (DI)の値(ASCII)から後ろの文字列を(DI)=0Dかまたは(DI)=ALになるまで画面に表示する | AX、DI |
101B | CRLF | 改行する | AL |
101E | DPKIN | x | |
1021 | PRTR | x | |
1024 | SPJMP | (DI)→AL、AL=20ならDI=DI+1、AL≠20まで繰り返し | AL、DI |
1027 | HDCMP | SI−DIを計算、結果によってC、Z、Sフラグが変化する。SIは変化しない | SI、DI |
102A | HOWDP | HOW?表示後システムに戻る | |
102D | SRYDP | SORRY表示後システムに戻る | |
1030 | WHTDP | WHAT?表示後システムに戻る | |
1033 | REENT | システムに戻る | |
1036 | DECIN | (DI)の値から後ろの数値(ASCII、30〜39)を非数値になるまで読んで2進数に変換してSIにいれる | AL、BH、DX、SI、DI |
1039 | SPCDP | 1桁の空白を表示する | AL |
103C | INKEY | x | |
103F | ASHX1 | ASCII→HEX1桁変換。ALの値が30−39、41−46のとき00−09、0A−0FをALに入れる | AL |
1042 | ASHX2 | ASCII→HEX2桁変換。DXの値(ASCII2桁)をHEXに変換、DHに入れる | AL、DX |
1045 | ASHX4 | ASCII→HEX4桁変換。(DI)〜(DI+3)の値(ASCII4桁)をHEXに変換、DXに入れる。実行後DI=DI+4になる | AL、BH、DX、DI |
1048 | HXDP1 | ALの値(下位4ビット)を16進数1桁で表示する | AL |
104B | HXDP2 | DHの値を16進数2桁で表示する | AL、DH |
104E | HXDP4 | DXの値を16進数4桁で表示する | AL、DX |
1051 | ADRD | (DI)〜(DI+8)の値”aaaa,bbbb”(aaaa、bbbbはASCII表現の16進数)を読み、BX=aaaa、DX=bbbbにする。実行後DI=DI+9になる。 | AL、BX、DX、DI |
1054 | BREAK | x | |
1057 | BRSP | x | |
105A | LDISP | BASIC1行表示 | |
105D | DECDP | SIの値を符号付10進数で表示する | AL、BX、DX、SI |
1060 | HLNEG | SIが負数のとき−SI→SI、BHのビット7を反転する | BH、SI |
1063 | DIV | SI/DI→BX 余りはSIに。計算後DIは変化しない | AX、BX、DX、SI、DI |
1066 | BITDP | ALの値をビット表示する | AL、BX |
1069 | LDSP1 | BASIC1行表示 | |
106C | ATMKCK | x | |
106F | HLNG2 | −SI→SI、BHのビット7を反転する | BH、SI |
1072 | LSRC1 | BASIC行サーチ | |
1075 | LSRC2 | BASIC行サーチ | |
1078 | LSRC0 | BASIC行サーチ | |
107B | CRLF | 改行する | AL |
107E | ASH22 | ASCII→HEX2桁変換。(DI)〜(DI+1)の値(ASCII2桁)をHEXに変換、AL、DLに入れる。実行後DI=DI+2になる | AL、DI、DX |
1081 | MOVE | (BX)〜(SI)の値を(DI)〜にCOPYする | BX、CX、SI、DI |
1084 | ADRD3 | (DI)〜(DI+13)の値”aaaa,bbbb,cccc”(aaaa、bbbb、ccccはASCII表現の16進数)を読み、BX=aaaa、SI=bbbb、DI=ccccにする。 | AL、BX、DX、SI、DI |
1087 | DINS | (DI)の値から後ろの数値(ASCII、30〜39)を非数値になるまで読んで2進数に変換してDXにいれる。オーバフローしたときはDH=FFになる | AL、BX、DX、DI |
108A | BRKCK | x | |
108D | CLRNT | x | |
1090 | BRSP2 | x | |
1093 | LSC0 | BASIC行サーチ | |
1096 | LSC1 | BASIC行サーチ | |
1099 | LSC2 | BASIC行サーチ | |
109C | VDPS | BASIC変数名表示 | |
109F | CMDP | BASICコマンド名表示 | |
10A2 | LDSP2 | BASIC1行表示(行番号より後ろ) | |
10A5 | PRT0 | 82C55に接続したセントロニクスプリンタにAの値(ASCII)を1字印刷 | AL |
10A8 | ERRDP | ERR:に続いてAの値が10進数2桁で表示される | AX、BX、DX、SI、DI |
10AB | ADSPS | Aレジスタの値(ASCIIコード)を画面に表示する | |
10AE | SIN | ND80Zモニタのシリアル入力ルーチンをCALLする | AL |
表中BASIC行、BASIC命令などに関係するサブルーチンはBASICの編集、実行に使用されるサブルーチンなので汎用としては使えません。
私自身の備忘録も兼ねているため表中に記載しましたが、特殊目的のため詳細については省略しています。
16ビットマイコンボードの製作[第71回]
2018.8.13upload
前へ
次へ
ホームページトップへ戻る