2015.2.4

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

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


[第121回]


●ファンクション1B

ファンクション1Bはディスクアローケーションアドレスの取り出しです。
カレントドライブのディスクアローケーションベクトル(ALV)の先頭アドレスがHLレジスタに入ります。
アローケーションベクトル(ALV)については「ワンボードマイコンでCP/Mを!」[第210回][第212回]で詳しく説明をしています。

ファンクション1Bは「ワンボードマイコンでCP/Mを!」[第210回]でテストをしました。
そこで作ったテストプログラムはVFTST15です。
最初にカレントドライブのアローケーションベクトルの先頭アドレスを表示したあと、アローケーションベクトル(128バイト)の内容を表示します。

テストプログラムVFTST15のソースプログラムをインテルニーモニックに書き直してMFTST15を作りました。

●テストプログラムMFTST15

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

; BDOS TEST15 function1B (get allocation vector address )
;2012/4/12 9/4
;
        ORG $0100
        FCALL=$0005
;
        MVI C,1B
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        MVI C,08
LOOP:MVI B,10
LOOP1:MOV A,M
        CALL B2HEXDP
        INX H
        DCR B
        JNZ LOOP1
        CALL CRLF
        DCR C
        JNZ LOOP
        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
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:MOV A,H
        CALL B2HEX2
        XCHG
        MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH PSW
        RRC
        RRC
        RRC
        RRC
        CALL B2HEX1
        MOV D,A
        POP PSW
        CALL B2HEX1
        MOV E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:ANI 0F
        ADI 30
        CPI 3A
        RC;0-9
        ADI 07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CPI 30;>="0"?
        RC;no
        CPI 3A;<="9"?
        JC HTOB1_2;yes,"0" to "9"
        CPI 41;>="A" ?
        RC;no
        CPI 47;<="F"?
        JC HTOB1_1
        CPI 61;>="a"?
        RC;no
        CPI 67;<="f"?
        CMC
        RC;no
HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:ANI 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH B
        PUSH H
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH D
        XCHG
        CALL DEDP
        POP D
        CALL DEDP
        POP H
        POP B
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH B
        PUSH H
        CALL B2HEX2
        CALL DEDP
        POP H
        POP B
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH D
        MOV E,D
        MVI C,02
        CALL FCALL
        POP D
        MVI C,02
        CALL FCALL
        RET
;
ERRMSG:"err"
        DB 24;$
;

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

2015/1/31  9:42  mftst15.txt
END=019F
              ; BDOS TEST15 function1B (get allocation vector address )
              ;2012/4/12 9/4
              ;
                        ORG $0100
                        FCALL=$0005
              ;
0100 0E1B       MVI C,1B
0102 CD0500     CALL FCALL
0105 CD7201     CALL HEX4DP
0108 CD2001     CALL CRLF
010B 0E08       MVI C,08
010D 0610     LOOP:MVI B,10
010F 7E       LOOP1:MOV A,M
0110 CD8301     CALL B2HEXDP
0113 23         INX H
0114 05         DCR B
0115 C20F01     JNZ LOOP1
0118 CD2001     CALL CRLF
011B 0D         DCR C
011C C20D01     JNZ LOOP
011F C9         RET
              ;
              ;CL & LF
0120 3E0D     CRLF:MVI A,0D
0122 CD2C01     CALL ADP
0125 3E0A       MVI A,0A
0127 C32C01     JMP ADP
              ;space disp
012A 3E20     SPDP:MVI A,20
              ;A disp
012C C5       ADP:PUSH B
012D E5         PUSH H
012E 5F         MOV E,A
012F 0E02       MVI C,02
0131 CD0500     CALL FCALL
0134 E1         POP H
0135 C1         POP B
0136 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0137 7C       B2HEX4:MOV A,H
0138 CD3D01     CALL B2HEX2
013B EB         XCHG
013C 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
013D F5       B2HEX2:PUSH PSW
013E 0F         RRC
013F 0F         RRC
0140 0F         RRC
0141 0F         RRC
0142 CD4C01     CALL B2HEX1
0145 57         MOV D,A
0146 F1         POP PSW
0147 CD4C01     CALL B2HEX1
014A 5F         MOV E,A
014B C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
014C E60F     B2HEX1:ANI 0F
014E C630       ADI 30
0150 FE3A       CPI 3A
0152 D8         RC;0-9
0153 C607       ADI 07;A-F
0155 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
0156 FE30     HTOB1:CPI 30;>="0"?
0158 D8         RC;no
0159 FE3A       CPI 3A;<="9"?
015B DA6F01     JC HTOB1_2;yes,"0" to "9"
015E FE41       CPI 41;>="A" ?
0160 D8         RC;no
0161 FE47       CPI 47;<="F"?
0163 DA6D01     JC HTOB1_1
0166 FE61       CPI 61;>="a"?
0168 D8         RC;no
0169 FE67       CPI 67;<="f"?
016B 3F         CMC
016C D8         RC;no
016D C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
016F E60F     HTOB1_2:ANI 0F
0171 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
0172 C5       HEX4DP:PUSH B
0173 E5         PUSH H
0174 CD3701     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
0177 D5         PUSH D
0178 EB         XCHG
0179 CD8E01     CALL DEDP
017C D1         POP D
017D CD8E01     CALL DEDP
0180 E1         POP H
0181 C1         POP B
0182 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
0183 C5       B2HEXDP:PUSH B
0184 E5         PUSH H
0185 CD3D01     CALL B2HEX2
0188 CD8E01     CALL DEDP
018B E1         POP H
018C C1         POP B
018D C9         RET
              ;
              ;DE(asckii 2bytes) disp
