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

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

[第90回]


●ファンクションコール18H、19H(ログインベクトルとログインディスクbフ取り出し)

ログインディスクという用語は今では一般的ではありません。
カレントディスク、カレントドライブと言うほうが適切だと思います。
a>
と表示されているときのAドライブがカレントドライブです。
ここで
a>b:[Enter]
と入力して
b>
と表示されたときから、カレントドライブはBドライブです。

それに対して、ログインベクトルはカレントベクトルと言い直してもしっくりきません。
CP/Mでは最大で16台のディスクドライブ装置を接続できます。
ドライブ名としてアルファベットのA〜Pが使われます。
そのA〜Pを16ビットの値のビット0からビット15に当てはめたものがログインベクトルです(下図)。

bit15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
P
O
N
M
L
K
J
I
H
G
F
E
D
C
B
A


CP/Mを起動してから以後にアクセスされたディスクに対応するビットが1になります。

●ファンクションコール18H、19Hテストプログラム

[第88回]で作成したFTST10−4を変更して、ファンクションコール18H、19Hを追加します。
レジスタの値を16進で表示するために、[第42回]で作ったDMプログラムの表示サブルーチンをコピーします。

下はそのようにして作ったプログラム(FTST10−5.TXT)のソースリストです。
DNOPASS:の下にファンクションコール18H、19Hを追加しました。
ADSP:サブルーチンの下に16進表示のためのサブルーチンを追加しました。

; BDOS TEST10 filename search   function0e,11,12,18,19
;2012/3/19 4/4 
; 4/7 4/9 dir disp
;4/10 func18,19
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        DMA=$8080
;
        LD HL,FCB
        INC HL
        LD A,(HL)
        CP 20;no fcb data
        JP NZ,LOOP
        LD B,0B;=11
        LD A,3F;'?'
FILL3F:LD (HL),A
        INC HL
        DEC B
        JP NZ,FILL3F
LOOP:LD DE,INPMSG
        CALL MSGDP
        LD C,01
        CALL FCALL
        CP 1A;^z
        RET Z
        CP 30
        JP Z,DNOPASS
        AND 0F
        DEC A
        LD E,A
        LD C,0E
        CALL FCALL
DNOPASS:CALL CRLF
;
        LD C,18
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        LD C,19
        CALL FCALL
        CALL B2HEXDP
        CALL CRLF
;
        LD C,11;first file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,NOFILE
;       
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
LOOP1:  JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP LOOP1
NMDISP:INC HL;pass drive no.
        LD B,08
NMDISP2:LD A,(HL)
        CP 20
        JP Z,NMDISP3
        CALL ADP
NMDISP3:INC HL
        DEC B
        JP NZ,NMDISP2
        LD A,2E;"."
        CALL ADP
        LD B,03
NMDISP4:LD A,(HL)
        CALL ADP
        INC HL
        DEC B
        JP NZ,NMDISP4
        CALL CRLF
;next file search
        LD C,12;next file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,END
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
NXTSRCH:JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP NXTSRCH
;
NOFILE:LD DE,NFMSG
        CALL MSGDP
        JP LOOP 
;
END:LD DE,ENDMSG
        CALL MSGDP
        JP LOOP
;
MSGDP:LD C,09
        CALL FCALL
        RET
;
;CL & LF
CRLF:LD A,0D
        CALL ADP
        LD A,0A
        JP ADP
;space disp
SPDP:LD A,20
;A disp
ADP:PUSH BC
        PUSH HL
        LD E,A
        LD C,02
        CALL FCALL
        POP HL
        POP BC
        RET
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:LD A,H
        CALL B2HEX2
        EX DE,HL
        LD A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH AF
        RRCA
        RRCA
        RRCA
        RRCA
        CALL B2HEX1
        LD D,A
        POP AF
        CALL B2HEX1
        LD E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:AND 0F
        ADD A,30
        CP 3A
        RET C;0-9
        ADD A,07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CP 30;>="0"?
        RET C;no
        CP 3A;<="9"?
        JP C,HTOB1_2;yes,"0" to "9"
        CP 41;>="A" ?
        RET C;no
        CP 47;<="F"?
        JP C,HTOB1_1
        CP 61;>="a"?
        RET C;no
        CP 67;<="f"?
        CCF
        RET C;no
HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:AND 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH BC
        PUSH HL
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH DE
        EX DE,HL
        CALL DEDP
        POP DE
        CALL DEDP
        POP HL
        POP BC
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH BC
        PUSH HL
        CALL B2HEX2
        CALL DEDP
        POP HL
        POP BC
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH DE
        LD E,D
        LD C,02
        CALL FCALL
        POP DE
        LD C,02
        CALL FCALL
        RET
;
INPMSG:"drvn"
        "o."
        DB 3F;?
        DB 24;$
NFMSG:"not "
        "foun"
        "d"
        DB 0D
        DB 0A
        DB 24;$
ENDMSG:"end"
        DB 0D
        DB 0A
        DB 24;$
;

追加した部分の説明です。
Cレジスタに18Hを入れてシステムをコールします。
その結果HLレジスタにログインベクトルの値が入ります。
サブルーチンHEX4DPをコールして、HLレジスタの値を16進4桁で表示します。
そのあと、Cレジスタに19Hを入れてシステムをコールします。
その結果Aレジスタに現在のログインディスク(カレントドライブ)のbェ入ります。
カレントドライブbヘ、CP/M内部で使われている値がそのまま入れられます。
Aドライブが00、Bドライブが01、Cドライブが02、…という数値で示されます。

FTST10−5.TXTをZASM.COMでアセンブルします。
下はアセンブルの結果作成されたアセンブルリストです。

2012/4/10  10:48  ftst10-5.txt
END=8252
              ; BDOS TEST10 filename search   function0e,11,12,18,19
              ;2012/3/19 4/4 
              ; 4/7 4/9 dir disp
              ;4/10 func18,19
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                DMA=$8080
              ;
8100 215C80     LD HL,FCB
8103 23         INC HL
8104 7E         LD A,(HL)
8105 FE20       CP 20;no fcb data
8107 C21481     JP NZ,LOOP
810A 060B       LD B,0B;=11
810C 3E3F       LD A,3F;'?'
810E 77       FILL3F:LD (HL),A
810F 23         INC HL
8110 05         DEC B
8111 C20E81     JP NZ,FILL3F
8114 113982   LOOP:LD DE,INPMSG
8117 CDB781     CALL MSGDP
811A 0E01       LD C,01
811C CD0580     CALL FCALL
811F FE1A       CP 1A;^z
8121 C8         RET Z
8122 FE30       CP 30
8124 CA3081     JP Z,DNOPASS
8127 E60F       AND 0F
8129 3D         DEC A
812A 5F         LD E,A
812B 0E0E       LD C,0E
812D CD0580     CALL FCALL
8130 CDBD81   DNOPASS:CALL CRLF
              ;
8133 0E18       LD C,18
8135 CD0580     CALL FCALL
8138 CD0F82     CALL HEX4DP
813B CDBD81     CALL CRLF
813E 0E19       LD C,19
8140 CD0580     CALL FCALL
8143 CD2082     CALL B2HEXDP
8146 CDBD81     CALL CRLF
              ;
8149 0E11       LD C,11;first file search
814B 115C80     LD DE,FCB
814E CD0580     CALL FCALL
8151 FEFF       CP FF
8153 CAA581     JP Z,NOFILE
              ; 
8156 218080     LD HL,DMA
8159 112000     LD DE,$0020
815C B7         OR A;dirctory code 00-03
815D CA6581   LOOP1:    JP Z,NMDISP
8160 19         ADD HL,DE
8161 3D         DEC A
8162 C35D81     JP LOOP1
8165 23       NMDISP:INC HL;pass drive no.
8166 0608       LD B,08
8168 7E       NMDISP2:LD A,(HL)
8169 FE20       CP 20
816B CA7181     JP Z,NMDISP3
816E CDC981     CALL ADP
8171 23       NMDISP3:INC HL
8172 05         DEC B
8173 C26881     JP NZ,NMDISP2
8176 3E2E       LD A,2E;"."
8178 CDC981     CALL ADP
817B 0603       LD B,03
817D 7E       NMDISP4:LD A,(HL)
817E CDC981     CALL ADP
8181 23         INC HL
8182 05         DEC B
8183 C27D81     JP NZ,NMDISP4
8186 CDBD81     CALL CRLF
              ;next file search
