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

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

[第202回]


●ファンクションコール1A(DMAアドレスセット)

前回はテストプログラムVFTST5を使ってファイルコピーをしました。
正しくコピーが行なわれたかどうかを確認するために、[第55回]で、ファイル内容の比較プログラム、FTST6CMPを作りました。
FTST6CMPを使った実際の比較作業は[第58回]で行なっています。
FTST6CMPは、ファンクションコール1A(DMAアドレスセット)のテストプログラムでもありますから、FTST6CMPを実行することで、同時にファンクションコール1Aの動作確認にもなります。

[第136回]ではRAMディスク版での動作テストをしています。
そこに書いておりますように、2つのファイルの内容が一致している場合には何も表示されませんから、本当に比較が行なわれたのかどうかちょっと不安になります。
そこで[第136回]では比較する一方のファイルの中味を一部だけ書き換えて比較を行ないました。
そこではRAMディスクでしたのでセーブされているファイルの中味を直接書き換えるという芸当ができましたが、仮想フロッピーディスクではそうは簡単にいきません。
そこで別の方法で一部を書き換えたファイルを用意して比較を行ないます。

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

FTST6CMPを64KBフルRAM用に一部を書き換えてファイル名をVFTST6にしました。
下はそのソースプログラムリストです。

; BDOS TEST6 COMPARE
;2012/3/7 8/21
;
        ORG $0100
        FCALL=$0005
        FCBWK=$003B
        RECNO2=$005B
        FCB=$005C
        FCB2=$006C
        RECNO=$007C
        DMA1=$0080
        DMA2=$0300
        BYTECNTR=$0380
        AWK=$0382
;
        LD HL,FCB2
        LD DE,FCBWK
        LD B,11;=17
LOOP1:LD A,(HL)
        LD (DE),A
        INC HL
        INC DE
        DEC B
        JP NZ,LOOP1
;
        LD C,0F;open
        LD DE,FCB
        CALL FCALL
        INC A;if FFH?
        JP Z,NOFILERR
;
        LD C,0F;open
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,NOFILERR
;
        XOR A
        LD (RECNO),A
        LD (RECNO2),A
        LD HL,BYTECNTR
        LD (HL),A
        INC HL
        LD (HL),A
;
LOOP2:LD C,1A;DMA address set
        LD DE,DMA1
        CALL FCALL
        LD C,14;read
        LD DE,FCB
        CALL FCALL
        OR A
        JP NZ,CMPEND;read end
;
        LD C,1A;DMA address set
        LD DE,DMA2
        CALL FCALL
        LD C,14;read
        LD DE,FCBWK
        CALL FCALL
        OR A
        JP NZ,CMPEND;read end
;
        LD C,80
        LD HL,DMA1
        LD DE,DMA2
LOOP3:LD A,(DE)
        CP (HL)
        CALL NZ,NOTEQ
        INC HL
        INC DE
        PUSH HL
        LD HL,(BYTECNTR)
        INC HL
        LD (BYTECNTR),HL
        POP HL
        DEC C
        JP NZ,LOOP3
        JP LOOP2
;
NOFILERR:LD DE,CANTOPN
        LD C,09
        CALL FCALL
CMPEND:LD C,1A;DMA address set
        LD DE,DMA1
        CALL FCALL
        RET
;
NOTEQ:PUSH BC
        PUSH DE
        PUSH HL
        LD HL,(BYTECNTR)
        CALL HEX4DP
        CALL SPDP
        POP HL
        LD A,(HL)
        LD (AWK),A
        POP DE
        LD A,(DE)
        PUSH DE
        PUSH HL
        PUSH AF
        LD A,(AWK)
        CALL B2HEXDP
        LD A,2D;"-"
        CALL ADP
        POP AF
        CALL B2HEXDP
        CALL CRLF
        POP HL
        POP DE
        POP BC
        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
;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
;
;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
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
;

●比較するファイルの準備

比較するためのファイルを準備します。
以下はその作業を行なったときのログファイルです。

logfile nd80zlog\08212150.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>/ld vftst4.txt,0100
loading VFTST4.TXT ...02ea(746)bytes loaded,from 0100 to 03E9
>dm@0100,013f
0100  3B 20 42 44 4F 53 20 54-45 53 54 34 20 54 59 50  ; BDOS TEST4 TYP
0110  45 0D 0A 3B 32 30 31 32-2F 32 2F 32 38 20 38 2F  E..;2012/2/28 8/
0120  31 37 20 38 2F 31 38 0D-0A 3B 0D 0A 20 20 20 20  17 8/18..;..    
0130  20 20 20 20 4F 52 47 20-24 30 31 30 30 0D 0A 20      ORG $0100.. 
>cm@0120
0120 31-41
0121 37-42
0122 20-43
0123 38-
>dm@03e0,03ef
03E0  20 32 34 3B 24 0D 0A 3B-0D 0A 1A 05 F9 54 5A 10   24;$..;.....TZ.
>jp d233

A>save 4 testdat2.txt

A>copy z:vftst6.bin

A>
比較テストを行なうためにVFTST4.TXTの一部を書き換えます。
ND3BASICを起動して/LDコマンドでVFTST4.TXTをアドレス0100にロードしました。
そのあとDM@コマンドでロード内容を確認したあと、CM@コマンドで一部を書き換えました。
EOFコードを追加するために、ファイルエンドを確認しましたら、たまたま以前のテストの痕跡がそのまま残っていてちょうど終わりの位置にEOF(1AH)が書かれておりました。

JP D233[Enter]
でCP/M互換DOSを起動して、0100からの内容をTESTDAT2.TXTの名前でAドライブにセーブしました。

最後にCOPYコマンドでVFTST6をAドライブにコピーしました。
ドライブ名をZ:にすると、CP/M互換DOSプログラムがあるフォルダのファイルをカレントドライブにコピーします。
そのときコピー元のファイルの拡張子がBINなら、それをCOMに書き換えてコピーが行なわれます。

●VFTST6を実行しました

いつものように[第136回]を開いてそれをバックにして、VFTST6を実行しました。



今回は特に問題もなく正しく実行できました。

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

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