復活!CP/M ワンボードマイコンでCP/Mを!
CP/MがTK−80互換のワンボードマイコンの上で復活します
ND80ZVとMYCPU80の上でCP/Mが走ります!
[第54回]
●FILLFFプログラム
前回からの続きです。
COPYプログラムによって新規に作成されたファイルがDIRコマンドで表示されなかったのは、FCBのディレクトリ拡張bェ00になっていなかったためであることがわかりました。
COPYプログラムを直さなければならないのですが、それには、FCBのディレクトリ拡張bノプログラムで00を書き込むようにする、というのが最も安直な方法です。
しかし、もしもCP/MシステムによってCP/MシステムのFCBエリア(805CH〜807FH。本来は005CH〜007FH)にファイル名がインプットされるときに、このディレクトリ拡張bノも00がセットされるようになっているのでしたら、806CH〜の12バイトだけをFCBWK(803BH〜)にコピーするようにしていたところを、その後のデータ(8078H〜)も含めてコピーすればよいので、それをわざわざ後から00を書き込むというのは、いかにもみっともないプログラムだと思います。
いずれの方法にするのかを決めるためには、まず本当にそうなのか(CP/Mシステムによって8078H〜が00でクリアされるのか)、そうではないのかを確認する必要があります。
実はその確認作業はすでに[第44回]でやっております。
何もしないですぐにリターンするプログラム(test.com)を作って、それでパラメータをつけて実行したらどうなるかを確認しました。
そのときのメモリダンプリストを見ますと、ファイル名(および拡張子)の後の数バイトは00になっています。
しかしそれだけでは、ファイル名が書き込まれるときに同時に00が書き込まれたのか、もとから00であったのかは、はっきりしません。
そこで、もう一度[第44回]と同じテストをすることにしますが、ただし今回はtest.comを実行するよりも前に、FCBエリア(805CH〜807FH。本来は005CH〜007FH)にFFを書き込んでおくことにします。
ZB3BASICのCMコマンドで1バイトずつFFを書き込んでいってもよいのですけれど、[第48回]で作りましたFILL00プログラムをちょいと直せばできてしまいますから、そのようにしてみました。
FILLFFプログラムのソースリストです。
| 
; FILL FF 805c-807c
;
	ORG $8100
	FCB=$805C
              ;
     REENT=$1033
;          
	LD HL,FCB
	LD B,24
	LD C,FF
LOOP:LD (HL),C
	INC HL
	DEC B
	JP NZ,LOOP
	RET
;
 | 

| 
2012/3/7  9:40  fillff.txt
END=810D
              ; FILL FF 805c-807c
              ;
              	ORG $8100
              	FCB=$805C
                            ;
                   REENT=$1033
              ;          
8100 215C80   	LD HL,FCB
8103 0624     	LD B,24
8105 0EFF     	LD C,FF
8107 71       LOOP:LD (HL),C
8108 23       	INC HL
8109 05       	DEC B
810A C20781   	JP NZ,LOOP
810D C9       	RET
              ;
              
FCB          =805C  LOOP         =8107  REENT        =1033  
 | 
