2015.2.3

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

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


[第120回]


●ファンクション1A

ファンクション1AはDMAアドレスセットです。
ファンクション1Aは「ワンボードマイコンでCP/Mを!」[第202回]でテストをしました。
そこで作ったテストプログラムはVFTST6です。
2つのファイルを比較するプログラムです。
VFTST6のもとになったプログラムとDMAアドレスについては「ワンボードマイコンでCP/Mを!」[第56回]で説明をしています。

今ではかなり前のことになってしまいますが、ND80Z3.5(ND80ZV)用ZB3DOS(CP/M互換DOS)操作説明書を作成中に、ファンクション1Aの動作についての上記ページでの説明に誤りがあることに気が付きました。
同ページでは「ファンクション1AでDMAアドレスを変更すると、プログラムを終了してもその状態が持続するので、プログラムを終了する前にDMAアドレスをデフォルトの設定に戻しておく必要がある」と書きましたが、私の思い違いでした。

ファンクション1AによるDMAアドレスの変更はユーザープログラムの中だけで有効で、プログラムが終了するとデフォルトの設定に戻ります。
そのことにはND80Z3.5(ND80ZV)用ZB3DOS(CP/M互換DOS)の発売開始前に気が付きましたので、上記説明書では訂正文をつけるとともに、テストプログラムVFTST6ではDMAアドレスをデフォルトの設定に戻してから終了していたのを、デフォルトに戻さずに終了するように変更したプログラムVFTST6−2を新たに作り、その変更箇所を示しました。

しかし「ワンボードマイコンでCP/Mを!」[第56回]を訂正することはうっかり忘れておりました。
今頃になってですけれど、同記事も訂正いたしました。

ということでテストプログラムVFTST6−2のソースプログラムをインテルニーモニックに書き直してMFTST6−2を作りました。

●テストプログラムMFTST6−2

MFTST6−2のソースプログラムです。

; BDOS TEST6-2 *****
;2013/4/18****
;
        ORG $0100
        FCALL=$0005
        FCBWK=$003B
        RECNO2=$005B
        FCB=$005C
        FCB2=$006C
        RECNO=$007C
        DMA1=$0080
        DMA2=$0300
        BYTECNTR=$0380
        AWK=$0382
;
        LXI H,FCB2
        LXI D,FCBWK
        MVI B,11;=17
LOOP1:MOV A,M
        STAX D
        INX H
        INX D
        DCR B
        JNZ LOOP1
;
        MVI C,0F;open
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ NOFILERR
;
        MVI C,0F;open
        LXI D,FCBWK
        CALL FCALL
        INR A;if FFH?
        JZ NOFILERR
;
        XRA A
        STA RECNO
        STA RECNO2
        LXI H,BYTECNTR
        MOV M,A
        INX H
        MOV M,A
;
LOOP2:MVI C,1A;DMA address set
        LXI D,DMA1
        CALL FCALL
        MVI C,14;read
        LXI D,FCB
        CALL FCALL
        ORA A
        JNZ CMPEND;read end
;
        MVI C,1A;DMA address set
        LXI D,DMA2
        CALL FCALL
        MVI C,14;read
        LXI D,FCBWK
        CALL FCALL
        ORA A
        JNZ CMPEND;read end
;
        MVI C,80
        LXI H,DMA1
        LXI D,DMA2
LOOP3:LDAX D
        CMP M
        CNZ NOTEQ
        INX H
        INX D
        PUSH H
        LHLD BYTECNTR
        INX H
        SHLD BYTECNTR
        POP H
        DCR C
        JNZ LOOP3
        JMP LOOP2
;
NOFILERR:LXI D,CANTOPN
        MVI C,09
        CALL FCALL
CMPEND:RET;,1A;DMA address set
        LXI D,DMA1
        CALL FCALL
        RET
