mirror of
https://github.com/A2osX/A2osX.git
synced 2024-09-10 22:54:59 +00:00
581 lines
12 KiB
Plaintext
581 lines
12 KiB
Plaintext
PR#3
|
||
PREFIX /A2OSX.SRC
|
||
NEW
|
||
INC 1
|
||
AUTO 6
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
* In :
|
||
* X = #SYSCall
|
||
* Y,A = PATH (PSTR)
|
||
* Out :
|
||
* CC : Y,A = PTR to S.DIR
|
||
* CS : A = EC
|
||
*--------------------------------------
|
||
K.OPENDIRYA jsr PFT.CheckPathYA
|
||
>STYA ZPQuickPtr2
|
||
>STYA MLICALL.PARAMS+1 For GETFILEINFO,MLIOPEN
|
||
|
||
>PUSHWI S.DIR.PRODOS
|
||
>PUSHBI S.MEM.F.INIT0
|
||
jsr K.GetMem
|
||
bcs .9
|
||
|
||
>STYA ZPQuickPtr1
|
||
stx K.READDIRA.hDir
|
||
|
||
lda (ZPQuickPtr2)
|
||
cmp #1 One char ?
|
||
bne .7 No, Go open dir....
|
||
tay Y=1
|
||
lda (ZPQuickPtr2),y
|
||
cmp #'/' Root required ?
|
||
beq .8 Yes, Go for ONLINE Call (S.DIR.PRODOS.REF=0)
|
||
|
||
lda #SYSMGR.ERRSYN
|
||
sec
|
||
.9 rts
|
||
|
||
.7 >MLICALL MLIGETFILEINFO
|
||
bcs .98 file/dir does not exists....quit
|
||
lda MLICALL.PARAMS+4
|
||
cmp #$0F Directory ?
|
||
bne .98
|
||
|
||
>PUSHWI 1024 get a ProDOS IOBUF
|
||
>PUSHBI S.MEM.F.ALIGN+S.MEM.F.NOMOVE
|
||
jsr K.GetMem
|
||
bcs .98
|
||
|
||
>STYA MLICALL.PARAMS+3 Save Ptr to IOBUF for MLIOPEN call
|
||
txa
|
||
ldy #S.DIR.PRODOS.IOBUF
|
||
sta (ZPQuickPtr1),y
|
||
|
||
>MLICALL MLIOPEN
|
||
bcs .98
|
||
|
||
lda MLICALL.PARAMS+5 get ref_num
|
||
ldy #S.DIR.PRODOS.REF
|
||
sta (ZPQuickPtr1),y
|
||
|
||
.8 lda K.READDIRA.hDir
|
||
clc
|
||
rts
|
||
|
||
.98 pha save MLI error
|
||
jsr K.CLOSEDIRA.1
|
||
pla get back MLI error
|
||
sec
|
||
.99 rts
|
||
*--------------------------------------
|
||
* In :
|
||
* A = hDIR
|
||
* Out :
|
||
* CC : X = hDIREND, Y,A = PTR to S.DIRENT
|
||
* CS : A = EC, A = 0 : no more entry
|
||
*--------------------------------------
|
||
K.READDIRA.hDir .BS 1
|
||
K.READDIRA.hMem .BS 1
|
||
K.READDIRA.hDIRENT .BS 1
|
||
K.READDIRA.BufSize .BS 2
|
||
K.READDIRA.ECIB .BS 1
|
||
K.READDIRA.EC2Return .BS 1
|
||
*--S.DIR Cache ------------------------
|
||
K.READDIRA.EL .BS 1
|
||
K.READDIRA.EPB .BS 1
|
||
K.READDIRA.EC .BS 2
|
||
*--------------------------------------
|
||
K.READDIRA jsr PFT.CheckDirA
|
||
sta K.READDIRA.hDir
|
||
jsr K.GetMemPtrA
|
||
>STYA ZPQuickPtr1
|
||
|
||
ldy #S.DIR.F
|
||
lda (ZPQuickPtr1),y
|
||
and #S.DIR.F.NOMORE
|
||
bne .9
|
||
|
||
ldy #S.DIR.PRODOS.REF
|
||
lda (ZPQuickPtr1),y
|
||
beq K.READDIRA.ROOT
|
||
jmp K.READDIRA.DIR
|
||
|
||
.9 lda #0
|
||
sec CS,A=0 no more entry
|
||
rts
|
||
*--------------------------------------
|
||
K.READDIRA.ROOT stz MLICALL.PARAMS+1 All Volumes
|
||
|
||
>PUSHWI 256 Get a 256 bytes buffer for ONLINE call...
|
||
>PUSHBI 0
|
||
jsr K.GetMem
|
||
bcs .99
|
||
stx K.READDIRA.hMem
|
||
|
||
>STYA MLICALL.PARAMS+2
|
||
>STYA ZPQuickPtr2 For PASS #1 & #2
|
||
>MLICALL MLIONLINE
|
||
bcc .10
|
||
|
||
.98 jsr K.READDIRA.CLN
|
||
sec
|
||
.99 rts
|
||
* pass #1 compute BufSize.....
|
||
.10 lda #1 +1 for Ending 0
|
||
sta K.READDIRA.BufSize
|
||
stz K.READDIRA.BufSize+1
|
||
|
||
stz K.READDIRA.EC
|
||
|
||
ldy #0
|
||
|
||
.1 lda (ZPQuickPtr2),y
|
||
and #$0F
|
||
beq .2
|
||
|
||
inc K.READDIRA.EC increase entry count
|
||
|
||
sec Add Filelen +1
|
||
adc #S.STAT will ends with CC
|
||
adc K.READDIRA.BufSize
|
||
sta K.READDIRA.BufSize
|
||
bcc .2
|
||
inc K.READDIRA.BufSize+1
|
||
|
||
.2 tya
|
||
clc
|
||
adc #16
|
||
tay
|
||
bcc .1 loop until 256 bytes scanned
|
||
|
||
* pass #2 Fill Buffer...
|
||
jsr K.READDIRA.GetBuf
|
||
bcs .98
|
||
|
||
.3 lda (ZPQuickPtr2)
|
||
and #$0F
|
||
beq .88
|
||
|
||
tax
|
||
|
||
>LDYA ZPQuickPtr4 Store actual PTR for MLIGETFILEINFO
|
||
>STYA MLICALL.PARAMS+1
|
||
|
||
txa
|
||
inc
|
||
jsr K.READDIRA.AddToBuf
|
||
lda #'/'
|
||
jsr K.READDIRA.AddToBuf
|
||
|
||
ldy #1
|
||
|
||
.4 lda (ZPQuickPtr2),y
|
||
jsr K.READDIRA.AddToBuf
|
||
iny
|
||
dex
|
||
bne .4
|
||
|
||
jsr K.READDIRA.ClrStat
|
||
|
||
lda (ZPQuickPtr2)
|
||
|
||
asl DRIVE in Carry
|
||
pha
|
||
lda #0
|
||
rol
|
||
inc
|
||
sta KrnBuf256+S.STAT.PRODOS.DRIVE
|
||
pla
|
||
lsr CC
|
||
lsr
|
||
lsr
|
||
lsr
|
||
lsr
|
||
sta KrnBuf256+S.STAT.PRODOS.SLOT
|
||
|
||
>MLICALL MLIGETFILEINFO
|
||
sta KrnBuf256+S.STAT.PRODOS.DEVSTATUS
|
||
|
||
bcs .80
|
||
>LDYA MLICALL.PARAMS+5 AUXTYPE=TOTAL BLOCKS
|
||
>STYA KrnBuf256+S.STAT.PRODOS.DEVBLOCKS
|
||
>LDYA MLICALL.PARAMS+8
|
||
>STYA KrnBuf256+S.STAT.BLOCKS
|
||
|
||
|
||
.80 jsr K.READDIRA.ADDSTAT
|
||
|
||
.88 lda ZPQuickPtr2
|
||
clc
|
||
adc #16
|
||
sta ZPQuickPtr2
|
||
bcc .89
|
||
inc ZPQuickPtr2+1
|
||
.89 dec K.READDIRA.EC
|
||
bne .3
|
||
|
||
* lda #0 done by S.MEM.F.INIT0
|
||
* sta (ZPQuickPtr4) Ending 0
|
||
|
||
ldy #S.DIR.F
|
||
lda #S.DIR.F.NOMORE
|
||
sta (ZPQuickPtr1),y
|
||
|
||
jsr K.READDIRA.CLN Discard ONLINE BUFFER
|
||
|
||
lda K.READDIRA.hDIRENT
|
||
tax
|
||
jmp K.GetMemPtrA
|
||
*--------------------------------------
|
||
K.READDIRA.DIR sta MLICALL.PARAMS+1 A=#S.DIR.PRODOS.REF
|
||
|
||
>PUSHWI 512 Get a 512 bytes buffer for reading dir...
|
||
>PUSHBI 0
|
||
jsr K.GetMem
|
||
bcs .99
|
||
stx K.READDIRA.hMem
|
||
|
||
>STYA MLICALL.PARAMS+2 For reading
|
||
|
||
pha
|
||
tya
|
||
* clc CC from K.GetMem
|
||
adc #4 Skip 4 bytes linked list
|
||
sta ZPQuickPtr2 PTR to Buffer for PASS #1
|
||
sta ZPQuickPtr3 PTR to Buffer for PASS #2
|
||
|
||
pla
|
||
adc #0
|
||
sta ZPQuickPtr2+1 PTR to Buffer for PASS #1
|
||
sta ZPQuickPtr3+1 PTR to Buffer for PASS #2
|
||
|
||
>LDYAI 512
|
||
>STYA MLICALL.PARAMS+4
|
||
>MLICALL MLIREAD Read A block from directory
|
||
bcs .98
|
||
|
||
ldy #S.DIR.PRODOS.EL Check if first run....
|
||
lda (ZPQuickPtr1),y
|
||
bne .2 no, we have all we need....
|
||
|
||
ldy #$1f+3
|
||
ldx #3
|
||
|
||
.1 lda (ZPQuickPtr2),y Get K.READDIRA.EL.... From Block
|
||
sta K.READDIRA.EL,x
|
||
dey
|
||
dex
|
||
bpl .1
|
||
bra .4
|
||
|
||
.98 jsr K.READDIRA.CLN
|
||
sec
|
||
.99 rts
|
||
|
||
.2 ldy #S.DIR.PRODOS.EL+3
|
||
ldx #3
|
||
|
||
.3 lda (ZPQuickPtr1),y get this session parameters from S.DIR
|
||
sta K.READDIRA.EL,x
|
||
dey
|
||
dex
|
||
bpl .3
|
||
|
||
.4 ldx K.READDIRA.EC
|
||
cpx K.READDIRA.EPB
|
||
|
||
lda K.READDIRA.EC+1
|
||
sbc #0
|
||
bcc .5 We have less than EPB to read
|
||
ldx K.READDIRA.EPB
|
||
|
||
.5 stx K.READDIRA.ECIB
|
||
stz K.READDIRA.EC2Return
|
||
|
||
lda #1 For Ending 0
|
||
sta K.READDIRA.BufSize
|
||
stz K.READDIRA.BufSize+1
|
||
|
||
* pass #1 compute BufSize.....
|
||
K.READDIRA.DIR1 lda (ZPQuickPtr2) X = EntryCount In This Block
|
||
beq .7 Free slot....goto next
|
||
|
||
tay save LEN
|
||
|
||
and #$F0 get storage_type
|
||
cmp #$F0 Volume header ?
|
||
beq .1
|
||
|
||
cmp #$E0 directory header ?
|
||
beq .2
|
||
|
||
inc K.READDIRA.EC2Return regular DIR or File....
|
||
|
||
tya
|
||
and #$F get filename len
|
||
sec add "#<filename>" + S.STAT
|
||
|
||
adc #S.STAT
|
||
.HS 2C bit abs
|
||
|
||
.1 lda #2+S.STAT add "1." string + S.STAT
|
||
.HS 2C bit abs
|
||
|
||
.2 lda #2+S.STAT+3+S.STAT add "1." + S.STAT + "2.." + S.STAT...
|
||
|
||
clc
|
||
adc K.READDIRA.BufSize
|
||
sta K.READDIRA.BufSize
|
||
bcc .7
|
||
inc K.READDIRA.BufSize+1
|
||
|
||
.7 lda ZPQuickPtr2
|
||
clc
|
||
adc K.READDIRA.EL
|
||
sta ZPQuickPtr2
|
||
bcc .8
|
||
inc ZPQuickPtr2+1
|
||
|
||
.8 dex
|
||
bne K.READDIRA.DIR1
|
||
|
||
* pass #2 Fill Buffer...(ZPQuickPtr1 & Ptr2 can now be trashed)
|
||
K.READDIRA.DIR2 jsr K.READDIRA.GetBuf
|
||
bcs .98
|
||
|
||
* ldy #S.DIR.PRODOS.EL Check if first run....
|
||
* lda (ZPQuickPtr1),y
|
||
* bne .73
|
||
|
||
.71 lda (ZPQuickPtr3)
|
||
beq .78 Empty slot, skip
|
||
|
||
and #$F0
|
||
cmp #$F0 Vol Header ?
|
||
bne .72
|
||
jsr K.READDIRA.ADD.
|
||
bra .78
|
||
|
||
.72 cmp #$E0 Dir Header ?
|
||
bne .73
|
||
jsr K.READDIRA.ADD.
|
||
jsr K.READDIRA.ADD..
|
||
bra .78
|
||
|
||
.73 lda K.READDIRA.EC Regular FILE/DIR
|
||
sec
|
||
sbc #1
|
||
sta K.READDIRA.EC
|
||
|
||
lda K.READDIRA.EC+1
|
||
sbc #0
|
||
sta K.READDIRA.EC+1 CC, we reached $ffff
|
||
bcc .80 no more file to list...
|
||
|
||
jsr K.READDIRA.AddFNToBuf
|
||
jsr K.READDIRA.ClrStat
|
||
|
||
lda (ZPQuickPtr3)
|
||
and #$F0
|
||
cmp #$D0 Directory ?
|
||
bne .75
|
||
jsr K.READDIRA.ADDD
|
||
bra .78
|
||
|
||
.75 jsr K.READDIRA.ADDF
|
||
|
||
.78 lda ZPQuickPtr3
|
||
clc
|
||
adc K.READDIRA.EL
|
||
sta ZPQuickPtr3
|
||
bcc .79
|
||
inc ZPQuickPtr3+1
|
||
|
||
.79 dec K.READDIRA.ECIB
|
||
bne .71
|
||
|
||
.80
|
||
* lda #0 S.MEM.F.INIT0 already did this
|
||
* sta (ZPQuickPtr4) Ending 0
|
||
|
||
lda K.READDIRA.hDir Restore ZPQuickPtr1 trashed by STR API calls
|
||
jsr K.GetMemPtrA
|
||
>STYA ZPQuickPtr1
|
||
|
||
ldx #3
|
||
ldy #S.DIR.PRODOS.EL+3
|
||
|
||
.8 lda K.READDIRA.EL,x Store back this session prameters to S.DIR
|
||
sta (ZPQuickPtr1),y
|
||
dey
|
||
dex
|
||
bpl .8
|
||
|
||
jsr K.READDIRA.CLN Discard READBUFFER
|
||
|
||
lda K.READDIRA.hDIRENT
|
||
tax
|
||
jmp K.GetMemPtrA
|
||
|
||
.98 jsr K.READDIRA.CLN
|
||
sec
|
||
rts
|
||
*--------------------------------------
|
||
K.READDIRA.CLN pha
|
||
lda K.READDIRA.hMem
|
||
jsr K.FreeMemA
|
||
pla
|
||
rts
|
||
*--------------------------------------
|
||
K.READDIRA.GetBuf
|
||
>PUSHW K.READDIRA.BufSize Get a BufSize bytes buffer for storing results
|
||
>PUSHBI S.MEM.F.INIT0 make sure 0 filled
|
||
jsr K.GetMem
|
||
bcs .9
|
||
stx K.READDIRA.hDIRENT
|
||
>STYA ZPQuickPtr4
|
||
.9 rts
|
||
*--------------------------------------
|
||
K.READDIRA.ADD. ldx #1 filename="1."
|
||
.HS 2C bit abs
|
||
K.READDIRA.ADD..
|
||
ldx #2 filename="2.."
|
||
txa
|
||
jsr K.READDIRA.AddToBuf Add LEN
|
||
lda #'.'
|
||
|
||
.1 jsr K.READDIRA.AddToBuf Add X dot(s)
|
||
dex
|
||
bne .1
|
||
|
||
jsr K.READDIRA.ClrStat
|
||
|
||
* ldy #$25 total_blocks
|
||
* lda (ZPQuickPtr3),y
|
||
* sta KrnBuf256+S.STAT.BLOCKS
|
||
* iny
|
||
* lda (ZPQuickPtr3),y
|
||
* sta KrnBuf256+S.STAT.BLOCKS+1
|
||
*--------------------------------------
|
||
K.READDIRA.ADDD lda #$0F
|
||
sta KrnBuf256+S.STAT.PRODOS.TYPE
|
||
|
||
bra K.READDIRA.ADDSTAT
|
||
*--------------------------------------
|
||
K.READDIRA.ADDF ldx #ADDF.DST-ADDF.SRC
|
||
.1 ldy ADDF.SRC-1,x
|
||
lda (ZPQuickPtr3),y
|
||
ldy ADDF.DST-1,x
|
||
sta KrnBuf256,y
|
||
dex
|
||
bpl .1
|
||
|
||
>PUSHWI KrnBuf256+S.STAT.CTIME
|
||
lda #$18 creation Date/time
|
||
jsr K.READDIRA.ConvertTime
|
||
|
||
>PUSHWI KrnBuf256+S.STAT.MTIME
|
||
lda #$21 mod Date/time
|
||
jsr K.READDIRA.ConvertTime
|
||
*--------------------------------------
|
||
K.READDIRA.AddStat
|
||
ldy #S.STAT-1
|
||
|
||
.1 lda KrnBuf256,y
|
||
sta (ZPQuickPtr4),y
|
||
dey
|
||
bpl .1
|
||
|
||
lda ZPQuickPtr4
|
||
clc
|
||
adc #S.STAT
|
||
sta ZPQuickPtr4
|
||
bcc .8
|
||
inc ZPQuickPtr4+1
|
||
.8 rts
|
||
*--------------------------------------
|
||
K.READDIRA.ClrStat
|
||
ldx #S.STAT-1
|
||
|
||
.1 stz KrnBuf256,x
|
||
dex
|
||
bpl .1
|
||
rts
|
||
*--------------------------------------
|
||
K.READDIRA.AddFNToBuf
|
||
lda (ZPQuickPtr3)
|
||
and #$0F get filename len
|
||
tax
|
||
jsr K.READDIRA.AddToBuf
|
||
|
||
ldy #1
|
||
|
||
.1 lda (ZPQuickPtr3),y
|
||
jsr K.READDIRA.AddToBuf
|
||
iny
|
||
dex
|
||
bne .1
|
||
rts
|
||
*--------------------------------------
|
||
K.READDIRA.AddToBuf
|
||
sta (ZPQuickPtr4)
|
||
inc ZPQuickPtr4
|
||
bne .8
|
||
inc ZPQuickPtr4+1
|
||
.8 rts
|
||
*--------------------------------------
|
||
K.READDIRA.ConvertTime
|
||
clc
|
||
adc ZPQuickPtr3
|
||
tay
|
||
lda ZPQuickPtr3+1
|
||
adc #0
|
||
>PUSHYA
|
||
jmp K.PTime2Time Will destroy Ptr1 & Ptr2 !!!!
|
||
*--------------------------------------
|
||
ADDF.SRC .HS 1013141516171f20
|
||
ADDF.DST .DA #S.STAT.PRODOS.TYPE,#S.STAT.BLOCKS,#S.STAT.BLOCKS+1
|
||
.DA #S.STAT.SIZE,#S.STAT.SIZE+1,#S.STAT.SIZE+2
|
||
.DA #S.STAT.PRODOS.AUXTYPE,#S.STAT.PRODOS.AUXTYPE+1
|
||
*--------------------------------------
|
||
* In :
|
||
* A = hDIR
|
||
*--------------------------------------
|
||
K.CLOSEDIRA jsr PFT.CheckDirA
|
||
sta K.READDIRA.hDir
|
||
jsr K.GetMemPtrA
|
||
>STYA ZPQuickPtr1
|
||
|
||
K.CLOSEDIRA.1 ldy #S.DIR.PRODOS.REF
|
||
lda (ZPQuickPtr1),y
|
||
beq .1
|
||
sta MLICALL.PARAMS+1
|
||
>MLICALL MLICLOSE
|
||
|
||
.1 ldy #S.DIR.PRODOS.IOBUF
|
||
lda (ZPQuickPtr1),y
|
||
beq .2
|
||
jsr K.FreeMemA
|
||
|
||
.2 ldaK.READDIRA.hDir
|
||
jsr K.FreeMemA
|
||
clc
|
||
rts
|
||
*--------------------------------------
|
||
K.MKDIRYA jsr PFT.CheckPathYA
|
||
>STYA MLICALL.PARAMS+1
|
||
lda #S.FILEINFO.ACCESS.FULL
|
||
sta MLICALL.PARAMS+S.FILEINFO.ACCESS
|
||
lda #S.FILEINFO.TYPE.DIR
|
||
sta MLICALL.PARAMS+S.FILEINFO.TYPE
|
||
lda #S.FILEINFO.STORETYPE.DIR
|
||
sta MLICALL.PARAMS+S.FILEINFO.STORETYPE
|
||
>MLICALL MLICREATE
|
||
rts
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE SYS/KERNEL.S.DIR
|
||
LOAD SYS/KERNEL.S
|
||
ASM
|