A2osX/BIN/LS.S.txt
2016-08-17 08:25:58 +02:00

433 lines
8.1 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PR#3
PREFIX /A2OSX.SRC
NEW
INC 1
AUTO 6
.LIST OFF
.OP 65C02
.OR $2000
.TF /A2OSX.BOOT/BIN/LS
*--------------------------------------
.INB INC/MACROS.I
.INB INC/A2OSX.I
.INB INC/LIBSTR.I
*--------------------------------------
ZPPtr1 .EQ ZPBIN
ZPPtr2 .EQ ZPBIN+2
ZPPtr3 .EQ ZPBIN+4
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA 0
.DA CS.END-CS.START Code Length To Relocate
.DA DS.END-DS.START Data Segment to Allocate
.DA 0
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.LIBSTR .DA LIBSTR
L.MSG.VOL.HEADER .DA MSG.VOL.HEADER
L.MSG.DIR.HEADER .DA MSG.DIR.HEADER
L.MSG.VOL .DA MSG.VOL
L.MSG.DIR .DA MSG.DIR
L.MSG.FILE .DA MSG.FILE
L.MSG.VOL.END .DA MSG.VOL.END
L.MSG.DIR.END .DA MSG.DIR.END
L.PRODOS.FT.TXT .DA PRODOS.FT.TXT
.DA 0
*--------------------------------------
CS.INIT >LDYA L.LIBSTR
>SYSCALL SYS.LoadLibYA
sta hLIBSTR
stz TmpBuffer256
>SYSCALL SYS.GetArgC
cmp #1
bne .1
jsr CS.INIT.GETPFX no arg, go get current prefix
bra .3
.1 lda #1
>SYSCALL SYS.GetArgA
>STYA ZPPtr1
ldy #1
lda (ZPPtr1),y
cmp #'/' full path starting with '/'?
beq .2 yes, do not append to current prefix
jsr CS.INIT.GETPFX
.2 >PUSHW ZPPtr1
>PUSHWI TmpBuffer256
>SYSCALL SYS.PStrCat
.3 >LDYAI TmpBuffer256
>SYSCALL SYS.CheckPrefixYA is it a existing directory?
bcs .5 no, let ListDirInitYA extract pattern
lda TmpBuffer256
tay
lda #'/'
cmp TmpBuffer256,y
beq .4
iny
sta TmpBuffer256,y
.4 iny
lda #'*'
sta TmpBuffer256,y
.5 >LDYAI TmpBuffer256
>SYSCALL SYS.ListDirInitYA
bcs .9
ldy #hS.LISTDIR
sta (pData),y
lda (pPs)
ora #S.PS.F.EVENT Now accept events
sta (pPs)
clc
rts
.9 sec
rts
*--------------------------------------
CS.INIT.GETPFX ldy #S.PS.hPREFIX
lda (pPs),y
>SYSCALL SYS.GetMemPtrA
>PUSHYA
>PUSHWI TmpBuffer256
>SYSCALL SYS.PStrCpy
rts
*--------------------------------------
CS.RUN ldy #bCANCEL
lda (pData),y
beq .1
sec
rts
.1 ldy #bSTOP
lda (pData),y
beq .2
clc
rts
.2 ldy #hS.LISTDIR
lda (pData),y
>SYSCALL SYS.ListDirNextA
bcc .3
jmp Push.Footer
.3 pha
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1
lda (ZPPtr1)
pha
and #$0F
sta (ZPPtr1) Adjust Filename len
pla
and #$F0
cmp #$F0 Volume ($F) HEADER ?
bne .31
pla
ldy #hVOLHEADER
sta (pData),y
>PUSHW ZPPtr1
>PUSHW L.MSG.VOL.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.31 cmp #$E0 Dir ($E) HEADER ?
bne .4
pla
ldy #hDIRHEADER
sta (pData),y
>PUSHW ZPPtr1
>PUSHW L.MSG.DIR.HEADER
>LIBCALL hLIBSTR,LIBSTR.PRINTF
clc
rts
.4 cmp #$D0 Directory ?
bne .5
jsr Push.Dates
jsr Push.Dir
>PUSHW L.MSG.DIR
bra .8
.5 cmp #$C0 Volume Name ?
bne .6
>PUSHW ZPPtr1
>PUSHW L.MSG.VOL
bra .8
.6 jsr Push.Dates File
jsr Push.File
>PUSHW L.MSG.FILE
.8 >LIBCALL hLIBSTR,LIBSTR.PRINTF
.9 pla
>SYSCALL SYS.FreeMemA
clc
rts
*--------------------------------------
Push.Dir ldy #$1E get access mask
lda (ZPPtr1),y
>PUSHA
>PUSHW ZPPtr1
rts
*--------------------------------------
Push.File >PUSHBI 0 4th byte of file len=0
ldy #$17 get file len (3 bytes)
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
ldy #$1E get access mask
lda (ZPPtr1),y
>PUSHA
ldy #$20 get aux type
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
ldy #$10 get filetype
lda L.PRODOS.FT.TXT
sta ZPPtr2
lda L.PRODOS.FT.TXT+1
sta ZPPtr2+1
ldx #0
.1 lda (ZPPtr1),y
cmp PRODOS.FT.ID,x
beq .3
lda ZPPtr2
clc
adc #4
sta ZPPtr2
bcc .2
inc ZPPtr2+1
.2 inx
cpx PRODOS.FT.COUNT
bne .1
lda (ZPPtr1),y
lsr
lsr
lsr
lsr
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+2
lda (ZPPtr1),y
and #$0F
tax
lda HEXDIGIT,x
sta PRODOS.FT.DFLT+3
.3 >PUSHW ZPPtr2
>PUSHW ZPPtr1
>LIBCALL hLIBSTR,LIBSTR.LCASEP
>PUSHW ZPPtr1
rts
*--------------------------------------
Push.Dates ldy #$24 get modification time
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
ldy #$22
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
ldy #$1B get creation time
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
ldy #$19
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
rts
*--------------------------------------
Push.Footer ldy #hVOLHEADER
lda (pData),y
beq .20
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1
ldy #$22 file_count
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
>PUSHW L.MSG.VOL.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.20 ldy #hDIRHEADER
lda (pData),y
beq .21
>SYSCALL SYS.GetMemPtrA
>STYA ZPPtr1
ldy #$22 file_count
lda (ZPPtr1),y
>PUSHA
dey
lda (ZPPtr1),y
>PUSHA
>PUSHW L.MSG.DIR.END
>LIBCALL hLIBSTR,LIBSTR.PRINTF
.21 sec
rts
*--------------------------------------
CS.DOEVENT ldy #S.EVT.hDEV is Event from active IN device?
lda (pEvent),y
ldy #S.PS.hINDEV
cmp (pPs),y
bne .9
lda (pEvent)
and #S.EVT.F.KEY is it a KEY event?
beq .9
ldy #S.EVT.DATAHI is it an O or SAPPLE key ?
lda (pEvent),y
bne .9
ldy #S.EVT.DATALO
lda (pEvent),y
cmp #$03 Ctrl-C
bne .1
lda #$FF
ldy #bCANCEL
sta (pData),y
bra .8
.1 cmp #$13 Ctrl-S
bne .8
ldy #bSTOP
lda (pData),y
eor #$FF
sta (pData),y
.8 clc
rts
.9 sec
rts
*--------------------------------------
CS.QUIT ldy #hVOLHEADER
lda (pData),y
beq .1
>SYSCALL SYS.FreeMemA
.1 ldy #hDIRHEADER
lda (pData),y
beq .2
>SYSCALL SYS.FreeMemA
.2 ldy #hS.LISTDIR
lda (pData),y
>SYSCALL SYS.ListDirCloseA
ldy #hDIRPATH
lda (pData),y
beq .3
>SYSCALL SYS.FreeMemA
.3 lda hLIBSTR
>SYSCALL SYS.UnloadLibA
clc
rts
*--------------------------------------
CS.END
LIBSTR >PSTRING "libstr.o"
MSG.VOL.HEADER >CSTRING "Volume Listing Of %S\n"
MSG.DIR.HEADER >CSTRING "Directory Listing Of %S\n"
MSG.VOL >CSTRING "/%S\n"
MSG.DIR >CSTRING "/%15S <dir> %a %T %t %T %t\n"
MSG.FILE >CSTRING "%15S %S $%H %a %8L %T %t %T %t\n"
MSG.VOL.END >CSTRING "%D Files In Volume.\n"
MSG.DIR.END >CSTRING "%D Files In Directory.\n"
*--------------------------------------
PRODOS.FT.COUNT .HS 07
PRODOS.FT.ID .HS 0406FAFCFDE2FF
PRODOS.FT.TXT
T04 >PSTRING "TXT"
T06 >PSTRING "BIN"
TFA >PSTRING "S-C"
TFC >PSTRING "BAS"
TFD >PSTRING "VAR"
TE2 >PSTRING "ATK"
TFF >PSTRING "SYS"
PRODOS.FT.DFLT >PSTRING "$ "
HEXDIGIT .AS '0123456789ABCDEF'
hLIBSTR .BS 1
*--------------------------------------
.DUMMY
.OR 0
DS.START
hDIRPATH .BS 1
hS.LISTDIR .BS 1
hVOLHEADER .BS 1
hDIRHEADER .BS 1
bSTOP .BS 1
bCANCEL .BS 1
DS.END
.ED
*--------------------------------------
MAN
SAVE BIN/LS.S
ASM