mirror of
https://github.com/A2osX/A2osX.git
synced 2024-12-02 05:49:24 +00:00
432 lines
18 KiB
Plaintext
432 lines
18 KiB
Plaintext
NEW
|
||
AUTO 3,1
|
||
* object code = sel_1
|
||
* Bird's Better Bye at org = dispadr
|
||
|
||
ofsB .EQ birdbye-dispadr offset to Bird's Bye org
|
||
|
||
birdbye cld
|
||
lda romin read ROM
|
||
stz softev
|
||
lda #>dispadr set reset vector to 'dispadr'
|
||
sta softev+1
|
||
jsr setpwrc create power-up byte
|
||
lda #$A0
|
||
jsr init80 initialize 80 column text card
|
||
ldx #$17
|
||
|
||
* set up memory bitmap in global page
|
||
|
||
L5D16 stz memmap,x P8 memory bitmap
|
||
dex
|
||
bpl L5D16
|
||
inc memmap+$17 protect global page
|
||
lda #$CF protect zero page, stack and page 1
|
||
sta memmap
|
||
lda #$02
|
||
sta smparms init set mark parms pcount.
|
||
|
||
* drive selector
|
||
|
||
ldx numdevs get device count and
|
||
stx lstpntr store in zero page.
|
||
lda devnum get last slot/drive
|
||
bne volname
|
||
ds2 .EQ *-ofsB
|
||
L5D32 ldx lstpntr get device list pointer.
|
||
lda devlist,x get unit number from list.
|
||
cpx #$01 make sure it's real.
|
||
bcs L5D3F if so, change list pointer.
|
||
ldx numdevs get device count.
|
||
inx
|
||
L5D3F dex decrement list pointer and restore.
|
||
stx lstpntr
|
||
|
||
* get and store volume name
|
||
|
||
volname sta ol_unit store unit number for online.
|
||
jsr MLI
|
||
dc i1'$C5' online call
|
||
dc i2'ol_parms'
|
||
bcs L5D32 error check.
|
||
stz dlevel haven't read root directory yet.
|
||
lda PrefixBuf+1 load description byte.
|
||
and #$0F mask for name length.
|
||
beq L5D32 if 0, then try next unit.
|
||
adc #$02 add 2 to length.
|
||
tax name length in x.
|
||
vnam1 .EQ *-ofsB
|
||
stx PrefixBuf save the name length
|
||
lda #$2F '/'
|
||
sta PrefixBuf+1 slash before and
|
||
sta PrefixBuf,x after name.
|
||
stz PrefixBuf+1,x null after complete name.
|
||
|
||
* open and read directory
|
||
|
||
jsr MLI
|
||
dc i1'$C8' open
|
||
dc i2'op_parms'
|
||
bcc L5D7F good open.
|
||
lda dlevel trying to open root directory ?
|
||
beq L5D32 yes, just move to next volume.
|
||
jsr bell1 no, generate bell tone
|
||
jsr popdir and stay at same level.
|
||
stx PrefixBuf
|
||
jmp keyloop
|
||
L5D7F inc dlevel
|
||
stz filecount zero file count.
|
||
lda op_refn get file reference number
|
||
sta rd_refn store in read
|
||
sta sm_refn and setmark parm lists.
|
||
lda #$2B set read parm list for
|
||
sta dhdr_len directory header length.
|
||
stz dhdr_len+1
|
||
jsr doread read directory
|
||
bcs L5DB3
|
||
ldx #$03
|
||
L5D9A lda sysentry+$23,x copy directory info
|
||
sta entlen,x to zero page.
|
||
dex
|
||
bpl L5D9A
|
||
sta dhdr_len put entry length in read parm list.
|
||
lda #$01 set block file counter to 1.
|
||
sta blkfl
|
||
stz fpos_mid zero out msb's of file position
|
||
stz fpos_hi in setmark parm list.
|
||
lda filecnt any files in directory ?
|
||
ora filecnt+1
|
||
bne L5DB5 if so, continue
|
||
L5DB3 bra L5E29 else go close directory file.
|
||
L5DB5 bit filecnt+1 check msb of file count.
|
||
bmi L5DB3 if set then done.
|
||
L5DB9 lda fpos_mid get mid byte of setmark file position.
|
||
and #$FE reset lsb
|
||
sta fpos_mid and save.
|
||
ldy blkfl block file counter
|
||
lda #$00
|
||
cpy entblk have we read all entries in this block ?
|
||
bcc L5DCE if not, continue.
|
||
tay if so, zero y-reg and
|
||
sty blkfl reset block counter / flag
|
||
inc fpos_mid
|
||
|
||
* set up setmark parameters for next file to be read.
|
||
* if transfer to second sector, handle it.
|
||
|
||
L5DCC inc fpos_mid
|
||
L5DCE dey decrement file block counter
|
||
clc
|
||
bmi L5DD8
|
||
adc entlen add entry length to acc.
|
||
bcc L5DCE determine if we flopped into 2nd half of
|
||
bcs L5DCC block, if so inc mid byte position.
|
||
L5DD8 adc #$04 add 4 and put in
|
||
sta fpos_lo low byte of setmark.
|
||
jsr MLI call mli
|
||
dc i1'$CE' set mark
|
||
dc i1'smparms' parameters address = $0060
|
||
dc h'00'
|
||
bcs L5DB3 error
|
||
jsr doread
|
||
bcs L5DB3 error.
|
||
inc blkfl increase count of files read.
|
||
lda sysentry file type/length.
|
||
and #$F0 mask off high nibble.
|
||
beq L5DB9 deleted file, try next one.
|
||
dec filecnt decrement low file count.
|
||
bne L5DF8
|
||
dec filecnt+1 and high if necessary.
|
||
L5DF8 ror sysentry+$1E check access bit.
|
||
bcc L5DB5 if no read, try next file.
|
||
lda sysentry+$10 get file type.
|
||
cmp #$0F directory file ?
|
||
beq L5E08 then continue.
|
||
cmp #$FF system file ?
|
||
bne L5DB5 no, read next file.
|
||
L5E08 ldx filecount get valid files read.
|
||
cpx #$80 if greater than size of filename buffer
|
||
bcs L5E29 then close directory
|
||
sta filetyps,x else store filetype in zero page
|
||
jsr namecalc and go set up storage area.
|
||
ldy #$0F
|
||
L5E15 lda sysentry,y get byte of filename
|
||
sta (fnstore),y store in directed area
|
||
dey
|
||
bpl L5E15
|
||
iny y = 0
|
||
and #$0F mask off low nibble (name length)
|
||
sta (fnstore),y restore in name buffer
|
||
inc filecount increment valid file counter
|
||
bne L5DB5 get next file (branch always)
|
||
L5E26 jmp ds2 error. try next unit.
|
||
L5E29 jsr MLI close directory file
|
||
dc i1'$CC'
|
||
dc i2'cl_parms'
|
||
bcs L5E26 error.
|
||
jsr settxt use full screen for windows
|
||
jsr home
|
||
lda #$17 cursor at bottom of screen.
|
||
jsr tabv set vertical position.
|
||
ldy #$00
|
||
lda #$14 horizontal position.
|
||
jsr sethorz print message.
|
||
jsr homecurs cursor to upper/left.
|
||
ldx #$00
|
||
L5E48 lda PrefixBuf+1,x
|
||
beq showfiles
|
||
jsr output
|
||
inx
|
||
bne L5E48
|
||
showfiles stz valcnt
|
||
stz topname init top filename index.
|
||
lda filecount # of valid files.
|
||
beq L5EB0 if no files.
|
||
cmp #$15 more than what will fit on screen ?
|
||
bcc L5E61 no.
|
||
lda #$14 limit to 20 files on the screen.
|
||
L5E61 sta gp_cnt
|
||
lda #$02 set window dimensions
|
||
sta wndtop
|
||
sta wndlft
|
||
lda #$16
|
||
sta wndwdth
|
||
sta wndbtm
|
||
L5E6F jsr nameprnt output filename to screen
|
||
inc valcnt
|
||
dec gp_cnt file counter.
|
||
bne L5E6F continue printing names.
|
||
stz valcnt
|
||
beq L5EAA if last file, it needs to be inverse.
|
||
uparrow jsr nameprnt print old name in normal.
|
||
ldx valcnt get old name number.
|
||
beq L5EAA if already at the top name
|
||
dec valcnt else fix index.
|
||
lda cv current cursor line.
|
||
cmp #$02 at top line of window ?
|
||
bne L5EAA no, move up normally.
|
||
dec topname fix offset index
|
||
lda #$16 else sroll windows down a line.
|
||
bne L5EA7 branch always.
|
||
dnarrow jsr nameprnt print old name in normal.
|
||
ldx valcnt get old name number.
|
||
inx add one.
|
||
cpx filecount
|
||
bcs L5EAA if already at last filename
|
||
stx valcnt else update index.
|
||
lda cv current cursor line.
|
||
cmp #$15 at bottom line of window ?
|
||
bne L5EAA no, move cursor normally.
|
||
inc topname update offset index
|
||
lda #$17 else scroll up a line.
|
||
L5EA7 jsr cout
|
||
L5EAA jsr setinv set inverse text mode.
|
||
jsr nameprnt output last filename.
|
||
keyloop .EQ *-ofsB
|
||
L5EB0 lda kbd get keyboard input.
|
||
bpl L5EB0 loop until key pressed.
|
||
sta kbdstrobe clear strobe.
|
||
jsr setnorm set normal text mode.
|
||
ldx filecount are any files displayed ?
|
||
beq L5ECB no, don't accept arrow keys or return.
|
||
cmp #$8D return ?
|
||
beq L5EF4 then run selected file.
|
||
cmp #$8A down ?
|
||
beq dnarrow move down a name.
|
||
cmp #$8B up ?
|
||
beq uparrow move up a name.
|
||
L5ECB cmp #$89 tab ?
|
||
beq L5EED new volume.
|
||
cmp #$9B esc ?
|
||
bne L5EB0 no, try again else pop up a directory.
|
||
|
||
* pop a directory level
|
||
|
||
jsr popdir
|
||
dec dlevel
|
||
bra L5EF1
|
||
popdir .EQ *-ofsB
|
||
ldx PrefixBuf
|
||
L5EDD dex
|
||
lda PrefixBuf,x
|
||
cmp #$2F slash
|
||
bne L5EDD
|
||
cpx #$01
|
||
bne L5EEC
|
||
ldx PrefixBuf
|
||
L5EEC rts
|
||
L5EED jmp ds2 set up new unit number.
|
||
L5EF0 inx
|
||
L5EF1 jmp vnam1 get new directory info.
|
||
|
||
* run selected file
|
||
|
||
L5EF4 jsr MLI set prefix
|
||
dc i1'$C6'
|
||
dc i2'pf_parms'
|
||
bcs L5EED error.
|
||
ldx valcnt get name number.
|
||
jsr namecalc set up name storage area (on return y=0)
|
||
ldx PrefixBuf get prefix length.
|
||
L5F04 iny start at y = 1.
|
||
lda (fnstore),y get character of name.
|
||
inx
|
||
sta PrefixBuf,x store in prefix buffer.
|
||
cpy namelen check length of name.
|
||
bcc L5F04 loop until all transferred.
|
||
stx PrefixBuf put prefix length into buffer.
|
||
ldy valcnt get file number.
|
||
lda |filetyps,y get file type.
|
||
bpl L5EF0 branch if directory.
|
||
jsr settxt reset to full window.
|
||
jsr home makes for no flash.
|
||
lda #$95 ctrl-u
|
||
jsr cout turn off 80 columns.
|
||
jsr MLI open file
|
||
dc i1'$C8'
|
||
dc i2'op_parms'
|
||
bcs L5EED if error.
|
||
lda op_refn move reference number
|
||
sta rd_refn for read.
|
||
lda #$FF read the entire file.
|
||
sta dhdr_len
|
||
sta dhdr_len+1
|
||
jsr doread read selected file.
|
||
php save possible error.
|
||
jsr MLI close file. ignore any error from close
|
||
dc i1'$CC'
|
||
dc i2'cl_parms'
|
||
plp restore status from read.
|
||
bcs L5EED if any errors.
|
||
jmp sysentry execute selected system file.
|
||
|
||
* output messages. on entry: acc = horizontal position,
|
||
* y = index to message teminated by 0.
|
||
|
||
sethorz .EQ *-ofsB
|
||
sta ch
|
||
msgout .EQ *-ofsB
|
||
L5F4C lda dsp2msg,y
|
||
beq L5F57
|
||
jsr cout
|
||
iny
|
||
bne L5F4C
|
||
L5F57 rts
|
||
|
||
* name pointer calculator for name storage area
|
||
|
||
namecalc .EQ *-ofsB
|
||
stz fnstore+1 init high byte of 16-bit shift
|
||
txa
|
||
asl a shift to high nibble
|
||
rol fnstore+1
|
||
asl a
|
||
rol fnstore+1
|
||
asl a
|
||
rol fnstore+1
|
||
asl a
|
||
rol fnstore+1
|
||
sta fnstore low pointer
|
||
lda #>iobuf
|
||
clc
|
||
adc fnstore+1
|
||
sta fnstore+1
|
||
ldy #$00
|
||
lda (fnstore),y file name length
|
||
sta namelen
|
||
rts
|
||
|
||
* output a filename line
|
||
|
||
nameprnt .EQ *-ofsB
|
||
lda #$02
|
||
sta ch80col horizontal position = 2.
|
||
ldx valcnt filename number
|
||
txa
|
||
sec
|
||
sbc topname calculate line # to display name
|
||
inc a
|
||
inc a
|
||
jsr tabv set vertical position.
|
||
lda filetyps,x get filetype (x is unchanged by tabv).
|
||
bmi L5F99 branch if system file.
|
||
stz ch80col adjust cursor position.
|
||
lda invflg save current inverse setting
|
||
pha
|
||
ldy #<fldrmsg-dsp2msg
|
||
jsr msgout display the folder.
|
||
pla restore inverse setting.
|
||
sta invflg
|
||
L5F99 jsr outsp output a space.
|
||
jsr namecalc calc name location.
|
||
L5F9F iny y = 1 (first time).
|
||
lda (fnstore),y get name character.
|
||
jsr output put on screen.
|
||
cpy namelen end of name ?
|
||
bcc L5F9F no.
|
||
outsp .EQ *-ofsB output a space.
|
||
lda #$A0
|
||
bne L5FB1 branch always.
|
||
homecurs .EQ *-ofsB screen control - home cursor
|
||
lda #$99
|
||
output .EQ *-ofsB
|
||
ora #$80 set high bit.
|
||
L5FB1 jmp cout output to screen.
|
||
doread .EQ *-ofsB
|
||
jsr MLI mli read call
|
||
dc i1'$CA'
|
||
dc i2'rd_parms'
|
||
rts
|
||
|
||
* data area
|
||
|
||
dsp2msg .EQ *-ofsB
|
||
dc c'RETURN: Select | TAB: Chg Vol | '
|
||
dc c'ESC: Back'
|
||
dc i1'$00'
|
||
fldrmsg .EQ *-ofsB
|
||
dc h'0F' inverse control code
|
||
dc h'1B' enable mousetext
|
||
dc c'XY' folder characters
|
||
dc h'18' disable mousetext
|
||
dc h'0E' normal control code
|
||
dc h'00'
|
||
op_parms .EQ *-ofsB open parameters
|
||
dc h'03' 3 parms
|
||
dc i2'PrefixBuf' pathname
|
||
dc i2'op_buf' file buffer
|
||
op_refn .EQ *-ofsB
|
||
dc h'00' reference number
|
||
cl_parms .EQ *-ofsB close parameters
|
||
dc h'01' 1 parm
|
||
dc h'00' reference number.
|
||
ol_parms .EQ *-ofsB online parameters
|
||
dc h'02' 2 parms
|
||
ol_unit .EQ *-ofsB
|
||
dc h'60' unit number, default = s6, d1
|
||
dc i2'PrefixBuf+1' data buffer
|
||
pf_parms .EQ *-ofsB set prefix parameters
|
||
dc h'01' one parm
|
||
dc i2'PrefixBuf' pathname
|
||
rd_parms .EQ *-ofsB read parameters
|
||
dc h'04' 4 parms
|
||
rd_refn .EQ *-ofsB
|
||
dc h'01' reference number
|
||
dc i2'sysentry' data buffer
|
||
|
||
* these last 2 parms (4 bytes) may extend past $300 length limit since
|
||
* the request count is set prior to using the parm block and the transfer
|
||
* count isn't used at all (except by prodos)
|
||
* dc h'0000' requested length
|
||
* dc h'0000' actual length
|
||
|
||
dhdr_len .EQ *-ofsB directory header length
|
||
dc h'00' (actually uses 2 bytes)
|
||
|
||
* end of obj sel_1
|
||
*--------------------------------------
|
||
MAN
|
||
LOAD USR/SRC/PRODOS/PRODOS.S.SEL1
|
||
SAVE USR/SRC/PRODOS/PRODOS.S
|
||
ASM
|