home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol040 / menu-v2.asm < prev    next >
Assembly Source File  |  1984-04-29  |  18KB  |  688 lines

  1. ;         MENU.ASM Version 2.0 as of April 26, 1981
  2. ;     Original Program by: James J. Frantz, May 31, 1979
  3. ; Menu Program Selection for '.BAS', '.INT' or '.COM' Files
  4. ;          Modified from original by: Kelly Smith
  5. ;     Version 2.0 contains the following modifications:
  6. ; (1)  Made  CP/M  2.X compatible;  previous  version  would 
  7. ;    "clobber"  the  '$' string delimiter  in  filename  and 
  8. ;    would   display   filenames  and  garbage  memory   'ad 
  9. ;    nauseum'.
  10. ; (2)  Added  equates for either MBASIC or  CBASIC  assembly 
  11. ;    function, and corresponding 'heading'.
  12. ;      Note:  You  must  have MBASIC.COM  on  the  currently 
  13. ;             logged  diskette if 'mbasic$program' equate is 
  14. ;             true, and it will expect files of type '.BAS'. 
  15. ;             If 'cbasic$program' equate is true,  you  must 
  16. ;             have   CRUN.COM   on  the   currently   logged 
  17. ;             diskette,  and  it  will expect files of  type 
  18. ;             '.INT'.  If neither is equated to true, '.COM' 
  19. ;             filetypes are assumed.
  20. ; (3)   Added  command  option  to  select  drive  for  user 
  21. ;    requested MENU.  (i.e.,  MENU B:<cr>). If corresponding 
  22. ;    filetype  is not found for assembled MENU  type  (.BAS, 
  23. ;    .INT  or .COM),  MENU will display  "+++ File Not Found 
  24. ;    +++" and return to the default drive.
  25. ; (4) Added "Disk Drive - X:" to heading display,  where 'X' 
  26. ;     is the selected drive.
  27. ; (5)  Added  conditional  assembly  switches  for   'upper' 
  28. ;     (uppercase only terminals),  'stdcpm' (standard CP/M), 
  29. ;     'altcpm' (alternate CP/M).
  30. ; (6)  Added conditional assembly switch for 'no$sys$files',     
  31. ;     to inhibit display of CP/M 2.X 'SYS' files.  Handy, if 
  32. ;     running a Remote CP/M System and you don't want to let 
  33. ;     the whole world know whats 'hidden'...
  34. ; (7)  Stripped  MSB "tag bit" for files set-up  for  Remote 
  35. ;     CP/M  Systems as "not for distribution".  Files  would 
  36. ;     not  be  sorted  in proper order for  display  without 
  37. ;     this...this   will   also   work   for   MP/M   system 
  38. ;     configuration where "tag bit" must be 'Bit 6' (NOT Bit 
  39. ;     7)...Bit  7 used as "tag" in MP/M environment fouls up 
  40. ;     the 'Control-S' start/stop video scroll  function,  so 
  41. ;     some users are switching to Bit 6 as "tag"...
  42. ; (8)  Fixed  bug  when MENU is set for BASIC  file  (either 
  43. ;     MBASIC or CBASIC) and is in B:  (or greater drive) and 
  44. ;     attempting  to load the MBASIC (or CRUN) and THEN  the 
  45. ;     '.BAS'  (or '.INT') file...now looks on same  diskette 
  46. ;     that MENU is on.
  47. ;
  48. ; (9)  Added 'widecrt' equate for two CRT  terminal  display 
  49. ;     formats. Set  the equate 'widecrt' to true if your CRT 
  50. ;     terminal  can  display  80   columns  by  24  rows. If 
  51. ;     'widecrt' is false, the default display is 64  columns 
  52. ;     by 16 rows.
  53. ;  As supplied,  MENU.ASM is set-up for the following system 
  54. ; configuration and display format:
  55. ;      Lowercase terminal display:   upper = false
  56. ;      80 column by 24 row display:  widecrt = true
  57. ;      Standard CP/M:                stdcpm = true
  58. ;                                    altcpm = false
  59. ;      Display '.COM' Menu:          mbasic$program = false
  60. ;                                    cbasic$program = false
  61. ;      No display of 'SYS' files:    no$sys$files = true
  62. ;
  63. ;
  64. ;          A Generalized Suggestions for Using MENU
  65. ;  If you have kids that love to play games on your  system, 
  66. ; this  is  perhaps the most 'protective' way to keep  there 
  67. ; "busy   little   hands"   out  of   the   CP/M   operating 
  68. ; system...Just set the little BAST..errr,  pardon  me...set 
  69. ; your  "prodigy  child"  up  with  a  GAMES  diskette  that 
  70. ; AUTOLOAD's the MENU program, and never ever again will you 
  71. ; hear "Gee Dad, I tried ERA *.* and now nuthi'n works...".
  72. ;
  73. ;
  74. true    equ    -1    ; define true
  75. false    equ    not true; define false
  76. ;
  77. mbasic$program    equ    false    ; true = .BAS
  78. cbasic$program    equ    false    ; true = .INT
  79.                 ;
  80.                 ; Note: Only one may be true, and
  81.                 ;       both false = .COM
  82. ;
  83. no$sys$files    equ    true    ; true = no SYS display, false = SYS display
  84. ;
  85. upper    equ    false    ; true if uppercase only terminal
  86. widecrt    equ    true    ; true if 80 column/24 row terminal
  87. ;
  88. stdcpm    equ    true    ; true if standard CP/M (base address 0000h)
  89. altcpm    equ    false    ; true if alternate CP/M (base address 4200h)
  90. ;
  91.     if    stdcpm    ; if standard CP/M...
  92. base    equ    0000h    ; base for standard CP/M system
  93.     endif        ; end if...
  94. ;
  95.     if    altcpm    ; if alternate CP/M...
  96. base    equ    4200h    ; base for H8 or TRS-80 CP/M system
  97.     endif        ; end if...
  98. ;
  99. bdos    equ    base+5    ; CP/M BDOS entry address for function call
  100. tfcb    equ    base+5ch; transient file control block base address
  101. ;
  102. nbr$col        equ    4    ; number of columns to display
  103.  
  104.     if    widecrt        ; if 80 column/24 row crt terminal...
  105. screen$size    equ    24    ; terminal has 24 lines/screen display
  106. screen$hgt    equ    80    ; terminal has 80 rows/screen display
  107.     endif            ; end if...
  108.  
  109.     if    not widecrt    ; if 64 column/16 row crt terminal...
  110. screen$size    equ    16    ; terminal has 16 lines/screen display
  111. screen$hgt    equ    64    ; terminal has 64 rows/screen display
  112.     endif            ; end if...
  113. ;
  114. ccp$len    equ    3c06h-3400h    ; calculate CCP length
  115. ;
  116. bel    equ    007h        ; (^g) bell - human attention required
  117. lf    equ    00ah        ; (^j) line feed
  118. cr    equ    00dh        ; (^m) carriage return
  119.  
  120.     org    base+100h
  121.  
  122. start:    lxi    sp,stack$area    ; set up a stack
  123.     lda    tfcb        ; get drive specification
  124.     ora    a        ; was drive explicity requested?
  125.     jnz    drive$request    ; if yes, skip interrogate disk request
  126.     mvi    c,25        ; 'interrogate disk' function
  127.     call    bdos        ; find out which disk we're on...
  128.     inr    a        ; make A: = 1
  129. ;
  130. drive$request:
  131. ;
  132.     adi    'A'-1        ; make it ASCII
  133.     sta    driveid        ; save the ASCII drive identification
  134.     sbi    '@'        ; make it HEX
  135.     sta    srch$fcb    ; set selection for requested or default drive
  136.     mvi    c,17        ; 'search first' command
  137. sort$loop:
  138. ;
  139.     lxi    d,srch$fcb    ; point file control block
  140.     call    bdos        ; use CP/M entry point
  141.     ora    a        ; test for -1
  142.     jm    assign$menu$nbr    ; print empty
  143.     jz    kludge        ; do not set file found, if zero
  144.     sta    file$found    ; set file found flag
  145. kludge:    rrc            ; this is the same as
  146.     rrc            ; 5 "add a's"
  147.     rrc
  148.     ani    60h         ; mask correct bits
  149.     adi    80h        ; add base address (0080h)
  150.     mov    e,a        ; put pointer in (de)
  151.     mvi    d,0        ; as 16 bit value
  152.     lxi    h,dirtable    ; point start of table of
  153.                 ; sorted names
  154.     inx    d        ; point past erase field
  155. compare$loop:
  156.     push    d        ; save pointer to next
  157.                 ; entry from disk directory
  158.     mvi    c,8        ; length of compare
  159.     push    h        ; save pointer to table
  160. compare1:
  161. ;
  162.     ldax    d        ; get trial name char
  163.     ani    7fh        ; mask-off high bit 'cause may be
  164.                 ; "tagged" as 'not for distribution' for RCPM's
  165.     cmp    m        ; match?
  166.     jnz    end$compare    ; if not, try next entry
  167.     inx    h        ; advance pointers
  168.     inx    d                
  169.     dcr    c        ; one less char to compare    
  170.     jnz    compare1    ; keep testing    
  171. ;
  172. end$compare:    
  173. ;
  174.     pop    b        ; restore table pointer
  175.     jc    insert$name    ; directory name goes in    
  176.                 ; front of current table
  177.                 ; entry if lower (cy = 1)
  178.     lxi    h,14        ; length of table entry
  179.     dad    b        ; (hl) to next table entry
  180.     pop    d        ; recover trailer name point
  181.     jmp    compare$loop    ; loop again
  182. insert$name:
  183. ;
  184.     if    no$sys$files    ; if no SYStem files to be displayed...
  185.     push    b        ; save pointer to table entry
  186.     push    d        ; save pointer to file name
  187.     xchg
  188.     lxi    d,9        ; add bias for "SYS" flag character
  189.     dad    d
  190.     mov    a,m        ; get character
  191.     ani    80h        ; mask for "SYS" flag
  192.     pop    d        ; adjust stack, in case we take the next jump
  193.     pop    b        ; ...or we really need the pointers
  194.     jnz    abort        ; abort this filename, if "SYS"
  195.     endif            ; end if...
  196.  
  197.     ldax    d        ; get first byte of filename
  198.     ani    7fh        ; mask-off high bit 'cause may be
  199.                 ; "tagged" as 'not for distribution' for RCPM's
  200.     stax    d        ; and save back, so proper file sort display
  201.     lxi    h,file$count    ; count the number of files
  202.     inr    m        ; to be displayed
  203.     lhld    end$of$table    ; get pointer to table
  204.     xchg
  205.     lxi    h,14        ; distance to move
  206.     dad    d        ; (hl) point destination
  207.     shld    end$of$table    ; save the new end of table
  208.     inx    h
  209.     inx    d
  210. ;
  211. move$up:
  212. ;
  213.     dcx    d
  214.     dcx    h
  215.     ldax    d        ; get byte to move
  216.     mov    m,a        ; put in new spot
  217.     mov    a,c        ; test for done
  218.     cmp    e        ; (bc) = (de)?
  219.     jnz    move$up
  220.     mov    a,b
  221.     cmp    d
  222.     jnz    move$up
  223.     pop    h        ; recover pointer
  224.     mvi    c,8
  225.     call    block$move    ; insert name in table
  226.     lxi    h,menu$buff    ; point menu number block
  227.     mvi    c,6        ; length of movek
  228.     call    block$move    ; insert text in table
  229. abort:    mvi    c,18        ; 'search next' command
  230.     jmp    sort$loop
  231. assign$menu$nbr:
  232. ;
  233.     lda    file$count
  234.     mov    b,a        ; save in (b)
  235.     push    psw        ; and on stack
  236.     mvi    c,0        ; initial file number
  237.     lxi    h,dirtable+11    ; point first file number
  238.     lxi    d,13        ; offset to other numbers
  239. number$files:
  240. ;
  241.     mov    a,c        ; put file number in (a)
  242.     adi    1        ; increment
  243.     daa            ; decimal convert
  244.     mov    c,a        ; resave    in (c)
  245.     rrc            ; get tens digit into
  246.     rrc            ; proper place
  247.     rrc            ; 
  248.     rrc
  249.     ani    0fh        ; add mask
  250.     jz    use$blank    ; supress leading zero by
  251.     adi    10h        ; add either 20h (ASCII ' ')
  252. ;
  253. use$blank:
  254. ;
  255.     adi    ' '        ; or 20h + 10h for numeral
  256.     mov    m,a        ; put in text stream
  257.     mov    a,c        ; get units portion
  258.     ani    0fh        ; mask off tens portion
  259.     adi    '0'        ; convert to ASCII
  260.     inx    h            
  261.     mov    m,a
  262.     dad    d        ; repeat until all files
  263.     dcr    b        ; are sequentially numbered
  264.     jnz    number$files
  265.     pop    psw        ; get file$count from stack
  266.     push    psw        ; and save again for later
  267.     adi    nbr$col-1
  268.     mvi    b,255        ; (b) accumulates quotient
  269.                 ; so set to -1 for at least
  270.                 ; 1 pass thru gives 0
  271. divx:
  272. ;
  273.     inr    b
  274.     sui    nbr$col        ; divide (file$count+3) by
  275.                 ; fout to get offset1
  276.     jp    divx
  277.     adi    nbr$col        ; substracted once too much
  278.                 ; so add it back on
  279.     lxi    h,offset1        
  280.     mov    m,b        ; insert offset1 into table
  281.     inx    h        ; point offset2 location
  282.     jnz    setoffset2    ; same as offset1 if non-
  283.                 ; zero remainder
  284.     dcr    b        ; else offset2 = offset1-1
  285. ;
  286. setoffset2:
  287. ;
  288.     mov    m,b        ; put offset2 in table
  289.     inx    h        ; point offset    for col 3
  290.     dcr    a        ; test for remainder of 1
  291.     jnz    setoffset3    ; if remainder <> 1, use
  292.                 ; offset3 = offset2-1
  293.     dcr    b        ; else offset3 = offset2-1y
  294. setoffset3:
  295. ;
  296.     mov    m,b        ; else offset to column 4
  297. ;     
  298. reprint:
  299. ;
  300.     pop    psw        ; recover file count
  301. reprint1:    
  302. ;
  303.     push    psw        ; save again for later use
  304.     sta    file$count    ; save for counting    
  305.     mvi    a,screen$hgt    ; set for video display size
  306.     sta    line$count
  307.     lda    file$found    ; get file$found flag
  308.     ora    a        ; and set psw flags
  309.     jz    exit        ; if zero, no files of this type found
  310.     lxi    d,heading
  311.     mvi    c,9        ; buffer printer command
  312.     call    bdos        ; CP/M prints heading
  313.     lxi    h,dir$table-14    ; point dummy 0th entry
  314. ;     
  315. print$line:
  316. ;
  317.     push    h        ; save base address
  318.     lxi    d,offset0    ; point offset table
  319.     mvi    a,nbr$col    ; 4 column per line
  320. print$name:
  321. ;
  322.     sta    column$cnt    ; save count of columns
  323.     push    h        ; save current name pointer
  324.     push    d        ; save offset table pointer
  325.  
  326.     if    widecrt        ; if 80 column/24 row crt terminal...
  327.     lxi    d,doubl$space    ; print 2 spaces
  328.     mvi    c,9        ; 'print buffer' command
  329.     call    bdos        ; use CP/M 
  330.     endif            ; end if...
  331.  
  332.     lxi    d,doubl$space    ; print 2 spaces
  333.     mvi    c,9        ; 'print buffer' command
  334.     call    bdos        ; use CP/M 
  335.     pop    d        ; get offset table pointer
  336.     pop    h        ; get name pointer
  337.     ldax    d        ; get offset value
  338.     lxi    b,14        ; each name is 14 long
  339. mult$14:
  340. ;
  341.     dad    b        ; add 14 for each offset
  342.     dcr    a        ; until offset = 0
  343.     jnz    mult$14
  344.     push    h        ; save new name pointer
  345.     push    d        ; save offset pointer
  346.     xchg            ; pointer name to print w/(de)
  347.     mvi    c,9        ; print buffer
  348.     call    bdos        ; print file name
  349.                 ; and it's menu number
  350. test$finish:
  351. ;
  352.     lxi    h,file$count    ; see if done printing
  353.     dcr    m        ; by testing count of files
  354.     pop    d        ; get offset pointer
  355.     pop    h        ; get pointer to last name
  356.     jz    finish        ; no more to print
  357.     inx    d        ; advance offset pointer
  358.     lda    column$cnt
  359.     dcr    a        ; see if column left = 0
  360.     jnz    print$name    ; print another save line 
  361.     call    crlf            
  362.     pop    h        ; get base of previous line
  363.     lxi    d,14        ; add offset
  364.     dad    d    
  365.     jmp    print$line
  366. ;
  367. finish:
  368. ;
  369.     pop    h        ; unjunk stack
  370. lf$loop:
  371. ;
  372.     call    crlf
  373.     lxi    d,prompt    ; point instruction message
  374.     mvi    c,9            
  375.     call    bdos
  376.     lxi    d,input$buff
  377.     mvi    a,10        ; 10 characters maximum
  378.     stax    d
  379.     mvi    c,10        ; 'read buffer' command
  380.     call    bdos
  381.     lxi    h,input$buff+1    ; point to character counter
  382.     mov    a,m        ; get it and see if >2 
  383.     cpi    3
  384.     jnc    reprint        ; reprint the menu
  385.     mov    c,a        ; count of digits to (c)
  386.     mvi    b,0
  387. get$menu$nbr:
  388. ;
  389.     inx    h        ; point ASCII digit
  390.     mov    a,m        ; get it
  391.     call    ascii$convert    ; convert to binary
  392.     jc    reprint        ; re-display on error
  393.     dcr    c        
  394.     jnz    get$menu$nbr
  395.     pop    psw        ; recover file counter
  396.     cmp    b        ; file count - request number
  397.     jc    reprint1    ; redisplay menu if illegal
  398.     lxi    d,14        ; increment between names
  399.     lxi    h,dir$table-14    ; point dummy 0th entry
  400. find$name:
  401. ;
  402.     dad    d        ; add offset b times
  403.     dcr    b            
  404.     jnz    find$name
  405.     push    d        ; found filename, tidy-up screen...
  406.     push    h
  407.     lxi    d,crlfmsg
  408.     mvi    c,9
  409.     call    bdos
  410.     pop    h
  411.     pop    d
  412.     xchg            ; save pointer to file name
  413.     lhld    base+6        ; get bdos entry point
  414.     lxi    b,-ccp$len    ; offset to start of CP/M
  415.     dad    b
  416.     push    h        ; save CP/M entry point
  417.                 ; on stack for branch
  418.     lxi    b,8        ; offset to command buffer "autoload"
  419.     dad    b        ; (hl) points place to put name of 
  420.                 ; .BAS, .INT, or .COM file to be
  421.                 ; executed
  422.     push    d        ; save pointer to file name
  423.     xchg            ; (de) points to command buffer
  424.     lxi    h,128        ; offset to end of command buffer
  425.                 ; where pointer is stored
  426.     dad    d        ; (hl) points to storage place
  427.     mov    m,e        ; update buffer pointer to
  428.     inx    h        ; the start of the command
  429.     mov    m,d        ; buffer so CP/M will read
  430.     lda    driveid        ; get selected drive identification
  431.     stax    d        ; store at start of command buffer
  432.     inx    d        ; bump for ':' delimeter position
  433.     mvi    a,':'        ; make delimeter
  434.     stax    d        ; and store it...
  435.     inx    d        ; bump for destination pointer to filename
  436.  
  437.     if    mbasic$program or cbasic$program    ; if BASIC program...
  438.     lxi    h,command$name    ; point command name
  439.     mvi    c,len$cmd$name    ; length of command name
  440.     call    block$move
  441.     lda    driveid        ; get selected drive identification
  442.     stax    d        ; store at start of command buffer
  443.     inx    d        ; bump for ':' delimeter position
  444.     mvi    a,':'        ; make delimeter
  445.     stax    d        ; and store it...
  446.     inx    d        ; bump for destination pointer to filename
  447.     endif            ; end if...
  448.  
  449.     pop    h        ; point selected file name
  450.     mvi    c,8        ; length of file name
  451.     call    block$move
  452.  
  453.     if    mbasic$program or cbasic$program    ; if BASIC program...
  454.     lxi    h, spec$type
  455.     mvi    c,4
  456.     call    block$move 
  457.     endif            ; end if...
  458.  
  459.     xra    a        ; needs a 0 at end
  460.     stax    d        ; of command line
  461.     ret
  462. block$move:
  463. ;
  464.     mov    a,m
  465.     stax    d
  466.     inx    d
  467.     inx    h
  468.     dcr    c
  469.     jnz    block$move
  470.     ret
  471. ascii$convert:
  472. ;
  473.     sui    '0'        ; subtract ASCII bias
  474.     cpi    9+1        ; be sure it's numeric
  475.     cmc
  476.     rc
  477.     mov    d,a
  478.     mov    a,b
  479.     rlc
  480.     rlc
  481.     rlc
  482.     add    b
  483.     rc
  484.     add    b
  485.     rc
  486.     add    d
  487.     mov    b,a
  488.     ret
  489. crlf:
  490. ;
  491.     lxi    d,crlfmsg
  492.     mvi    c,9
  493.     call    bdos
  494.     lxi    h,line$count
  495.     dcr    m
  496.     ret
  497. exit:    lxi    d,nofile    ; indicate no files present
  498.     mvi    c,9
  499.     call    bdos
  500.     jmp    base        ; and exit to CP/M via "warm boot"
  501. ;
  502.     if    upper        ; if uppercase only terminal...
  503. nofile:        db    cr,lf,lf,'+++ FILE NOT FOUND! +++',cr,lf,'$'
  504.     endif
  505.  
  506.     if    not upper    ; if not uppercase only terminal...
  507. nofile:        db    cr,lf,lf,'+++ File Not Found! +++',cr,lf,'$'
  508.     endif
  509.  
  510. crlfmsg:    db    cr,lf,'$'
  511. heading:    db    cr,lf,lf
  512.     if    widecrt and mbasic$program
  513.     db    '                   '
  514.     endif
  515.  
  516.     if    not widecrt and mbasic$program
  517.     db    '              '
  518.     endif
  519.  
  520.     if    upper and mbasic$program
  521.     db    'MICROSOFT COMPATIBLE BASIC FILE MENU'
  522.     endif
  523.  
  524.     if    not upper and mbasic$program
  525.     db    'Microsoft Compatible BASIC File Menu'
  526.     endif
  527.  
  528.     if    widecrt and cbasic$program
  529.     db    '                '
  530.     endif
  531.  
  532.     if    not widecrt and cbasic$program
  533.     db    '           '
  534.     endif
  535.  
  536.     if    upper and cbasic$program
  537.     db    'COMPILER SYSTEMS COMPATIBLE BASIC FILE MENU'
  538.     endif
  539.  
  540.     if    not upper and cbasic$program
  541.     db    'Compiler Systems Compatible BASIC File Menu'
  542.     endif
  543.  
  544.     if    widecrt and not mbasic$program and not cbasic$program
  545.     db    '                         '
  546.     endif
  547.  
  548.     if    not widecrt and not mbasic$program and not cbasic$program
  549.     db    '                    '
  550.     endif
  551.  
  552.     if    upper and not mbasic$program and not cbasic$program
  553.     db    'CP/M COMMAND FILE MENU'
  554.     endif
  555.  
  556.     if    not upper and not mbasic$program and not cbasic$program
  557.     db    'CP/M Command File Menu'
  558.     endif
  559.  
  560.     db    cr,lf
  561.  
  562.     if    widecrt        ; if 80 column/24 row crt terminal...
  563.     db    '                             '
  564.     endif            ; end if...
  565.  
  566.     if    not widecrt    ; if 64 column/16 row crt terminal
  567.     db    '                       '
  568.     endif            ; end if...
  569.  
  570.     if    upper    ; if uppercase only terminal...
  571.     db    'DISK DRIVE - '
  572.     endif        ; end if...
  573.  
  574.     if    not upper    ; if not uppercase only terminal
  575.     db    'Disk Drive - '
  576.     endif            ; end if...
  577.  
  578. driveid:ds    1    ; current logged ASCII drive identification
  579.  
  580.     db    ':',cr,lf,lf,'$'
  581.  
  582.     if    upper        ; if uppercase only terminal
  583. prompt:    db    cr,lf,bel,' ENTER MENU NUMBER, AND PRESS RETURN: $'
  584.     endif            ; end if...
  585.  
  586.     if    not upper    ; if not uppercase only terminal...
  587. prompt:    db    cr,lf,bel,' Enter menu number, and press return: $'
  588.     endif            ; end if...
  589.  
  590.     if    mbasic$program    ; if MBASIC program...
  591. command$name:    db    'MBASIC '    ; Microsoft BASIC
  592. len$cmd$name    equ    $-command$name
  593. spec$type:    db    '.BAS'
  594.     endif            ; end if...
  595.  
  596.     if    cbasic$program    ; if CBASIC program...
  597. command$name:    db    'CRUN '    ; Compiler Systems BASIC
  598. len$cmd$name    equ    $-command$name
  599. spec$type:    db    '.INT'
  600.     endif            ; end if...
  601.  
  602. doubl$space:    db    '  $'
  603. menu$buff:    db    ' - 00$'
  604. offset0:    db    1
  605. ;
  606. offset1:    db    0,0,0
  607. end$of$table:    dw    dirtable
  608. file$count:    db    0
  609. ;
  610. column$cnt:    db    4
  611. ;
  612. line$count:    db    0
  613. ;
  614. file$found:    db    0    ; file found flag
  615.  
  616.     if    mbasic$program    ; if MBASIC program...
  617. srch$fcb:    db    0,'????????BAS',0,0,0,0
  618.     endif            ; end if...
  619.  
  620.     if    cbasic$program    ; if CBASIC program...
  621. srch$fcb:    db    0,'????????INT',0,0,0,0
  622.     endif            ; end if...
  623.  
  624.     if    not mbasic$program and not cbasic$program    ; if not BASIC program...
  625. srch$fcb:    db    0,'????????COM',0,0,0,0
  626.     endif            ; end if...
  627.  
  628. dir$table:    db    255
  629. stack$area    equ    200*14 + 30
  630. input$buff    equ    stack$area
  631.     end    start
  632.