2015.1.27

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

MYCPU80でCP/Mを!
超巨大基板の8080互換HCMOS・CPUでCP/Mを走らせてしまおうという、なんとも狂気なプロジェクトです!


[第113回]


●ファンクション0E

ファンクション0Eはディスクドライブセレクトです。
カレントディスクドライブを変更します。
Eレジスタに入れた値(Aドライブ=00、Bドライブ=01、Cドライブ=02、Dドライブ=03)によって、ファンクション0Eの実行後は、そこで指定したドライブがカレントディスクドライブになります。
ただしその効果はユーザープログラム内だけで有効で、プログラムを終了すると、プログラム開始時のカレントドライブに戻ります。

ファンクション0Eは「ワンボードマイコンでCP/Mを!」[第206回]で説明をしています。
そこでテストに使ったプログラムはVFTST102です。
いつものようにVFTST102をインテルニーモニックに書き換えてMFTST102を作りました。

●テストプログラムMFTST102

MFTST102のソースプログラムです。

; BDOS TEST10 filename search   function0e,11,12
;2012/3/19 4/4 8/27
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        DMA=$0080
;
LOOP:LXI D,INPMSG
        CALL MSGDP
        MVI C,01
        CALL FCALL
        CPI 1A;^z
        RZ
        CPI 30
        JZ DNOPASS
        ANI 0F
        DCR A
        MOV E,A
        MVI C,0E
        CALL FCALL
DNOPASS:CALL CRLF
        MVI C,11;first file search
        LXI D,FCB
        CALL FCALL
        CPI FF
        JZ NOFILE
;       
        LXI H,DMA
        LXI D,$0020
        ORA A;dirctory code 00-03
LOOP1:JZ NMDISP
        DAD D
        DCR A
        JMP LOOP1
NMDISP:INX H;pass drive no.
        MVI B,08
NMDISP2:MOV A,M
        CPI 20
        JZ NMDISP3
        CALL ADP
NMDISP3:INX H
        DCR B
        JNZ NMDISP2
        MVI A,2E;"."
        CALL ADP
        MVI B,03
NMDISP4:MOV A,M
        CALL ADP
        INX H
        DCR B
        JNZ NMDISP4
        CALL CRLF
;next file search
        MVI C,12;next file search
        LXI D,FCB
        CALL FCALL
        CPI FF
        JZ END
        LXI H,DMA
        LXI D,$0020
        ORA A;dirctory code 00-03
NXTSRCH:JZ NMDISP
        DAD D
        DCR A
        JMP NXTSRCH
;
NOFILE:LXI D,NFMSG
        CALL MSGDP
        JMP LOOP        
;
END:LXI D,ENDMSG
        CALL MSGDP
        JMP LOOP
;
MSGDP:MVI C,09
        CALL FCALL
        RET
;
;CL & LF
CRLF:MVI A,0D
        CALL ADP
        MVI A,0A
        JMP ADP
;space disp
SPDP:MVI A,20
;A disp
ADP:PUSH B
        PUSH H
        MOV E,A
        MVI C,02
        CALL FCALL
        POP H
        POP B
        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;$
;

下はMFTST102のアセンブルリストです。

2015/1/27  20:50  mftst102.txt
END=01C3
              ; BDOS TEST10 filename search   function0e,11,12
              ;2012/3/19 4/4 8/27
              ;
                        ORG $0100
                        FCALL=$0005
                FCB=$005C
                DMA=$0080
              ;
0100 11AA01   LOOP:LXI D,INPMSG
0103 CD8D01     CALL MSGDP
0106 0E01       MVI C,01
0108 CD0500     CALL FCALL
010B FE1A       CPI 1A;^z
010D C8         RZ
010E FE30       CPI 30
0110 CA1C01     JZ DNOPASS
0113 E60F       ANI 0F
0115 3D         DCR A
0116 5F         MOV E,A
0117 0E0E       MVI C,0E
0119 CD0500     CALL FCALL
011C CD9301   DNOPASS:CALL CRLF
011F 0E11       MVI C,11;first file search
0121 115C00     LXI D,FCB
0124 CD0500     CALL FCALL
0127 FEFF       CPI FF
0129 CA7B01     JZ NOFILE
              ; 