| logfile nd80zlog\03070940.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld fillff.bin,8100 loading FILLFF.BIN ...000e(14)bytes loaded,from 8100 to 810D >jp d233 a>dir A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM A: TEST COM : FTEST4 COM : FTEST4-1 TXT : FTEST4-2 COM A: FTEST4-3 COM : COPY COM : TESTDATA TXT : a>save 1 fillff.com a>dir A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM A: TEST COM : FTEST4 COM : FTEST4-1 TXT : FTEST4-2 COM A: FTEST4-3 COM : COPY COM : TESTDATA TXT : FILLFF COM a>fillff a> | 
| a>^D>a>^D> ERR:23 >dm 8000,80ff 8000 C3 62 D2 00 00 C3 06 C4-03 6A 45 68 42 88 51 E6 テbメ..テ.ト.jEhB.Q. 8010 FC DF 41 00 45 53 54 34-00 00 04 00 F8 DF 44 00 .゚A.EST4.....゚D. 8020 45 53 54 34 00 00 04 00-FC 32 A0 10 3F 3D 54 F2 EST4.....2.?=T. 8030 EF 86 20 08 3F 8F 15 BA-DA EC AF 00 54 45 53 54 .. .?..コレ.ッ.TEST 8040 44 41 54 41 54 58 54 B8-00 00 06 0D 0E 00 00 00 DATATXTク........ 8050 00 00 00 00 00 00 00 00-00 00 00 06 FF FF FF FF ................ 8060 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................ 8070 FF FF FF FF FF FF FF FF-FF FF FF FF FF FF FF FF ................ 8080 00 00 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 8090 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80A0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80B0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80C0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80D0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80E0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80F0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ > | 
| >jp d233 a>dir A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM A: TEST COM : FTEST4 COM : FTEST4-1 TXT : FTEST4-2 COM A: FTEST4-3 COM : COPY COM : TESTDATA TXT : FILLFF COM a>test name1.txt name2.txt a> | 
| a>^D>a>^D> ERR:23 >dm 8000,80ff 8000 C3 62 D2 00 00 C3 06 C4-03 6A 45 68 42 88 51 E6 テbメ..テ.ト.jEhB.Q. 8010 FC DF 41 00 45 53 54 34-00 00 04 00 F8 DF 44 00 .゚A.EST4.....゚D. 8020 45 53 54 34 00 00 04 00-FC 32 A0 10 3F 3D 54 F2 EST4.....2.?=T. 8030 EF 86 20 08 3F 8F 15 BA-DA EC AF 00 54 45 53 54 .. .?..コレ.ッ.TEST 8040 44 41 54 41 54 58 54 B8-00 00 06 0D 0E 00 00 00 DATATXTク........ 8050 00 00 00 00 00 00 00 00-00 00 00 06 00 4E 41 4D .............NAM 8060 45 31 20 20 20 54 58 54-00 00 00 02 00 4E 41 4D E1 TXT.....NAM 8070 45 32 20 20 20 54 58 54-00 00 00 00 00 FF FF FF E2 TXT........ 8080 14 20 4E 41 4D 45 31 2E-54 58 54 20 4E 41 4D 45 . NAME1.TXT NAME 8090 32 2E 54 58 54 00 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 2.TXT........... 80A0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80B0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80C0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80D0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80E0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ 80F0 E5 E5 E5 E5 E5 E5 E5 E5-E5 E5 E5 E5 E5 E5 E5 E5 ................ >0000 00C3 - リモート接続を終了しました logfile closed at Wed Mar 07 09:50:47 2012 | 
| ; BDOS TEST5 COPY
;2012/3/4 3/7
;
        ORG $8100
        FCALL=$8005
        FCBWK=$803B
        RECNO2=$805B
        FCB=$805C
        FCB2=$806C
        RECNO=$807C
        DMA=$8080
;
        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,13;delete
        LD DE,FCBWK
        CALL FCALL
;
        LD C,16;make file
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,DFULERR
;
        XOR A
        LD (RECNO),A
        LD (RECNO2),A
;
LOOP2:  LD C,14;read
        LD DE,FCB
        CALL FCALL
        OR A
        JP NZ,CLOSE;read end
        LD C,15;write
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,DFULERR
        JP LOOP2
;
CLOSE:LD C,10;close
        LD DE,FCBWK
        CALL FCALL
        INC A;if FFH?
        JP Z,CLOSERR
        LD DE,OK
        JP MSGOUT
;
NOFILERR:LD DE,CANTOPN
        JP MSGOUT
DFULERR:LD DE,DFULL
        JP MSGOUT
CLOSERR:LD DE,CANTCLS
MSGOUT:LD C,09
        CALL FCALL
        RET
;
CANTOPN:"can'"
        "t op"
        "en!"
        DB 0D
        DB 0A
        DB 24;$
DFULL:"disk"
        " ful"
        "l!"
        DB 0D
        DB 0A
        DB 24;$
CANTCLS:"can'"
        "t cl"
        "ose!"
        DB 0D
        DB 0A
        DB 24;$
OK:"copy"
        " don"
        "e"
        DB 0D
        DB 0A
        DB 24;$
;
 | 

| logfile nd80zlog\03071119.txt open ND80ZVに接続しました 0001 0000 - z 1000 00C3 - *** nd80z3 basic **** >/ld ftst5cpy.bin,8100 loading FTST5CPY.BIN ...00af(175)bytes loaded,from 8100 to 81AE >jp d233 a>dir A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM A: TEST COM : FTEST4 COM : FTEST4-1 TXT : FTEST4-2 COM A: FTEST4-3 COM : COPY COM : TESTDATA TXT : FILLFF COM a>save 1 copy.com a>copy ftest4-1.txt testdat2.txt copy done a>dir A: FILLE5 COM : FTEST1 COM : FTEST2 COM : DM COM A: TEST COM : FTEST4 COM : FTEST4-1 TXT : FTEST4-2 COM A: FTEST4-3 COM : COPY COM : TESTDATA TXT : FILLFF COM A: TESTDAT2 TXT a> |