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

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

[第99回]


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

前々回([第97回])と 前回([第98回])、続けてファイルアトリビュートについて書いてきましたのは、今回説明しますファンクションコール1EH(ファイルアトリビュートのセット)の動作確認の準備を先にしておきたいと思ったからです。

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

通常の操作でファイルを作成したときは、そのファイルのアトリビュートはR/WかつDIRになります。
その後ファンクションコール1EHによって、それをR/OやSYSに変更したり、またはR/OやSYSをR/WやDIRに戻したりすることができます。
ファイルアトリビュートについては 前回([第98回])、前々回([第97回])で説明していますので、そちらも参照してください。

●テストプログラムFTST17.TXT

ファンクションコール1EHのテストプログラムFTST17.TXTのソースリストです。

; BDOS TEST17 file attribute set
;
;2012/4/15
;
        ORG $8100
        FCALL=$8005
        FCB=$805C
        FCB9=$8065
        FCBA=$8066
        DMA=$8080
;
        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;$
;

プログラムの先頭部分でファンクションコール11Hを実行しています。
FTST17.COMをコマンドとして実行するために、ファイル名’FTST17’をコンソール入力しますが、そのときに’FTST17’に続けて(間にスペースを置いて)、ターゲットのファイル名を入力します。
するとそのターゲットのファイル名はFCBエリア(805CH〜。本来は005CH〜)に格納されます。
ファンクションコール11Hはそのように入力されたファイル名をカレントドライブのディレクトリの先頭からサーチします([第65回]参照)。
ファンクションコール11Hは、そのファイルが存在しているかどうかを確認するためだけに使っています。
こうすることが必須ではありません。
このあとファンクションコール1EHを実行した時点でファイルがなければどうせエラーになりますから、わざわざ先にファイルの存在を確認しなくてもよいという考え方もあります。
でも、アトリビュートを変更してリードオンリーとかシステムファイルとかにするために、あれこれ入力したあとで、「ファイルがありません」なんて表示されたりしますと、「そんなんなら最初から言ってよー」なんてつい文句を言いたくなりますよねぇ。
ここではファンクションコール11Hは、そういうことのために使っています。

次にファイルアトリビュートをどのように変更するのかをコンソール入力によって決定します。
ファンクションコール01を実行して入力された1文字によって判断します。
Ctrl−Zならプログラムを終了します。
Ctrl−Z以外なら
AND 5F
を実行します。
小文字でも大文字でも入力できるように’a’〜’z’(61H〜7AH)を大文字’A’〜’Z’(41H〜5AH)に変換します。
テストプログラムなのでここまでしなくてもよいのですけれど、つい作ってしまいました。

’R’(Read/Only)か’W’(Read/Write)かを判定してそれぞれの処理をします。
それ以外の文字の場合には’?’を表示して、再入力に戻ります。
Read/Onlyの場合にはFCB9(アドレス8065H。本来は0065H)にあるエクステンション(拡張子)の先頭バイトのビット7を1にします。
FCB9はたまたまアドレスの16進数表記にも読めますがラベル名(変数名)です。
ちょっと紛らわしい名前をつけてしまった、と反省しています。
Read/Writeの場合には、そのビット7を0にします。

そのあと今度はシステムファイルか、そのほかのファイルかを指定します。
最初から1回でR/O、R/WとSYS、DIRを指定するように工夫することもできますが、ここはテストプログラムですから、このように2回に分けて入力するようにしました。

’S’(SYSファイル)か’D’(DIRファイル)かを判定してそれぞれの処理をします。
それ以外の文字の場合には’?’を表示して、再入力に戻ります。
SYSの場合にはFCBA(アドレス8066H。本来は0066H)にあるエクステンション(拡張子)の第2バイトのビット7を1にします。
FCBAもアドレスの16進数表記にも読めてしまう紛らわしいラベル名(変数名)です。
こういうことは、ちょっと時間を置いて、あとから読み直してみると気が付きます。

そのように変更したFCBアドレスをDEレジスタに入れて、Cレジスタに1EHを入れて、システムをコールします。
エラーの場合にはAレジスタにFFHが入りますから’err’と表示して終了します。
それ以外のときは’ok’と表示して終了します。

●FTST17.TXTのアセンブル

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

2012/4/15  11:20  ftst17.txt
END=81E0
              ; BDOS TEST17 file attribute set
              ;
              ;2012/4/15
              ;
                        ORG $8100
                        FCALL=$8005
                FCB=$805C
                FCB9=$8065
                FCBA=$8066
                DMA=$8080
              ;