;
NOTEQ:PUSH B
        PUSH D
        PUSH H
        LHLD BYTECNTR
        CALL HEX4DP
        CALL SPDP
        POP H
        MOV A,M
        STA AWK
        POP D
        LDAX D
        PUSH D
        PUSH H
        PUSH PSW
        LDA AWK
        CALL B2HEXDP
        MVI A,2D;"-"
        CALL ADP
        POP PSW
        CALL B2HEXDP
        CALL CRLF
        POP H
        POP D
        POP B
        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
;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
;
;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
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
;

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

2015/1/30  9:25  mftst6-2.txt
END=0225
              ; BDOS TEST6-2 *****
              ;2013/4/18****
              ;
                ORG $0100
                FCALL=$0005
                FCBWK=$003B
                RECNO2=$005B
                FCB=$005C
                FCB2=$006C
                RECNO=$007C
                DMA1=$0080
                DMA2=$0300
                BYTECNTR=$0380
                AWK=$0382
              ;
0100 216C00     LXI H,FCB2
0103 113B00     LXI D,FCBWK
0106 0611       MVI B,11;=17
0108 7E       LOOP1:MOV A,M
0109 12         STAX D
010A 23         INX H
010B 13         INX D
010C 05         DCR B
010D C20801     JNZ LOOP1
              ;
0110 0E0F       MVI C,0F;open
0112 115C00     LXI D,FCB
0115 CD0500     CALL FCALL
0118 3C         INR A;if FFH?
0119 CA7C01     JZ NOFILERR
              ;
011C 0E0F       MVI C,0F;open
011E 113B00     LXI D,FCBWK
0121 CD0500     CALL FCALL
0124 3C         INR A;if FFH?
0125 CA7C01     JZ NOFILERR
              ;
0128 AF         XRA A
0129 327C00     STA RECNO
012C 325B00     STA RECNO2
012F 218003     LXI H,BYTECNTR
0132 77         MOV M,A
0133 23         INX H
0134 77         MOV M,A
              ;
0135 0E1A     LOOP2:MVI C,1A;DMA address set
0137 118000     LXI D,DMA1
013A CD0500     CALL FCALL
013D 0E14       MVI C,14;read
013F 115C00           LXI D,FCB
0142 CD0500           CALL FCALL
0145 B7               ORA A
0146 C28401           JNZ CMPEND;read end
              ;
0149 0E1A       MVI C,1A;DMA address set
014B 110003     LXI D,DMA2
014E CD0500     CALL FCALL
0151 0E14       MVI C,14;read
0153 113B00     LXI D,FCBWK
0156 CD0500     CALL FCALL
0159 B7         ORA A
015A C28401     JNZ CMPEND;read end
              ;
015D 0E80       MVI C,80
015F 218000     LXI H,DMA1
0162 110003     LXI D,DMA2
0165 1A       LOOP3:LDAX D
0166 BE         CMP M
0167 C48C01     CNZ NOTEQ
016A 23         INX H
016B 13         INX D
016C E5         PUSH H
016D 2A8003     LHLD BYTECNTR
0170 23         INX H
0171 228003     SHLD BYTECNTR
0174 E1         POP H
0175 0D         DCR C
0176 C26501     JNZ LOOP3
0179 C33501     JMP LOOP2
              ;
017C 111802   NOFILERR:LXI D,CANTOPN
017F 0E09       MVI C,09
0181 CD0500           CALL FCALL
0184 C9       CMPEND:RET;,1A;DMA address set
0185 118000     LXI D,DMA1
0188 CD0500     CALL FCALL
018B C9               RET
              ;
018C C5       NOTEQ:PUSH B
018D D5         PUSH D
018E E5         PUSH H
018F 2A8003     LHLD BYTECNTR
0192 CDCF01     CALL HEX4DP
0195 CDC201     CALL SPDP
0198 E1         POP H
0199 7E         MOV A,M
019A 328203     STA AWK
019D D1         POP D
019E 1A         LDAX D
019F D5         PUSH D
01A0 E5         PUSH H
01A1 F5         PUSH PSW
01A2 3A8203     LDA AWK
01A5 CDE001     CALL B2HEXDP
01A8 3E2D       MVI A,2D;"-"
01AA CDC401     CALL ADP
01AD F1         POP PSW
01AE CDE001     CALL B2HEXDP
01B1 CDB801     CALL CRLF
01B4 E1         POP H
01B5 D1         POP D
01B6 C1         POP B
01B7 C9         RET
              ;
              ;CL & LF
