home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpm / rcpm / section.mac < prev    next >
Encoding:
Text File  |  1994-07-13  |  15.8 KB  |  670 lines

  1.  
  2. ;
  3. ;
  4. ;        S E C T I O N . M A C
  5. ;
  6. ;
  7. ; 09/04/85 modified for use with ZCPR2 and converted to Zilog
  8. ; mnemonics for assembly with Microsoft's M80 Assembler by Max Southall
  9. ;        Micro/Access, Box 136 Station J, Toronto
  10. ;        (416) 463 9360   2400/1200/300
  11. ;
  12. ; from SECTION.ASM, originally by Ron Fowler, Westland, Michigan  06/27/82
  13. ;
  14. ; This program is intended for RCPM systems where
  15. ; files are grouped into drive/user area by their
  16. ; classification.  This program implements a naming
  17. ; convention, whereby a caller can move into a
  18. ; section by typing its name, rather than the random
  19. ; searching formerly needed. If proper equates are set, and
  20. ; ZCPR2 is used, the program will not allow changing to 
  21. ; restricted drives or user areas. A resident or disk-based 
  22. ; command can be run after a section change if using the ZCPR2
  23. ; external command buffer.  If the section name buffer is implemented
  24. ; in the BIOS and custom ZCPR2, then the section name can be displayed
  25. ; as the prompt.
  26. ;
  27. ; Syntax is:  SECTION [<section-name>]
  28. ;
  29. ; If section-name is omitted, a short list of
  30. ; available sections is printed. The special
  31. ; form "SECTION ?" prints the detailed description
  32. ; of each section.
  33. ;
  34. ; You have to fill in the sections table
  35. ; (located near the end of this program) for your
  36. ; particular system.
  37. ;
  38. ;----< Examples of use: >-----
  39. ;
  40. ; A0>SECTION ZCPR    ;changes drive/user to ZCPR area
  41. ; B4>SECTION MBASIC    ;changes drive/user to mbasic area
  42. ; A6>SECTION        ;prints short list of sections
  43. ; A9>SECTION ?        ;prints the detailed list
  44. ;
  45. false    EQU    0    
  46. true    EQU    not false
  47. ;
  48. ; the following equates may be
  49. ; customized to your preference
  50. ;
  51. zcmd    EQU    TRUE    ;ZCPR2/3 multiple command buffer used?
  52.             ;If using ZCPR2 command buffer, run command at
  53.             ;CMD after new section is selected.  
  54. check    EQU    TRUE    ;check maximum drive and user permitted
  55. cmdbuf    EQU    0fe80h    ;address of zcpr2/3 multiple command buffer
  56. ;
  57. prompt    EQU    TRUE    ;make prompt section name (must implement sname
  58.             ;in modified ZCPR2/3 and initialize in BIOS)
  59. sname    EQU    0f2b0h+49+49  ;address of section name prompt buffer
  60. ;
  61. maxuser    EQU    03fh    ;address of maximum user # byte
  62. maxdriv    EQU    03dh    ;address of maximum drive # byte
  63. ;
  64. descol    EQU    15    ;column # where description begins
  65.             ;(in detailed list) (should be greater
  66.             ;than longest section name) (but small
  67.             ;enuf so display is not too long)
  68. perlin    EQU    4    ;names printed per line in short list
  69. tabpos    EQU    12    ;tab stops (set mod tabpos)
  70.             ;should be at least one greater than
  71.             ;longest section name.
  72. ;
  73. lines    EQU    18    ;line # to pause at so screen doesn't overflow
  74. ;
  75. ; ZCPR conventions
  76. ;
  77. cpbase    EQU    0    
  78. ccpdrv    EQU    cpbase+4    ;ccp user/drive storage loc
  79. bdos    EQU    cpbase+5    ;system entry point
  80. dfcb    EQU    cpbase+5CH    ;default file control block
  81. dbuf    EQU    cpbase+80H    ;default buffer
  82. tpa    EQU    cpbase+100H    ;base of transient program area
  83. coninf    EQU    1    ;system call, get console char
  84. conotf    EQU    2    ;system call, console output
  85. printf    EQU    9    ;system call, print cons string
  86. cstsf    EQU    11    ;system call, get console status
  87.  
  88. ;
  89. ; character definitions
  90. ;
  91. cr    EQU    13    ;carriage-return code
  92. lf    EQU    10    ;linefeed code
  93. ;
  94. ; code begins....
  95. ;
  96.     .Z80    ;Accept Z80 instruction format
  97. ;
  98.     ORG    tpa
  99. ;
  100. ;
  101. pbase:
  102.     LD    HL,0    ;save system stack
  103.     ADD    HL,SP
  104.     LD    (spsave),HL
  105.     LD    SP,stack    ;load local stack
  106. ;
  107.     LD    A,(ccpdrv)    ;get current drive #
  108.     LD    (lastdrv),A    ;save
  109.     PUSH    AF    ;save it
  110. ;
  111. gosect:
  112.     CALL    sect    ;perform the section function
  113. ;
  114. back:
  115.     LD    HL,(spsave)    ;restore stack for proper return
  116.     LD    SP,HL
  117.  
  118.     LD    A,(lastdrv)    ;check to see if section changed
  119.     LD    B,A
  120.     LD    A,(ccpdrv)
  121.     CP    B
  122.     RET    Z    ;no section change, exit but don't warmboot
  123.     
  124.      if    prompt
  125.     ld    (sname),a    ;put drv/usr in sname buffer
  126.     ld    hl,(savecmd)
  127.     ld    de,sname+1
  128. putsname:
  129.     ld    a,(hl)
  130.     ld    (de),a
  131.     cp    0
  132.     jr    z,swarm
  133.     inc    hl
  134.     inc    de
  135.     jr    putsname
  136.      
  137.      endif
  138.  
  139. swarm:
  140.     JP    cpbase    ;CCP will change section at warmboot
  141. ;
  142. ;
  143. ; scan cmd line...if an arg exists, attempt to
  144. ; match it in the table.  If no arg, dump a list
  145. ; of available sections.
  146. ;
  147. sect:
  148.     LD    A,(dfcb+1)    ;is there a cmd-line arg?
  149.     CP    ' '
  150.     JP    Z,prnqk    ;then go print sections out
  151.     CP    '?'    ;wants detailed list?
  152.     JP    Z,prntbl    ;then go do it
  153. ;
  154. ;    SCAN FOR SECTION & CHANGE IF LEGAL
  155. ;
  156.     LD    HL,dbuf    ;something there, scan to it
  157. ;
  158. scanbk:
  159.     INC    HL    ;  ignoring blanks
  160.     LD    A,(HL)
  161.     CP    ' '
  162.     JP    Z,scanbk
  163. scant:
  164.     LD    (savecmd),HL
  165.     LD    DE,table    ;point de to the section table
  166.     CALL    loop
  167. scant1:
  168.     LD    HL,(savecmd)
  169.     LD    DE,table1
  170.     CALL    loop
  171. scant2:    
  172.     LD    HL,(savecmd)    
  173.     LD    DE,table2
  174.     CALL    loop    
  175. scant3:
  176.     LD    HL,(savecmd)    
  177.     LD    de,table3
  178.     CALL    loop
  179. ;
  180.     LD    DE,matmsg    ;print out no-match message
  181.     LD    C,printf
  182.     CALL    bdos
  183. ;
  184.     CALL    prnqk    ;go give short list    
  185.     RET
  186. ;
  187. loop:
  188.     PUSH    HL    ;save cmd line arg pointer
  189. eloop:
  190.     LD    A,(DE)    ;test entry against table
  191.     CP    1    ;end of entry marker?
  192.     JP    NZ,noend    ;jump if not
  193.     LD    A,(HL)    ;yes, did user cmd terminate also?
  194.     OR    A
  195.     JP    Z,match    ;then declare a match
  196.  
  197.     JP    nomat    ;else declare a mismatch
  198.  
  199. noend:
  200.     CP    (HL)
  201.     JP    NZ,nomat    ;skip if no match
  202.     INC    HL    ;continue with comparison
  203.     INC    DE
  204.     JP    eloop
  205. ;
  206. ; here when an entry didn't match
  207. ;
  208. nomat::    LD    A,(DE)
  209.     OR    A    ;entry terminator?
  210.     INC    DE
  211.     JP    NZ,nomat    ;scan through it
  212.     POP    HL    ;restore cmd line arg pntr
  213.     INC    DE    ;end of entry, skip over user #
  214.     INC    DE    ;and drive
  215.     LD    A,(DE)    ;end of table?
  216.     OR    A    ;(terminated by 0)
  217.     JP    NZ,loop    ;go scan another if not
  218. ;
  219. ; here when no match can be found
  220. ;
  221.     ret
  222. ;
  223. ; here when a match is found
  224. ;
  225. match:
  226.     EX    DE,HL    ;hl==> user #
  227. scmat:
  228.     INC    HL    ;scan past description
  229.     LD    A,(HL)    ;looking for terminating null
  230.     OR    A
  231.     JP    NZ,scmat
  232.  
  233.     INC    HL    ;skip over terminator
  234.     LD    A,(HL)    ;fetch user #
  235.     SUB    '0'    ;subtract ascii bias
  236.     CP    10    ;is it > 15?
  237.     JP    C,scmat2    ;no, so continue on
  238.     SUB    7    ;remove the rest 
  239. scmat2::
  240.     LD    (user),A
  241.     LD    E,A
  242.     INC    HL    ;point hl to drive #
  243.     LD    A,(HL)    ;fetch drive
  244.     SUB    'A'    ;subtract ascii bias
  245.     LD    (drive),A
  246.     LD    D,A    ;save drive #
  247.     LD    A,E    ;fetch user number
  248.     RLC    A    ;rotate to high nybble
  249.     RLC    A
  250.     RLC    A
  251.     RLC    A
  252.     OR    D    ;"or" in the drive
  253.  
  254.     POP    DE    ;clear garbage from stack
  255.  
  256.      if    check    ;if checking maxdrive & user
  257.  
  258.     LD    (newdrive),A    ;save while we check for limits
  259. chkd:
  260.     LD    A,(drive)    ;check for maximum drive first
  261.     LD    HL,maxdriv
  262.     INC    (HL)
  263.     CP    (HL)
  264.     JR    NC,restrict    ;illegal request - don't change section
  265. chku:
  266.     LD    A,(user)    ;check for maximum user area
  267.     LD    HL,maxuser
  268.     INC    (HL)
  269.     CP    (HL)
  270.     JR    C,okset        ;ok - change section
  271. ;
  272. restrict:
  273.     LD    DE,rstrmsg    ;print illegal request message
  274.     LD    C,printf
  275.     CALL    bdos
  276.     jr    cmdret            ;return without changing section
  277. ;
  278. okset:
  279.     LD    A,(newdrive)    ;restore request
  280.  
  281.      endif        ;if checking maxuser & maxdrive    
  282.  
  283.  
  284. ;    -- Change user/drive at 04H for the ccp
  285.  
  286.     LD    (ccpdrv),A    ;save drive/user for ccp use
  287. ;
  288.      if    zcmd        ;if running a command after section change
  289. ;
  290.     LD    B,A
  291.     LD    A,(lastdrv)
  292.     CP    B
  293.     JR    Z,cmdret
  294. ;
  295. ; Place command to run after section change in ZCPR2/3 multiple command buffer
  296. ;
  297.     LD    HL,cmd        ;address of command to run
  298.     LD    DE,cmdbuf+4    ;place to put command
  299.     LD    (cmdbuf),DE    ;store address of command
  300. transcmd:
  301.     LD    A,(HL)        ;get command letter
  302.     CP    '$'        ;end of command delimiter?
  303.     JR    Z,cmdret        ;if so, return        
  304.     LD    (DE),A        ;put cmd letter in cmd buffer
  305.     INC    HL        ;bump 'em both
  306.     INC    DE
  307.     JR    transcmd    ;do again until finished
  308.  
  309.      endif
  310. cmdret:
  311.     POP    HL        ;dummy clear stack for proper return
  312.     RET            ;return to caller
  313. ;
  314. ;     PRINT QUICK LIST
  315. ;
  316. prnqk:
  317.     LD    DE,signon
  318.     LD    C,printf
  319.     CALL    bdos
  320.  
  321. prnqk1:
  322.     LD    DE,tblmsg
  323.     LD    C,printf
  324.     CALL    bdos
  325.     LD    HL,table
  326.     call    qloop
  327.     LD    HL,table1
  328.     call    qloop
  329.     LD    HL,table2
  330.     CALL    qloop
  331.     LD    HL,table3
  332.     CALL    qloop
  333. ;
  334.     LD    DE,matms2    ;print ending message
  335.     LD    C,printf
  336.     CALL    bdos
  337.     CALL    crlf
  338. ;
  339.     RET
  340. ;
  341. qloop::    LD    B,perlin    ;get names-per-line counter
  342. qloop2::LD    A,(HL)    ;end of table?
  343.     OR    A
  344.     JP    Z,qkend    ;then go print end msg
  345.     CALL    prathl    ;else print the name
  346. qscan::    LD    A,(HL)    ;scan to description terminator
  347.     INC    HL    ;(this effectively ignores
  348.     OR    A    ; the description)
  349.     JP    NZ,qscan
  350.     INC    HL    ;skip over user #
  351.     INC    HL    ;and drive #
  352.     DEC    B    ;count down line entry counter
  353.     JP    NZ,qtab    ;go tab if line not full
  354.     CALL    crlf    ;else turn up new line
  355.     JP    qloop    ;and continue
  356. ;
  357. ; tab between entry names
  358. ;
  359. qtab::    LD    A,' '    ;seperate names with tabs
  360.     CALL    type
  361.     LD    A,(column)    ;get column #
  362. qsub::    SUB    tabpos    ;test tab position
  363.     JP    Z,qloop2    ;continue if at a tab position
  364.     JP    NC,qsub    ;convert mod tabpos
  365.     JP    qtab    ;keep tabbing
  366. ;
  367. qkend:
  368.     CALL    crlf
  369.     RET    
  370. ;
  371. ; here to print out a list of available section numbers
  372. ;
  373. prntbl::
  374.     LD    DE,signon
  375.     LD    C,printf
  376.     CALL    bdos
  377.  
  378.     LD    A,(dfcb+2)
  379.     CP    'Z'
  380.     jr    Z,prnt1
  381.     CP    'P'        
  382.     jr    Z,prnt2        
  383.     CP    'M'
  384.     jr    Z,prnt3
  385.  
  386. prtall:
  387.     LD    DE,tblmsg
  388.     LD    C,printf
  389.     CALL    bdos
  390.     LD    HL,table
  391.     CALL    prloop1
  392.     CALL    prnt1
  393.     call    prnt2
  394.     call    prnt3
  395.     ret
  396. ;    
  397. prnt1:
  398.     LD    DE,tbl1msg
  399.     LD    C,printf
  400.     CALL    bdos
  401.     LD    HL,table1
  402.     CALL    PRLOOP1
  403.     RET
  404. prnt2:
  405.     LD    DE,tbl2msg
  406.     LD    C,printf
  407.     CALL    bdos
  408.     LD    HL,table2
  409.     CALL    prloop1
  410.     RET
  411.  
  412. prnt3:
  413.     LD    DE,tbl3msg
  414.     LD    C,printf
  415.     CALL    bdos
  416.     LD    HL,table3
  417.     CALL    prloop1
  418.     ret
  419. prloop1:
  420.     CALL    crlf
  421. prloop:
  422.     LD    A,(HL)    ;end-of-table?
  423.     OR    A
  424.     RET    Z    ;then all done
  425.     CALL    prathl    ;print the name
  426. tab::    LD    A,'.'    ;tab over with leader
  427.     CALL    type
  428.     LD    A,(column)    ;get column
  429.     CP    descol    ;at description column yet?
  430.     JP    C,tab    ;then keep tabbing
  431.     CALL    prathl    ;print description
  432.     INC    HL    ;skip over user #
  433.     INC    HL    ;and drive number
  434.     CALL    crlf    ;turn up new line
  435. ;
  436. ; pause for user input before continuing if screen end reached    
  437. ;
  438.     PUSH    HL        ;save HL
  439.     LD    HL,lincount    ;current linecount
  440.     LD    A,lines        ;# of lines permitted before pause
  441.     CP    (HL)        ;max # of lines yet?
  442.     JR    NZ,cprat    ;not yet - continue listing
  443. ;
  444. prtpause:
  445.     LD    DE,pausemsg    ;print pause message
  446.     LD    C,printf
  447.     CALL    bdos
  448. ;
  449. getinp:
  450.     LD    C,coninf    ;get user input
  451.     CALL    bdos            
  452.     AND    5FH
  453.     CP    'N'        ;Exit?
  454.     JR    Z,cprat2
  455.     CP     'C'-40h
  456.     JR    Z,cprat2
  457.     ld    c,conotf
  458.     ld    e,cr
  459.     CALL    bdos
  460.     XOR    A        ;CR - zero lincount
  461.     LD    (lincount),A
  462.     JR    cprat1
  463. cprat:    
  464.     INC    (HL)        ;bump line counter
  465. cprat1:
  466.     POP    HL        ;restore HL
  467. ;
  468.     JP    prloop    ;and continue printing list
  469.  
  470. cprat2:
  471.     POP    HL
  472.     POP    HL
  473.     POP    HL
  474.     RET
  475. ;
  476. ; print message @hl until null or 01 binary
  477. ;
  478. prathl::LD    A,(HL)    ;fetch char
  479.     INC    HL    ;point past it
  480.     OR    A    ;null?
  481.     RET    Z    ;then done
  482.     CP    1    ;1 also terminates
  483.     RET    Z
  484.     CALL    type    ;nope, print it
  485.     CALL    break    ;check for console abort
  486.     JP    prathl
  487. ;
  488. ; test for request from console to stop (^C)
  489. ;
  490. break::    PUSH    HL    ;save 'em all
  491.     PUSH    DE
  492.     PUSH    BC
  493.     LD    C,cstsf    ;get console sts request
  494.     CALL    bdos
  495.     OR    A    ;anything waiting?
  496.     JP    Z,brback    ;exit if not
  497.     LD    C,coninf    ;there, is, get it
  498.     CALL    bdos
  499.     CP    'S'-64    ;got pause request?
  500.     LD    C,coninf
  501.     CALL    Z,bdos    ;then wait for another character
  502.     CP    'C'-64    ;got abort request?
  503.     JP    Z,quit    ;then go abort
  504. brback::POP    BC    ;else restore and return
  505.     POP    DE
  506.     POP    HL
  507.     RET    
  508. ;
  509. ; request from console to abort
  510. ;
  511. quit::    LD    DE,qmesg    ;tell of quit
  512.     LD    C,printf
  513.     CALL    bdos
  514.     LD    HL,(spsave)    ;get stack pointer
  515.     LD    SP,HL
  516.     RET    
  517. ;
  518. qmesg::    DB    cr,lf,'==> Aborted',cr,lf,'$'
  519. ;
  520. ; turn up a new line on display
  521. ;
  522. crlf::    LD    A,cr    ;print a return
  523.     CALL    type
  524.     LD    A,lf    ;get lf, fall into type
  525. ;
  526. ; Routine to print char in A on console,
  527. ; while maintaining column number. 
  528. ;
  529. type::    PUSH    HL    ;save everybody
  530.     PUSH    DE
  531.     PUSH    BC
  532.     LD    E,A    ;align char for printing
  533.     PUSH    AF    ;save char
  534.     LD    C,conotf
  535.     CALL    bdos    ;print it
  536.     POP    AF    ;restore char
  537.     LD    HL,column    ;bump column counter
  538.     CP    lf    ;linefeed doesn't chang column
  539.     JP    Z,nochg
  540.     INC    (HL)
  541.     CP    cr    ;carriage-return zeroes it
  542.     JP    NZ,nochg    ;skip if not cr
  543.     LD    (HL),0    ;is, zero column
  544. nochg::    POP    BC    ;restore & return
  545.     POP    DE
  546.     POP    HL
  547.     RET    
  548. ;
  549. ; dump heading message
  550. ;
  551. signon:    DB    cr,lf,'Micro/Access SECTION  9/4/85',cr,lf,'$' 
  552. ;
  553. tblmsg: DB    cr,lf,'Currently available sections:',cr,lf,'$'
  554. ;
  555. tbl1msg: DB    cr,lf,'Current ZCPR-CP/M sections:',cr,lf,'$'
  556. ;
  557. tbl2msg: DB    cr,lf,'Current PC/XT/AT sections:',cr,lf,'$'
  558. ;
  559. tbl3msg: DB    cr,lf,'Current MAC sections:',cr,lf,'$'
  560. ;
  561. rstrmsg: DB    cr,lf,'==> Restricted',cr,lf,'$'
  562. ;
  563. pausemsg: DB    '>>> MORE? <Y/N> - $'    
  564. ;
  565. ; message printed when match failed
  566. ;
  567. matmsg::DB    cr,lf,'==> ??? Section'
  568.     DB    cr,lf,'$'
  569. matms2:
  570.     DB    cr,lf,lf,'Type "SECTION <section-name>" to log into a section.'
  571.     DB    cr,lf
  572.     DB    '"SECTION ?" - detailed list of ALL sections',cr,lf
  573.     DB    '?P - PC/XT/AT sections',cr,lf
  574.     DB    '?Z - 8080/Z80/HD64180 sections',cr,lf
  575.     DB    '?M - MAC sections',cr,lf
  576.     DB    '"SECTION" alone prints available section names' 
  577.     DB    cr,lf,'$'
  578. ;
  579. ;    Patch command to execute here
  580. ;
  581. cmd: DB    'DIR',0,'$'        ;command to execute after changing sections
  582.                 ;'$' is to delimit transfer to cmdbuffer,
  583.                 ;cmd itself must always end with 0 for ZCPR2/3.
  584. ;
  585. ; variables
  586. ;
  587. spsave: DW    0    ;stack-pointer save
  588. savecmd: DW     0    ;pointer to section command in buffer 
  589. column: DB    0    ;current column #
  590. lincount: DB    0    ;current line printed
  591. lastdrv: DS    1    ;drive/user before execution
  592. newdrive: DS    1    ;requested drive/user
  593. drive:    DS    1    ;requested drive
  594. user:    DS    1    ;requested user    
  595.     DS    40    ;the stack
  596. ;
  597. stack    EQU    $    ;define it
  598. ;
  599. ;
  600. ;
  601. ;
  602. ; SECTIONS TABLE (located at end for easy patching with ZSID)
  603. ;
  604. ; This is the table that defines the sections.    Entry format is:
  605. ;
  606. ;    <name>,sep,<description>,null,user,drive
  607. ;
  608. ; where <name>           is the section name
  609. ;    sep           is a binary 1 used to terminate the match test
  610. ;    <description>  is a one-line-or-less comment printed when
  611. ;               the list is dumped.  Match testing terminates
  612. ;               before this field.
  613. ;    null           is a binary 0 used to terminate the description
  614. ;    user           is the user number (0-15) of the section (ascii)
  615. ;    drive           is the drive (A-P) number of the section (ascii)
  616. ;
  617. ; the table ends with a <name> of zero (binary).
  618. ;
  619. ; Note: be sure to make section names ALL-CAPS, because the
  620. ;    CCP converts command-line arguments to capitals. The
  621. ;    description may be in lower case, since it has nothing
  622. ;    to do with the matching process.
  623. ; Also: although the drive and user # is in ascii (for convenience
  624. ;    in setting up the table), be sure to use caps for the
  625. ;    drive designation.  No error checking is done on the values.
  626. ;
  627. table:
  628.     DB    'UPLOADS',1,'Recent User Uploads',0,'0B'
  629.     DB    'DOCS',1,'Documentation & Text',0,'0C'
  630.     DB    'TRACE',1,'TRACE Computer Club Related Files',0,'DE'
  631.     DB    0    ;<<== end of table 0
  632. table1:
  633.     DB    'APPLE-80',1,'Apple CP/M-ZCPR Programs',0,'5C'
  634.     DB    'ASM-80',1,'Z80/HD64180 Assembly Language Area',0,'1B'
  635.     DB    'BBS-80',1,'Remote Communication for ZCPR-CP/M',0,'6B'
  636.     DB    'C-80',1,'C Language Area for ZCPR-CP/M',0,'3C'
  637.     DB    'CATS-80',1,'SIG/M, CP/MUG Catalogs',0,'BB'
  638.     DB    'COMM-80',1,'Modem programs for ZCPR-CP/M',0,'4B'
  639.     DB    'CPM-86',1,'CP/M-86 Area',0,'2E'
  640.     DB    'DBASE',1,'DBASEII programs',0,'AC'
  641.     DB    'EMX',1,'Simon Ewins'' remote message/software system',0,'4C'
  642.     DB    'S100',1,'Source for Multiflex, other S100',0,'8C'
  643.     DB    'SYS-80',1,'ZCPR-CP/M System Files',0,'2B'
  644.     DB    'UTIL-80',1,'ZCPR-CP/M Utilities',0,'3B'
  645.     DB    'VIDTEK',1,'Source for SBC-80, JLS BB',0,'6C'
  646.     DB    'WORD-80',1,'Word-processing related files',0,'9C'
  647.     DB    'XEROX',1,'Source for XEROX 820-I',0,'7C'
  648.     DB    'ZCPR2',1,'ZCPR2 processor for CP/M-80',0,'BC'
  649.     DB    'ZCPR3',1,'ZCPR3 processor for CP/M-80',0,'CC'
  650.     DB    0    ;<<== end of table1
  651. table2:
  652.     DB    'PC-COMM',1,'Modem programs for PC/XT/AT',0,'1D'
  653.     DB    'PC-GAME',1,'Games for PC/XT/AT',0,'4D'
  654.     DB    'PC-KERMIT',1,'Columbia U''s Communications Program',0,'3E'
  655.     DB    'PC-MASM',1,'8086/286 Assembly Language Source',0,'7D'
  656.     DB    'PC-PROG',1,'General Program Area',0,'8D'
  657.     DB    'PC-RBBS',1,'Remote system software',0,'6D'
  658.     DB    'PC-TURBO',1,'Turbo Pascal Files',0,'1E'
  659.     DB    'PC-UTIL1',1,'Utilities for IBM PC/XT/AT',0,'0D'
  660.     DB    'PC-UTIL2',1,'More PC/XT/AT Utilities',0,'2D'
  661.     DB    'PC-WORD',1,'Word processing related files',0,'5D'
  662.     DB    0    ;<<== end of table2
  663. table3:
  664.     DB    'MAC',1,'Apple MACINTOSH Area',0,'0F'    
  665.     DB    0    ;<<== end of table3
  666. ;
  667. ; -----< end of SECTIONS table>-----
  668. ;
  669.     END    pbase    ;that's all.
  670.