8100 0E11       LD C,11;first file search
8102 115C80     LD DE,FCB
8105 CD0580     CALL FCALL
8108 FEFF       CP FF
810A CA9B81     JP Z,NOFILE
              ;
810D 11BE81   LOOP:LD DE,RWMSG
8110 CDA181     CALL MSGDP
8113 0E01       LD C,01
8115 CD0580     CALL FCALL
8118 FE1A       CP 1A;^z
811A C8         RET Z
811B E65F       AND 5F;bit 5=0,'a' to 'A'
811D FE52       CP 52;'R' Read only
811F CA3281     JP Z,ROSET
8122 FE57       CP 57;'W' read Write
8124 CA3C81     JP Z,RWSET
8127 CDA781     CALL CRLF
812A 3E3F       LD A,3F;'?'
812C CDB381     CALL ADP
812F CDA781     CALL CRLF
8132 216580   ROSET:LD HL,FCB9
8135 7E         LD A,(HL)
8136 F680       OR 80
8138 77         LD (HL),A
8139 C34381     JP SYSDIRSET
813C 216580   RWSET:LD HL,FCB9
813F 7E         LD A,(HL)
8140 E67F       AND 7F
8142 77         LD (HL),A
8143 CDA781   SYSDIRSET:CALL CRLF
8146 11C481     LD DE,SDMSG
8149 CDA181     CALL MSGDP
814C 0E01       LD C,01
814E CD0580     CALL FCALL
8151 FE1A       CP 1A;^z
8153 C8         RET Z
8154 E65F       AND 5F;bit 5=0,'a' to 'A'
8156 FE53       CP 53;'S' SYS
8158 CA6B81     JP Z,SYSSET
815B FE44       CP 44;'D' DIR
815D CA7581     JP Z,DIRSET
8160 CDA781     CALL CRLF
8163 3E3F       LD A,3F;'?'
8165 CDB381     CALL ADP
8168 C34381     JP SYSDIRSET
816B 216680   SYSSET:LD HL,FCBA
816E 7E         LD A,(HL)
816F F680       OR 80
8171 77         LD (HL),A
8172 C37C81     JP ATTRSET
8175 216680   DIRSET:LD HL,FCBA
8178 7E         LD A,(HL)
8179 E67F       AND 7F
817B 77         LD (HL),A
817C 115C80   ATTRSET:LD DE,FCB
817F 0E1E       LD C,1E
8181 CD0580     CALL FCALL
8184 FEFF       CP FF
8186 CA9281     JP Z,ERRDP
8189 CDA781     CALL CRLF
818C 11DC81     LD DE,OKMSG
818F C3A181     JP MSGDP
                ;
8192 CDA781   ERRDP:CALL CRLF
8195 11D681   LD DE,ERRMSG
8198 C3A181     JP MSGDP        
              ;
819B 11CA81   NOFILE:LD DE,NFMSG
819E C3A181     JP MSGDP
              ;
81A1 0E09     MSGDP:LD C,09
81A3 CD0580     CALL FCALL
81A6 C9         RET
              ;
              ;CL & LF
81A7 3E0D     CRLF:LD A,0D
81A9 CDB381     CALL ADP
81AC 3E0A       LD A,0A
81AE C3B381     JP ADP
              ;space disp
81B1 3E20     SPDP:LD A,20
              ;A disp
81B3 C5       ADP:PUSH BC
81B4 E5         PUSH HL
81B5 5F         LD E,A
81B6 0E02       LD C,02
81B8 CD0580     CALL FCALL
81BB E1         POP HL
81BC C1         POP BC
81BD C9         RET
              ;
81BE 526F7257 RWMSG:"RorW"
81C2 3F         DB 3F;?
81C3 24         DB 24;$
81C4 536F7244 SDMSG:"SorD"
81C8 3F         DB 3F;?
81C9 24         DB 24;$
81CA 6E6F7420 NFMSG:"not "
81CE 666F756E   "foun"
81D2 64         "d"
81D3 0D         DB 0D
81D4 0A         DB 0A
81D5 24         DB 24;$
81D6 657272   ERRMSG:"err"
81D9 0D         DB 0D
81DA 0A         DB 0A
81DB 24         DB 24;$
81DC 6F6B     OKMSG:"ok"
81DE 0D         DB 0D
81DF 0A         DB 0A
81E0 24         DB 24;$
              ;
ADP          =81B3  ATTRSET      =817C  CRLF         =81A7  
DIRSET       =8175  DMA          =8080  ERRDP        =8192  
ERRMSG       =81D6  FCALL        =8005  FCB          =805C  
FCB9         =8065  FCBA         =8066  LOOP         =810D  
MSGDP        =81A1  NFMSG        =81CA  NOFILE       =819B  
OKMSG        =81DC  ROSET        =8132  RWMSG        =81BE  
RWSET        =813C  SDMSG        =81C4  SPDP         =81B1  
SYSDIRSET    =8143  SYSSET       =816B  