01B8 3E0D     CRLF:MVI A,0D
01BA CDC401     CALL ADP
01BD 3E0A       MVI A,0A
01BF C3C401     JMP ADP
              ;space disp
01C2 3E20     SPDP:MVI A,20
              ;A disp
01C4 C5       ADP:PUSH B
01C5 E5         PUSH H
01C6 5F         MOV E,A
01C7 0E02       MVI C,02
01C9 CD0500     CALL FCALL
01CC E1         POP H
01CD C1         POP B
01CE C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
01CF C5       HEX4DP:PUSH B
01D0 E5         PUSH H
01D1 CDF901     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01D4 D5         PUSH D
01D5 EB         XCHG
01D6 CDEB01     CALL DEDP
01D9 D1         POP D
01DA CDEB01     CALL DEDP
01DD E1         POP H
01DE C1         POP B
01DF C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
01E0 C5       B2HEXDP:PUSH B
01E1 E5         PUSH H
01E2 CDFF01     CALL B2HEX2
01E5 CDEB01     CALL DEDP
01E8 E1         POP H
01E9 C1         POP B
01EA C9         RET
              ;
              ;DE(asckii 2bytes) disp
01EB D5       DEDP:PUSH D
01EC 5A         MOV E,D
01ED 0E02       MVI C,02
01EF CD0500     CALL FCALL
01F2 D1         POP D
01F3 0E02       MVI C,02
01F5 CD0500     CALL FCALL
01F8 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
01F9 7C       B2HEX4:MOV A,H
01FA CDFF01     CALL B2HEX2
01FD EB         XCHG
01FE 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
01FF F5       B2HEX2:PUSH PSW
0200 0F         RRC
0201 0F         RRC
0202 0F         RRC
0203 0F         RRC
0204 CD0E02     CALL B2HEX1
0207 57         MOV D,A
0208 F1         POP PSW
0209 CD0E02     CALL B2HEX1
020C 5F         MOV E,A
020D C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
020E E60F     B2HEX1:ANI 0F
0210 C630       ADI 30
0212 FE3A       CPI 3A
0214 D8         RC;0-9
0215 C607       ADI 07;A-F
0217 C9         RET
              ;
0218 63616E27 CANTOPN:"can'"
021C 74206F70         "t op"
0220 656E21           "en!"
0223 0D               DB 0D
0224 0A               DB 0A
0225 24               DB 24;$
              ;
ADP          =01C4  AWK          =0382  B2HEX1       =020E  
B2HEX2       =01FF  B2HEX4       =01F9  B2HEXDP      =01E0  
BYTECNTR     =0380  CANTOPN      =0218  CMPEND       =0184  
CRLF         =01B8  DEDP         =01EB  DMA1         =0080  
DMA2         =0300  FCALL        =0005  FCB          =005C  
FCB2         =006C  FCBWK        =003B  HEX4DP       =01CF  
LOOP1        =0108  LOOP2        =0135  LOOP3        =0165  
NOFILERR     =017C  NOTEQ        =018C  RECNO        =007C  
RECNO2       =005B  SPDP         =01C2  

CMPEND:(アドレス0184)でDMAアドレスをデフォルトに戻してから終了していたところをただのRETに直しています。
その後ろのもとの命令部分を削除しないで残したのは、VFTST6のマシン語プログラムでアドレス0184をC9に書き換えるだけでVFTST6−2のマシン語プログラムになるようにとの配慮からでした。
今回はVFTST6とは関係なくVFTST6−2のみをインテルニーモニックで書き直したため、その部分は削除してしまってもよかったのですが、VFTST6−2との対比の意味からMFTST6−2でもそのまま残すことにしました。

