2015.2.11

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

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


[第128回]


●ファンクション24(2)

ファンクション24は「ワンボードマイコンでCP/Mを!」[第233回]「ワンボードマイコンでCP/Mを!」[第235回]でテストをしています。
前回は「ワンボードマイコンでCP/Mを!」[第233回]と同じように、ファンクション24のテストをするための前準備として、シーケンシャルファイルTEST.SAFを作成しました。
そしてTEST.SAFが正しく作成されたかどうかを確かめるために、VFDUMPでBドライブのセクタを直接読んで確認をしました。
「ワンボードマイコンでCP/Mを!」[第234回ではVFTST24.COMを作って、TEST.SAFの内容を読み出しています。
今回もそれと同じテストをしてみることにします。

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

●テストプログラムMFTST24

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

; BDOS VFTST24 file read
; from ftest4-1.txt & ftest3dm.txt
;2012/2/28
;4/30
;10/18
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        RECNO=$007C
        DMA=$0080
;
        MVI C,0F;open
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ ERR
        XRA A
        STA RECNO
;
LOOP1:MVI C,14;read
        LXI D,FCB
        CALL FCALL
        ORA A
        RNZ;read end
;
        LDA RECNO
        CALL B2HEXDP
        MVI A,28;(
        CALL ADP
        LXI H,DMA
        MOV C,M
        INX H
        MOV A,M
        CALL B2HEXDP
        MOV A,C
        CALL B2HEXDP
        MVI A,29;)
        CALL ADP
        CALL SPDP
        CALL SPDP
        JMP LOOP1
;
;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
;
ERR:LXI D,ERRMSG
        MVI C,09
        CALL FCALL
        RET
ERRMSG:"can'"
        "t op"
        "en"
        DB 0D
        DB 0A
        DB 24;$
;

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

2015/2/3  15:13  mftst24.txt
END=01D1
              ; BDOS VFTST24 file read
              ; from ftest4-1.txt & ftest3dm.txt
              ;2012/2/28
              ;4/30
              ;10/18
              ;
                      ORG $0100
                      FCALL=$0005
                      FCB=$005C
                      RECNO=$007C
                      DMA=$0080
              ;
0100 0E0F             MVI C,0F;open
0102 115C00           LXI D,FCB
0105 CD0500           CALL FCALL
0108 3C               INR A;if FFH?
0109 CABC01           JZ ERR
010C AF               XRA A
010D 327C00           STA RECNO
              ;
0110 0E14     LOOP1:MVI C,14;read
0112 115C00           LXI D,FCB
0115 CD0500           CALL FCALL
0118 B7               ORA A
0119 C0               RNZ;read end
              ;
011A 3A7C00     LDA RECNO
011D CDA301     CALL B2HEXDP
0120 3E28       MVI A,28;(
0122 CD4C01     CALL ADP
0125 218000           LXI H,DMA
0128 4E         MOV C,M
0129 23         INX H
012A 7E         MOV A,M
012B CDA301           CALL B2HEXDP
012E 79         MOV A,C
012F CDA301     CALL B2HEXDP
0132 3E29       MVI A,29;)
0134 CD4C01     CALL ADP
0137 CD4A01     CALL SPDP
013A CD4A01           CALL SPDP
013D C31001           JMP LOOP1
              ;
              ;CL & LF
0140 3E0D     CRLF:MVI A,0D
0142 CD4C01     CALL ADP
0145 3E0A       MVI A,0A
0147 C34C01     JMP ADP
              ;space disp
014A 3E20     SPDP:MVI A,20
              ;A disp
014C C5       ADP:PUSH B
014D E5         PUSH H
014E 5F         MOV E,A
014F 0E02       MVI C,02
0151 CD0500     CALL FCALL
0154 E1         POP H
0155 C1         POP B
0156 C9         RET
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
0157 7C       B2HEX4:MOV A,H
0158 CD5D01     CALL B2HEX2
015B EB         XCHG
015C 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
015D F5       B2HEX2:PUSH PSW
015E 0F         RRC
015F 0F         RRC
0160 0F         RRC
0161 0F         RRC
0162 CD6C01     CALL B2HEX1
0165 57         MOV D,A
0166 F1         POP PSW
0167 CD6C01     CALL B2HEX1
016A 5F         MOV E,A
016B C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
016C E60F     B2HEX1:ANI 0F
016E C630       ADI 30
0170 FE3A       CPI 3A
0172 D8         RC;0-9
0173 C607       ADI 07;A-F
0175 C9         RET
              ;hex to binary, ascii 1charactor to low 4bit 
0176 FE30     HTOB1:CPI 30;>="0"?
0178 D8         RC;no
0179 FE3A       CPI 3A;<="9"?
017B DA8F01     JC HTOB1_2;yes,"0" to "9"
017E FE41       CPI 41;>="A" ?
0180 D8         RC;no
0181 FE47       CPI 47;<="F"?
0183 DA8D01     JC HTOB1_1
0186 FE61       CPI 61;>="a"?
0188 D8         RC;no
0189 FE67       CPI 67;<="f"?
018B 3F         CMC
018C D8         RC;no
018D C609     HTOB1_1:ADI 09;41 to 46 -> 4A to 4F,or 61 to 67 -> 6A to 6F
018F E60F     HTOB1_2:ANI 0F
0191 C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
0192 C5       HEX4DP:PUSH B
0193 E5         PUSH H
0194 CD5701     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
0197 D5         PUSH D
0198 EB         XCHG
0199 CDAE01     CALL DEDP
019C D1         POP D
019D CDAE01     CALL DEDP
01A0 E1         POP H
01A1 C1         POP B
01A2 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
01A3 C5       B2HEXDP:PUSH B
01A4 E5         PUSH H
01A5 CD5D01     CALL B2HEX2
01A8 CDAE01     CALL DEDP
01AB E1         POP H
01AC C1         POP B
01AD C9         RET
              ;
              ;DE(asckii 2bytes) disp
01AE D5       DEDP:PUSH D
01AF 5A         MOV E,D
01B0 0E02       MVI C,02
01B2 CD0500     CALL FCALL
01B5 D1         POP D
01B6 0E02       MVI C,02
01B8 CD0500     CALL FCALL
01BB C9         RET
              ;
01BC 11C501   ERR:LXI D,ERRMSG
01BF 0E09             MVI C,09
01C1 CD0500           CALL FCALL
01C4 C9               RET
01C5 63616E27 ERRMSG:"can'"
01C9 74206F70         "t op"
01CD 656E             "en"
01CF 0D               DB 0D
01D0 0A               DB 0A
01D1 24               DB 24;$
              ;
ADP          =014C  B2HEX1       =016C  B2HEX2       =015D  
B2HEX4       =0157  B2HEXDP      =01A3  CRLF         =0140  
DEDP         =01AE  DMA          =0080  ERR          =01BC  
ERRMSG       =01C5  FCALL        =0005  FCB          =005C  
HEX4DP       =0192  HTOB1        =0176  HTOB1_1      =018D  
HTOB1_2      =018F  LOOP1        =0110  RECNO        =007C  
SPDP         =014A  

以下の説明は「ワンボードマイコンでCP/Mを!」[第234回でVFTST24について書いたところをそのまま引用しました。

シーケンシャルリードは、ファイルのレコードを最初に読むときに、FCBの33バイト目(RECNO)に00を書き込みます。
ここはシーケンシャルリード(またはライト)で、次にアクセスするレコードbェ置かれるところです。
今回のプログラムではレコードの値を読むとともに、そのRECNOの値も読んで表示するようにしました。
その値も、レコードのデータを読んで表示する値も16進数で表示します。
1つのレコードには、128バイトの全部にレコードbノ相当する2バイトの値が繰り返して書き込まれていますから、最初の2バイトだけを読んで表示します。
最初にRECNOの値を16進数2桁で表示します。
次に括弧で囲んでレコードのデータを16進数2桁で表示します。

●MFTST24の実行

MFTST24を実行しました。



下は実行を完了したあとの画面です。
「ワンボードマイコンでCP/Mを!」[第234回を開いてその画像をバックにして実行しました。



全部で512レコードありますから前のほうのデータはスクロールしてしまって見えません。
終わりのあたりのデータだけが表示されています。
よく見るとRECNOの値は01〜80が繰り返されています。
シーケンシャルファイルの場合には次に表示するレコードbニして00〜80Hを使います。
最後の80Hは、実は次のエクステントの先頭のレコード(セクタ)であることを示しています(つまり次のエクステントのbO0と同じ)。
ですからこの値が80Hで終わって、次は01から始まっていても、レコードは途切れないで正しい順序でちゃんと読み出されます。
80Hの前後でも()内の値は連続しています。

MYCPU80でCP/Mを![第128回]
2015.2.11upload

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