●FTST17.COMのセーブ

いつものようにログファイルで説明をいたします。
ZB3BASICにエントリして、
/LD FTST17.BIN,8100[Enter]
を実行します。
そのあと
JP D233[Enter]
でCP/Mを起動し、
Aドライブは一杯になってしまっていますから、
a>b:[Enter]
と入力して、カレントドライブをBドライブにしたあと、
save 1 ftst17.com[Enter]
と入力し、FTST17.COMというファイル名でBドライブにセーブしました。
そのあとDIRコマンドでAドライブの現在のディレクトリを表示しました。

logfile nd80zlog\04150943.txt open

ND80ZVに接続しました
0001 0000 - z
1000 00C3 - 
*** nd80z3 basic ****
>/ld ftst17.bin,8100
loading FTST17.BIN ...00e1(225)bytes loaded,from 8100 to 81E0
>jp d233

a>b:
b>save 1 ftst17.com
b>dir a:
A: FNC0E-1  COM : FTST10   COM : FTST10-5 COM : FTST11   COM
A: FTST12   COM : FTST13   COM : FTST14   COM : FTST15   COM
A: FTST16   COM : FTST10-6 COM
b>

●FTST17.COMの実行

b>a:[Enter]
と入力してカレントドライブをAドライブにしてから
Aドライブ上のファイルFTST10−2.COMのアトリビュートを変更してみます。


b>a:
a>b:ftst17 ftst10-2.com
RorW?w
SorD?d
ok

a>dir
A: FNC0E-1  COM : FTST10   COM : FTST10-2 COM : FTST10-5 COM
A: FTST11   COM : FTST12   COM : FTST13   COM : FTST14   COM
A: FTST15   COM : FTST16   COM : FTST10-6 COM
a>b:ftst10-7
drvno.?a
FNC0E-1  COM RW DIR
FTST10   COM RO DIR
FTST10-2 COM RW DIR
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.?
a>

a>b:ftst17 ftst10−2.com[Enter]
と入力しました。
Aドライブが一杯になってしまったためFTST17.COMはBドライブにセーブしてあります。
BドライブのFTST17.COMを起動してカレントドライブ(Aドライブ)のFTST10−2.COMのアトリビュートを変更します。
最初にRorW?と表示されされましたから、Wと入力しました。
SorD?と表示されましたから、Dと入力しました。

DIRコマンドでディレクトリを確認しました。
FTST10−2.COMは[第97回]で、CMコマンドを使って強制的にシステムファイルにした結果、DIRコマンドでは表示されなくなっていましたが、今回の操作でファイルアトリビュートをシステムファイルから普通のファイルに変更しましたから、DIRコマンドで普通に表示されるようになりました。

さらに確かめてみるため、前回作成したFTST10−7.COMを実行してみました。
FTST10−2.COMはR/W、DIRと表示されました。

続けて同じ操作をして、FTST10−4.COMとFTST10.COMもR/WかつDIRファイルに戻してみました。
そのあと、FTST10−7.COMを実行して、そのように変更されたことを確認しました。

b>ftst17 a:ftst10-4.com
RorW?w
SorD?d
ok

b>

b>ftst17 a:ftst10.com
RorW?w
SorD?d
ok

b>ftst10-7
drvno.?a
FNC0E-1  COM RW DIR
FTST10   COM RW DIR
FTST10-2 COM RW DIR
FTST10-4 COM RW DIR
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.?

今度は新たにFTST11.COMをリードオンリーに、FTST12.COMをシステムファイルに、そしてFTST13.COMをリードオンリーかつシステムファイルに、それぞれ設定してみました。


b>ftst17 a:ftst11.com
RorW?r
SorD?d
ok

b>ftst17 a:ftst12.com
RorW?w
SorD?s
ok

b>ftst17 a:ftst13.com
RorW?r
SorD?s
ok

b>ftst10-7
drvno.?a
FNC0E-1  COM RW DIR
FTST10   COM RW DIR
FTST10-2 COM RW DIR
FTST10-4 COM RW DIR
FTST10-5 COM RW DIR
FTST11   COM RO DIR
FTST12   COM RW SYS
FTST13   COM RO SYS
FTST14   COM RW DIR
FTST15   COM RW DIR
FTST16   COM RW DIR
FTST10-6 COM RW DIR
end
drvno.?
b>

FTST17.COMを実行したあと、FTST10−7.COMを実行して、そのように設定されていることが確認できました。

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

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