●MFTST6−2の実行

「ワンボードマイコンでCP/Mを!」[第202回]と同じようにしてMFTST6−2を実行しました。
上記リンクページと同様、ファイルの内容比較が正しく行なわれていることがわかるように、わざともとのファイル(MFTST4.TXT)の一部を書き換えました。

ファイルエンドを確認してエンドコード1Aを追加してからCP/M互換DOSにエントリしました。

そのあとTESTDAT3.TXTという名前でセーブしたあと、MFTST6−2を実行したのですが…。
こんな結果になってしまいました。


MFTST6−2はファイル比較プログラムとしては不完全なプログラムでした(VFTST6−2も同じです)。
CP/Mはファイルの中身を128バイトずつDMAバッファに読み込みます。
最後にバッファに読み込んだデータの途中にファイルエンドがあった場合、そこで比較を終了しなければいけなかったのですが、そのような場合でもバッファの最後まで比較を続けてしまうプログラムになっていました。
「ワンボードマイコンでCP/Mを!」[第202回]では今回のような結果にならなかったのは、そのとき比較したファイルが両方ともファイルエンドのあとバッファの終わりまで1Aで埋められていたためでした。

上の画面でスクロールして見えなかったところをログで確認しました。

>cm@03df
03DF B2-1a
03E0 BF-
>/cpm,d
drive D ................................
drive C ................................
drive B ................................
drive A ................................

A>save 3 testdat3.txt

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 : MFTST4   COM : MFTST4-1 TXT : TESTDAT2 TXT
A: MFTST11  COM : MFTST18  COM : MFTST19  COM : TESTDAT3 TXT

A>z:mftst6-2 mftst4-1.txt testdat3.txt
0020 31-41
0021 37-42
0022 20-43
02E0 1A-BF
02E1 1A-7B
02E2 1A-25
02E3 1A-F7
02E4 1A-8A
02E5 1A-89
02E6 1A-0E
02E7 1A-0D
02E8 1A-CE
02E9 1A-CA
02EA 1A-74
02EB 1A-2B
02EC 1A-DF
02ED 1A-4D
02EE 1A-6C
02EF 1A-CA
02F0 1A-97
02F1 1A-FD
02F2 1A-98
02F3 1A-ED
02F4 1A-9F
02F5 1A-E5
02F6 1A-4F
02F7 1A-C3
02F8 1A-59
02F9 1A-7A
02FA 1A-D1
02FB 1A-12
02FC 1A-77
02FD 1A-57
02FE 1A-DC
02FF 1A-7C

A>/exit
>
0000 00C3 - 
リモート接続を終了しました
logfile closed at Fri Jan 30 12:01:04 2015

アドレス02DFで2つのファイルが共に1Aでファイルエンドになって、そこで比較を終了するはずのところ前記の理由でバッファエンドまで比較が続けられてしまったことが推測できます。

あれ?
02DFではなくて03DFですよね?
そういえばデータが不一致であるのはアドレス0120〜0122のはずでした。
むむ。
表示アドレスが100バイトずれていました。

●テストプログラムMFTST6−3

前記の不具合を修正しました。
MFTST6−3のソースプログラムです。

; BDOS TEST6-2 ***** TEST6-3
;2013/4/18****
;2015/1/30
;
        ORG $0100
        FCALL=$0005
        FCBWK=$003B
        RECNO2=$005B
        FCB=$005C
        FCB2=$006C
        RECNO=$007C
        DMA1=$0080
        DMA2=$0300
        BYTECNTR=$0380
        AWK=$0382
;
        LXI H,FCB2
        LXI D,FCBWK
        MVI B,11;=17
LOOP1:MOV A,M
        STAX D
        INX H
        INX D
        DCR B
        JNZ LOOP1
;
        MVI C,0F;open
        LXI D,FCB
        CALL FCALL
        INR A;if FFH?
        JZ NOFILERR
