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

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

[第56回]

●ファイル内容比較プログラム(2)

前回からの続きです。
前回はファイル内容比較プログラム(ftst6cmp.txt)のソースリストをお見せしました。
下はそれをZASM.COMでアセンブルしてバイナリファイルが作成されたときに同時に作成されたアセンブルリストです。

2012/3/10  21:25  ftst6cmp.txt
END=8226
              ; BDOS TEST6 COMPARE
              ;2012/3/7
              ;
                ORG $8100
                FCALL=$8005
                FCBWK=$803B
                RECNO2=$805B
                FCB=$805C
                FCB2=$806C
                RECNO=$807C
                DMA1=$8080
                DMA2=$8300
                BYTECNTR=$8380
                AWK=$8382
              ;
8100 216C80     LD HL,FCB2
8103 113B80     LD DE,FCBWK
8106 0611       LD B,11;=17
8108 7E       LOOP1:LD A,(HL)
8109 12         LD (DE),A
810A 23         INC HL
810B 13         INC DE
810C 05         DEC B
810D C20881     JP NZ,LOOP1
              ;
8110 0E0F       LD C,0F;open
8112 115C80     LD DE,FCB
8115 CD0580     CALL FCALL
8118 3C         INC A;if FFH?
8119 CA7C81     JP Z,NOFILERR
              ;
811C 0E0F       LD C,0F;open
811E 113B80     LD DE,FCBWK
8121 CD0580     CALL FCALL
8124 3C         INC A;if FFH?
8125 CA7C81     JP Z,NOFILERR
              ;
8128 AF         XOR A
8129 327C80     LD (RECNO),A
812C 325B80     LD (RECNO2),A
812F 218083     LD HL,BYTECNTR
8132 77         LD (HL),A
8133 23         INC HL
8134 77         LD (HL),A
              ;
8135 0E1A     LOOP2:LD C,1A;DMA address set
8137 118080     LD DE,DMA1
813A CD0580     CALL FCALL
813D 0E14       LD C,14;read
813F 115C80           LD DE,FCB
8142 CD0580           CALL FCALL
8145 B7               OR A
8146 C28481           JP NZ,CMPEND;read end
              ;
8149 0E1A       LD C,1A;DMA address set
814B 110083     LD DE,DMA2
814E CD0580     CALL FCALL
8151 0E14       LD C,14;read
8153 113B80     LD DE,FCBWK
8156 CD0580     CALL FCALL
8159 B7         OR A
815A C28481     JP NZ,CMPEND;read end
              ;
815D 0E80       LD C,80
815F 218080     LD HL,DMA1
8162 110083     LD DE,DMA2
8165 1A       LOOP3:LD A,(DE)
8166 BE         CP (HL)
8167 C48D81     CALL NZ,NOTEQ
816A 23         INC HL
816B 13         INC DE
816C E5         PUSH HL
816D 2A8083     LD HL,(BYTECNTR)
8170 23         INC HL
8171 228083     LD (BYTECNTR),HL
8174 E1         POP HL
8175 0D         DEC C
8176 C26581     JP NZ,LOOP3
8179 C33581     JP LOOP2
              ;
817C 111982   NOFILERR:LD DE,CANTOPN
817F 0E09       LD C,09
8181 CD0580           CALL FCALL
8184 0E1A     CMPEND:LD C,1A;DMA address set
8186 118080     LD DE,DMA1
8189 CD0580     CALL FCALL
818C C9               RET
              ;
818D C5       NOTEQ:PUSH BC
818E D5         PUSH DE
818F E5         PUSH HL
8190 2A8083     LD HL,(BYTECNTR)
8193 CDD081     CALL HEX4DP
8196 CDC381     CALL SPDP
8199 E1         POP HL
819A 7E         LD A,(HL)
819B 328283     LD (AWK),A
819E D1         POP DE
819F 1A         LD A,(DE)
81A0 D5         PUSH DE
81A1 E5         PUSH HL
81A2 F5         PUSH AF
81A3 3A8283     LD A,(AWK)
81A6 CDE181     CALL B2HEXDP
81A9 3E2D       LD A,2D;"-"
81AB CDC581     CALL ADP
81AE F1         POP AF
81AF CDE181     CALL B2HEXDP
81B2 CDB981     CALL CRLF
81B5 E1         POP HL
81B6 D1         POP DE
81B7 C1         POP BC
81B8 C9         RET
              ;
              ;CL & LF
81B9 3E0D     CRLF:LD A,0D
81BB CDC581     CALL ADP
81BE 3E0A       LD A,0A
81C0 C3C581     JP ADP
              ;space disp
81C3 3E20     SPDP:LD A,20
              ;A disp
81C5 C5       ADP:PUSH BC
81C6 E5         PUSH HL
81C7 5F         LD E,A
81C8 0E02       LD C,02
81CA CD0580     CALL FCALL
81CD E1         POP HL
81CE C1         POP BC
81CF C9         RET
              ;HL(bynary 2bytes) to asckii 4bytes & disp
81D0 C5       HEX4DP:PUSH BC
81D1 E5         PUSH HL
81D2 CDFA81     CALL B2HEX4;binary 2 bytes to ascii HEX 4bytes
81D5 D5         PUSH DE
81D6 EB         EX DE,HL
81D7 CDEC81     CALL DEDP
81DA D1         POP DE
81DB CDEC81     CALL DEDP
81DE E1         POP HL
81DF C1         POP BC
81E0 C9         RET
              ;A(binary) to asckii 2bytes HEX & disp
