; --------- basic 4 zeropage ------------------------------------------
CURCOL = $c6 ; cursor column (0-39 / 0-79)
CUROW = $d8 ; cursor row (0-24)
CR = $0D ; CARRIAGE RETURN
DN = $d4 ; device number
FNADR = $da ; ptr $da,$db to filename
FNLEN = $d1 ; filename's length
LF = $d2 ; logical file number
LVFLAG = $9d ; LOAD/VERIFY flag
SA = $d3 ; secondary address
STATUS = $96 ; status ST
CHRGET = $70 ; subroutine: get next byte of BASIC text
CHRGOT = $76 ; entry to get same byte of text again
TXTPTR = $77 ; $77/$78 pointer to next CHRGET byte
MEMUSS = $fd ; $7d/$fe tape load temps
; --------- basic 4 subroutines ------------------------------------------
SETCUR = $e067 ; set cursor (ofs col:$c6, row:$d8)
SCROUT = $e202 ; output A to screen
ACPTR = $f1c0 ; input IEEE -> A
CHKIN = $ffc6 ; stdin from logical file # in X
CIOUT = $f19e ; output A -> IEEE
CKOUT = $ffc9 ; stdout to logical file # in X
CLOSE = $f2e0 ; close file
CLRCH = $ffcc ; reset stdio to defaults
LISTN = $f0d5 ; send LISTEN
LOAD = $f408 ; LOAD
LOADOP = $f356 ; LOAD without pointer change
OPEN = $f563 ; open file
OPENI = $f4a5 ; open file on IEEE device
SCNT = $f2c1 ; prepare SETT for logical file A
SECND = $f143 ; send secondary address A
SETT = $f2cd ; set LF,DN,SA from table
TALK = $f0d2 ; send TALK
TWAIT = $f92b ;
UNLSN = $f1b9 ; send UNLISTEN
UNTLK = $f1ae ; send UNTALK
READY = $b3ff ; basic warm start
CLRSCR = $e015 ; clear screen
INTOUT = $cf83 ; write integer 0-65535 X=LSB,A=MSB
CRLF = $d534 ; move cursor to next line
; --------- kernel subroutines ------------------------------------------
BASIN = $ffcf ; read char from input channel -> A
BSOUT = $ffd2 ; Write A to stdout
GETIN = $ffe4 ; read char from keyboard buffer -> A
;----------------------------------------------------------------------------
firstline = $0a
lastline = $0b
s_lo = $fb
s_hi = $fc
linelenght = $fe
get = $ffe4
!to "dir.prg",cbm
*=$1000
;----------------------------------------------------------------------------
; DIRECTORY
;----------------------------------------------------------------------------
jsr CLRSCR
jsr build_title
lda #$01
sta FNLEN
lda #$08
sta DN
lda #$00
sta menuline
sta menupage
sta lines
sta STATUS
sta $da ; FNADR = $da; ptr $da,$db to filename
lda #$12
sta $db
lda #$60 ;DATA SA 0
sta SA
jsr OPENI ; open file
jsr TALK
lda SA
jsr SECND
lda #$03
sta CUROW
jsr SETCUR
ldy #3
list_blocks:
- sty FNLEN
jsr ACPTR
sta MEMUSS ; store blocks LSB
ldy STATUS
bne +
jsr ACPTR
sta MEMUSS + 1 ; store blocks MSB
ldy STATUS
bne +
ldy FNLEN
dey
bne -
ldx MEMUSS
lda MEMUSS + 1
jsr INTOUT ; write #blocks to screen
lda #' '
listing:
jsr SCROUT
getbyte: jsr ACPTR ; read byte from IEEE
ldx STATUS
+ bne stoplisting
cmp #0
beq newline
jsr SCROUT ; write filename and type
bne getbyte ; then continue
newline: lda #CR
jsr SCROUT
inc ofset
inc lines
lda lines
cmp #$14
beq nextpage
jsr GETIN
cmp #27
beq stoplisting
ldy #$02
- bne list_blocks
nextpage:
jsr GETIN
cmp #'S'
beq lightbar
cmp #27
beq stoplisting
cmp #$20
bne nextpage
jsr CLRSCR
lda #$00
sta lines
jsr build_title
lda #$03
sta CUROW
jsr SETCUR
ldy #$02
bne -
stoplisting: jsr $f72f ; close file with $E0, unlisten
jsr CRLF
pla
pla
jmp READY ; BASIC warm start
build_title:
ldy #00
- lda title,y
sta $8000,y
iny
cpy #$50
bne -
rts
; lightbar setup
lightbar:
lda #$80 ; ofs first line
sta s_hi
lda #$f0
sta s_lo
lda #$1d ; lenght of the line
sta linelenght
lda #$00 ; first line (+ofs)
sta firstline
lda lines
sta lastline
dec lastline
; build inverted highlighting at second line
;
jsr j0
; move by keyboard
main:
jsr get
cmp #27 ; esc-key
beq +
cmp #$11 ; cursor down
beq move_down
cmp #$91 ; cursor up
beq move_up
jmp main
+ ldy #$00
- lda (s_lo),y
and #%01111111
sta (s_lo),y
iny
cpy linelenght
bne -
lda #00
sta menuline
jmp nextpage
; move-routines
move_down:
lda menuline
cmp lastline
bne +
jmp main
+ inc menuline
clc
ldy #$00
- lda (s_lo),y
and #%01111111
sta (s_lo),y
iny
bcc +
inc s_hi
+ cpy linelenght
bne -
lda s_lo
clc
adc #$50
sta s_lo
bcc j0
inc s_hi
j0: clc
ldy #$00
- lda (s_lo),y
ora #%10000000
sta (s_lo),y
iny
bcc +
inc s_hi
+ cpy linelenght
bne -
jmp main
move_up:
lda menuline
cmp firstline
bne +
jmp main
+ dec menuline
clc
ldy #$00
- lda (s_lo),y
and #%01111111
sta (s_lo),y
iny
bcc +
inc s_hi
+ cpy linelenght
bne -
lda s_lo
sec
sbc #$50
sta s_lo
bcs +
dec s_hi
+ bne j0
jmp main
*=$1200
!TX "$"
lines: !by $00
menuline !by $00
ofset !by $00
title: !scr"*** cbm 8000 tiny directory explorer *** "
Letzte Änderung: 2019-01-04 09:54:18