;
        MVI C,0F;open
        LXI D,FCBWK
        CALL FCALL
        INR A;if FFH?
        JZ NOFILERR
;
        XRA A
        STA RECNO
        STA RECNO2
        LXI H,$0100
        SHLD BYTECNTR
;
LOOP2:MVI C,1A;DMA address set
        LXI D,DMA1
        CALL FCALL
        MVI C,14;read
        LXI D,FCB
        CALL FCALL
        ORA A
        RNZ;read end
;
        MVI C,1A;DMA address set
        LXI D,DMA2
        CALL FCALL
        MVI C,14;read
        LXI D,FCBWK
        CALL FCALL
        ORA A
        RNZ;read end
;
        MVI C,80
        LXI H,DMA1
        LXI D,DMA2
LOOP3:LDAX D
        CMP M
        PUSH PSW
        CNZ NOTEQ
        POP PSW
        JNZ FECK
        CPI 1A
        RZ
LOOP4:INX H
        INX D
        PUSH H
        LHLD BYTECNTR
        INX H
        SHLD BYTECNTR
        POP H
        DCR C
        JNZ LOOP3
        JMP LOOP2
FECK:CPI 1A
        JZ ERREND
        MOV A,M
        CPI 1A
        JNZ LOOP4
ERREND:LXI D,ENDERR
        MVI C,09
        CALL FCALL
        RET
;
NOFILERR:LXI D,CANTOPN
        MVI C,09
        CALL FCALL
        RET
;
NOTEQ:PUSH B
        PUSH D
        PUSH H
        LHLD BYTECNTR
        CALL HEX4DP
        CALL SPDP
        POP H
        MOV A,M
        STA AWK
        POP D
        LDAX D
        PUSH D
        PUSH H
        PUSH PSW
        LDA AWK
        CALL B2HEXDP
        MVI A,2D;"-"
        CALL ADP
        POP PSW
        CALL B2HEXDP
        CALL CRLF
        POP H
        POP D
        POP B
        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
;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
;
;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
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
ENDERR:"end "
        "err!"
        DB 0D
        DB 0A
        DB 24;$
;

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

2015/1/30  22:43  mftst6-3.txt
END=0241
              ; BDOS TEST6-2 ***** TEST6-3
              ;2013/4/18****
              ;2015/1/30
              ;
                ORG $0100
                FCALL=$0005
                FCBWK=$003B
                RECNO2=$005B
                FCB=$005C
                FCB2=$006C
                RECNO=$007C
                DMA1=$0080
                DMA2=$0300
                BYTECNTR=$0380
                AWK=$0382
              ;
0100 216C00     LXI H,FCB2
0103 113B00     LXI D,FCBWK
0106 0611       MVI B,11;=17
0108 7E       LOOP1:MOV A,M
0109 12         STAX D
010A 23         INX H
010B 13         INX D
010C 05         DCR B
010D C20801     JNZ LOOP1
              ;
0110 0E0F       MVI C,0F;open
0112 115C00     LXI D,FCB
0115 CD0500     CALL FCALL
0118 3C         INR A;if FFH?
0119 CA9401     JZ NOFILERR
              ;
011C 0E0F       MVI C,0F;open
011E 113B00     LXI D,FCBWK
0121 CD0500     CALL FCALL
0124 3C         INR A;if FFH?
0125 CA9401     JZ NOFILERR
              ;
0128 AF         XRA A
0129 327C00     STA RECNO
012C 325B00     STA RECNO2
012F 210001     LXI H,$0100
0132 228003     SHLD BYTECNTR
              ;
0135 0E1A     LOOP2:MVI C,1A;DMA address set
0137 118000     LXI D,DMA1
013A CD0500     CALL FCALL
013D 0E14       MVI C,14;read
013F 115C00           LXI D,FCB
0142 CD0500           CALL FCALL
0145 B7               ORA A
0146 C0               RNZ;read end
              ;
