復活!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;$
; | 
| ; 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;$
; | 
| 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> |