*COPY *WILD*CARD* SOMEDIR is now working.

This commit is contained in:
Bobbi Webber-Manners 2021-09-15 22:03:57 -04:00
parent dbb432dd6a
commit 4df7797cba
4 changed files with 85 additions and 25 deletions

Binary file not shown.

View File

@ -50,6 +50,10 @@ IOBUF4 EQU $1C00
BLKBUF EQU $5000 ; Can't use $400 as ProDOS uses
BLKBUFEND EQU $5200 ; 'hidden' bytes within screen
* 512 byte buffer for file copy (*COPY)
COPYBUF EQU $5200 ; File copy needs separate buffer
*COPYBUFEND EQU $5400
* Address in aux memory where ROM will be loaded
AUXADDR EQU $8000

View File

@ -41,12 +41,26 @@ READPL2 HEX 04 ; Number of parameters
DW 1 ; Request count
DW $0000 ; Trans count
* Used for file copy only because we can't trash BLKBUF
RDPLCP HEX 04 ; Number of parameters
DB $00 ; Reference number
DW COPYBUF ; Pointer to data buffer
DW 512 ; Request count
DW $0000 ; Trans count
WRITEPL HEX 04 ; Number of parameters
DB $01 ; Reference number
DW BLKBUF ; Pointer to data buffer
DW $00 ; Request count
DW $0000 ; Trans count
* Used for file copy only because we can't trash BLKBUF
WRTPLCP HEX 04 ; Number of parameters
DB $01 ; Reference number
DW COPYBUF ; Pointer to data buffer
DW $00 ; Request count
DW $0000 ; Trans count
CLSPL HEX 01 ; Number of parameters
DB $00 ; Reference number

View File

@ -111,11 +111,31 @@ COPYFILE >>> ENTMAIN
BRA :MAINLOOP ; Source: wildcard, dest: dir
:NOWILD
:MAINLOOP
LDA :DESTTYPE ; Recover destination type
LDA MOSFILE2 ; Length
STA :OLDLEN
LDA :DESTTYPE ; Check dest type
CMP #$02 ; Existing directory?
BNE :NOTDIR
LDY MOSFILE2 ; Dest idx = length
LDA #'/' ; Add a '/' separator
STA MOSFILE2+1,Y
INY
LDX #$00 ; Source id
:APPLOOP CPX MATCHBUF ; At end?
BEQ :DONEAPP
LDA MATCHBUF+1,X ; Appending MATCHBUF to MOSFILE2
STA MOSFILE2+1,Y
INX
INY
BRA :APPLOOP
:DONEAPP STY MOSFILE2 ; Update length
:NOTDIR LDA :DESTTYPE ; Recover destination type
JSR COPY1FILE ; Copy an individual file
BCS :COPYERR
JSR WILDNEXT
BCS :NOMORE
LDA :OLDLEN ; Restore MOSFILE2
STA MOSFILE2
BRA :MAINLOOP
JSR CLSDIR
:EXIT >>> XF2AUX,COPYRET
@ -132,18 +152,17 @@ COPYFILE >>> ENTMAIN
LDA #$40 ; TODO PROPER ERROR CODE
BRA :EXIT
:DESTTYPE DB $00
:OLDLEN DB $00
* Copy a single file
* Source is in MOSFILE, DEST in MOSFILE2
* On entry: A=0 dest doesn't exist, A=1 dest is file, A=2 dest is dir
* Returns with carry set if error, carry clear otherwise
COPY1FILE STA :DESTTYPE ; TODO: USE THE DEST TYPE!!!!
LDA #<MOSFILE
COPY1FILE LDA #<MOSFILE
STA GINFOPL+1
STA OPENPL+1
STA OPENPL2+1
LDA #>MOSFILE
STA GINFOPL+2
STA OPENPL+2
STA OPENPL2+2
JSR GETINFO ; GET_FILE_INFO
BCS :ERR
LDA #<MOSFILE2
@ -160,16 +179,9 @@ COPY1FILE STA :DESTTYPE ; TODO: USE THE DEST TYPE!!!!
LDA #$0A ; Num parms back as we found it
STA GINFOPL
BCS :ERR ; Error creating dest file
JSR OPENFILE
BCS :ERR ; Open error
LDA OPENPL+5 ; File ref num
STA READPL+1
LDA #<MOSFILE2
STA OPENPL2+1
LDA #>MOSFILE2
STA OPENPL2+2
LDA #$00 ; Look for empty slot
JSR FINDBUF
STX :BUFIDX1
JSR BUFADDR
BCS :ERR ; No I/O bufs available
STA OPENPL2+3
@ -177,32 +189,61 @@ COPY1FILE STA :DESTTYPE ; TODO: USE THE DEST TYPE!!!!
JSR MLI
DB OPENCMD
DW OPENPL2
BCS :ERR ; Open error
LDA OPENPL2+5 ; File ref num
STA RDPLCP+1
LDX :BUFIDX1
STA FILEREFS,X ; Record the ref number
LDA #<MOSFILE2
STA OPENPL2+1
LDA #>MOSFILE2
STA OPENPL2+2
LDA #$00 ; Look for empty slot
JSR FINDBUF
STX :BUFIDX2
JSR BUFADDR
BCS :ERRCLS1 ; No I/O bufs available
STA OPENPL2+3
STY OPENPL2+4
JSR MLI
DB OPENCMD
DW OPENPL2
BCS :ERRCLS1
LDA OPENPL2+5 ; File ref num
STA WRITEPL+1
LDA OPENPL2+5 ; File ref num
STA WRTPLCP+1
LDX :BUFIDX2
STA FILEREFS,X ; Record the ref number
BRA :MAINLOOP
:ERR SEC ; Report error
RTS
:MAINLOOP JSR RDFILE ; Read a block
:MAINLOOP JSR MLI ; Read a block
DB READCMD
DW RDPLCP
BCC :RDOKAY
CMP #$4C ; Is it EOF?
BEQ :EOFEXIT
BRA :ERRCLS2 ; Any other error
:RDOKAY LDA READPL+6 ; Trans count MSB
STA WRITEPL+4 ; Request count MSB
LDA READPL+7 ; Trans count MSB
STA WRITEPL+5 ; Request count MSB
JSR WRTFILE ; Write a block
:RDOKAY LDA RDPLCP+6 ; Trans count MSB
STA WRTPLCP+4 ; Request count MSB
LDA RDPLCP+7 ; Trans count MSB
STA WRTPLCP+5 ; Request count MSB
JSR MLI ; Write a block
DB WRITECMD
DW WRTPLCP
BCS :ERRCLS2 ; Write error
BRA :MAINLOOP
:EOFEXIT CLC ; No error
PHP
:CLOSE2 LDA READPL+1 ; Close output file
:CLOSE2 LDA WRTPLCP+1 ; Close output file
STA CLSPL+1
JSR CLSFILE
:CLOSE1 LDA WRITEPL+1 ; Close input file
LDX :BUFIDX2
STZ FILEREFS,X
:CLOSE1 LDA RDPLCP+1 ; Close input file
STA CLSPL+1
JSR CLSFILE
LDX :BUFIDX1
STZ FILEREFS,X
PLP
RTS
:ERRCLS1 SEC
@ -211,7 +252,8 @@ COPY1FILE STA :DESTTYPE ; TODO: USE THE DEST TYPE!!!!
:ERRCLS2 SEC
PHP
BRA :CLOSE2
:DESTTYPE DB $00
:BUFIDX1 DB $00
:BUFIDX2 DB $00
* ProDOS file handling for MOS OSFIND OPEN call
* Options in A: $40 'r', $80 'w', $C0 'rw'