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

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

[第207回]


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

CP/M2.2では最大16台のディスクを接続することができました。
ディスクドライブはA〜Pの名前をつけて識別します。
そしてそのAドライブ〜Pドライブをビット0〜ビット15までの各ビットに順に割り当てた16ビットの値がログインベクトルです。

あるドライブに1回でもアクセスすると、ログインベクトルの、そのドライブに対応するビットが1になります。

ファンクションコール19H(ログインディスクbフ取り出し)は現在のカレントドライブb取得します。

ファンクションコール18Hと19Hについては[第90回]でテストをしました。
そこで作ったテストプログラムはFTST10−5です。

[第141回]ではRAMディスク版での動作テストをしています。

今回はFTST10−5を64KBフルRAM用に一部を書き換えてファイル名をVFTST105にしました。
下はそのソースプログラムリストです。
ディレクトリ表示プログラムにログインベクトルとカレントドライブbフ表示を追加しています。

●ソースプログラムVFTST105.TXT

; BDOS TEST10 filename search   function0e,11,12,18,19
;2012/3/19 4/4 
; 4/7 4/9 dir disp
;4/10 func18,19
;8/29
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        DMA=$0080
;
        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;$
;

●VFTST105の実行

[第141回]と同じことをVFTST105で行なってみました。
表示結果が多くて1画面には収まりませんので[第141回]と同様にログファイルでお見せします。
表示結果が長くなりますので、ドライブのディレクトリ表示は途中のファイル名表示を省略しました。

logfile nd80zlog\08292120.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>jp d233

A>copy z:vftst105.bin

A>vftst105
drvno.?0
0001
00
F80.COM
F80.COM
HELL1.FOR
HELL1.REL
.
.
FNC0BT-2.COM
FNC06T-2.COM
FNC03T-2.COM
VFTST102.COM
end
drvno.?b
0003
01
TEST2.COM
MBASIC.COM
.
.
FORLIB.REL
HELLO.COM
end
drvno.?a
0003
00
F80.COM
F80.COM
HELL1.FOR
HELL1.REL
.
.
FNC0BT-2.COM
FNC06T-2.COM
FNC03T-2.COM
VFTST102.COM
end
drvno.?
A>

●ファンクションコール1CH(ライトプロテクトセット)、1DH(R/Oベクトルの取り出し)

ファンクションコール1CHと1DHは[第91回]でテストをしました。
ファンクションコール1CHはカレントドライブにライトプロテクトをかけてリードオンリーにします。
R/Oベクトルは上で説明しましたログインベクトルと同じ形式の16ビットの値で、リードオンリーになっているドライブに対応するビットが1になります。

ファンクションコール1DHは、そのR/Oベクトルの値をHLレジスタに入れてリターンします。

[第91回]ではファンクションコール1CHをテストするFTST11と、ファンクションコール1DHをテストするFTST12を作りました。

[第141回]ではRAMディスク版での動作テストをしています。

今回はFTST11を64KBフルRAM用に一部を書き換えてファイル名をVFTST11にしました。
また同様にFTST12を書き換えてファイル名をVFTST12にしました。
下はそのソースプログラムリストです。

●ソースプログラムVFTST11.TXT

; BDOS TEST11 set 'read only ' function1C
;2012/4/10 8/29
;
     	ORG $0100
     	FCALL=$0005
;
	LD C,1C
	CALL FCALL
	RET
;

●ソースプログラムVFTST12.TXT

; BDOS TEST12 get r/o vector    function1D
;2012/4/10 8/29
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
;
        LD C,1D
        CALL FCALL
        CALL HEX4DP
        ;
;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
;

●VFTST11とVFTST12の実行

[第141回]を開いてそれをバックにして、VFTST11とVFTST12を実行しました。



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

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