Basic elements of *COPY are in. Needs more work!

This commit is contained in:
Bobbi Webber-Manners 2021-09-15 00:02:08 -04:00
parent 052e46f98a
commit 82f66cae7c
6 changed files with 215 additions and 39 deletions

Binary file not shown.

View File

@ -567,14 +567,14 @@ PRSPACE LDA #' '
* Parameter string in XY
RENAME JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :RENSYN
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :RENSYN
BEQ :SYNTAX
>>> XF2MAIN,RENFILE
:RENSYN BRK
:SYNTAX BRK
DB $DC
ASC 'Syntax: RENAME <old fname> <new fname>'
ASC 'Syntax: RENAME <objspec> <objspec>'
BRK
RENRET
>>> ENTAUX
@ -582,6 +582,25 @@ RENRET
LDA #$00
RTS
* Perform *COPY function
* Parameter string in XY
COPY JSR PARSNAME ; Copy Arg1->MOSFILE
CMP #$00 ; Length of arg1
BEQ :SYNTAX
JSR PARSLPTR2 ; Copy Arg2->MOSFILE2
CMP #$00 ; Length of arg2
BEQ :SYNTAX
>>> XF2MAIN,COPYFILE
:SYNTAX BRK
DB $DC
ASC 'Syntax: COPY <listspec> <*objspec*>'
BRK
COPYRET
>>> ENTAUX
JSR CHKERROR
LDA #$00
RTS
* Handle *DIR (directory change) command
* On entry, XY points to command line
CHDIR JSR PARSNAME ; Copy filename->MOSFILE
@ -589,7 +608,7 @@ CHDIR JSR PARSNAME ; Copy filename->MOSFILE
BNE :HASPARM
BRK
DB $DC
ASC 'Syntax: DIR <pathname>'
ASC 'Syntax: DIR <*objspec*>'
BRK
:HASPARM >>> XF2MAIN,SETPFX
@ -603,7 +622,7 @@ DRIVE LDA (OSLPTR),Y ; First char
BEQ :HASPARM
:ERR BRK
DB $DC
ASC 'Syntax: DRIVE :sd (eg: DRIVE :61)'
ASC 'Syntax: DRIVE <dry> (eg: DRIVE :61)'
BRK
:HASPARM >>> XF2MAIN,SETPFX
@ -627,7 +646,7 @@ FREE LDA (OSLPTR),Y ; First char
BEQ :HASPARM
:ERR BRK
DB $DC
ASC 'Syntax: FREE :sd (eg: DRIVE :61)'
ASC 'Syntax: FREE <dry> (eg: DRIVE :61)'
BRK
:HASPARM >>> XF2MAIN,DRVINFO
@ -672,7 +691,7 @@ ACCESS JSR PARSLPTR ; Copy filename->MOSFILE
>>> XF2MAIN,SETPERM
:SYNTAX BRK
DB $DC
ASC 'Syntax: ACCESS <obj-list> <L|R|W>'
ASC 'Syntax: ACCESS <listspec> <L|R|W>'
BRK
ACCRET >>> ENTAUX
@ -686,7 +705,7 @@ DESTROY JSR PARSLPTR ; Copy filename->MOSFILE
>>> XF2MAIN,MULTIDEL
:SYNTAX BRK
DB $DC
ASC 'Syntax: DESTROY <obj-list>'
ASC 'Syntax: DESTROY <listspec>'
BRK
DESTRET >>> ENTAUX

View File

@ -53,6 +53,9 @@ CMDTABLE ASC 'CAT' ; Must be first command so matches '*.'
DB $8B
DW STARBYTE-1 ; OPT -> OSBYTE &8B,X,Y XY=>params
* others
ASC 'COPY'
DB $FF
DW COPY-1 ; COPY -> XY=>params
ASC 'QUIT'
DB $80
DW STARQUIT-1 ; QUIT -> (LPTR)=>params

View File