018E D5       DEDP:PUSH D
018F 5A         MOV E,D
0190 0E02       MVI C,02
0192 CD0500     CALL FCALL
0195 D1         POP D
0196 0E02       MVI C,02
0198 CD0500     CALL FCALL
019B C9         RET
              ;
019C 657272   ERRMSG:"err"
019F 24         DB 24;$
              ;
ADP          =012C  B2HEX1       =014C  B2HEX2       =013D  
B2HEX4       =0137  B2HEXDP      =0183  CRLF         =0120  
DEDP         =018E  ERRMSG       =019C  FCALL        =0005  
HEX4DP       =0172  HTOB1        =0156  HTOB1_1      =016D  
HTOB1_2      =016F  LOOP         =010D  LOOP1        =010F  
SPDP         =012A  

●MFTST15の実行

「ワンボードマイコンでCP/Mを!」[第210回]を開いて、その画面をバックにしてMFTST15を実行しました。



「ワンボードマイコンでCP/Mを!」[第210回]を書いた時点ではディスクアローケーションベクトルはD800〜D7FFに置いていましたが、その後ND80Z3.5(ND80ZV)用ZB3DOS(CP/M互換DOS)を供給開始した時までに、E600〜E7FFに変更しました。

●ファンクション1F

ファンクション1FはCP/M起動時にメモリに読み込まれるディスクパラメータブロックの先頭アドレスを取得してHLレジスタに入れます。
ディスクパラメータブロックについては「ワンボードマイコンでCP/Mを!」[第143回]で説明をしています。
ディスクパラメータブロックは15バイトのエリアで、ディスクの基本的な情報(セクタ数/トラックや総ブロック数など)が書かれています。
ファンクション1Fは「ワンボードマイコンでCP/Mを!」[第212回]でテストをしました。
そこで作ったテストプログラムはFTST16です。

テストプログラムVFTST16のソースプログラムをインテルニーモニックに書き直してMFTST16を作りました。

●テストプログラムMFTST16

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

; BDOS TEST16 function1F (get disk parameter address )
;2012/4/12 9/10
;
        ORG $0100
        FCALL=$0005
;
        MVI C,1F
        CALL FCALL
        CALL HEX4DP
        CALL CRLF
        MVI B,0F;=15
LOOP:MOV A,M
        CALL B2HEXDP
        CALL SPDP
        INX H
        DCR B
        JNZ LOOP
        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
;
;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
B2HEX4:MOV A,H
        CALL B2HEX2
        XCHG
        MOV A,E
;binary to hex, 1byte data to ascii 2charactors,A to DE
B2HEX2:PUSH PSW
        RRC
        RRC
        RRC
        RRC
        CALL B2HEX1
        MOV D,A
        POP PSW
        CALL B2HEX1
        MOV E,A
        RET
;binary to hex, low 4bit to ascii 1charactor
B2HEX1:ANI 0F
        ADI 30
        CPI 3A
        RC;0-9
        ADI 07;A-F
        RET
;hex to binary, ascii 1charactor to low 4bit 
HTOB1:CPI 30;>="0"?
        RC;no
        CPI 3A;<="9"?
        JC HTOB1_2;yes,"0" to "9"
        CPI 41;>="A" ?
        RC;no
        CPI 47;<="F"?
        JC HTOB1_1
        CPI 61;>="a"?
        RC;no
        CPI 67;<="f"?
        CMC
        RC;no
HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
HTOB1_2:ANI 0F
        RET
;HL(bynary 2bytes) to asckii 4bytes & disp
HEX4DP:PUSH B
        PUSH H
        CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
        PUSH D
        XCHG
        CALL DEDP
        POP D
        CALL DEDP
        POP H
        POP B
        RET
;A(binary) to asckii 2bytes HEX & disp
B2HEXDP:PUSH B
        PUSH H
        CALL B2HEX2
        CALL DEDP
        POP H
        POP B
        RET
;
;DE(asckii 2bytes) disp
DEDP:PUSH D
        MOV E,D
        MVI C,02
        CALL FCALL
        POP D
        MVI C,02
        CALL FCALL
        RET
;
ERRMSG:"err"
        DB 24;$
;

下はMFTST6−3のアセンブルリストです。

2015/1/31  10:32  mftst16.txt
END=0199
              ; BDOS TEST16 function1F (get disk parameter address )
              ;2012/4/12 9/10
              ;
                        ORG $0100
                        FCALL=$0005
              ;