0147 0E1A       MVI C,1A;DMA address set
0149 110003     LXI D,DMA2
014C CD0500     CALL FCALL
014F 0E14       MVI C,14;read
0151 113B00     LXI D,FCBWK
0154 CD0500     CALL FCALL
0157 B7         ORA A
0158 C0         RNZ;read end
              ;
0159 0E80       MVI C,80
015B 218000     LXI H,DMA1
015E 110003     LXI D,DMA2
0161 1A       LOOP3:LDAX D
0162 BE         CMP M
0163 F5         PUSH PSW
0164 C49D01     CNZ NOTEQ
0167 F1         POP PSW
0168 C28001     JNZ FECK
016B FE1A       CPI 1A
016D C8         RZ
016E 23       LOOP4:INX H
016F 13         INX D
0170 E5         PUSH H
0171 2A8003     LHLD BYTECNTR
0174 23         INX H
0175 228003     SHLD BYTECNTR
0178 E1         POP H
0179 0D         DCR C
017A C26101     JNZ LOOP3
017D C33501     JMP LOOP2
0180 FE1A     FECK:CPI 1A
0182 CA8B01     JZ ERREND
0185 7E         MOV A,M
0186 FE1A       CPI 1A
0188 C26E01     JNZ LOOP4
018B 113702   ERREND:LXI D,ENDERR
018E 0E09       MVI C,09
0190 CD0500           CALL FCALL
0193 C9         RET
              ;
0194 112902   NOFILERR:LXI D,CANTOPN
0197 0E09       MVI C,09
0199 CD0500           CALL FCALL
019C C9         RET
              ;
019D C5       NOTEQ:PUSH B
019E D5         PUSH D
019F E5         PUSH H
01A0 2A8003     LHLD BYTECNTR
01A3 CDE001     CALL HEX4DP
01A6 CDD301     CALL SPDP
01A9 E1         POP H
01AA 7E         MOV A,M
01AB 328203     STA AWK
01AE D1         POP D
01AF 1A         LDAX D
01B0 D5         PUSH D
01B1 E5         PUSH H
01B2 F5         PUSH PSW
01B3 3A8203     LDA AWK
01B6 CDF101     CALL B2HEXDP
01B9 3E2D       MVI A,2D;"-"
01BB CDD501     CALL ADP
01BE F1         POP PSW
01BF CDF101     CALL B2HEXDP
01C2 CDC901     CALL CRLF
01C5 E1         POP H
01C6 D1         POP D
01C7 C1         POP B
01C8 C9         RET
              ;
              ;CL & LF
01C9 3E0D     CRLF:MVI A,0D
01CB CDD501     CALL ADP
01CE 3E0A       MVI A,0A
01D0 C3D501     JMP ADP
              ;space disp
01D3 3E20     SPDP:MVI A,20
              ;A disp
01D5 C5       ADP:PUSH B
01D6 E5         PUSH H
01D7 5F         MOV E,A
01D8 0E02       MVI C,02
01DA CD0500     CALL FCALL
01DD E1         POP H
01DE C1         POP B
01DF C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
01E0 C5       HEX4DP:PUSH B
01E1 E5         PUSH H
01E2 CD0A02     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
01E5 D5         PUSH D
01E6 EB         XCHG
01E7 CDFC01     CALL DEDP
01EA D1         POP D
01EB CDFC01     CALL DEDP
01EE E1         POP H
01EF C1         POP B
01F0 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
01F1 C5       B2HEXDP:PUSH B
01F2 E5         PUSH H
01F3 CD1002     CALL B2HEX2
01F6 CDFC01     CALL DEDP
01F9 E1         POP H
01FA C1         POP B
01FB C9         RET
              ;
              ;DE(asckii 2bytes) disp
