201 lines
4.5 KiB
ArmAsm
201 lines
4.5 KiB
ArmAsm
;;; ============================================================
|
|
;;;
|
|
;;; COPY - Copy changing command for ProDOS-8
|
|
;;;
|
|
;;; Usage: COPY pathname1,pathname2
|
|
;;;
|
|
;;; Inspiration from COPY.ALL by Sandy Mossberg, Nibble 6/1987
|
|
;;;
|
|
;;; ============================================================
|
|
|
|
.include "apple2.inc"
|
|
.include "more_apple2.inc"
|
|
.include "prodos.inc"
|
|
|
|
;;; ============================================================
|
|
|
|
.org $4000
|
|
|
|
;; NOTE: Assumes XLEN is set by PATH
|
|
|
|
;; Point BI's parser at the command execution routine.
|
|
lda #<execute
|
|
sta XTRNADDR
|
|
page_num2 := *+1 ; address needing updating
|
|
lda #>execute
|
|
sta XTRNADDR+1
|
|
|
|
;; Mark command as external (zero).
|
|
lda #0
|
|
sta XCNUM
|
|
|
|
;; Set accepted parameter flags (2 Filenames)
|
|
|
|
lda #PBitsFlags::FN1 | PBitsFlags::FN2 ; Filenames
|
|
sta PBITS
|
|
lda #0
|
|
sta PBITS+1
|
|
|
|
clc ; Success (so far)
|
|
rts ; Return to BASIC.SYSTEM
|
|
|
|
;;; ============================================================
|
|
|
|
FN1REF := $D6
|
|
FN2REF := $D7
|
|
|
|
FN1INFO := $2EE
|
|
FN2BUF := $4200
|
|
DATABUF := $4600
|
|
DATALEN = $6000 - DATABUF
|
|
|
|
execute:
|
|
;; Get FN1 info
|
|
lda #$A
|
|
sta SSGINFO
|
|
lda #GET_FILE_INFO
|
|
jsr GOSYSTEM
|
|
bcs rts1
|
|
|
|
;; Reject directory file
|
|
lda FIFILID
|
|
cmp #$F ; DIR
|
|
bne :+
|
|
lda #$D ; FILE TYPE MISMATCH
|
|
sec
|
|
rts1: rts
|
|
:
|
|
|
|
;; Save FN1 info
|
|
ldx #$11
|
|
: lda SSGINFO,x
|
|
sta FN1INFO,x
|
|
dex
|
|
bpl :-
|
|
|
|
;; Open FN1
|
|
lda HIMEM ; Use BI's general purpose buffer
|
|
sta OSYSBUF
|
|
lda HIMEM+1
|
|
sta OSYSBUF+1
|
|
lda #OPEN
|
|
jsr GOSYSTEM
|
|
bcs rts1
|
|
lda OREFNUM
|
|
sta FN1REF
|
|
|
|
;; Copy FN2 to FN1
|
|
ptr1 := $06
|
|
ptr2 := $08
|
|
lda VPATH1
|
|
sta ptr1
|
|
lda VPATH1+1
|
|
sta ptr1+1
|
|
lda VPATH2
|
|
sta ptr2
|
|
lda VPATH2+1
|
|
sta ptr2+1
|
|
ldy #0
|
|
lda (ptr2),y
|
|
tay
|
|
: lda (ptr2),y
|
|
sta (ptr1),y
|
|
dey
|
|
bpl :-
|
|
|
|
;; Get FN2 info
|
|
lda #GET_FILE_INFO
|
|
jsr GOSYSTEM
|
|
bcs :+
|
|
|
|
lda #$13 ; DUPLICATE FILE NAME
|
|
err: pha
|
|
jsr close
|
|
pla
|
|
sec
|
|
rts
|
|
|
|
: cmp #6 ; BI Errors 6 and 7 cover
|
|
beq :+ ; vol dir, pathname, or filename
|
|
cmp #7 ; not found.
|
|
bne err ; Otherwise - fail.
|
|
:
|
|
|
|
;; Create FN2
|
|
lda #$C3 ; Free access
|
|
sta CRACESS
|
|
ldx #3
|
|
: lda FN1INFO+4,x ; storage type, file type,
|
|
sta CRFKIND-3,x ; aux type, create date/time
|
|
lda FN1INFO+$E,x
|
|
sta CRFKIND+1,x
|
|
dex
|
|
bpl :-
|
|
lda #CREATE
|
|
jsr GOSYSTEM
|
|
bcs err
|
|
|
|
;; Open FN2
|
|
lda #<FN2BUF
|
|
sta OSYSBUF
|
|
lda #>FN2BUF
|
|
sta OSYSBUF+1
|
|
lda #OPEN
|
|
jsr GOSYSTEM
|
|
bcs err
|
|
lda OREFNUM
|
|
sta FN2REF
|
|
|
|
;; Read
|
|
read: lda FN1REF
|
|
sta RWREFNUM
|
|
lda #<DATABUF
|
|
sta RWDATA
|
|
lda #>DATABUF
|
|
sta RWDATA+1
|
|
lda #<DATALEN
|
|
sta RWCOUNT
|
|
lda #>DATALEN
|
|
sta RWCOUNT+1
|
|
lda #READ
|
|
jsr GOSYSTEM
|
|
bcc :+
|
|
cmp #5 ; END OF DATA
|
|
beq finish
|
|
:
|
|
|
|
;; Write
|
|
lda FN2REF
|
|
sta RWREFNUM
|
|
lda #<DATABUF
|
|
sta RWDATA
|
|
lda #>DATABUF
|
|
sta RWDATA+1
|
|
lda RWTRANS
|
|
sta RWCOUNT
|
|
lda RWTRANS+1
|
|
sta RWCOUNT+1
|
|
lda #WRITE
|
|
jsr GOSYSTEM
|
|
bcc read
|
|
jmp err
|
|
|
|
|
|
finish: jsr close
|
|
clc
|
|
rts
|
|
|
|
.proc close
|
|
lda FN1REF
|
|
sta CFREFNUM
|
|
lda #CLOSE
|
|
jsr GOSYSTEM
|
|
lda FN2REF
|
|
sta CFREFNUM
|
|
lda #CLOSE
|
|
jsr GOSYSTEM
|
|
rts
|
|
.endproc
|
|
|
|
.assert * <= FN2BUF, error, "Too long"
|