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

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

[第98回]


●ファイルアトリビュート表示プログラム

前回からの続きです。
前回はファイルアトリビュートについて説明をしました。
今回はファイルのアトリビュートを表示するプログラムを作ります。
[第88回]で作成したFTST10−4.TXT(DIR表示プログラム)をもとにして、アトリビュートを表示する部分を追加します。

そのようにして作成したFTST10−7.TXTのソースリストです。

; BDOS TEST10 filename search   function0e,11,12
;2012/3/19 4/4 
; 4/7 4/9 dir disp
; 4/14 display file attribute
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        DMA=$8080
;
        LD HL,FCB
        INC HL
        LD A,(HL)
        CP 20;no fcb data
        JP NZ,LOOP
        LD B,0B;=11
        LD A,3F;'?'
FILL3F:LD (HL),A
        INC HL
        DEC B
        JP NZ,FILL3F
LOOP:LD DE,INPMSG
        CALL MSGDP
        LD C,01
        CALL FCALL
        CP 1A;^z
        RET Z
        CP 30
        JP Z,DNOPASS
        AND 0F
        DEC A
        LD E,A
        LD C,0E
        CALL FCALL
DNOPASS:CALL CRLF
        LD C,11;first file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,NOFILE
;       
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
LOOP1:  JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP LOOP1
NMDISP:INC HL;pass drive no.
        LD B,08
NMDISP2:LD A,(HL)
        CALL ADP
NMDISP3:INC HL
        DEC B
        JP NZ,NMDISP2
        CALL SPDP
        LD B,03
        PUSH HL
NMDISP4:LD A,(HL)
        AND 7F
        CALL ADP
        INC HL
        DEC B
        JP NZ,NMDISP4
CALL SPDP
        POP HL
        PUSH HL
        LD A,(HL)
        RLCA
        JP C,ROSET
        LD DE,RWT
        JP RODSP
ROSET:LD DE,ROT
RODSP:CALL MSGDP
        CALL SPDP
        POP HL
        INC HL
        LD A,(HL)
        RLCA
        JP C,SYSSET
        LD DE,DIRT
        JP SYSDSP
SYSSET:LD DE,SYST
SYSDSP:CALL MSGDP
        CALL CRLF
;next file search
        LD C,12;next file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,END
        LD HL,DMA
        LD DE,$0020
        OR A;dirctory code 00-03
NXTSRCH:JP Z,NMDISP
        ADD HL,DE
        DEC A
        JP NXTSRCH
;
NOFILE:LD DE,NFMSG
        CALL MSGDP
        JP LOOP 
;
END:LD DE,ENDMSG
        CALL MSGDP
        JP LOOP
;
MSGDP:LD C,09
        CALL FCALL
        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
;
INPMSG:"drvn"
        "o."
        DB 3F;?
        DB 24;$
NFMSG:"not "
        "foun"
        "d"
        DB 0D
        DB 0A
        DB 24;$
ENDMSG:"end"
        DB 0D
        DB 0A
        DB 24;$
RWT:"RW"
        DB 24;$
ROT:"RO"
        DB 24;$
DIRT:"DIR"
        DB 24;$
SYST:"SYS"
        DB 24;$
;

FTST10−4.TXTから変更した主なところは、NMDISP4:以下に追加挿入したR/W〜SYS表示部分ですが、それ以外にも、ファイル名の表示を揃えるための変更なども行なっています。

FTST10−7.TXTをZASM.COMでアセンブルします。
下はアセンブルの結果作成されたアセンブルリストです。

2012/4/14  22:12  ftst10-7.txt
END=820D
              ; BDOS TEST10 filename search   function0e,11,12
              ;2012/3/19 4/4 
              ; 4/7 4/9 dir disp
              ; 4/14 display file attribute
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                DMA=$8080
              ;
8100 215C80     LD HL,FCB
8103 23         INC HL
8104 7E         LD A,(HL)
8105 FE20       CP 20;no fcb data
8107 C21481     JP NZ,LOOP
810A 060B       LD B,0B;=11
810C 3E3F       LD A,3F;'?'
810E 77       FILL3F:LD (HL),A
810F 23         INC HL
8110 05         DEC B
8111 C20E81     JP NZ,FILL3F
8114 11E681   LOOP:LD DE,INPMSG
8117 CDC981     CALL MSGDP
811A 0E01       LD C,01
811C CD0580     CALL FCALL
811F FE1A       CP 1A;^z
8121 C8         RET Z
8122 FE30       CP 30
8124 CA3081     JP Z,DNOPASS
8127 E60F       AND 0F
8129 3D         DEC A
812A 5F         LD E,A
812B 0E0E       LD C,0E
812D CD0580     CALL FCALL
8130 CDCF81   DNOPASS:CALL CRLF
8133 0E11       LD C,11;first file search
8135 115C80     LD DE,FCB
8138 CD0580     CALL FCALL
813B FEFF       CP FF
813D CAB781     JP Z,NOFILE
              ; 