01FC D5       DEDP:PUSH D
01FD 5A         MOV E,D
01FE 0E02       MVI C,02
0200 CD0500     CALL FCALL
0203 D1         POP D
0204 0E02       MVI C,02
0206 CD0500     CALL FCALL
0209 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
020A 7C       B2HEX4:MOV A,H
020B CD1002     CALL B2HEX2
020E EB         XCHG
020F 7B         MOV A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
0210 F5       B2HEX2:PUSH PSW
0211 0F         RRC
0212 0F         RRC
0213 0F         RRC
0214 0F         RRC
0215 CD1F02     CALL B2HEX1
0218 57         MOV D,A
0219 F1         POP PSW
021A CD1F02     CALL B2HEX1
021D 5F         MOV E,A
021E C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
021F E60F     B2HEX1:ANI 0F
0221 C630       ADI 30
0223 FE3A       CPI 3A
0225 D8         RC;0-9
0226 C607       ADI 07;A-F
0228 C9         RET
              ;
0229 63616E27 CANTOPN:"can'"
022D 74206F70         "t op"
0231 656E21           "en!"
0234 0D               DB 0D
0235 0A               DB 0A
0236 24               DB 24;$
0237 656E6420 ENDERR:"end "
023B 65727221   "err!"
023F 0D         DB 0D
0240 0A         DB 0A
0241 24         DB 24;$
              ;
ADP          =01D5  AWK          =0382  B2HEX1       =021F  
B2HEX2       =0210  B2HEX4       =020A  B2HEXDP      =01F1  
BYTECNTR     =0380  CANTOPN      =0229  CRLF         =01C9  
DEDP         =01FC  DMA1         =0080  DMA2         =0300  
ENDERR       =0237  ERREND       =018B  FCALL        =0005  
FCB          =005C  FCB2         =006C  FCBWK        =003B  
FECK         =0180  HEX4DP       =01E0  LOOP1        =0108  
LOOP2        =0135  LOOP3        =0161  LOOP4        =016E  
NOFILERR     =0194  NOTEQ        =019D  RECNO        =007C  
RECNO2       =005B  SPDP         =01D3  


ここまで変更すると、もうCMPEND:のところをもとのまま残す意味はなくなってしまいますから、そこはRETのみにして不要になった部分は削除しました。

●MFTST6−3の実行

MFTST6−3ではファイルエンドを確認するようにプログラムを変更しましたから、そのテストもできるようにファイルエンドマークを追加しないで、ファイルエンドマークがないままのファイルTESTDAT4.TXTを新たに作りました。

さきほどMFTST6−2で行なったのと同じことをMFTST6−3で行ないました。
MFTST4−1.TXTとTESTDAT3.TXTの比較です。
今回はファイルエンドを検出してそこでプログラムが終了しました。

さらに進んでテストを行ないました。

さきほど新たに作った、わざとファイルエンドコードを追記しなかったTESTDAT4.TXTとMFTST4−1.TXTとの比較です。
03DFでMFTST4−1.TXTはファイルエンドコード1Aがあるのに、TESTDAT4.TXTはそれがないため、不一致が表示されたあと一方のファイルにファイルエンドがないときのエラーとして”end err!”が表示されました。

次に念のため比較するファイル名パラメータの記述順序を入れ替えてテストしてみました。
順序を入れ替えても正しく比較が行なわれました。

さらに念のため、エンドコードを含めて内容が全く同じファイルを比較してみました。
おや can’t open! と表示されてしまいました。
うっかりしてMFTST4−1.TXTとするところをMFTST4.TXTとしてしまいました。
DIRで確認してみましたが、AドライブにはMFTST4.TXTはありませんでした。
おお、そうでした。
MFTST4.TXTはRENでMFTST4−1.TXTに名前を変更したのでした([第115回])。

あらためてMFTST4−1.TXTとTESTDAT2.TXTを比較しました。
TESTDAT2.TXTは[第116回]でMFTST5をテストしたときに、MFTST4−1.TXTのコピーとして作成されたファイルですから中身は同じです。
MFTST6−3で両者を比較した結果は何も表示されずにプログラムが終了しました。
ファイルエンドコードを含めて両者が一致していることが確認できました。

MYCPU80でCP/Mを![第120回]
2015.2.3upload

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