A2osX/ProDOS.FX/ProDOS.S.SEL1.txt
2023-11-04 15:42:28 +01:00

550 lines
12 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.

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