@ -27,6 +27,7 @@ COPYAUXBLK >>> ALTZP ; Alt ZP & Alt LC on
RTS
* Search FILEREFS for value in A
* On return, buffer number is in X (or $FF if no bufs)
FINDBUF LDX #$00
:L1 CMP FILEREFS,X
BEQ :END
@ -36,6 +37,34 @@ FINDBUF LDX #$00
LDX #$FF ; $FF for not found
:END RTS
* Obtain I/O buffer address
* On entry: buffer number in X
* On exit: buffer address in AY
* Carry set if no bufs, clear otherwise
BUFADDR CPX #$00
BNE :S1
LDA #<IOBUF1
LDY #>IOBUF1
BRA :EXIT
:S1 CPX #$01
BNE :S2
LDA #<IOBUF2
LDY #>IOBUF2
BRA :EXIT
:S2 CPX #$02
BNE :S3
LDA #<IOBUF3
LDY #>IOBUF3
BRA :EXIT
:S3 CPX #$03
BNE :NOBUFS
LDA #<IOBUF4
LDY #>IOBUF4
:EXIT CLC
RTS
:NOBUFS SEC
RTS
* Check if file exists
* Return A=0 if doesn't exist, A=1 file, A=2 dir
EXISTS LDA #<MOSFILE

View File

@ -61,7 +61,7 @@ PREPATH LDX MOSFILE ; Length
JSR DEL1CHAR ; Delete '/' from MOSFILE
BRA :REENTER ; Go again!
:APPEND JSR APFXMF ; Append MOSFILE->PREFIX
JSR COPYPFXMF ; Copy back to MOSFILE
JSR PFXtoMF ; Copy back to MOSFILE
:EXIT JSR DIGCONV ; Handle initial digits
CLC
RTS
@ -218,7 +218,7 @@ MFtoTMP LDA #<MOSFILE
JSR STRCPY
RTS
* Copy MFTEMP to MOSFILE1
* Copy MFTEMP to MOSFILE
TMPtoMF LDA #<MFTEMP
STA A1L
LDA #>MFTEMP
@ -230,6 +230,18 @@ TMPtoMF LDA #<MFTEMP
JSR STRCPY
RTS
* Copy MFTEMP to MOSFILE2
TMPtoMF2 LDA #<MFTEMP
STA A1L
LDA #>MFTEMP
STA A1H
LDA #<MOSFILE2
STA A4L
LDA #>MOSFILE2
STA A4H
JSR STRCPY
RTS
* Copy MOSFILE to MOSFILE2
COPYMF12 LDA #<MOSFILE
STA A1L
@ -255,8 +267,7 @@ COPYMF21 LDA #<MOSFILE2
RTS
* Copy PREFIX to MOSFILE
COPYPFXMF
LDA #<PREFIX
PFXtoMF LDA #<PREFIX
STA A1L
LDA #>PREFIX
STA A1H

View File