8189 0E12       LD C,12;next file search
818B 115C80     LD DE,FCB
818E CD0580     CALL FCALL
8191 FEFF       CP FF
8193 CAAE81     JP Z,END
8196 218080     LD HL,DMA
8199 112000     LD DE,$0020
819C B7         OR A;dirctory code 00-03
819D CA6581   NXTSRCH:JP Z,NMDISP
81A0 19         ADD HL,DE
81A1 3D         DEC A
81A2 C39D81     JP NXTSRCH
              ;
81A5 114182   NOFILE:LD DE,NFMSG
81A8 CDB781     CALL MSGDP
81AB C31481     JP LOOP 
              ;
81AE 114D82   END:LD DE,ENDMSG
81B1 CDB781     CALL MSGDP
81B4 C31481     JP LOOP
              ;
81B7 0E09     MSGDP:LD C,09
81B9 CD0580     CALL FCALL
81BC C9         RET
              ;
              ;CL & LF
81BD 3E0D     CRLF:LD A,0D
81BF CDC981     CALL ADP
81C2 3E0A       LD A,0A
81C4 C3C981     JP ADP
              ;space disp
81C7 3E20     SPDP:LD A,20
              ;A disp
81C9 C5       ADP:PUSH BC
81CA E5         PUSH HL
81CB 5F         LD E,A
81CC 0E02       LD C,02
81CE CD0580     CALL FCALL
81D1 E1         POP HL
81D2 C1         POP BC
81D3 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
81D4 7C       B2HEX4:LD A,H
81D5 CDDA81     CALL B2HEX2
81D8 EB         EX DE,HL
81D9 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
81DA F5       B2HEX2:PUSH AF
81DB 0F         RRCA
81DC 0F         RRCA
81DD 0F         RRCA
81DE 0F         RRCA
81DF CDE981     CALL B2HEX1
81E2 57         LD D,A
81E3 F1         POP AF
81E4 CDE981     CALL B2HEX1
81E7 5F         LD E,A
81E8 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
81E9 E60F     B2HEX1:AND 0F
81EB C630       ADD A,30
81ED FE3A       CP 3A
81EF D8         RET C;0-9
81F0 C607       ADD A,07;A-F
81F2 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
81F3 FE30     HTOB1:CP 30;>="0"?
81F5 D8         RET C;no
81F6 FE3A       CP 3A;<="9"?
81F8 DA0C82     JP C,HTOB1_2;yes,"0" to "9"
81FB FE41       CP 41;>="A" ?
81FD D8         RET C;no
81FE FE47       CP 47;<="F"?
8200 DA0A82     JP C,HTOB1_1
8203 FE61       CP 61;>="a"?
8205 D8         RET C;no
8206 FE67       CP 67;<="f"?
8208 3F         CCF
8209 D8         RET C;no
820A C609     HTOB1_1:ADD A,09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
820C E60F     HTOB1_2:AND 0F
820E C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
820F C5       HEX4DP:PUSH BC
8210 E5         PUSH HL
8211 CDD481     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
8214 D5         PUSH DE
8215 EB         EX DE,HL
8216 CD2B82     CALL DEDP
8219 D1         POP DE
821A CD2B82     CALL DEDP
821D E1         POP HL
821E C1         POP BC
821F C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
8220 C5       B2HEXDP:PUSH BC
8221 E5         PUSH HL
8222 CDDA81     CALL B2HEX2
8225 CD2B82     CALL DEDP
8228 E1         POP HL
8229 C1         POP BC
822A C9         RET
              ;
              ;DE(asckii 2bytes) disp