0100 0E1F       MVI C,1F
0102 CD0500     CALL FCALL
0105 CD6C01     CALL HEX4DP
0108 CD1A01     CALL CRLF
010B 060F       MVI B,0F;=15
010D 7E       LOOP:MOV A,M
010E CD7D01     CALL B2HEXDP
0111 CD2401     CALL SPDP
0114 23         INX H
0115 05         DCR B
0116 C20D01     JNZ LOOP
0119 C9         RET
              ;
              ;CL & LF
011A 3E0D     CRLF:MVI A,0D
011C CD2601     CALL ADP
011F 3E0A       MVI A,0A
0121 C32601     JMP ADP
              ;space disp
0124 3E20     SPDP:MVI A,20
              ;A disp
0126 C5       ADP:PUSH B
0127 E5         PUSH H
0128 5F         MOV E,A
0129 0E02       MVI C,02
012B CD0500     CALL FCALL
012E E1         POP H
012F C1         POP B
0130 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0131 7C       B2HEX4:MOV A,H
0132 CD3701     CALL B2HEX2
0135 EB         XCHG
0136 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0137 F5       B2HEX2:PUSH PSW
0138 0F         RRC
0139 0F         RRC
013A 0F         RRC
013B 0F         RRC
013C CD4601     CALL B2HEX1
013F 57         MOV D,A
0140 F1         POP PSW
0141 CD4601     CALL B2HEX1
0144 5F         MOV E,A
0145 C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
0146 E60F     B2HEX1:ANI 0F
0148 C630       ADI 30
014A FE3A       CPI 3A
014C D8         RC;0-9
014D C607       ADI 07;A-F
014F C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
0150 FE30     HTOB1:CPI 30;>="0"?
0152 D8         RC;no
0153 FE3A       CPI 3A;<="9"?
0155 DA6901     JC HTOB1_2;yes,"0" to "9"
0158 FE41       CPI 41;>="A" ?
015A D8         RC;no
015B FE47       CPI 47;<="F"?
015D DA6701     JC HTOB1_1
0160 FE61       CPI 61;>="a"?
0162 D8         RC;no
0163 FE67       CPI 67;<="f"?
0165 3F         CMC
0166 D8         RC;no
0167 C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
0169 E60F     HTOB1_2:ANI 0F
016B C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
016C C5       HEX4DP:PUSH B
016D E5         PUSH H
016E CD3101     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
0171 D5         PUSH D
0172 EB         XCHG
0173 CD8801     CALL DEDP
0176 D1         POP D
0177 CD8801     CALL DEDP
017A E1         POP H
017B C1         POP B
017C C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
017D C5       B2HEXDP:PUSH B
017E E5         PUSH H
017F CD3701     CALL B2HEX2
0182 CD8801     CALL DEDP
0185 E1         POP H
0186 C1         POP B
0187 C9         RET
              ;
              ;DE(asckii 2bytes) disp
0188 D5       DEDP:PUSH D
0189 5A         MOV E,D
018A 0E02       MVI C,02
018C CD0500     CALL FCALL
018F D1         POP D
0190 0E02       MVI C,02
0192 CD0500     CALL FCALL
0195 C9         RET
              ;
0196 657272   ERRMSG:"err"
0199 24         DB 24;$
              ;
ADP          =0126  B2HEX1       =0146  B2HEX2       =0137  
B2HEX4       =0131  B2HEXDP      =017D  CRLF         =011A  
DEDP         =0188  ERRMSG       =0196  FCALL        =0005  
HEX4DP       =016C  HTOB1        =0150  HTOB1_1      =0167  
HTOB1_2      =0169  LOOP         =010D  SPDP         =0124    

●MFTST16の実行

MFTST16を実行しました。

最初にディスクパラメータブロックの先頭アドレス(E920)が表示され、続いてディスクパラメータブロック(15パイト)の内容が表示されました。
パラメータブロックの値とその値の示す意味は次の通りです。

E920 1000 1トラック(ブロック)当たりのセクタ数。0010H=16
E922 04   ブロックシフトaiBIOS内部で計算に使われる
E923 0F   セクタ/ブロック−1
E924 00   このシステムでは使いません
E925 FF03 ディスクサイズ(総ブロック数−1) 03FFH=1023
E927 7F00 ディレクトリサイズ(管理できる最大ファイル名数−1) 007FH=127
E929 C000 ALVの先頭2バイトに置かれているディレクトリブロックの配置
E92B 0000 このシステムでは使いません
E92D 0000 オフセット。使用可能な最初のデータブロックの位置

「ワンボードマイコンでCP/Mを!」[第212回]でのVFTST16の実行結果ではパラメータブロックの先頭アドレスはD268と表示されていますが、その後にプログラムサイズの関係でE020に変更しました。
最終的には今回の実行結果にありますようにE920に変更しました。
ところがND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)取扱説明書では最終的な変更が反映されていなくて、E020のままになっていることがわかりました。
すでにND80Z3.5(ND80ZV)用のZB3DOS(CP/M互換DOS)をご購入いただいた読者様は、お手数ですが上記のように同説明書を訂正していただきますようお願いいたします。

MYCPU80でCP/Mを![第121回]
2015.2.4upload

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