mirror of
https://github.com/bobbimanners/Applecorn.git
synced 2024-06-28 03:29:32 +00:00
Better handling of *DIR ^ and *DIR ^/SOME/PATH
This commit is contained in:
parent
f5d596a4eb
commit
d4fc8d1b42
BIN
applecorn.po
BIN
applecorn.po
Binary file not shown.
131
mainmem.s
131
mainmem.s
|
@ -47,10 +47,10 @@ SETPRFX LDA #GPFXCMD
|
||||||
LDX $0300
|
LDX $0300
|
||||||
BNE RTSINST
|
BNE RTSINST
|
||||||
LDA $BF30
|
LDA $BF30
|
||||||
STA ONLPL+1 ; Device number
|
STA ONLNPL+1 ; Device number
|
||||||
JSR MLI
|
JSR MLI
|
||||||
DB ONLNCMD
|
DB ONLNCMD
|
||||||
DW ONLPL
|
DW ONLNPL
|
||||||
LDA $0301
|
LDA $0301
|
||||||
AND #$0F
|
AND #$0F
|
||||||
TAX
|
TAX
|
||||||
|
@ -810,28 +810,47 @@ CATALOGRET
|
||||||
>>> ENTMAIN
|
>>> ENTMAIN
|
||||||
BRA CATREENTRY
|
BRA CATREENTRY
|
||||||
|
|
||||||
* Set the prefix
|
* Preprocess path in MOSFILE, handling '^' character
|
||||||
SETPFX >>> ENTMAIN
|
* '^' means parent dir (eg: '^/SOMEDIR'))
|
||||||
* LDA MOSFILE ; Length
|
* Carry set on error, clear otherwise
|
||||||
* CMP #$01
|
PREPATH LDA MOSFILE+1 ; First char of dirname
|
||||||
* BNE :S1 ; Not one char
|
|
||||||
LDA MOSFILE+1 ; First char of dirname
|
|
||||||
CMP #$5E ; '^' char
|
CMP #$5E ; '^' char
|
||||||
BNE :S1 ; Not '^'
|
BEQ :CARET ; If '^'
|
||||||
|
CMP #$3A ; ':' char
|
||||||
|
BEQ :COLON
|
||||||
|
BRA :EXIT ; Nothing to do
|
||||||
|
:CARET JSR GETPREF ; Current prfx -> MOSFILE2
|
||||||
JSR PARENT ; Parent dir -> MOSFILE2
|
JSR PARENT ; Parent dir -> MOSFILE2
|
||||||
LDA #<MOSFILE2
|
JSR DEL1CHAR ; Delete '^' from MOSFILE
|
||||||
STA SPFXPL+1
|
LDA MOSFILE ; Is there more?
|
||||||
LDA #>MOSFILE2
|
BEQ :PARENT ; Only '^'
|
||||||
STA SPFXPL+2
|
LDA MOSFILE+1 ; What is next char?
|
||||||
BRA :S2
|
CMP #$2F ; Is it slash?
|
||||||
:S1 LDA #<MOSFILE
|
BNE :ERR
|
||||||
|
:PARENT JSR APPMF2 ; Append MOSFILE->MOSFILE2
|
||||||
|
JSR COPYMF2 ; Copy back to MOSFILE
|
||||||
|
:EXIT CLC
|
||||||
|
RTS
|
||||||
|
:COLON
|
||||||
|
* TODO: Handle :SD for slot/drive here
|
||||||
|
BRA :ERR
|
||||||
|
:ERR SEC
|
||||||
|
RTS
|
||||||
|
|
||||||
|
* Set prefix. Used by *DIR to change directory
|
||||||
|
SETPFX >>> ENTMAIN
|
||||||
|
JSR PREPATH ; Preprocess path
|
||||||
|
BCS :ERR
|
||||||
|
LDA #<MOSFILE
|
||||||
STA SPFXPL+1
|
STA SPFXPL+1
|
||||||
LDA #>MOSFILE
|
LDA #>MOSFILE
|
||||||
STA SPFXPL+2
|
STA SPFXPL+2
|
||||||
:S2 JSR MLI
|
JSR MLI ; SET_PREFIX
|
||||||
DB SPFXCMD
|
DB SPFXCMD
|
||||||
DW SPFXPL
|
DW SPFXPL
|
||||||
>>> XF2AUX,STARDIRRET
|
:EXIT >>> XF2AUX,STARDIRRET
|
||||||
|
:ERR LDA #$40 ; Invalid pathname syn
|
||||||
|
BRA :EXIT
|
||||||
|
|
||||||
* Create disk file
|
* Create disk file
|
||||||
CRTFILE JSR MLI
|
CRTFILE JSR MLI
|
||||||
|
@ -869,10 +888,9 @@ GETPREF JSR MLI
|
||||||
DW GPFXPL
|
DW GPFXPL
|
||||||
RTS
|
RTS
|
||||||
|
|
||||||
* Put parent directory in MOSFILE2
|
* Convert path in MOSFILE2 by removing leaf dir to leave
|
||||||
* If already at top level, parent is current dir
|
* parent directory. If already at top, return unchanged.
|
||||||
PARENT JSR GETPREF
|
PARENT LDX MOSFILE2 ; Length of string
|
||||||
LDX MOSFILE2 ; Length of string
|
|
||||||
BEQ :EXIT ; Prefix len zero
|
BEQ :EXIT ; Prefix len zero
|
||||||
DEX ; Ignore trailing '/'
|
DEX ; Ignore trailing '/'
|
||||||
:L1 LDA MOSFILE2,X
|
:L1 LDA MOSFILE2,X
|
||||||
|
@ -886,7 +904,74 @@ PARENT JSR GETPREF
|
||||||
STX MOSFILE2 ; Truncate string
|
STX MOSFILE2 ; Truncate string
|
||||||
:EXIT RTS
|
:EXIT RTS
|
||||||
|
|
||||||
|
* Convert slot/drive to prefix
|
||||||
|
* Expect slot number (1..7) in A, drive (0..1) in X
|
||||||
|
* Puts prefix (or empty string) in MOSFILE
|
||||||
|
DRV2PFX ASL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
ASL
|
||||||
|
STX :TEMP
|
||||||
|
ORA :TEMP
|
||||||
|
STA ONLNPL+1 ; Device number
|
||||||
|
JSR MLI ; Call ON_LINE
|
||||||
|
DB ONLNCMD
|
||||||
|
DW ONLNPL ; Buffer set to $301
|
||||||
|
LDA $301 ; Slot/Drive/Length
|
||||||
|
AND #$08 ; Mask to get length
|
||||||
|
STA MOSFILE ; Store length
|
||||||
|
TAX
|
||||||
|
:L1 CPX #$00 ; Copy -> MOSFILE
|
||||||
|
BEQ :EXIT
|
||||||
|
LDA $301,X
|
||||||
|
STA MOSFILE,X
|
||||||
|
DEX
|
||||||
|
BRA :L1
|
||||||
|
:EXIT RTS
|
||||||
|
:TEMP DB $00
|
||||||
|
|
||||||
|
* Delete first char of MOSFILE
|
||||||
|
DEL1CHAR LDX MOSFILE ; Length
|
||||||
|
BEQ :EXIT ; Nothing to delete
|
||||||
|
LDY #$02 ; Second char
|
||||||
|
:L1 CPY MOSFILE
|
||||||
|
BEQ :S2 ; If Y=MOSFILE okay
|
||||||
|
BCS :S1 ; If Y>MOSFILE done
|
||||||
|
:S2 LDA MOSFILE,Y
|
||||||
|
STA MOSFILE-1,Y
|
||||||
|
INY
|
||||||
|
BRA :L1
|
||||||
|
:S1 DEC MOSFILE
|
||||||
|
:EXIT RTS
|
||||||
|
|
||||||
|
* Append MOSFILE to MOSFILE2
|
||||||
|
APPMF2 LDY MOSFILE2 ; Length of MOSFILE2
|
||||||
|
LDX #$00 ; Index into MOSFILE
|
||||||
|
:L1 CPX MOSFILE ; Length of MOSFILE
|
||||||
|
BEQ :DONE
|
||||||
|
LDA MOSFILE+1,X
|
||||||
|
STA MOSFILE2+1,Y
|
||||||
|
INX
|
||||||
|
INY
|
||||||
|
BRA :L1
|
||||||
|
:DONE STY MOSFILE2 ; Update length MOSFILE2
|
||||||
|
RTS
|
||||||
|
|
||||||
|
* Copy MOSFILE2 to MOSFILE
|
||||||
|
COPYMF2 LDX #$00
|
||||||
|
:L1 CPX MOSFILE2
|
||||||
|
BEQ :DONE
|
||||||
|
LDA MOSFILE2+1,X
|
||||||
|
STA MOSFILE+1,X
|
||||||
|
INX
|
||||||
|
BRA :L1
|
||||||
|
:DONE STX MOSFILE
|
||||||
|
RTS
|
||||||
|
|
||||||
|
******************************************************
|
||||||
* ProDOS Parameter lists for MLI calls
|
* ProDOS Parameter lists for MLI calls
|
||||||
|
******************************************************
|
||||||
|
|
||||||
OPENPL HEX 03 ; Number of parameters
|
OPENPL HEX 03 ; Number of parameters
|
||||||
DW $0000 ; Pointer to filename
|
DW $0000 ; Pointer to filename
|
||||||
DW IOBUF0 ; Pointer to IO buffer
|
DW IOBUF0 ; Pointer to IO buffer
|
||||||
|
@ -937,7 +1022,7 @@ CLSPL HEX 01 ; Number of parameters
|
||||||
FLSHPL HEX 01 ; Number of parameters
|
FLSHPL HEX 01 ; Number of parameters
|
||||||
DB $00 ; Reference number
|
DB $00 ; Reference number
|
||||||
|
|
||||||
ONLPL HEX 02 ; Number of parameters
|
ONLNPL HEX 02 ; Number of parameters
|
||||||
DB $00 ; Unit num
|
DB $00 ; Unit num
|
||||||
DW $301 ; Buffer
|
DW $301 ; Buffer
|
||||||
|
|
||||||
|
@ -984,7 +1069,7 @@ QUITPL HEX 04 ; Number of parameters
|
||||||
* Pascal string
|
* Pascal string
|
||||||
MOSFILE DS 65 ; 64 bytes max prefix/file len
|
MOSFILE DS 65 ; 64 bytes max prefix/file len
|
||||||
|
|
||||||
* Buffer for second filename (for rename)
|
* Buffer for second filename
|
||||||
* Pascal string
|
* Pascal string
|
||||||
MOSFILE2 DS 65 ; 64 bytes max prefix/file len
|
MOSFILE2 DS 65 ; 64 bytes max prefix/file len
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user