822B D5       DEDP:PUSH DE
822C 5A         LD E,D
822D 0E02       LD C,02
822F CD0580     CALL FCALL
8232 D1         POP DE
8233 0E02       LD C,02
8235 CD0580     CALL FCALL
8238 C9         RET
              ;
8239 6472766E INPMSG:"drvn"
823D 6F2E       "o."
823F 3F         DB 3F;?
8240 24         DB 24;$
8241 6E6F7420 NFMSG:"not "
8245 666F756E   "foun"
8249 64         "d"
824A 0D         DB 0D
824B 0A         DB 0A
824C 24         DB 24;$
824D 656E64   ENDMSG:"end"
8250 0D         DB 0D
8251 0A         DB 0A
8252 24         DB 24;$
              ;
ADP          =81C9  B2HEX1       =81E9  B2HEX2       =81DA  
B2HEX4       =81D4  B2HEXDP      =8220  CRLF         =81BD  
DEDP         =822B  DMA          =8080  DNOPASS      =8130  
END          =81AE  ENDMSG       =824D  FCALL        =8005  
FCB          =805C  FILL3F       =810E  HEX4DP       =820F  
HTOB1        =81F3  HTOB1_1      =820A  HTOB1_2      =820C  
INPMSG       =8239  LOOP         =8114  LOOP1        =815D  
MSGDP        =81B7  NFMSG        =8241  NMDISP       =8165  
NMDISP2      =8168  NMDISP3      =8171  NMDISP4      =817D  
NOFILE       =81A5  NXTSRCH      =819D  SPDP         =81C7  

●FTST10−5.COMのセーブと実行

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST10−5.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動します。

logfile nd80zlog\04101051.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst10-5.bin,8100
loading FTST10-5.BIN ...0153(339)bytes loaded,from 8100 to 8252
>jp d233

a>save 2 ftst10-5.com
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM
a>

CP/Mを起動したあと、
SAVE 2 FTST10−5.COM[Enter]
を実行して、FTST10−5.COMというファイル名でAドライブにセーブしました。
今回はプログラムが少し長くて256バイトを越えてしまいましたから、SAVE 2 になります。
SAVEの後に置く数値はプログラムサイズが256バイト以下の場合には1、256バイトを超え、512バイト以下のとき2、というように256バイト増えるごとに1、2、3…のように与えます。

DIRコマンドを実行して、セーブされたことを確認しました。

FTST10−5.COMを実行しました。

a>ftst10-5
drvno.?0
0001
00
FNC0E-1.COM
FTST10.COM
FTST10-2.COM
FTST10-4.COM
FTST10-5.COM
end
drvno.?b
0003
01
FNC0E-0.COM
end
drvno.?a
0003
00
FNC0E-1.COM
FTST10.COM
FTST10-2.COM
FTST10-4.COM
FTST10-5.COM
end
drvno.?
a>^D
end of CP/M
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Apr 10 10:54:02 2012

drvno?の表示に、

を入力しました。
0を入力したときはカレントドライブは変わりませんから、Aドライブのままです。
ログインベクトルの値として0001が表示されました。
まだAドライブ以外はアクセスされていませんから、Aドライブを示すビット0のみが1になっています。
カレントドライブとして00が表示されました。
Aドライブは数値としては01ですが、ファンクションコール19Hでは、それを−1した数が示されます。
そのあと、Aドライブにセーブされているファイル名が表示されました。

次のdrvno?の表示には

を入力しました。
これでAドライブとBドライブがアクセスされたことになりますから、ログインベクトルの値は、ビット0とビット1が1になって、0003と表示されました。
カレントドライブとして01が表示されました。
そのあとBドライブにセーブされているファイル名が表示されました。

次のdrvno?の表示には

を入力しました。
またAドライブが選択されましたが、ログインベクトルの値は、変わらず0003と表示されました。
カレントドライブとしては00が表示されました。
そのあとAドライブにセーブされているファイル名が表示されました。

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

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