012C 218000     LXI H,DMA
012F 112000     LXI D,$0020
0132 B7         ORA A;dirctory code 00-03
0133 CA3B01   LOOP1:JZ NMDISP
0136 19         DAD D
0137 3D         DCR A
0138 C33301     JMP LOOP1
013B 23       NMDISP:INX H;pass drive no.
013C 0608       MVI B,08
013E 7E       NMDISP2:MOV A,M
013F FE20       CPI 20
0141 CA4701     JZ NMDISP3
0144 CD9F01     CALL ADP
0147 23       NMDISP3:INX H
0148 05         DCR B
0149 C23E01     JNZ NMDISP2
014C 3E2E       MVI A,2E;"."
014E CD9F01     CALL ADP
0151 0603       MVI B,03
0153 7E       NMDISP4:MOV A,M
0154 CD9F01     CALL ADP
0157 23         INX H
0158 05         DCR B
0159 C25301     JNZ NMDISP4
015C CD9301     CALL CRLF
              ;next file search
015F 0E12       MVI C,12;next file search
0161 115C00     LXI D,FCB
0164 CD0500     CALL FCALL
0167 FEFF       CPI FF
0169 CA8401     JZ END
016C 218000     LXI H,DMA
016F 112000     LXI D,$0020
0172 B7         ORA A;dirctory code 00-03
0173 CA3B01   NXTSRCH:JZ NMDISP
0176 19         DAD D
0177 3D         DCR A
0178 C37301     JMP NXTSRCH
              ;
017B 11B201   NOFILE:LXI D,NFMSG
017E CD8D01     CALL MSGDP
0181 C30001     JMP LOOP        
              ;
0184 11BE01   END:LXI D,ENDMSG
0187 CD8D01     CALL MSGDP
018A C30001     JMP LOOP
              ;
018D 0E09     MSGDP:MVI C,09
018F CD0500     CALL FCALL
0192 C9         RET
              ;
              ;CL & LF
0193 3E0D     CRLF:MVI A,0D
0195 CD9F01     CALL ADP
0198 3E0A       MVI A,0A
019A C39F01     JMP ADP
              ;space disp
019D 3E20     SPDP:MVI A,20
              ;A disp
019F C5       ADP:PUSH B
01A0 E5         PUSH H
01A1 5F         MOV E,A
01A2 0E02       MVI C,02
01A4 CD0500     CALL FCALL
01A7 E1         POP H
01A8 C1         POP B
01A9 C9         RET
              ;
01AA 6472766E INPMSG:"drvn"
01AE 6F2E       "o."
01B0 3F         DB 3F;?
01B1 24         DB 24;$
01B2 6E6F7420 NFMSG:"not "
01B6 666F756E   "foun"
01BA 64         "d"
01BB 0D         DB 0D
01BC 0A         DB 0A
01BD 24         DB 24;$
01BE 656E64   ENDMSG:"end"
01C1 0D         DB 0D
01C2 0A         DB 0A
01C3 24         DB 24;$
              ;
ADP          =019F  CRLF         =0193  DMA          =0080  
DNOPASS      =011C  END          =0184  ENDMSG       =01BE  
FCALL        =0005  FCB          =005C  INPMSG       =01AA  
LOOP         =0100  LOOP1        =0133  MSGDP        =018D  
NFMSG        =01B2  NMDISP       =013B  NMDISP2      =013E  
NMDISP3      =0147  NMDISP4      =0153  NOFILE       =017B  
NXTSRCH      =0173  SPDP         =019D  

●MFTST102の実行

上のほうでも書きましたようにファンクション0EのテストプログラムVFTST102は「ワンボードマイコンでCP/Mを!」[第206回]で実行をしていますが、そこではそのもとになったプログラムのテストを行なった「ワンボードマイコンでCP/Mを!」[第140回]を引用してそこでの説明にしたがってテストをしています。
ところがその[第140回]を読んでみますと、実はファンクション0Eのテストプログラムはさらに元があって、「ワンボードマイコンでCP/Mを!」[第85回]でそもそものプログラムの説明をしています。
VFTST102はなんだかおかしな使い方をしているなあと思ったのですが、それでやっと合点がいきました。
もとはファンクション11、ファンクション12のテストプログラム(ファイル名サーチ)に少し手を加えてファンクション0Eについてもテストできるようにしたものだということがわかりました。

ファンクション11、12はMYCPU80用としてはまだテストしていません。
こういうテストプログラムはテストの順序から考えると不適切なのですが、仕方がありません。
VFTST102をもとにしてMFTST102を作ってしまいましたから、今回も同じことをMFTST102を使ってやってみることにしました。
テストの結果はログファイルでお見せします。

