; --------- 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