mirror of
https://github.com/A2osX/A2osX.git
synced 2024-11-28 10:52:33 +00:00
550 lines
12 KiB
Plaintext
550 lines
12 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
*--------------------------------------
|
||
VolListPtr .EQ $65
|
||
*
|
||
SelectedIndex .EQ $67 name counter
|
||
filecount .EQ $68 # of displayable files in directory
|
||
|
||
bInSubDir .EQ $6B directory level
|
||
FilenamePtr .EQ $6C filename storage pointer (16 bit)
|
||
|
||
ScrollIndex .EQ $73 index # of top name in display
|
||
*--------------------------------------
|
||
SEL1.PathBuf .EQ $280
|
||
SEL1.BSPathBuf .EQ $2C0
|
||
*--------------------------------------
|
||
SEL1.FileBuf .EQ $1800 1k
|
||
SEL1.DirBlk .EQ $1C00 512b
|
||
SEL1.filetypes .EQ $1F00
|
||
SEL1.Filenames .EQ $2000
|
||
*--------------------------------------
|
||
SEL1.START .PH $1000
|
||
|
||
SEL1.START1 cld
|
||
bit IO.RROMBNK2 read ROM
|
||
|
||
lda #$A0
|
||
jsr $C300 initialize 80 column text card
|
||
|
||
* set up memory bitmap in global page
|
||
|
||
ldx #TBX.MemReset
|
||
jsr GP.TOOLBOX
|
||
|
||
stz SEL1.BSPathBuf
|
||
*--------------------------------------
|
||
ldx GP.DEVCNT
|
||
|
||
.1 lda GP.DEVLST,x
|
||
and #$F0
|
||
cmp GP.DEVNUM
|
||
beq SEL1.GetVol
|
||
|
||
dex
|
||
bra .1
|
||
*--------------------------------------
|
||
SEL1.NextVol ldx VolListPtr get device list pointer.
|
||
bne .1
|
||
|
||
ldx GP.DEVCNT get device count.
|
||
inx
|
||
|
||
.1 dex
|
||
lda GP.DEVLST,x get unit number from list.
|
||
*--------------------------------------
|
||
SEL1.GetVol stx VolListPtr
|
||
sta SEL1.OnLineP+1 store unit number for online.
|
||
jsr MLI
|
||
.DA #MLI.ONLINE
|
||
.DA SEL1.OnLineP
|
||
bcs SEL1.NextVol error check.
|
||
|
||
stz bInSubDir haven't read root directory yet.
|
||
lda SEL1.PathBuf+1 load description byte.
|
||
and #$0F mask for name length.
|
||
beq SEL1.NextVol if 0, then try next unit.
|
||
|
||
tax
|
||
inx add 2 to length.
|
||
SEL1.OpenDir1 inx name length in x.
|
||
|
||
SEL1.OpenDir stx SEL1.PathBuf save the name length
|
||
lda #'/'
|
||
sta SEL1.PathBuf+1 slash before and
|
||
sta SEL1.PathBuf,x after name.
|
||
|
||
jsr MLI
|
||
.DA #MLI.OPEN
|
||
.DA SEL1.OpenP
|
||
bcc SEL1.EnumDir good open.
|
||
|
||
lda bInSubDir trying to open root directory ?
|
||
beq SEL1.NextVol yes, just move to next volume.
|
||
|
||
jsr ROM.BELL1 no, generate bell tone
|
||
jsr SEL1.FullPath.. and stay at same level.
|
||
stx SEL1.PathBuf
|
||
jmp SEL1.KeyLoop
|
||
*--------------------------------------
|
||
SEL1.EnumDir stz filecount zero file count.
|
||
|
||
jsr SEL1.SetFNPtr
|
||
|
||
stz SEL1.ReadP+2
|
||
lda /SEL1.DirBlk
|
||
sta SEL1.ReadP+3
|
||
|
||
stz SEL1.ReadP+4 512 bytes
|
||
lda #2
|
||
sta SEL1.ReadP+5
|
||
|
||
SEL1.EnumBlk jsr MLI
|
||
.DA #MLI.READ
|
||
.DA SEL1.ReadP
|
||
bcs SEL1.CloseDir
|
||
|
||
lda /SEL1.DirBlk
|
||
ldx #TBX.EnumBlk
|
||
jsr GP.TOOLBOX
|
||
bcs SEL1.CloseDir
|
||
|
||
SEL1.EnumDirNext
|
||
jsr SEL1.SetFNPtr Y,A = FilenamePtr
|
||
ldx #TBX.EnumNext
|
||
jsr GP.TOOLBOX
|
||
bcs SEL1.EnumBlk
|
||
|
||
ldx filecount get valid files read.
|
||
sta SEL1.filetypes,x
|
||
|
||
lda (FilenamePtr)
|
||
eor #SEL1.BS.L
|
||
bne .8
|
||
|
||
tay Y = 0
|
||
ldx SEL1.PathBuf
|
||
|
||
.1 iny
|
||
lda SEL1.BS-1,y
|
||
cmp (FilenamePtr),y
|
||
bne .8
|
||
|
||
inx
|
||
sta SEL1.BSPathBuf,x
|
||
|
||
cpy #SEL1.BS.L
|
||
bne .1
|
||
|
||
stx SEL1.BSPathBuf
|
||
|
||
ldx SEL1.PathBuf
|
||
|
||
.2 lda SEL1.PathBuf,x
|
||
sta SEL1.BSPathBuf,x
|
||
dex
|
||
bne .2
|
||
|
||
.8 inc filecount
|
||
bne SEL1.EnumDirNext
|
||
*--------------------------------------
|
||
SEL1.CloseDir jsr MLI close directory file
|
||
.DA #MLI.CLOSE
|
||
.DA SEL1.CloseP
|
||
|
||
jsr ROM.SETTXT use full screen for windows
|
||
jsr ROM.HOME
|
||
|
||
lda #$17 cursor at bottom of screen.
|
||
jsr ROM.TABV set vertical position.
|
||
|
||
ldy #SEL1.RetIcon-SEL1.Strings
|
||
jsr SEL1.IconOutY
|
||
|
||
ldy #SEL1.Footer-SEL1.Strings
|
||
jsr SEL1.MsgOutY
|
||
|
||
lda #$99
|
||
jsr ROM.COUT cursor to upper/left.
|
||
|
||
ldx #$00
|
||
ldy SEL1.PathBuf
|
||
|
||
.1 lda SEL1.PathBuf+1,x
|
||
|
||
jsr SEL1.COut
|
||
inx
|
||
dey
|
||
bne .1
|
||
|
||
.2 stz SelectedIndex
|
||
stz ScrollIndex init top filename index.
|
||
ldx filecount # of valid files.
|
||
beq SEL1.KeyLoop if no files.
|
||
|
||
cpx #21 more than what will fit on screen ?
|
||
bcc .3 no.
|
||
|
||
ldx #20 limit to 20 files on the screen.
|
||
|
||
.3 lda #2 set window dimensions
|
||
sta ZP.WNDTOP
|
||
|
||
lda #22
|
||
sta ZP.WNDBOT
|
||
|
||
.4 phx
|
||
|
||
jsr SEL1.PrintFN
|
||
inc SelectedIndex
|
||
|
||
plx
|
||
dex
|
||
bne .4
|
||
|
||
stz SelectedIndex
|
||
beq L5EAA if last file, it needs to be inverse.
|
||
*--------------------------------------
|
||
SEL1.Up jsr SEL1.PrintFN print old name in normal.
|
||
ldx SelectedIndex
|
||
beq L5EAA if already at the top name
|
||
|
||
dec SelectedIndex
|
||
lda ZP.CV current cursor line.
|
||
cmp #2 at top line of window ?
|
||
bne L5EAA no, move up normally.
|
||
|
||
dec ScrollIndex fix offset index
|
||
lda #22 else sroll windows down a line.
|
||
bne SEL1.Scroll branch always.
|
||
*--------------------------------------
|
||
SEL1.Down jsr SEL1.PrintFN print old name in normal.
|
||
ldx SelectedIndex
|
||
inx add one.
|
||
cpx filecount
|
||
bcs L5EAA if already at last filename
|
||
|
||
stx SelectedIndex
|
||
lda ZP.CV current cursor line.
|
||
cmp #21 at bottom line of window ?
|
||
bne L5EAA no, move cursor normally.
|
||
|
||
inc ScrollIndex update offset index
|
||
lda #23 else scroll up a line.
|
||
|
||
SEL1.Scroll jsr ROM.COUT
|
||
|
||
L5EAA jsr SEL1.PrintFNInv output last filename.
|
||
*--------------------------------------
|
||
SEL1.KeyLoop lda IO.KBD get keyboard input.
|
||
bpl SEL1.KeyLoop loop until key pressed.
|
||
|
||
sta IO.KBDSTROBE clear strobe.
|
||
|
||
ldx filecount are any files displayed ?
|
||
beq .1 no, don't accept arrow keys or return.
|
||
|
||
cmp #$8D return ?
|
||
beq SEL1.CR then run selected file.
|
||
|
||
cmp #$8A down ?
|
||
beq SEL1.Down
|
||
|
||
cmp #$8B up ?
|
||
beq SEL1.Up
|
||
|
||
.1 cmp #$89 tab ?
|
||
beq L5EED new volume.
|
||
|
||
cmp #$9B esc ?
|
||
bne SEL1.KeyLoop no, try again else pop up a directory.
|
||
|
||
jsr SEL1.FullPath.. CD ..
|
||
jmp SEL1.OpenDir
|
||
*--------------------------------------
|
||
L5EED jmp SEL1.NextVol set up new unit number.
|
||
*--------------------------------------
|
||
SEL1.CR ldy SelectedIndex
|
||
lda SEL1.filetypes,y get file type.
|
||
|
||
jsr SEL1.CheckType
|
||
bmi SEL1.KeyLoop
|
||
|
||
cmp #S.FI.T.DIR
|
||
bne .1
|
||
|
||
jsr SEL1.SetFullPath
|
||
bcs L5EED
|
||
|
||
jmp SEL1.OpenDir1
|
||
|
||
.1 cmp #S.FI.T.SYS
|
||
beq .3
|
||
|
||
lda SEL1.BSPathBuf
|
||
beq SEL1.KeyLoop
|
||
|
||
lda #SEL1.BSPathBuf
|
||
sta SEL1.OpenP+1 open & read BASIC.SYSTEM
|
||
|
||
.3 jsr SEL1.SetFullPath
|
||
bcs L5EED
|
||
|
||
jsr MLI open file
|
||
.DA #MLI.OPEN
|
||
.DA SEL1.OpenP
|
||
bcs L5EED
|
||
|
||
lda #$20
|
||
sta SEL1.ReadP+3 read at $2000
|
||
|
||
lda #$9f
|
||
sta SEL1.ReadP+5 max $9F00
|
||
|
||
jsr MLI
|
||
.DA #MLI.READ
|
||
.DA SEL1.ReadP
|
||
php save possible error.
|
||
jsr MLI close file. ignore any error from close
|
||
.DA #MLI.CLOSE
|
||
.DA SEL1.CloseP
|
||
plp restore status from read.
|
||
bcs L5EED if any errors.
|
||
|
||
bit SEL1.OpenP+1
|
||
bvc .8
|
||
|
||
ldx SEL1.PathBuf
|
||
|
||
.7 lda SEL1.PathBuf,x
|
||
sta $2006,x
|
||
dex
|
||
bpl .7
|
||
|
||
.8 jsr ROM.SETTXT reset to full window.
|
||
jsr ROM.HOME makes for no flash.
|
||
lda #$95 ctrl-u
|
||
jsr ROM.COUT turn off 80 columns.
|
||
|
||
jmp $2000 execute selected system file.
|
||
*--------------------------------------
|
||
SEL1.PrintFN lda #$0E
|
||
.HS 2C BIT ABS
|
||
SEL1.PrintFNInv lda #$0F
|
||
pha
|
||
|
||
ldx SelectedIndex
|
||
txa
|
||
sec
|
||
sbc ScrollIndex calculate line # to display name
|
||
inc
|
||
inc
|
||
jsr ROM.TABV set vertical position.
|
||
|
||
lda #$01
|
||
sta ROM.OURCH
|
||
|
||
lda SEL1.filetypes,x get filetype (x is unchanged by ROM.TABV).
|
||
jsr SEL1.CheckType
|
||
bmi .1
|
||
|
||
lda SEL1.ValidIcons,y
|
||
tay
|
||
jsr SEL1.IconOutY
|
||
|
||
.1 jsr SEL1.SetFNPtrX calc name location.
|
||
|
||
lda #$05
|
||
sta ROM.OURCH
|
||
|
||
pla normal / inverse
|
||
jsr ROM.COUT
|
||
|
||
jsr SEL1.SPOut output a space.
|
||
|
||
ldy #0
|
||
|
||
.2 iny
|
||
lda (FilenamePtr),y get name character.
|
||
jsr SEL1.COut put on screen.
|
||
tya
|
||
cmp (FilenamePtr) end of name ?
|
||
bcc .2 no.
|
||
|
||
*.3 jsr SEL1.SPOut
|
||
* iny
|
||
* cpy #16
|
||
* bne .3
|
||
|
||
jsr SEL1.SPOut
|
||
jmp ROM.SETNORM set normal text mode.
|
||
*--------------------------------------
|
||
SEL1.SetFullPath
|
||
jsr MLI
|
||
.DA #MLI.SETPREFIX
|
||
.DA SEL1.SetPrefixP
|
||
bcs .9
|
||
|
||
ldx SelectedIndex
|
||
jsr SEL1.SetFNPtrX
|
||
|
||
ldx SEL1.PathBuf get prefix length.
|
||
ldy #0
|
||
|
||
.1 iny start at y = 1.
|
||
lda (FilenamePtr),y get character of name.
|
||
inx
|
||
sta SEL1.PathBuf,x store in prefix buffer.
|
||
tya
|
||
eor (FilenamePtr) check length of name.
|
||
bne .1 loop until all transferred.
|
||
|
||
stx SEL1.PathBuf put prefix length into buffer.
|
||
|
||
inc bInSubDir
|
||
|
||
* clc
|
||
|
||
.9 rts
|
||
*--------------------------------------
|
||
SEL1.FullPath.. ldx SEL1.PathBuf
|
||
|
||
.1 dex
|
||
lda SEL1.PathBuf,x
|
||
cmp #'/'
|
||
bne .1
|
||
|
||
cpx #$01
|
||
bne .9
|
||
|
||
ldx SEL1.PathBuf
|
||
|
||
.9 dec bInSubDir
|
||
|
||
rts
|
||
*--------------------------------------
|
||
SEL1.SetFNPtr ldx filecount
|
||
|
||
SEL1.SetFNPtrX lda /SEL1.Filenames/16
|
||
sta FilenamePtr+1
|
||
txa
|
||
|
||
ldx #4
|
||
|
||
.1 asl
|
||
rol FilenamePtr+1
|
||
dex
|
||
bne .1
|
||
|
||
sta FilenamePtr
|
||
tay
|
||
lda FilenamePtr+1
|
||
|
||
rts
|
||
*--------------------------------------
|
||
SEL1.CheckType ldy #SEL1.ValidTypes.L-1
|
||
|
||
.1 cmp SEL1.ValidTypes,y
|
||
beq .8
|
||
|
||
dey
|
||
bpl .1
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
SEL1.IconOutY phx
|
||
|
||
ldx #0
|
||
|
||
.1 lda SEL1.MouseText,x
|
||
|
||
jsr ROM.COUT
|
||
inx
|
||
cpx #2
|
||
bne .2
|
||
|
||
jsr SEL1.MsgOutY
|
||
|
||
.2 cpx #4
|
||
bcc .1
|
||
|
||
plx
|
||
rts
|
||
*--------------------------------------
|
||
SEL1.MsgOutY lda SEL1.Strings,y
|
||
php
|
||
jsr SEL1.COut
|
||
iny
|
||
plp
|
||
bpl SEL1.MsgOutY
|
||
|
||
.8 rts
|
||
*--------------------------------------
|
||
SEL1.SPOut lda #' ' SPACE
|
||
|
||
SEL1.COut ora #$80 set high bit.
|
||
jmp ROM.COUT output to screen.
|
||
*--------------------------------------
|
||
* data area
|
||
*--------------------------------------
|
||
SEL1.BS .AS "BASIC.SYSTEM"
|
||
SEL1.BS.L .EQ *-SEL1.BS
|
||
*--------------------------------------
|
||
SEL1.ValidTypes .DA #S.FI.T.DIR
|
||
.DA #S.FI.T.SYS
|
||
.DA #S.FI.T.BIN
|
||
.DA #S.FI.T.BAS
|
||
SEL1.ValidTypes.L .EQ *-SEL1.ValidTypes
|
||
*--------------------------------------
|
||
SEL1.ValidIcons .DA #SEL1.DirIcon-SEL1.Strings
|
||
.DA #SEL1.SysIcon-SEL1.Strings
|
||
.DA #SEL1.BinIcon-SEL1.Strings
|
||
.DA #SEL1.BasIcon-SEL1.Strings
|
||
*--------------------------------------
|
||
SEL1.MouseText .HS 0F1B
|
||
.HS 180E
|
||
*--------------------------------------
|
||
SEL1.Strings
|
||
*--------------------------------------
|
||
SEL1.Footer .AT ":Select,TAB:Chg Vol,ESC:Back"
|
||
SEL1.DirIcon .AT "XY" "XYI"
|
||
SEL1.SysIcon .AT "Z\^_"
|
||
SEL1.BinIcon .AT "Z\\_"
|
||
SEL1.BasIcon .AT "ZVW_"
|
||
SEL1.RetIcon .AT "M"
|
||
*--------------------------------------
|
||
SEL1.OpenP .DA #3 Param Count
|
||
.DA SEL1.PathBuf pathname
|
||
.DA SEL1.FileBuf file buffer
|
||
.HS 01 reference number
|
||
*--------------------------------------
|
||
SEL1.CloseP .DA #1 Param Count
|
||
.HS 01 reference number
|
||
*--------------------------------------
|
||
SEL1.OnLineP .DA #2 Param Count
|
||
.HS 60 unit number, default = s6, d1
|
||
.DA SEL1.PathBuf+1 data buffer
|
||
*--------------------------------------
|
||
SEL1.SetPrefixP .DA #1 Param Count
|
||
.DA SEL1.PathBuf pathname
|
||
*--------------------------------------
|
||
SEL1.ReadP .DA #4 Param Count
|
||
.HS 01 reference number
|
||
*--------------------------------------
|
||
.EP
|
||
*--------------------------------------
|
||
* .LIST ON
|
||
SEL1.LEN .EQ *-SEL1.START
|
||
.LIST OFF
|
||
*--------------------------------------
|
||
.DUMMY
|
||
.BS 2 MemPtr
|
||
.BS 2 requested length
|
||
.BS 2 read length
|
||
.ED
|
||
*--------------------------------------
|
||
MAN
|
||
SAVE usr/src/prodos.fx/prodos.s.sel1
|
||
LOAD usr/src/prodos.fx/prodos.s
|
||
ASM
|