logfile mycpu80log\01272118.txt open
mzbdos3o 2015.1.21 by Chunichidenko

MYCPU80に接続しました(19200bps)
0001 001E - z
1000 00C3 - 
*** mycpu80 zb3basic ****
>/cpm
loading mcpm5e.bin ...19be(6590)bytes loaded,from CC00 to E5BD
inbf[0]=3E,inbf[1]=01
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>copy z:mftst102.com
MFTST102COM to MFTST102COM.. done

A>dir
A: MBASIC   COM : STARTREK BAS : PIP      COM : ESC4     MAC
A: MFTST102 COM : VFDUMP1  COM : VFDUMP2  COM : VFDUMP   COM
A: VFD05    COM : STARTRK2 BAS : TREKINST BAS : VFTST11  COM
A: VFTST12  COM
A>dir b:
B: MBASIC   COM : STARTREK BAS : PIP      COM : ESC4     MAC
B: VFTST6   TXT : VFDUMP1  COM : VFDUMP2  COM : VFDUMP   COM
B: VFD05    COM : STARTRK2 BAS : TREKINST BAS : VFTST12  COM
B: TEST     TXT
A>dir c:
C: ABTEST1  TXT : ABTEST2  TXT : TEST3XYZ TXT
A>mftst102 *.*
drvno.?a
MBASIC.COM
STARTREK.BAS
PIP.COM
ESC4.MAC
MFTST102.COM
VFDUMP1.COM
VFDUMP2.COM
VFDUMP.COM
VFD05.COM
STARTRK2.BAS
TREKINST.BAS
VFTST11.COM
VFTST12.COM
end
drvno.?c
ABTEST1.TXT
ABTEST2.TXT
TEST3XYZ.TXT
end
drvno.?0
ABTEST1.TXT
ABTEST2.TXT
TEST3XYZ.TXT
end
drvno.?
A>

もとのテストはAドライブとBドライブで行なっていますが、念のためDIRコマンドで確認をしたところ、AドライブとBドライブの中身が似ていることがわかりましたので、今回のテストではAドライブとCドライブでテストをすることにしました。

drvno?の表示に

と入力するとAドライブのファイル名が表示されました。
次のdrvno?の表示に

と入力するとCドライブのファイル名が表示されました。
次のdrvno?の表示に

と入力するとCドライブのファイル名が表示されました。
0を入力すると最後に選択したドライブがそのまま選択されるようにプログラムされています。
ここでCtrl+Zを入力してMFTST102の実行を終了しました。

プログラムの中でCドライブを選択して終了したのですが、その選択はプログラムの中だけで有効で、プログラムを終了すると、プログラム開始時のカレントドライブに戻ります。

続いてカレントドライブを意識したテストを行ないました。
カレントドライブをCドライブに変更して、MFTST102を実行します。

A>c:
C>a:mftst102 *.*
drvno.?0
ABTEST1.TXT
ABTEST2.TXT
TEST3XYZ.TXT
end
drvno.?a
MBASIC.COM
STARTREK.BAS
PIP.COM
ESC4.MAC
MFTST102.COM
VFDUMP1.COM
VFDUMP2.COM
VFDUMP.COM
VFD05.COM
STARTRK2.BAS
TREKINST.BAS
VFTST11.COM
VFTST12.COM
end
drvno.?0
MBASIC.COM
STARTREK.BAS
PIP.COM
ESC4.MAC
MFTST102.COM
VFDUMP1.COM
VFDUMP2.COM
VFDUMP.COM
VFD05.COM
STARTRK2.BAS
TREKINST.BAS
VFTST11.COM
VFTST12.COM
end
drvno.?
C>/exit
>
0000 00C3 - 
リモート接続を終了しました
logfile closed at Tue Jan 27 21:24:25 2015

drvno?の表示に

と入力すると実行開始時のカレントドライブが選択され、Cドライブのファイル名が表示されました。
次のdrvno?の表示に

と入力するとAドライブのファイル名が表示されました。
次のdrvno?の表示に

と入力するとAドライブのファイル名が表示されました。
ここでCtrl+Zを入力してMFTST102の実行を終了しました。

プログラムの中でAドライブを選択して終了したのですが、その選択はプログラムの中だけで有効で、プログラムを終了すると、プログラム開始時のカレントドライブCドライブに戻り、
C>
と表示されました。

MYCPU80でCP/Mを![第113回]
2015.1.27upload

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