@ -86,6 +86,140 @@ RENFILE >>> ENTMAIN
DW RENPL
>>> XF2AUX,RENRET
* ProDOS file handling for file copying
COPYFILE >>> ENTMAIN
JSR MFtoTMP ; Swap MOSFILE & MOSFILE2
JSR COPYMF21
JSR TMPtoMF2
JSR PREPATH ; Preprocess arg2 (in MOSFILE)
JSR WILDONE ; Handle any wildcards
JSR EXISTS ; See if destination exists
STA :DESTTYPE ; Stash for later
JSR MFtoTMP ; Swap MOSFILE & MOSFILE2 again
JSR COPYMF21
JSR TMPtoMF2
JSR PREPATH ; Preprocess arg1
JSR WILDCARD ; Handle any wildcards in arg1
BCS :NONE
JSR HASWILD
BCC :MAINLOOP ; No wildcards in final segment
LDA :DESTTYPE ; Wildcards, check dest type
CMP #$02 ; Existing directory?
BNE :BADDEST ; If not, error
BRA :MAINLOOP ; Source: wildcard, dest: dir
:NOWILD
:MAINLOOP
LDA :DESTTYPE ; Recover destination type
JSR COPY1FILE ; Copy an individual file
BCS :COPYERR
JSR WILDNEXT
BCS :NOMORE
BRA :MAINLOOP
JSR CLSDIR
:EXIT >>> XF2AUX,COPYRET
:NONE JSR CLSDIR
LDA #$40 ; TODO PROPER ERROR CODE
BRA :EXIT
:BADDEST JSR CLSDIR
LDA #$40 ; TODO PROPER ERROR CODE
BRA :EXIT
:NOMORE JSR CLSDIR
LDA #$00
BRA :EXIT
:COPYERR JSR CLSDIR
LDA #$40 ; TODO PROPER ERROR CODE
BRA :EXIT
:DESTTYPE 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
STA GINFOPL+1
STA OPENPL+1
LDA #>MOSFILE
STA GINFOPL+2
STA OPENPL+2
JSR GETINFO ; GET_FILE_INFO
BCS :ERR
LDA #<MOSFILE2
STA GINFOPL+1
LDA #>MOSFILE2
STA GINFOPL+2
LDA #$07 ; Fix num parms in PL
STA GINFOPL
JSR MLI ; Call CREATE with ..
DB CREATCMD ; .. PL from GET_FILE_INFO
DW GINFOPL
LDA #$0A ; Num parms back as we found it
STA GINFOPL
BCS :ERR ; Error creating dest file
LDA #$00 ; Look for empty slot
JSR FINDBUF
STX :BUFIDX
JSR BUFADDR
BCS :ERR ; No I/O bufs available
STA OPENPL+3
STY OPENPL+4
JSR OPENFILE
BCS :ERR ; Open error
LDA OPENPL+5 ; File ref num
STA READPL+1
LDX :BUFIDX
STA FILEREFS,X ; Store file ref number
LDA #<MOSFILE2
STA OPENPL+1
LDA #>MOSFILE2
STA OPENPL+2
LDA #$00 ; Look for empty slot
JSR FINDBUF
STX :BUFIDX
JSR BUFADDR
BCS :ERR ; No I/O bufs available
STA OPENPL+3
STY OPENPL+4
JSR OPENFILE
BCS :ERRCLS1
LDA OPENPL+5 ; File ref num
STA WRITEPL+1
LDX :BUFIDX
STA FILEREFS,X ; Store file ref number
BRA :MAINLOOP
:ERR SEC ; Report error
RTS
:MAINLOOP JSR RDFILE ; Read a block
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
BCS :ERRCLS2 ; Write error
BRA :MAINLOOP
:EOFEXIT CLC ; No error
PHP
:CLOSE2 LDA READPL+1 ; Close output file
STA CLSPL+1
JSR CLSFILE
:CLOSE1 LDA WRITEPL+1 ; Close input file
STA CLSPL+1
JSR CLSFILE
PLP
RTS
:ERRCLS1 SEC
PHP
BRA :CLOSE1
:ERRCLS2 SEC
PHP
BRA :CLOSE2
:DESTTYPE DB $00
:BUFIDX DB $00
* ProDOS file handling for MOS OSFIND OPEN call
* Options in A: $40 'r', $80 'w', $C0 'rw'
OFILE >>> ENTMAIN
@ -103,7 +237,7 @@ OFILE >>> ENTMAIN
:NOTDIR PLA
PHA
CMP #$80 ; Write mode
BNE :S0
BNE :S1
JSR DODELETE
LDA #$01 ; Storage type - file
STA CREATEPL+7
@ -118,32 +252,13 @@ OFILE >>> ENTMAIN
LDA #$00
STA CREATEPL+6
JSR CRTFILE ; Create MOSFILE
:S0 LDA #$00 ; Look for empty slot
:S1 LDA #$00 ; Look for empty slot
JSR FINDBUF
STX BUFIDX
CPX #$00
BNE :S1
LDA #<IOBUF1
LDY #>IOBUF1
BRA :S4
:S1 CPX #$01
BNE :S2
LDA #<IOBUF2
LDY #>IOBUF2
BRA :S4
:S2 CPX #$02
BNE :S3
LDA #<IOBUF3
LDY #>IOBUF3
BRA :S4
:S3 CPX #$03
BNE :NOTFND ; Out of buffers really
LDA #<IOBUF4
LDY #>IOBUF4
:S4 STA OPENPL2+3
JSR BUFADDR
BCS :NOTFND
STA OPENPL2+3
STY OPENPL2+4
LDA #<MOSFILE
STA OPENPL2+1
LDA #>MOSFILE
@ -169,8 +284,7 @@ CFILE >>> ENTMAIN
JSR CLSFILE
LDA MOSFILE
JSR FINDBUF
CPX #$FF
BEQ :S1
BCS :S1
LDA #$00
STA FILEREFS,X
:S1 JMP FINDEXIT