81E1 C5       B2HEXDP:PUSH BC
81E2 E5         PUSH HL
81E3 CD0082     CALL B2HEX2
81E6 CDEC81     CALL DEDP
81E9 E1         POP HL
81EA C1         POP BC
81EB C9         RET
              ;
              ;DE(asckii 2bytes) disp
81EC D5       DEDP:PUSH DE
81ED 5A         LD E,D
81EE 0E02       LD C,02
81F0 CD0580     CALL FCALL
81F3 D1         POP DE
81F4 0E02       LD C,02
81F6 CD0580     CALL FCALL
81F9 C9         RET
              ;
              ;binary to hex, 2bytes data to ascii 4charactors,HL to HL,DE
81FA 7C       B2HEX4:LD A,H
81FB CD0082     CALL B2HEX2
81FE EB         EX DE,HL
81FF 7B         LD A,E
              ;binary to hex, 1byte data to ascii 2charactors,A to DE
8200 F5       B2HEX2:PUSH AF
8201 0F         RRCA
8202 0F         RRCA
8203 0F         RRCA
8204 0F         RRCA
8205 CD0F82     CALL B2HEX1
8208 57         LD D,A
8209 F1         POP AF
820A CD0F82     CALL B2HEX1
820D 5F         LD E,A
820E C9         RET
              ;binary to hex, low 4bit to ascii 1charactor
820F E60F     B2HEX1:AND 0F
8211 C630       ADD A,30
8213 FE3A       CP 3A
8215 D8         RET C;0-9
8216 C607       ADD A,07;A-F
8218 C9         RET
              ;
8219 63616E27 CANTOPN:"can'"
821D 74206F70         "t op"
8221 656E21           "en!"
8224 0D               DB 0D
8225 0A               DB 0A
8226 24               DB 24;$
              ;
ADP          =81C5  AWK          =8382  B2HEX1       =820F  
B2HEX2       =8200  B2HEX4       =81FA  B2HEXDP      =81E1  
BYTECNTR     =8380  CANTOPN      =8219  CMPEND       =8184  
CRLF         =81B9  DEDP         =81EC  DMA1         =8080  
DMA2         =8300  FCALL        =8005  FCB          =805C  
FCB2         =806C  FCBWK        =803B  HEX4DP       =81D0  
LOOP1        =8108  LOOP2        =8135  LOOP3        =8165  
NOFILERR     =817C  NOTEQ        =818D  RECNO        =807C  
RECNO2       =805B  SPDP         =81C3  

今回のプログラムは[第51回]で作りましたCOPYプログラムと同様、2つのファイルを扱います。

COPYプログラムでは片方のファイルからデータを読んで、それを他方のファイルに書き込みました。
ですからデータバッファはデフォルトのDMAバッファだけで済みました。
今回のファイル内容比較プログラムでは、両方のファイルからそれぞれデータを読み込みます。
ですからデータバッファが2つ必要です。

デフォルトのDMAバッファのほかに、もうひとつバッファを用意します。
デフォルトのDMAバッファは8080H〜80FFH(本来は0080H〜00FFH)です。
上のプログラムでは、これをDMA1としました。
もうひとつのバッファはプログラムの後方、8300H〜837FHに置きました。
これをDMA2としました。

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

CP/M起動時には、デフォルトのDMAバッファとして8080H〜80FFH(本来は0080H〜00FFH)が割り当てられます。

今回のプログラムではfilename1のデータ読み込みバッファとしてデフォルトのDMA1を使いますが、filename2のデータを読み込むときには、データ読み込みバッファをDMA2に変更しなければなりません。

DMAバッファを変更するにはファンクションコール1Aを使います。
DEレジスタにDMAバッファアドレスを入れて、Cレジスタに1AHを入れてシステムをコールします。
一度DMAアドレスを変更すると、次にまたファンクションコール1AでDMAアドレスを変更するまで、そのDMAアドレスが有効になります。

今回のプログラムでは、それぞれのファイルからデータを読み込む前に、それぞれのDMAアドレスに設定するためにファンクションコール1Aをコールしています。
それが8135Hと8149Hの部分です。

忘れてはならないことがあります。
上に書きましたように一度DMAアドレスを変更すると、次にDMAアドレスを再変更するまで、そのDMAアドレスが有効になります。
ですからプログラムを終了する前に、DMAアドレスをデフォルトの8080H(本来は0080H)に戻しておくようにします。
それが8184Hの部分です。


[2015.2.3注記]
後になってから上の説明部分は私の思い違いであることに気が付いたのですが、訂正するのをすっかり忘れていました。
ファンクション1AによるDMAアドレスの変更はユーザープログラムの中だけで有効で、ユーザープログラムを終了すると、デフォルトのDMAアドレスに戻ります。
ですからプログラムを終了するときにDMAアドレスを元に戻すのは無駄作業になります。[注記ここまで]

説明の途中ですが、本日も時間がなくなってしまいました。
この続きは次回にいたします。

ワンボードマイコンでCP/Mを![第56回]
2012.3.10upload
2015.2.3注記

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