8140 218080     LD HL,DMA
8143 112000     LD DE,$0020
8146 B7         OR A;dirctory code 00-03
8147 CA4F81   LOOP1:    JP Z,NMDISP
814A 19         ADD HL,DE
814B 3D         DEC A
814C C34781     JP LOOP1
814F 23       NMDISP:INC HL;pass drive no.
8150 0608       LD B,08
8152 7E       NMDISP2:LD A,(HL)
8153 CDDB81     CALL ADP
8156 23       NMDISP3:INC HL
8157 05         DEC B
8158 C25281     JP NZ,NMDISP2
815B CDD981     CALL SPDP
815E 0603       LD B,03
8160 E5         PUSH HL
8161 7E       NMDISP4:LD A,(HL)
8162 E67F       AND 7F
8164 CDDB81     CALL ADP
8167 23         INC HL
8168 05         DEC B
8169 C26181     JP NZ,NMDISP4
816C CDD981   CALL SPDP
816F E1         POP HL
8170 E5         PUSH HL
8171 7E         LD A,(HL)
8172 07         RLCA
8173 DA7C81     JP C,ROSET
8176 110082     LD DE,RWT
8179 C37F81     JP RODSP
817C 110382   ROSET:LD DE,ROT
817F CDC981   RODSP:CALL MSGDP
8182 CDD981     CALL SPDP
8185 E1         POP HL
8186 23         INC HL
8187 7E         LD A,(HL)
8188 07         RLCA
8189 DA9281     JP C,SYSSET
818C 110682     LD DE,DIRT
818F C39581     JP SYSDSP
8192 110A82   SYSSET:LD DE,SYST
8195 CDC981   SYSDSP:CALL MSGDP
8198 CDCF81     CALL CRLF
              ;next file search
819B 0E12       LD C,12;next file search
819D 115C80     LD DE,FCB
81A0 CD0580     CALL FCALL
81A3 FEFF       CP FF
81A5 CAC081     JP Z,END
81A8 218080     LD HL,DMA
81AB 112000     LD DE,$0020
81AE B7         OR A;dirctory code 00-03
81AF CA4F81   NXTSRCH:JP Z,NMDISP
81B2 19         ADD HL,DE
81B3 3D         DEC A
81B4 C3AF81     JP NXTSRCH
              ;
81B7 11EE81   NOFILE:LD DE,NFMSG
81BA CDC981     CALL MSGDP
81BD C31481     JP LOOP 
              ;
81C0 11FA81   END:LD DE,ENDMSG
81C3 CDC981     CALL MSGDP
81C6 C31481     JP LOOP
              ;
81C9 0E09     MSGDP:LD C,09
81CB CD0580     CALL FCALL
81CE C9         RET
              ;
              ;CL & LF
81CF 3E0D     CRLF:LD A,0D
81D1 CDDB81     CALL ADP
81D4 3E0A       LD A,0A
81D6 C3DB81     JP ADP
              ;space disp
81D9 3E20     SPDP:LD A,20
              ;A disp
81DB C5       ADP:PUSH BC
81DC E5         PUSH HL
81DD 5F         LD E,A
81DE 0E02       LD C,02
81E0 CD0580     CALL FCALL
81E3 E1         POP HL
81E4 C1         POP BC
81E5 C9         RET
              ;
81E6 6472766E INPMSG:"drvn"
81EA 6F2E       "o."
81EC 3F         DB 3F;?
81ED 24         DB 24;$
81EE 6E6F7420 NFMSG:"not "
81F2 666F756E   "foun"
81F6 64         "d"
81F7 0D         DB 0D
81F8 0A         DB 0A
81F9 24         DB 24;$
81FA 656E64   ENDMSG:"end"
81FD 0D         DB 0D
81FE 0A         DB 0A
81FF 24         DB 24;$
8200 5257     RWT:"RW"
8202 24         DB 24;$
8203 524F     ROT:"RO"
8205 24         DB 24;$
8206 444952   DIRT:"DIR"
8209 24         DB 24;$
820A 535953   SYST:"SYS"
820D 24         DB 24;$
              ;
ADP          =81DB  CRLF         =81CF  DIRT         =8206  
DMA          =8080  DNOPASS      =8130  END          =81C0  
ENDMSG       =81FA  FCALL        =8005  FCB          =805C  
FILL3F       =810E  INPMSG       =81E6  LOOP         =8114  
LOOP1        =8147  MSGDP        =81C9  NFMSG        =81EE  
NMDISP       =814F  NMDISP2      =8152  NMDISP3      =8156  
NMDISP4      =8161  NOFILE       =81B7  NXTSRCH      =81AF  
RODSP        =817F  ROSET        =817C  ROT          =8203  
RWT          =8200  SPDP         =81D9  SYSDSP       =8195  
SYSSET       =8192  SYST         =820A  


