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

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

[第214回]


●ファンクションコール1EH(ファイルアトリビュートのセット)

ファンクションコール1EHについては[第99回]で説明をしました。
ファンクションコール1EHはファイルアトリビュートのセットを行ないます。
[第99回]で作成したテストプログラムはFTST17です。

ファイルアトリビュートはファイルの属性のことで、CP/MではそのファイルがR/O(Read Only、更新削除禁止)かR/W(読み書き可能)か、またSYS(システムファイル)か、DIR(それ以外のファイル)かというファイル属性を付与できます。

通常の操作でファイルを作成したときは、そのファイルのアトリビュートはR/WかつDIRになります。
その後ファンクションコール1EHによって、それをR/OやSYSに変更したり、またはR/OやSYSをR/WやDIRに戻したりすることができます。

[第144回]ではRAMディスク版での動作テストをしています。
今回はFTST17を64KBフルRAM用に一部を書き換えてファイル名をVFTST17にしました。
下はそのソースプログラムリストです。

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

; BDOS TEST17 file attribute set
;
;2012/4/15 9/12
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        FCB9=$0065
        FCBA=$0066
        DMA=$0080
;
        LD C,11;first file search
        LD DE,FCB
        CALL FCALL
        CP FF
        JP Z,NOFILE
;
LOOP:LD DE,RWMSG
        CALL MSGDP
        LD C,01
        CALL FCALL
        CP 1A;^z
        RET Z
        AND 5F;bit 5=0,'a' to 'A'
        CP 52;'R' Read only
        JP Z,ROSET
        CP 57;'W' read Write
        JP Z,RWSET
        CALL CRLF
        LD A,3F;'?'
        CALL ADP
        CALL CRLF
ROSET:LD HL,FCB9
        LD A,(HL)
        OR 80
        LD (HL),A
        JP SYSDIRSET
RWSET:LD HL,FCB9
        LD A,(HL)
        AND 7F
        LD (HL),A
SYSDIRSET:CALL CRLF
        LD DE,SDMSG
        CALL MSGDP
        LD C,01
        CALL FCALL
        CP 1A;^z
        RET Z
        AND 5F;bit 5=0,'a' to 'A'
        CP 53;'S' SYS
        JP Z,SYSSET
        CP 44;'D' DIR
        JP Z,DIRSET
        CALL CRLF
        LD A,3F;'?'
        CALL ADP
        JP SYSDIRSET
SYSSET:LD HL,FCBA
        LD A,(HL)
        OR 80
        LD (HL),A
        JP ATTRSET
DIRSET:LD HL,FCBA
        LD A,(HL)
        AND 7F
        LD (HL),A
ATTRSET:LD DE,FCB
        LD C,1E
        CALL FCALL
        CP FF
        JP Z,ERRDP
        CALL CRLF
        LD DE,OKMSG
        JP MSGDP
        ;
ERRDP:CALL CRLF
LD DE,ERRMSG
        JP MSGDP        
;
NOFILE:LD DE,NFMSG
        JP MSGDP
;
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
;
RWMSG:"RorW"
        DB 3F;?
        DB 24;$
SDMSG:"SorD"
        DB 3F;?
        DB 24;$
NFMSG:"not "
        "foun"
        "d"
        DB 0D
        DB 0A
        DB 24;$
ERRMSG:"err"
        DB 0D
        DB 0A
        DB 24;$
OKMSG:"ok"
        DB 0D
        DB 0A
        DB 24;$
;

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

FTST17の実行結果を確認するために、[第98回]でファイルアトリビュート表示プログラムFTST10−7を作りました。
今回はFTST10−7を64KBフルRAM用に一部を書き換えてファイル名をVFTST107にしました。
下はそのソースプログラムリストです。

; BDOS TEST10 filename search   function0e,11,12
;2012/3/19 4/4 
; 4/7 4/9 dir disp
; 4/14 display file attribute
; 9/12
;
        ORG $0100
        FCALL=$0005
        FCB=$005C
        DMA=$0080
;
        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;$
;

●VFTST17の実行

[第144回]と同じテストをVFTST17を使って行ないました。
[第144回]と同じくログファイルでお見せします。

logfile nd80zlog\09122056.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
can't open D.vfd
>jp d233

A>copy z:vftst17.bin

A>copy z:vftst107.bin

A>b:
B>dir
B: TEST2    COM : MBASIC   COM : F80      COM : HELLO    FOR
B: HELLO    REL : L80      COM : FORLIB   REL : HELLO    COM

B>a:vftst17 test2.com
RorW?r
SorD?s
ok

B>a:vftst17 hello.for
RorW?r
SorD?d
ok

B>a:vftst17 hello.com
RorW?w
SorD?s
ok

B>dir
B: MBASIC   COM : F80      COM : HELLO    FOR : HELLO    REL
B: L80      COM : FORLIB   REL
B>a:vftst107
drvno.?b
TEST2    COM RO SYS
MBASIC   COM RW DIR
MBASIC   COM RW DIR
F80      COM RW DIR
F80      COM RW DIR
HELLO    FOR RO DIR
HELLO    REL RW DIR
L80      COM RW DIR
FORLIB   REL RW DIR
FORLIB   REL RW DIR
HELLO    COM RW SYS
end
drvno.?
B>

Aドライブはセーブしたファイル数が多いので表示が長くなって見づらいためBドライブのファイルを対象にしてテストしました。

最初にDIRコマンドでファイル名を確認してから、VFTST17を実行して、以下の3ファイルについてアトリビュートを設定しました。
TEST2.COMをReadOnly(R)、SystemFile(S)にしました。
HELLO.FORをReadOnly(R)、DirectoryFile(D、普通のファイル)にしました。
HELLO.COMをReadWrite(W)、SystemFile(S)にしました。

結果を確認するため、DIRコマンドでファイル名を表示させてみました。
CP/MではシステムファイルはDIRコマンドで表示されません。
VFTST17の実行によって、TEST2.COMとHELLO.COMがシステムファイルにされたため、DIRコマンドで表示されなくなりました。

そのあとVFTST107を実行してファイルアトリビュートを確認しました。
TEST2.COM、HELLO.FOR、HELLO.COMのファイルアトリビュートが変更されていることが確認できました。

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

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