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

復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります

[第62回]

●IOバイトとバージョンai2)

前回は、ちょっと時間がありませんでしたので、ファンクションコール07H(IOバイトの取り出し)とファンクションコール0CH(バージョンbフ取り出し)のテストプログラムのソースリストをお見せしただけで終わりました(のつもりでした)。
本日になりましてから読み直してみましたら、うっかりしてソースプログラムリストではなくてアセンブルリストだったことに気が付きました。
急いで差換えましたので、現在はソースプログラムリストになっています。

そこであらためまして。
下がアセンブルリストです。

2012/3/15  22:6  ftst7.txt
END=819B
              ; BDOS TEST7 get IOBYTE & version No.
              ;2012/3/15
              ;
                ORG $8100
                FCALL=$8005
              ; 
              ;IOBYTE
8100 0E07       LD C,07;get iobyte
8102 CD0580     CALL FCALL
8105 F5         PUSH AF
8106 118881     LD DE,IOBYTE
8109 0E09       LD C,09;string out
810B CD0580     CALL FCALL
810E F1         POP AF
810F CD5081     CALL B2HEXDP
8112 CD2881     CALL CRLF
              ;version no.
8115 0E0C       LD C,0C;version no. get
8117 CD0580     CALL FCALL
811A E5         PUSH HL
811B 119081     LD DE,VERNO
811E 0E09       LD C,09;string out
8120 CD0580     CALL FCALL
8123 E1         POP HL
8124 CD3F81     CALL HEX4DP
8127 C9         RET
              ;
              ;CL & LF
8128 3E0D     CRLF:LD A,0D
812A CD3481     CALL ADP
812D 3E0A       LD A,0A
812F C33481     JP ADP
              ;space disp
8132 3E20     SPDP:LD A,20
              ;A disp
8134 C5       ADP:PUSH BC
8135 E5         PUSH HL
8136 5F         LD E,A
8137 0E02       LD C,02
8139 CD0580     CALL FCALL
813C E1         POP HL
813D C1         POP BC
813E C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
813F C5       HEX4DP:PUSH BC
8140 E5         PUSH HL
8141 CD6981     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8144 D5         PUSH DE
8145 EB         EX DE,HL
8146 CD5B81     CALL DEDP
8149 D1         POP DE
814A CD5B81     CALL DEDP
814D E1         POP HL
814E C1         POP BC
814F C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
8150 C5       B2HEXDP:PUSH BC
8151 E5         PUSH HL
8152 CD6F81     CALL B2HEX2
8155 CD5B81     CALL DEDP
8158 E1         POP HL
8159 C1         POP BC
815A C9         RET
              ;
              ;DE(asckii 2bytes) disp
815B D5       DEDP:PUSH DE
815C 5A         LD E,D
815D 0E02       LD C,02
815F CD0580     CALL FCALL
8162 D1         POP DE
8163 0E02       LD C,02
8165 CD0580     CALL FCALL
8168 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
8169 7C       B2HEX4:LD A,H
816A CD6F81     CALL B2HEX2
816D EB         EX DE,HL
816E 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
816F F5       B2HEX2:PUSH AF
8170 0F         RRCA
8171 0F         RRCA
8172 0F         RRCA
8173 0F         RRCA
8174 CD7E81     CALL B2HEX1
8177 57         LD D,A
8178 F1         POP AF
8179 CD7E81     CALL B2HEX1
817C 5F         LD E,A
817D C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
817E E60F     B2HEX1:AND 0F
8180 C630       ADD A,30
8182 FE3A       CP 3A
8184 D8         RET C;0-9
8185 C607       ADD A,07;A-F
8187 C9         RET
              ;
8188 696F6279 IOBYTE:"ioby"
818C 7465             "te"
818E 3D         DB 3D;=
818F 24               DB 24;$
8190 76657273 VERNO:"vers"
8194 696F6E20   "ion "
8198 484C       "HL"
819A 3D         DB 3D
819B 24         DB 24;$
              ;
ADP          =8134  B2HEX1       =817E  B2HEX2       =816F  
B2HEX4       =8169  B2HEXDP      =8150  CRLF         =8128  
DEDP         =815B  FCALL        =8005  HEX4DP       =813F  
IOBYTE       =8188  SPDP         =8132  VERNO        =8190  

●IOバイト(論理デバイスと物理デバイス)

CP/Mでは入出力装置として4つのデバイスを扱います。
それぞれに名前がついています。

CON: コンソール入出力(キーボード入力とディスプレイ表示を想定)
RDR: シリアル入力(当初は紙テープリーダーを想定)
PUN: シリアル出力(当初は紙テープパンチャーを想定)
LST: プリンタ出力

CP/Mではこの4つの装置はロジカルデバイス(論理的な装置)として定義されています。
ロジカルデバイスに対してフィジカルデバイス(物理的な装置)があります。
これは実際に接続される装置で、「実習CP/M」(アスキー出版局)によりますと、その例として、TTY(テレタイプ)、CRT(キャラクタディスプレイ)、PTR(紙テープリーダー)、PTP(紙テープパンチャー)、LPT(ラインプリンタ)などが挙げられています。
うむむ。
これは確かに、過去の遺物ですねえ。

そして前記の4つの論理デバイスのそれぞれに対して、各4通りの物理デバイスを結びつけることができます。
論理デバイスの何に物理デバイスの何を結びつけるか、ということを管理しているのがIOバイトです。
アドレス8003H(本来は0003H)の1バイトです。
1バイトを2ビットずつに区切り、下のようにLST:、PUN:、RDR:、CON:を割り当てています。