●FTST10−7.COMのセーブ

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST10−7.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動し、カレントドライブをBドライブに切り換えます。
実は、今回のテスト作業中にAドライブが一杯になってしまいました。
それで、新しく作ったプログラムはBドライブにセーブするようにしたのです。

save 2 ftst10−7.com[Enter]
と入力し、FTST10−7.COMというファイル名でBドライブにセーブしました。
そのあとDIRコマンドを実行して、FTST10−7.COMがセーブされたことを確認しました。

logfile nd80zlog\04142212.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst10-7.bin,8100
loading FTST10-7.BIN ...010e(270)bytes loaded,from 8100 to 820D
>jp d233

a>b:
b>save 2 ftst10-7.com
b>dir
B: TEST     COM : TEST1    COM : FTST10-7 COM
b>

●FTST10−7.COMの実行

FTST10−7.COMを実行しました。

b>ftst10-7
drvno.?a
FNC0E-1  COM RW DIR
FTST10   COM RO DIR
FTST10-2 COM RW SYS
FTST10-4 COM RO SYS
FTST10-5 COM RW DIR
FTST11   COM RW DIR
FTST12   COM RW DIR
FTST13   COM RW DIR
FTST14   COM RW DIR
FTST15   COM RW DIR
FTST16   COM RW DIR
FTST10-6 COM RW DIR
end
drvno.?b
TEST     COM RW DIR
TEST1    COM RW DIR
FTST10-7 COM RW DIR
end
drvno.?
b>^D
end of CP/M
>0000 00C3 - 
リモート接続を終了しました
logfile closed at Sat Apr 14 22:13:49 2012

FTST10.COMはRO DIRと表示され、FTST10−2.COMはRW SYS、またFTST10−4.COMはRO SYSと表示されました。
それ以外のファイルはRW DIRと表示されました。

●DISK FULLについて

上で書きましたように、作成したテストプログラムをAドライブにセーブしようとしたところ、ディスクスペースが無くなってしまいました。
なにしろ6KBしか無いものですからじきにディスクフルになってしまいます。

そのときの様子です。

logfile nd80zlog\04131311.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst10-6.bin,8100
loading FTST10-6.BIN ...0178(376)bytes loaded,from 8100 to 8277
>JP D233

a>save 2 ftst10-6.com
No space
a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-4 COM
A: FTST10-5 COM : FTST11   COM : FTST12   COM : FTST13   COM
A: FTST14   COM : FTST15   COM : FTST16   COM : FTST10-6 COM
a>

新しく作ったテストプログラムをセーブしようとして、
SAVE 2 FTST10−6.COM[Enter]
と入力したところ
No space
と表示されてしまいました。

そのあとでDIRコマンドでAドライブのディレクトリを確認してみました。
あれ?
FTST10−6.COMがある?

FTST10−6.COMをセーブしようとしたときにディスクフルになってしまってNo spaceと表示されたのに、あたかもFTST10−6.COMがセーブできているかのようです。

CP/Mを終了して、ZB3BASICに戻ってから、DMコマンドでAドライブのディレクトリを表示させてみました。

>dm 8900,89ff
8900  00 46 54 53 54 31 34 20-20 43 4F 4D 00 00 00 02  .FTST14  COM....
8910  09 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8920  00 46 54 53 54 31 35 20-20 43 4F 4D 00 00 00 02  .FTST15  COM....
8930  0A 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8940  00 46 54 53 54 31 36 20-20 43 4F 4D 00 00 00 02  .FTST16  COM....
8950  0B 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
8960  00 46 54 53 54 31 30 2D-36 43 4F 4D 00 00 00 00  .FTST10-6COM....
8970  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

FTST16.COMのアローケーションエリアには、ブロックbOBが書き込まれています。
AドライブのRAMディスク容量は6KBです。
1ブロックは4セクタで、1セクタが128バイトですから、1ブロックは0.5KBです。
ブロックbOから始まってブロックbOBで、ちょうど12ブロック(6KB)ですから、FTST16.COMまででディスクの空きスペースは0になっています。
で。
次のFTST10−6.COMを見ますと、ブロックbヘ書き込まれていません。
ファイル名だけはセーブされてしまうようです。

むむむ。
さすがにこれは手抜きでありましょう。
こういう場合は、「セーブできませんでした」ということで、ファイル名を保存しないで終了すべきだと思いますけれど…。
こういうことだとしますと、No spaceが表示されながらファイル名だけは、ディレクトリエリアが一杯になってしまうまで、どんどん登録されてしまうことになります。
こういうあたりは、「未完成なOS」という感じがします。

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

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