home *** CD-ROM | disk | FTP | other *** search
/ Transactor / Transactor_24_1988_Transactor_Publishing.d64 / sd4.bud < prev    next >
Text File  |  2023-02-26  |  22KB  |  1,047 lines

  1. ;**************************************
  2. ;*                sdir                *
  3. ;*                                    * 
  4. ;*         universal scrolling        *
  5. ;*          directory reader          *
  6. ;*           for c-128 and            *
  7. ;*         1541, 1571 or 1581         *
  8. ;*                                    *
  9. ;*               ver 4.0              *      
  10. ;*                                    *
  11. ;*       <c> 1987 m. garamszeghy      *
  12. ;*              87-09-01              *
  13. ;*                                    *
  14. ;**************************************
  15. ;
  16. ;--- boot entry = SYS 4864 ($1300)= init
  17. ;
  18. ;--- activate from basic by
  19. ;    sd "pattern",u<disk device#>,p<printer device#>,w<printer width>
  20. ;
  21. ;
  22. ;------------   zero page pointers
  23. ;
  24. p1 =$fa  
  25. p2 =$fc
  26. p3 =$fe
  27. ;
  28. ;------------  addresses
  29. ;
  30. bottom =$e4   ; screen windows
  31. top    =$e5
  32. left   =$e6
  33. right  =$e7
  34. ;
  35. flag80  =$00d7  ; screen width flag =40 or 80
  36. basbuf  =$0200  ; basic input buffer
  37. icrunch =$0304  ; crunch basic command line
  38. eof     =$1210  ; end of basic text pointer
  39. bashi   =$1212  ; top of basic pointer
  40. ocrunch =$430d  ; normal basic crunch vector
  41. ;
  42. ; --- work space storage
  43. ;
  44. dirent =$0d00  ; number of directory entries
  45. prn    =$0d02  ; printer device
  46. psec   =$0d03  ; printer secondary address
  47. width  =$0d04  ; printer width
  48. drive  =$0d05  ; disk drive device number
  49. ;
  50. scrollp =$0d06 ; scroll pointer
  51. dirp    =$0d07 ; directory pointer
  52. lastkey =$0d09 ; last key press
  53. ;
  54. ;
  55. dirbuf  =$c000   ; directory buffer 
  56. combuf  =$0c00   ; disk command and error buffer
  57. nambuf  =$0d60   ; disk name buffer
  58. pattern =$0d20   ; directory pattern
  59. frebuf  =$0db8   ; blocks free buffer             
  60. filbuf  =$0da0   ; files found buffer
  61. ;
  62. work1 =$0d10 ; temporary storage
  63. work2 =$0d12
  64. work3 =$0d14
  65. work4 =$0d16
  66. work5 =$0d18
  67. ;
  68. comlen =$0d0a   ; length of disk command
  69. errlen =$0d0b   ; length of error message
  70. stat   =$0d0c   ; error status flag
  71. len    =$0d0d   ; file name length
  72. ;
  73. mmu =$ff00   ; registers
  74. ;
  75. setlfs   =$ffba ; kernal routines
  76. setnam   =$ffbd
  77. open     =$ffc0
  78. close    =$ffc3
  79. closeall =$ffe7                
  80. chkin    =$ffc6
  81. chkout   =$ffc9
  82. clrchn   =$ffcc
  83. chrin    =$ffcf
  84. getin    =$ffe4
  85. chrout   =$ffd2
  86. status   =$ffb7
  87. write    =$ff7d
  88. plot     =$fff0
  89. stop     =$ffe1
  90. setbank  =$ff68
  91. kload    =$ffd5
  92. pfkey    =$ff65
  93. ;
  94. convfp   =$84c9 ; basic rom routines
  95. convasc  =$8e44
  96. ;
  97. ;
  98. ;
  99. ;
  100.    .org $1300     ; unused bank 0 ram
  101.    .obj "0:sd4"
  102.    .fast
  103.     jmp init      ; bypass defaults
  104. ;
  105. ; default system values
  106. ;
  107. unit    =*
  108.      .byt 8           ; default disk drive device number
  109. prtr    =*
  110.      .byt 4           ; default device number for printer
  111. prtrsec =*
  112.      .byt 4           ; default printer sec address (CARDCO, transparent)
  113. cols    =*
  114.      .byt 96          ; default printer width in increments of 32
  115. compress =*
  116.      .byt 15          ; set compressed print       (values for EPSON printer)
  117. compoff  =*
  118.      .byt 18          ; turn off compressed print
  119. expand   =*
  120.      .byt 14          ; set expanded print
  121. exoff    =*
  122.      .byt 20          ; expanded off
  123. ;
  124. ;
  125. init =*     ; boot entry point
  126.      ldx #0           ; clear screen  
  127.      stx p1+2
  128.      jsr setwindow                  
  129.      jsr bootmessage  ; and greetings
  130.      lda #$cf         ; set top of basic to $bfff
  131.      sta bashi+1
  132.      lda #$ff
  133.      sta bashi
  134.      lda <sdir        ; set basic crunch pointer
  135.      sta icrunch      ; to point to custom routine
  136.      lda >sdir
  137.      sta icrunch+1
  138.      jsr write
  139.      .byt 13,13
  140.      .asc "syntax:  sd ":.byt 34:.asc "pattern":.byt 34:.asc ",u<device#>"
  141.      .byt 13,0
  142.      lda <key         ; redefine <f3> key
  143.      sta p1         
  144.      lda >key
  145.      sta p1+1
  146.      lda #p1
  147.      ldy #4
  148.      ldx #3
  149.      jmp pfkey        ; go back to basic
  150. ;
  151. key =*
  152.      .byt 13:.asc "sd":.byt 13   ; redefine f3
  153. ;
  154. bootmessage =*
  155.      jsr write
  156.      .asc "sdir 4.0  <c>1987 m. garamszeghy"
  157.      .byt 0
  158.      rts
  159. ;
  160. endsdir =*  ; exit routine and return to basic
  161.       lda #0
  162.       sta mmu
  163.       jsr closeall ; close all channels
  164. end2 =*
  165.       ldx #0        ; clear screen, reset window
  166.       jmp setwindow ; and bye
  167. ;
  168. pat =*
  169.     .asc "$0:"      ; default directory pattern
  170. ;
  171.    sdir =*          ; main entry point
  172.      lda basbuf     ; check for sdir command
  173.      cmp #"s"
  174.      bne notsdir    ; exit to normal basic crunch if no match
  175.      lda basbuf+1
  176.      cmp #"d"
  177.      beq letsgo     ; complete match
  178. ;
  179. notsdir =*          ; exit to main basic crunch routine
  180.      jmp ocrunch
  181. ;
  182. letsgo =*
  183.       lda #0        
  184.       sta mmu        ; make sure in bank 15
  185.       tay
  186. z1    sta dirent,y   ; clear all pointers
  187.       iny
  188.       bne z1
  189. ;
  190.       jsr clrchn     ; reset default i/o
  191.       jsr closeall
  192.       ldx #0
  193.       jsr setwindow  ; clear screen
  194.       ldx #3
  195.       jsr setwindow  ; title block
  196.       jsr bootmessage
  197.       ldx #1
  198.       jsr setwindow  ; data window
  199. ;
  200. ; -- set defaults
  201. ;
  202.       lda unit     ; default disk drive device #
  203.       sta drive                    
  204.       lda cols     ; # printer columns
  205.       sta width
  206.       lda prtr     ; printer device #
  207.       sta prn
  208.       lda prtrsec  ; printer secondary address
  209.       sta psec
  210. ;
  211.       ldy #0        ; default dir pattern
  212. -     lda pat,y   
  213.       sta pattern,y
  214.       iny          
  215.       cpy #3 
  216.       bne -        
  217.       dey            ; default pattern length
  218.       sty len
  219. ;
  220.       ldy #0         ; re-set index        
  221. z3    lda basbuf,y   ; parse rest of command buffer for parameters
  222.       bne +          ; end of command on 0
  223.       jmp nomatch
  224. +     cmp #34        ; check for quote
  225.       beq match 
  226.       cmp #"u"       ; check for "u"  
  227.       beq chkunit    ; get unit number
  228.       cmp #"p"       ; check for "p"
  229.       beq chkprn     ; get printer #
  230.       cmp #"w"       ; check for "w"
  231.       beq chkwid     ; get printer width
  232. ;
  233. nb =*
  234.       iny            ; next byte
  235.       bne z3         ; and try again
  236.       beq nomatch
  237. ;
  238. chkunit =*           ; check for unit number
  239.       jsr nparse     ; parse ascii string
  240.       bne z4         ; valid value
  241.       lda unit       ; else get default
  242. z4    sta drive
  243.       bne nb         ; go back for more
  244. ;
  245. chkprn =*            ; check for printer number
  246.       jsr nparse
  247.       bne z5
  248.       lda prtr      ; default
  249. z5    sta prn
  250.       bne nb
  251. ;
  252. chkwid =*            ; check printer column width
  253.       jsr nparse
  254.       and #7         ; mask lo bits
  255.       tax                            
  256.       lda widths,x   ; look in table
  257.       sta width      ; and save it    
  258.       jmp nb
  259. ;
  260. widths =*            ; width table
  261.       .byt 64, 64, 64, 96, 128, 160, 192, 64
  262. ;
  263. nparse =*            ; parse ascii number to hex digit
  264.       iny
  265.       lda basbuf,y   ; get next char
  266.       and #15        ; mask lo nibble
  267.       cmp #1   
  268.       bne eparse     ; single digit
  269.       iny
  270.       lda basbuf,y   ; second digit
  271.       and #3         ; isolate low 2 bits
  272.       clc
  273.       adc #10        ; make into teen
  274. eparse =*
  275.       rts            ; return
  276. ;
  277. match =*
  278.       ldx #0         ; reset filename pointer
  279. getnext =*
  280.       iny
  281.       lda basbuf,y    ; transfer match to pattern buffer
  282.       sta work3
  283.       beq eol         ; end of line
  284.       cmp #34         ; end of quote
  285.       beq eol
  286.       sta pattern+3,x
  287.       inx
  288.       bne getnext
  289. eol =*
  290.       cpx #0        ; check for valid pattern length
  291.       beq nomatch
  292.       inx           ; increase by 1
  293.       txa      
  294.       clc
  295.       adc len       ; new pattern length
  296.       sta len
  297.       lda work3
  298.       bne nb
  299. ;
  300. nomatch =*
  301.       lda #0
  302.       sta basbuf       ; clear keyboard buffer
  303. ;
  304.       lda #14
  305.       ldx drive
  306.       ldy #15        ; open command channel
  307.       jsr setlfs
  308.       lda #0
  309.       jsr setnam
  310.       jsr open  
  311.       bcc dir
  312.       jmp error1    ; abort on error
  313. ;
  314. ;---- execute directory
  315. ;
  316. dir =*
  317.    lda #"i"     ; send "i0" command to drive
  318.    sta combuf
  319.    lda #"0"
  320.    sta combuf+1
  321.    lda #2
  322.    sta comlen
  323.    jsr sendcom
  324.    lda stat     ; abort on error
  325.    beq d1
  326.    jmp endsdir
  327. d1 jsr readcom ; read error channel
  328.    lda combuf
  329.    cmp #"0"
  330.    beq cont
  331. x1 jsr error1    ; abort on error
  332.    jmp endsdir
  333. ;
  334. cont =*
  335.    jsr setdir       ; init buffer pointers
  336.    ldx #1
  337.    jsr setwindow    ; set display window
  338.    jsr write
  339.    .asc "working..." ; status message
  340.    .byt 0
  341. ;
  342.       lda #1
  343.       ldx drive
  344.       ldy #0
  345.       jsr setlfs    ; open directory channel as #1
  346.       lda len
  347.       ldx <pattern
  348.       ldy >pattern
  349.       jsr setnam
  350.       lda #0
  351.       tax
  352.       jsr setbank
  353.       jsr open
  354.       jsr readcom   ; check errors
  355.       lda combuf
  356.       cmp #"0"
  357.       bne x1
  358. ;
  359.       ldx #1        ; set input channel
  360.       jsr chkin
  361.       ldy #0        ; reset pointer
  362.       sty dirent    ; clear # of filenames
  363.       sty dirent+1
  364. ;
  365. readnam =*           ; read disk name
  366. r1    jsr readbyte   ; get a disk byte
  367.       bcc r2
  368.       jmp getout     ; exit if no more, else
  369. ;
  370. r2    cmp #34        ; check for quote
  371.       bne r1         ; and wait
  372. ;
  373. nextnam =*           ; read name bytes
  374.    jsr readbyte
  375.    cmp #34        ; check for closing quote
  376.    beq nextnam    ; skip
  377.    sta nambuf,y   ; stash disk name
  378.    iny
  379.    cpy #22        ; check for end of header
  380.    bne nextnam
  381. ;
  382. nextfil =*        ; read filenames
  383.    lda #32        ; fill entry position with spaces
  384.    ldy #0
  385. n1 jsr stashbyte
  386.    iny
  387.    cpy #32
  388.    bne n1
  389. n2 jsr readbyte
  390.    bcc n3
  391.    jmp getout     ; end of dir
  392. n3 bne n2         ; looking for zero byte
  393.    jsr readbyte   ; bypass 2 bytes
  394.    jsr readbyte
  395.    bcc n4
  396.    jmp getout
  397. n4 jsr readbyte   ; get lo byte of file length
  398.    sta work4
  399.   jsr readbyte    ; get hi byte
  400.    ldx work4      ; recover lo byte
  401.    jsr convert
  402.    ldy #22
  403. n5 lda 234,y      ; get # blocks in ascii
  404.    beq n6         ; end on zero byte
  405.    jsr stashbyte  ; save byte in bank 0 buffer
  406.       iny         ; next byte
  407.       bne n5
  408. n6    ldy #0      ; set to dir entry position
  409. n7    jsr readbyte
  410.       bcc n8
  411.       jmp getout
  412. n8    cmp #34     ; check for leading quote
  413.       bne n7
  414. n9    jsr readbyte; get another char
  415.       bcc n10
  416.       jmp getout
  417. n10   cmp #34
  418.       beq n9      ; skip trailing quote
  419.       jsr stashbyte
  420.       iny
  421.       cpy #22    ; read 22 bytes
  422.       bne n9
  423.       jsr add32  ; increment p2 by 32 bytes
  424.       inc dirent ; increment # of dir entries lo byte
  425.       bne n11    
  426.       inc dirent+1 ; and hi byte if required
  427. n11   jmp nextfil ; get next file
  428. ;
  429. free =*
  430.      .asc "blocks free "
  431. ;
  432. ;
  433. getout =*            ; end dir read
  434.       jsr clrchn     ; restore i/o
  435.       lda #1         ; close directory channel
  436.       jsr close
  437.       ldy #22
  438. g1    jsr getbyte    ; move blocks free to blocks free buffer
  439.       sta frebuf-22,y
  440.       iny
  441.       cpy #32
  442.       bne g1
  443.       ldy #0
  444. g2    lda free,y      ; blocks free message to buffer
  445.       sta frebuf+5,y
  446.       iny
  447.       cpy #12
  448.       bne g2
  449.       lda #$ff        ; end of dir marker
  450.       ldy #0
  451.       jsr stashbyte
  452. ;
  453. exitdir =*
  454.     ldx #3
  455.     jsr setwindow
  456.     jsr bootmessage
  457.     ldx #4
  458.     jsr setwindow     ; set to disk name window
  459.     ldy #0
  460. g3  lda nambuf,y       ; print disk name
  461.     jsr chrout
  462.     iny
  463.     cpy #24
  464.     bne g3
  465.     lda dirent+1       ; calc # of files found
  466.     ldx dirent
  467.     jsr convert
  468.     ldy #0             ; reset counter
  469.     jsr carret
  470. g4  lda $100,y
  471.     beq g5
  472.     sta filbuf,y       ; save for later
  473.     jsr chrout
  474.     iny
  475.     bne g4
  476. g5  ldy #0
  477. g6  lda flifnd,y
  478.     beq g7
  479.     jsr chrout
  480.     sta filbuf+5,y
  481.     iny
  482.     bne g6
  483. flifnd =* 
  484.    .asc "  files"
  485.    .byt 32,32,32,32,0
  486. ;
  487. g7  tay     
  488. g8  lda frebuf,y    ; print blocks free
  489.     jsr chrout
  490.     iny
  491.     cpy #18
  492.     bne g8
  493. ;
  494.     ldx #1
  495.     lda dirent      ; check for no files found
  496.     bne g9
  497.     lda dirent+1
  498.     bne g9
  499.     jsr setwindow   ; set display window
  500.     jsr write
  501.     .asc "no files found"
  502.     .byt 13,0
  503.     jsr presskey    ; exit if no files
  504.     jmp endsdir
  505. ;
  506. g9 inx             ; menu window
  507.    lda flag80      ; check for 80 column
  508.    bne g10     
  509.    jmp dispdir
  510. g10 jsr setwindow
  511.    jsr write
  512.    .byt 176
  513.    .asc "{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}": .byt 174,13
  514.    .asc "{SHIFT--} <up>,<dn> - scroll list     {SHIFT--}": .byt 13
  515.    .asc "{SHIFT--}    <home> - top of list     {SHIFT--}": .byt 13
  516.    .asc "{SHIFT--}     <esc> - exit to basic   {SHIFT--}": .byt 13
  517.    .asc "{SHIFT--}  <return> - bload prg       {SHIFT--}": .byt 13          
  518.    .asc "{SHIFT--}           - read seq        {SHIFT--}": .byt 13
  519.    .asc "{SHIFT--}           - change 1581 dir {SHIFT--}": .byt 13
  520.    .asc "{SHIFT--}      c= m - merge seq       {SHIFT--}": .byt 13   
  521.    .asc "{SHIFT--}      c= p - print dir       {SHIFT--}": .byt 13    
  522.    .asc "{SHIFT--}      c= r - 1581 root dir   {SHIFT--}": .byt 13    
  523.    .asc "{SHIFT--}      c= s - scratch file    {SHIFT--}": .byt 13     
  524.    .asc "{SHIFT--}      c= v - validate disk   {SHIFT--}": .byt 13,173 
  525.    .asc "{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}{SHIFT-*}": .byt 189,0 
  526. ;
  527. ;
  528. dispdir =*          ; display and scroll directory
  529.    jsr setdir      ; set pointers to directory buffer    
  530. ;
  531. dirmenu =*         ; directory menu
  532.    ldx #0
  533.    stx work2
  534.    stx scrollp
  535.    stx dirp
  536.    stx dirp+1
  537.    inx                 ; display window
  538.    jsr setwindow
  539. dispmore =*
  540.    ldy #0
  541. w1 jsr getbyte ; display a filename
  542.    cmp #$ff
  543.    bne w2     
  544.    jmp dm   
  545. w2 jsr chrout
  546.    iny
  547.    cpy #28
  548.    bne w1
  549.    jsr add32     ; point to next filename
  550.    inc work2        ; increment pointer
  551.    lda work2
  552.    cmp #20          ; check for full screen
  553.    beq dm
  554.    jsr carret       ; carriage return
  555.    jmp dispmore
  556. dm =*
  557.    jsr setdir 
  558.    jsr downout
  559.    jmp kloop2
  560. ;
  561. downout =*
  562. printrvs =*
  563.    lda #18     ; set <rvs> on
  564.    jsr chrout
  565. printnorm =*
  566.    ldy #0
  567.    ldx scrollp
  568.    clc
  569.    jsr plot         ; go to start of line
  570.    ldy #0
  571. w4 jsr getbyte ; get from bank 0
  572.    jsr chrout
  573.    iny
  574.    cpy #31
  575.    bne w4
  576.    lda #146     ; set <rvs> off
  577.    jmp chrout
  578. ;
  579. scrolldown =*
  580.    jsr printnorm    ; display normally       
  581.    ldx dirp         ; check lo byte of counter
  582.    inx
  583.    cpx dirent
  584.    bne q1         
  585.    jmp downout      ; dont do anything
  586. q1 stx dirp
  587.    ldx scrollp
  588.    cpx #19
  589.    beq q2  
  590.    inx
  591.    stx scrollp
  592.    jmp q3
  593. q2 jsr carret
  594. q3 jsr add32
  595.    jmp downout
  596. ;
  597. ;
  598. kloop2 =*      ; main key loop
  599. k0 jsr getin   ; get a key
  600.    beq k0
  601.    sta lastkey
  602.    cmp #27     ; <esc> to exit
  603.    bne k1
  604.    jmp endsdir
  605. k1 cmp #19     ; <home> to start
  606.    bne k2
  607.    jmp dispdir
  608. k2 cmp #13     ; <return> to load, etc
  609.    bne k3
  610.    jmp load
  611. k3 cmp #167    ; C= m  to merge seq file
  612.    bne k4
  613.    jmp load
  614. k4 cmp #175    ; C= p to print dir
  615.    bne k5
  616.    jmp printdir
  617. k5 cmp #145    ; <cursor up>
  618.    beq up
  619.    cmp #17     ; <cursor down>
  620.    bne k6        
  621.    jmp down
  622. k6 cmp #174    ; C= s to delete file
  623.    bne k7
  624.    jmp load 
  625. k7 cmp #178    ; C= r for 1581 root dir
  626.    bne k8
  627.    ldx #2      ; reset and go again
  628.    stx len
  629.    jmp dir    
  630. k8 cmp #190    ; c= v for validate
  631.    bne k9
  632.    jmp val 
  633. k9 jmp kloop2
  634.  
  635. ;
  636. up =*
  637.    jsr scrollup
  638.    jmp kloop2 
  639. ;
  640. down =*
  641.    jsr scrolldown
  642.    jmp kloop2
  643. ;
  644. scrollup =*
  645.    jsr printnorm
  646.    ldx dirp
  647.    dex             ; check lo byte of counter
  648.    cpx #$ff
  649.    bne s1
  650.    jmp downout
  651. s1 stx dirp
  652.    ldx scrollp
  653.    beq s2
  654.    dex
  655.    stx scrollp
  656.    jmp s3
  657. s2 lda #27         ; escape insert line sequence
  658.    jsr chrout
  659.    lda "i"
  660.    jsr chrout
  661. s3 sec
  662.    lda p2
  663.    sbc #32
  664.    sta p2
  665.    bcs s4
  666.    dec p2+1
  667. s4 jmp downout
  668. ;
  669. load =*
  670.    ldy #16         ; calc len of filename
  671. s5 jsr getbyte 
  672.    and #$7f
  673.    cmp #32
  674.    bne s6
  675.    dey
  676.    bne s5
  677. s6 iny
  678.    sty work1 ; save fn len
  679.    lda lastkey    ; check for C= s to scratch
  680.    cmp #174
  681.    bne s7
  682.    ldy #0
  683. s8 lda scratch,y   ; set up scratch command
  684.    sta combuf,y
  685.    iny
  686.    cpy #3
  687.    bne s8
  688.    jmp transfer   ; transfer filename and execute
  689. ;
  690. s7 ldy #17
  691.    jsr getbyte     ; look for cbm partition on 1581
  692.    cmp "c"
  693.    bne notsubdir
  694. root =*
  695.    ldy #0 
  696. s9 lda subdir,y    ; set up "/0:" command
  697.    sta combuf,y
  698.    iny
  699.    cpy #3 
  700.    bne s9
  701.    dey             ; reset directory pattern
  702.    sty len
  703. ;
  704. transfer =*
  705.    ldy #0          ; transfer filename to combuf
  706. t1 jsr getbyte 
  707.    sta combuf+3,y
  708.    iny
  709.    cpy work1
  710.    bne t1
  711.    clc
  712.    lda work1       ; set command length
  713.    adc #3
  714.    sta comlen
  715.    jsr sendcom     ; send command
  716.    jmp cont        ; and read dir over again
  717. ;
  718. subdir =*
  719.    .asc "/0:"      ; dos command prefix for change subdir
  720. ;
  721. ;
  722. scratch =*
  723.    .asc "s0:"      ; dos command prefix for scratch
  724. ;
  725. validate =*
  726.    .asc "v0:"      ; dos validate command
  727. val =*
  728.    ldy #0
  729. v1 lda validate,y
  730.    sta combuf,y
  731.    iny
  732.    cpy #3
  733.    bne v1
  734.    sty comlen
  735.    jsr sendcom
  736.    jmp cont
  737. ;
  738. notsubdir =*
  739.    ldx #0
  740.    jsr setwindow
  741.    lda #1
  742.    ldx drive
  743.    ldy #3   
  744.    jsr setlfs ; open file for load
  745.    lda work1  ; filename length
  746.    ldx p2
  747.    ldy p2+1
  748.    jsr setnam ; set filename
  749.    lda #0
  750.    tax    
  751.    jsr setbank ; set bank
  752.    ldy #17
  753.    jsr getbyte 
  754.    cmp #"p" ; check for program file
  755.    bne readsq      ; and read file if not
  756.    clc
  757.    lda #0
  758.    jsr kload   ; load file
  759.    stx eof    ; save eof pointers
  760.    sty eof+1
  761.    bcs ns1
  762.    jmp endsdir
  763. ;  
  764. ns1 jsr readcom
  765.     jmp dispdir
  766. ;
  767. readsq =*   ; read or merge seq file
  768.    jsr open
  769.    ldx #1
  770.    jsr chkin
  771.    lda lastkey
  772.    cmp #167   ; check for C= M to merge a file
  773.    bne go
  774.    ldy #17
  775.    jsr getbyte 
  776.    cmp #"s"
  777.    bne go
  778.    jmp end2   ; merge then exit
  779. go =*
  780.    jsr chrin  ; display file
  781.    jsr chrout
  782.    jsr stop   ; test stop key
  783.    bpl nogo   ; abort if pressed
  784.    jsr status
  785.    beq go
  786. nogo =*
  787.    jsr clrchn
  788.    lda #1
  789.    jsr close
  790.    jsr presskey
  791.    ldx #0       ; clear screen
  792.    jsr setwindow
  793.    jmp exitdir  ; back to main menu
  794. ;
  795. ;---- print hard copy of directory
  796. ;
  797. printdir =*
  798.     lda #6
  799.     ldx prn        ; printer device#
  800.     ldy psec       ; printer secondary address               
  801.     jsr setlfs     ; open printer file
  802.     lda #0
  803.     jsr setnam
  804.     jsr open
  805.     clc
  806.     ldx #6
  807.     jsr chkout  ; select printer for output
  808.     bcc pd1
  809.     jmp endprint ; end if error
  810. pd1 jsr setdir 
  811.     lda expand   ; set expanded print
  812.     jsr chrout
  813.     ldy #0
  814. pd2 lda nambuf,y
  815.     jsr chrout
  816.     iny
  817.     cpy #32
  818.     bne pd2
  819.     jsr carret
  820.     jsr carret
  821.     lda exoff     ; turn off expanded
  822.     jsr chrout
  823.     lda compress  ; set compressed print                  
  824.     jsr chrout
  825.     ldy width
  826.     jsr preq
  827.     jsr carret
  828. ;
  829. nexttwo =*        ; print file names , width/32 to a line
  830.     ldy #0
  831. nt1 jsr getbyte   ; get a byte
  832.     cmp #$ff
  833.     beq exitloop
  834.     jsr chrout
  835.     iny
  836.     cpy width  ; check screen width
  837.     bne nt1
  838.     jsr carret
  839.     clc
  840.     lda p2
  841.     adc width
  842.     sta p2
  843.     bcc nexttwo
  844.     inc p2+1
  845.     jmp nexttwo
  846. ;
  847. exitloop =*     ; end print out
  848.     jsr carret
  849.     ldy width
  850.     jsr preq
  851.     jsr carret
  852.     lda compoff ; turn off compressed print
  853.     jsr chrout
  854.     ldy #0
  855. el1 lda filbuf,y ; number of files found and bytes free
  856.     jsr chrout
  857.     iny
  858.     cpy #48
  859.     bne el1
  860.     jsr carret
  861. ;
  862. endprint =*
  863.     jsr clrchn
  864.     lda #6
  865.     jsr close
  866.     jmp dispdir
  867. ;
  868. setdir =*            ; reset dir pointers
  869.     lda <dirbuf
  870.     sta p2
  871.     sta p3    
  872.     lda >dirbuf
  873.     sta p2+1
  874.     sta p3+1
  875.     rts
  876. ;
  877. ;
  878. ;
  879. ;--------- subroutines
  880. ;
  881. ;
  882. ;
  883. ;---- convert digit to ascii string 
  884. ;
  885. convert =*       ; convert 2 digit integer to ascii
  886.     sta $64       ; before calling lda with high byte
  887.     stx $65       ; ldx with low byte
  888.     ldx #$90
  889.     sec
  890.     jsr $8c75
  891.     jsr $8e44    ; ascii will be at $100 ended by 0 byte
  892.     rts
  893. ;
  894. ;---- set screen windows      
  895. ;
  896. setwindow =* ; window with <clear>
  897.   lda bottoms,x
  898.   sta bottom
  899.   lda tops,x
  900.   sta top     
  901.   lda flag80  ; check screen width
  902.   beq sw1     ; skip rest if 40 col
  903.   lda lefts,x
  904.   sta left
  905.   lda rights,x
  906.   sta right
  907. ;
  908. sw1   lda #147                       ; clear screen
  909.       jmp chrout
  910.                                  ; ldx with window number
  911. ;                                ; before calling
  912. bottoms =*
  913.   .byt 24,22,24,24,2              ; 0= full screen
  914. tops =*                          ; 1= data window
  915.   .byt 0,3,5,24,0                ; 2= menu window
  916. lefts =*                         ; 3= title window
  917.   .byt 0,0,45,0,0                ; 4= status window
  918. rights =*
  919.   .byt 79,44,79,44,44
  920. ;
  921. ;
  922. ;---- write prompt messages
  923. ;
  924. error1 =*
  925.    jsr clrchn
  926.    ldx #1
  927.    jsr setwindow
  928.     jsr write
  929.    .byt 13,13
  930.    .asc "error:"
  931.    .byt 13,0
  932.    lda errlen
  933.    beq er2
  934.    ldy #0
  935. er1 lda combuf,y
  936.    jsr chrout
  937.    iny
  938.    cpy errlen
  939.    bne er1
  940. er2 lda #64 
  941.    sta stat       ; error flag        
  942. ;                                      
  943. presskey =*
  944.    jsr write
  945.    .byt 13,13
  946.    .asc "press a key ..."
  947.    .byt 13,0
  948. pk1 jsr getin
  949.    beq pk1
  950.    rts
  951. ;
  952. ;
  953. ;
  954. ;------------ disk i/o routines
  955. ;
  956. ;---- read error channel
  957. ;
  958. ; error message will be returned in combuf
  959. ; length of message in errlen
  960. ;
  961. readcom =*
  962.    clc
  963.    ldx #14     ; command channel
  964.    jsr chkin
  965.    bcs error1    ; abort on error
  966.    ldy #0
  967. rc1 jsr chrin
  968.    sta combuf,y
  969.    cmp #13
  970.    beq rc2
  971.    iny
  972.    bne rc1
  973. rc2 sty errlen
  974.    jsr clrchn
  975.    rts
  976. ;
  977. ;---- send disk command
  978. ;
  979. ; before calling:
  980. ;
  981. ; sta comlen with length of command string
  982. ;     (combuf) with command
  983. ;
  984. sendcom =*
  985.    ldx #14   ;  file #
  986.    clc
  987.    jsr chkout
  988.    bcs diskerror  ; abort on error 
  989.    ldy #0
  990. sc1 lda combuf,y
  991.    jsr chrout
  992.    iny
  993.    cpy comlen
  994.    bne sc1
  995.    jmp clrchn
  996. ;
  997. diskerror =*
  998.   jsr clrchn
  999.   jmp error1   
  1000. ;
  1001. ;--- read a disk byte
  1002. ;
  1003. readbyte =*           ; read a disk byte
  1004.      sec
  1005.      jsr status       ; read disk status byte
  1006.      bne rb1          ; not 0, then abort with carry set
  1007.      clc              ; clear carry for byte ok
  1008.      jsr chrin        ; read byte and
  1009. rb1  rts              ; return
  1010. ;
  1011. stashbyte =*          ; save a byte in bank 0
  1012.      ldx #$3f       
  1013.      stx mmu          ; go to bank 0
  1014.      sta (p2),y       ; save data
  1015.      ldx #0    
  1016.      stx mmu          ; back to default bank
  1017.      rts              ; and return
  1018. ;
  1019. getbyte =*          ; get a byte from bank 0
  1020.      ldx #$3f       
  1021.      stx mmu          ; go to bank 0
  1022.      lda (p2),y       ; get data
  1023.      ldx #0    
  1024.      stx mmu          ; back to default bank
  1025.      rts              ; and return
  1026. ;
  1027. add32 =*            ; add 32 to zero page pointers
  1028.     clc
  1029.     lda p2
  1030.     adc #32
  1031.     sta p2
  1032.     bcc a1
  1033.     inc p2+1
  1034. a1  rts
  1035. ;
  1036. carret =*         ; send carriage return
  1037.     lda #13
  1038.     jmp chrout
  1039. ;
  1040. preq =*          ; print .y = signs
  1041.     lda "="
  1042.     jsr chrout
  1043.     dey
  1044.     bne preq
  1045.     rts
  1046.