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