ビット7 6   5 4   3 2   1 0
 LST:  PUN:  RDR:  CON:

  ↓      ↓       ↓       ↓
  00     00      00      00
  01     01      01      01
  10     10      10      10
  11     11      11      11

2ビットですから、その下に示したように、4通りの選択ができます。
それぞれの00〜11に、それぞれの物理デバイスを結びつけておくことで、ビットの値を変更することによって、物理デバイスをソフトウエアで選択することができるようになります。

ところで。
今回のテストをするまでは、私はこのIOバイトの各ビットにはすでに何らかの物理デバイスが割り当てられているものだと思っていました。
実はCP/Mを起動するとIOバイトは00Hになります。
各ビットが全て0になります。
前述の「実習CP/M」(アスキー出版局)では、各論理デバイスの00にはTTY(テレタイプ)が割り当ててありました。

しかし。
どうもどこかがおかしいぞ?
という気がしていました。
BIOSのエントリ部には、TTYもPTPもPTRもないのですよねえ。
あるのは、CONST、CONIN、CONOUT、LIST、PUNCH、READERだけです。

えええ?
これって、全部論理デバイスじゃないの?
BIOSなのに、物理デバイスに関する項目が無い???
言うなれば、デバイスドライバが無いってことでしょ。
それで、どうやって論理デバイスと物理デバイスとを結びつけるというのでしょう?

どうやら私は勘違いをしていたようです。
あらためて「実習CP/M」(アスキー出版局)を読み直してみて、やっと納得できました。
実はCP/MではIOバイトの各ビットをどのように実際の物理デバイスに結びつけるか、というところは全てBIOSに任せてしまっていたのです。

これはこの次に説明する予定の、ファンクションコール08(IOバイトのセット)のテストプログラムを実行して確認しています。
IOバイトの値をどのように変更しても、入力、出力には全く変化はありませんでした。

IOバイトの値を参照して、それぞれのビットに応じた物理デバイスを割り当てるのは、BIOSのやる仕事ですから、BIOSにそのようなプログラムが書かれてない限り、IOバイトは全く「無意味」ということになります。

うむむ。
そういうことであったか…。

ということは、たとえばCON:に232Cを割り当てることもできるけれども、それはそのようにBIOSに書いておかなければならない、ということのようです。
…そこまではちょっとやってられませんから、とりあえずは、現行のまま、物理デバイスの割り当てをIOバイトに従っておこなう、という部分は「白紙」ということにしておきます。

●バージョン

ファンクションコール0CHを実行すると、Hレジスタには00が、Lレジスタには22Hが入ります。
Hレジスタ=00はOSがCP/Mであることを示し、01ならMP/Mであることを示しています。
またLレジスタはそのバージョンで、22Hはバージョン2.2であることを示しています。
うむむ。
これがCP/M2.2であることを知った上で使っている場合には(当然そのはずです)、意味の無いファンクションコールです。
しかし、将来中日電工オリジナルのCP/Mを供給するようになった場合には、このファンクションコールは、そのバージョンを示すために利用できるかも知れません。

●プログラムの説明

このプログラムを実行すると、現在のIOバイトの値とバージョン情報が表示されます。

ファンクションコール07HはIOバイトの取り出しです。
Cレジスタに07を入れてシステムをコールすると、AレジスタにIOバイト(8003H。本来は0003H)の値が入ります。

ファンクションコール0CHはバージョンbフ取り出しです。
Cレジスタに0CHを入れてシステムをコールすると、HLレジスタにバージョンo報が入ります。
Hレジスタには00(CP/M)か01(MP/M)かのいずれかが入ります。
Lレジスタにはバージョンb示す値が入ります。
このCP/Mはバージョン2.2ですからL=22Hになります。

結果を表示するのに、[第42回]で作ったメモリダンププログラムのサブルーチンをそのまま利用しています。

●FTST7.TXTのアセンブル画面です

FTST7.TXTをZASM.COMでアセンブルしたあと、ZB3[Enter]でND80ZVとUSB接続しました。



この後はいつものように、ログファイルで説明をします。

logfile nd80zlog\03152206.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst7.bin,8100
loading FTST7.BIN ...009c(156)bytes loaded,from 8100 to 819B
>jp d233

a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN
a>save 1 ftst7.com
a>dir
A: FILLE5   COM : FTEST1   COM : FTEST2   COM : DM       COM
A: TEST     COM : FTEST4   COM : FTEST4-1 TXT : FTEST4-2 COM
A: FTEST4-3 COM : COPY     COM : TESTDATA TXT : FILLFF   COM
A: TESTDAT2 TXT : CMP      COM : FILL00   BIN : FTST7    COM
a>ftst7
iobyte=00
version HL=0022
a>^D>a>^D>

ERR:23 
>dm 8000,800f
8000  C3 62 D2 00 00 C3 06 C4-01 68 45 68 02 88 51 E7  テbメ..テ.ト.hEh..Q.
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Thu Mar 15 22:13:15 2012

/LDコマンドでFTST7.BINを8100Hにロードしました。
そのあと、
JP D233[Enter]
でCP/Mを起動して、DIRコマンドでディレクトリを表示させました。

SAVE 1 FTST7.COM[Enter]
と入力して、8100HからのプログラムをFTST7.COMの名前でRAMディスクに保存したあと、DIRコマンドで確認をしています。

FTST7[Enter]
で、FTST7.COMを実行した結果、
iobyte=00
version HL=0022
が表示されました。
IOバイトの値が00で、ファンクションコール0CHを実行した結果、HLに0022Hが入れられたことを示しています。

ワンボードマイコンでCP/Mを![第62回]
2012.3.16upload

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