home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / CPM / RCPM / SECTION.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  12KB  |  470 lines

  1. ;
  2. ;
  3. ;    *****************
  4. ;    *        *
  5. ;    *  SECTION.ASM    *
  6. ;    *     v1.1    *
  7. ;    *        *
  8. ;    *****************
  9. ;
  10. ; 06/27/82 by Ron Fowler, Westland, Michigan
  11. ;
  12. ; 08/09/83 adapt for CP/M+ by Dick Lieber, Chicago Illinois  312-326-4392
  13. ;
  14. ; 04/20/84 adapted for CP/M+ with user numbers over 9
  15. ;          by James M. Scardelis, Director CP/M Plus Users' Group
  16. ;       P.O. Box 295, Little Falls, NJ 07424-0295
  17. ; This program is intended for RCPM systems where
  18. ; files are grouped into drive/user area by their
  19. ; classification.  This program implements a naming
  20. ; convention, whereby a caller can move into a
  21. ; section by typing its name, rather than the random
  22. ; searching formerly needed.
  23. ;
  24. ; Syntax is:  SECTION [<section-name>]
  25. ;
  26. ; If section-name is omitted, a short list of
  27. ; available sections is printed. The special
  28. ; form "SECTION ?" prints the detailed description
  29. ; of each section.
  30. ;
  31. ; You have to fill in the sections table
  32. ; (located near the end of this program) for your
  33. ; particular system.
  34. ;
  35. ;----< Examples of use: >-----
  36. ;
  37. ; A0>SECTION ATARI    ;changes drive/user to atari area
  38. ; B4>SECTION MBASIC    ;changes drive/user to mbasic area
  39. ; A6>SECTION        ;prints short list of sections
  40. ; A9>SECTION ?        ;prints the detailed list
  41. ;
  42. false    equ    0    ;define truth and falsehood
  43. true    equ    not false
  44. ;
  45. ; the following equates may be
  46. ; customized to your preference
  47. ;
  48. autodir equ    1        ;run directory command when new drive
  49.                 ;/user is selected.  Only works with
  50.                 ;cp/m+ but will be ignored in 2.2
  51. descol    equ    15        ;column # where description begins
  52.                 ;(in detailed list) (should be greater
  53.                 ;than longest section name) (but small
  54.                 ;enuf so display is not too long)
  55. perlin    equ    4        ;names printed per line in short list
  56. tabpos    equ    8        ;tab stops (set mod tabpos)
  57.                 ;should be at least one greater than
  58.                 ;longest section name.
  59. turbo    equ    false        ;set TRUE if you'er running TurboDOS
  60. ;
  61. ; o/s conventions
  62. ;
  63. cpbase    equ    0        ;set to 4200H for Heath
  64. ccpdrv    equ    cpbase+4    ;ccp user/drive storage loc
  65. bdos    equ    cpbase+5    ;system entry point
  66. dfcb    equ    cpbase+5CH    ;default file control block
  67. dbuf    equ    cpbase+80H    ;default buffer
  68. tpa    equ    cpbase+100H    ;base of transient program area
  69. coninf    equ    1        ;system call, get console char
  70. conotf    equ    2        ;system call, console output
  71. printf    equ    9        ;system call, print cons string
  72. cstsf    equ    11        ;system call, get console status
  73. version    equ    12        ;system call, return version
  74. setdrv    equ    14        ;system call, set/drive system call
  75. getdrv    equ    25        ;system call, get drive # system call
  76. gsuser    equ    32        ;system call, get/set user number
  77. chain    equ    47        ;system call, chain to ccp command (cpm+ only)
  78. ;
  79. ; character definitions
  80. ;
  81. cr    equ    13        ;carriage-return code
  82. lf    equ    10        ;linefeed code
  83. ;
  84. ; code begins....
  85. ;
  86.     org    tpa
  87. ;
  88. ;
  89. pbase:    lxi    h,0        ;save system stack
  90.     dad    sp
  91.     shld    spsave
  92.     lxi    sp,stack    ;load local stack
  93. ;
  94.     if    not turbo    ;cp/m, get drive #
  95.     mvi    c,getdrv    ;get current drive #
  96.     call    bdos
  97.     push    psw        ;save it
  98.     sta    newdrv        ;two ways
  99.     endif
  100. ;
  101.     call    sect        ;perform the section function
  102. ;
  103.     if    not turbo    ;turbodos doesn't need this stuff
  104.     lda    newdrv        ;get newly logged drive
  105.     mov    b,a        ;save for comparison
  106.     pop    psw        ;get old logged drive
  107.     cmp    b        ;did logged drive change?
  108.     jnz    cpbase        ;then relog with warm boot
  109.     endif
  110. ;
  111.     lhld    spsave        ;else restore stack
  112.     sphl
  113.     ret            ;to system...
  114. ;
  115. ; scan cmd line...if an arg exists, attempt to
  116. ; match it in the table.  If no arg, dump a list
  117. ; of available sections.
  118. ;
  119. sect:    lda    dfcb+1        ;is there a cmd-line arg?
  120.     cpi    ' '
  121.     jz    prnqk        ;then go print sections out
  122.     cpi    '?'        ;wants detailed list?
  123.     jz    prntbl        ;then go do it
  124.     lxi    h,dbuf        ;something there, scan to it
  125. scanbk: inx    h        ;  ignoring blanks
  126.     mov    a,m
  127.     cpi    ' '
  128.     jz    scanbk
  129.     lxi    d,table     ;point de to the section table
  130. loop:    push    h        ;save cmd line arg pointer
  131. eloop:    ldax    d        ;test entry against table
  132.     cpi    1        ;end of entry marker?
  133.     jnz    noend        ;jump if not
  134.     mov    a,m        ;yes, did user cmd terminate also?
  135.     ora    a
  136.     jz    match        ;then declare a match
  137.     jmp    nomat        ;else declare a mismatch
  138. noend:    cmp    m
  139.     jnz    nomat        ;skip if no match
  140.     inx    h        ;continue with comparison
  141.     inx    d
  142.     jmp    eloop
  143. ;
  144. ; here when an entry didn't match
  145. ;
  146. nomat:    ldax    d
  147.     ora    a        ;entry terminator?
  148.     inx    d
  149.     jnz    nomat        ;scan through it
  150.     pop    h        ;restore cmd line arg pntr
  151.     inx    d        ;end of entry, skip over user #
  152.     inx    d        ;and drive
  153.     ldax    d        ;end of table?
  154.     ora    a        ;(terminated by 0)
  155.     jnz    loop        ;go scan another if not
  156. ;
  157. ; here when no match can be found
  158. ;
  159.     lxi    d,matmsg    ;print out no-match message
  160.     mvi    c,printf
  161.     call    bdos
  162.     jmp    prnqk        ;go give short list
  163. ;
  164. ; here when a match is found
  165. ;
  166. match:    xchg            ;hl==> user #
  167. scmat:    inx    h        ;scan past description
  168.     mov    a,m        ;looking for terminating null
  169.     ora    a
  170.     jnz    scmat
  171.     inx    h        ;skip over terminator
  172.     mov    a,m        ;fetch user #
  173.     sui    '0'        ;subtract ascii bias
  174.     cpi    10        ;is it > 9?
  175.     jc    scmat2        ;no, so continue on
  176.     sui    7        ;remove the rest 
  177. scmat2:    mov    e,a
  178.     inx    h        ;point hl to drive #
  179.     push    d        ;save user #
  180.     push    h        ;and pointer
  181.     mvi    c,gsuser    ;set user number
  182.     call    bdos
  183.     pop    h        ;restore pointer to drive
  184.     mov    a,m        ;fetch drive
  185.     sui    'A'        ;subtract ascii bias
  186.     sta    newdrv        ;set new logged drive
  187.     pop    d        ;restore user number in e
  188.     mov    d,a        ;save drive #
  189.     mov    a,e        ;fetch user number
  190.     rlc            ;rotate to high nybble
  191.     rlc
  192.     rlc
  193.     rlc
  194.     ora    d        ;"or" in the drive
  195.     sta    ccpdrv        ;save for ccp use
  196. ;
  197. ;    if    turbo        ;if turbodos...
  198.     push    h
  199.     mvi    c,setdrv    ;...have to set drive explicitly
  200.     mov    e,d        ;get drive in e
  201.     call    bdos        ;set the drive
  202.     pop    h
  203. ;    endif
  204. ;
  205.     pop    d        ;clear garbage from stack
  206. ;
  207. ;    cpm+ stuff  -- setting user/drive at 4 is an undocumented
  208. ;               feature of cp/m 2.2, it has no effect on version 3
  209. ;
  210.     push    h
  211.     mvi    c,version
  212.     call    bdos
  213.     mvi    a,30h        ;version that supports chain
  214.     cmp    l
  215.     pop    d
  216.     rnc            ;all done if not cp/m+
  217. ;
  218. ;    move user/drive from table to default buffer
  219.     lxi    h,80h
  220.     ldax    d    ;get drive
  221.     mov    m,a
  222.  
  223.     inx    h
  224.     dcx    d
  225.     ldax    d    ;get user
  226.     cpi    'A'     ; is it a letter?
  227.     jc    fin
  228.     inx    h    ; yes, so move to second position in d/u spec.
  229.     sui    17    ; subtract bias
  230.     mov    m,a    ; save it
  231.     dcx    h    ; go back to first position.
  232.     mvi    a,'1'    ; first digit is always a one now.
  233.     mov     m,a    ; put it there
  234.     inx    h    ; and set H for next routine
  235.     jmp    fin2    ;and do it.
  236.  
  237. fin:    mov    m,a
  238.  
  239. fin2:    inx    h
  240.     mvi    m,':'    ;to indicate user/drive request
  241.     if    autodir
  242.     inx    h
  243.     mvi    m,'!'    ;command seperator
  244.     inx    h
  245.     mvi    m,'D'
  246.     inx    h
  247.     mvi    m,'I'
  248.     inx    h
  249.     mvi    m,'R'
  250.     endif
  251.     inx    h
  252.     mvi    m,0    ;mark end of command buffer
  253.  
  254.     mvi    c,chain
  255.     mvi    e,0        ;flag to make current drive/user ccp default
  256.     call    bdos
  257.     
  258.  
  259. ;
  260. ; message printed when match failed
  261. ;
  262. matmsg: db    cr,lf,'++ Entry not found ++'
  263.     db    cr,lf,cr,lf,'$'
  264. matms2: db    cr,lf,'Type "SECTION ?" for detailed list'
  265.     db    cr,lf,'      of available sections.',cr,lf
  266.     db    cr,lf,'Type "SECTION <section-name>" to log'
  267.     db    cr,lf,'      into a particular section.'
  268.     db    cr,lf,'$'
  269. ;
  270. ; print "quick list"
  271. ;
  272. prnqk:    lxi    d,tblmsg
  273.     mvi    c,printf
  274.     call    bdos
  275.     lxi    h,table     ;print abbreviated list
  276. qloop:    mvi    b,perlin    ;get names-per-line counter
  277. qloop2: mov    a,m        ;end of table?
  278.     ora    a
  279.     jz    qkend        ;then go print end msg
  280.     call    prathl        ;else print the name
  281. qscan:    mov    a,m        ;scan to description terminator
  282.     inx    h        ;(this effectively ignores
  283.     ora    a        ; the description)
  284.     jnz    qscan
  285.     inx    h        ;skip over user #
  286.     inx    h        ;and drive #
  287.     dcr    b        ;count down line entry counter
  288.     jnz    qtab        ;go tab if line not full
  289.     call    crlf        ;else turn up new line
  290.     jmp    qloop        ;and continue
  291. ;
  292. ; tab between entry names
  293. ;
  294. qtab:    mvi    a,' '        ;seperate names with tabs
  295.     call    type
  296.     lda    column        ;get column #
  297. qsub:    sui    tabpos        ;test tab position
  298.     jz    qloop2        ;continue if at a tab position
  299.     jnc    qsub        ;convert mod tabpos
  300.     jmp    qtab        ;keep tabbing
  301. ;
  302. qkend:    call    crlf        ;do newline
  303.     lxi    d,matms2    ;print ending message
  304.     mvi    c,printf
  305.     call    bdos
  306.     call    crlf
  307.     ret
  308. ;
  309. ; here to print out a list of available section numbers
  310. ;
  311. prntbl: lxi    d,tblmsg    ;print heading message
  312.     mvi    c,printf
  313.     call    bdos
  314.     call    crlf        ;turn up new line
  315.     lxi    h,table
  316. prloop: mov    a,m        ;end-of-table?
  317.     ora    a
  318.     rz            ;then all done
  319.     call    prathl        ;print the name
  320. tab:    mvi    a,'.'        ;tab over with leader
  321.     call    type
  322.     lda    column        ;get column
  323.     cpi    descol        ;at description column yet?
  324.     jc    tab        ;then keep tabbing
  325.     call    prathl        ;print description
  326.     inx    h        ;skip over user #
  327.     inx    h        ;and drive number
  328.     call    crlf        ;turn up new line
  329.     jmp    prloop        ;and continue
  330. ;
  331. ; print message @hl until null or 01 binary
  332. ;
  333. prathl: mov    a,m        ;fetch char
  334.     inx    h        ;point past it
  335.     ora    a        ;null?
  336.     rz            ;then done
  337.     cpi    1        ;1 also terminates
  338.     rz
  339.     call    type        ;nope, print it
  340.     call    break        ;check for console abort
  341.     jmp    prathl
  342. ;
  343. ; test for request from console to stop (^C)
  344. ;
  345. break:    push    h        ;save 'em all
  346.     push    d
  347.     push    b
  348.     mvi    c,cstsf     ;get console sts request
  349.     call    bdos
  350.     ora    a        ;anything waiting?
  351.     jz    brback        ;exit if not
  352.     mvi    c,coninf    ;there, is, get it
  353.     call    bdos
  354.     cpi    'S'-64        ;got pause request?
  355.     mvi    c,coninf
  356.     cz    bdos        ;then wait for another character
  357.     cpi    'C'-64        ;got abort request?
  358.     jz    quit        ;then go abort
  359. brback: pop    b        ;else restore and return
  360.     pop    d
  361.     pop    h
  362.     ret
  363. ;
  364. ; request from console to abort
  365. ;
  366. quit:    lxi    d,qmesg     ;tell of quit
  367.     mvi    c,printf
  368.     call    bdos
  369.     lhld    spsave        ;get stack pointer
  370.     sphl
  371.     ret
  372. ;
  373. qmesg:    db    cr,lf,'++ Aborted ++',cr,lf,'$'
  374. ;
  375. ; turn up a new line on display
  376. ;
  377. crlf:    mvi    a,cr        ;print a return
  378.     call    type
  379.     mvi    a,lf        ;get lf, fall into type
  380. ;
  381. ; Routine to print char in A on console,
  382. ; while maintaining column number. 
  383. ;
  384. type:    push    h        ;save everybody
  385.     push    d
  386.     push    b
  387.     mov    e,a        ;align char for printing
  388.     push    psw        ;save char
  389.     mvi    c,conotf
  390.     call    bdos        ;print it
  391.     pop    psw        ;restore char
  392.     lxi    h,column    ;bump column counter
  393.     cpi    lf        ;linefeed doesn't chang column
  394.     jz    nochg
  395.     inr    m
  396.     cpi    cr        ;carriage-return zeroes it
  397.     jnz    nochg        ;skip if not cr
  398.     mvi    m,0        ;is, zero column
  399. nochg:    pop    b        ;restore & return
  400.     pop    d
  401.     pop    h
  402.     ret
  403. ;
  404. ; dump heading message
  405. ;
  406. tblmsg: db    cr,lf,'Available sections are:',cr,lf,'$'
  407.  
  408. ;
  409. ;
  410. ; variables
  411. ;
  412. spsave: dw    0        ;stack-pointer save
  413. column: db    0        ;current column #
  414. newdrv: db    0        ;new drive # to log
  415.     ds    20        ;the stack
  416. ;
  417. stack    equ    $        ;define it
  418. ;
  419. ;
  420. ;
  421. ;
  422. ; SECTIONS TABLE (located at end for easy patching with DDT)
  423. ;
  424. ; This is the table that defines the sections.    Entry format is:
  425. ;
  426. ;    <name>,sep,<description>,null,user,drive
  427. ;
  428. ; where <name>           is the section name
  429. ;    sep           is a binary 1 used to terminate the match test
  430. ;    <description>  is a one-line-or-less comment printed when
  431. ;               the list is dumped.  Match testing terminates
  432. ;               before this field.
  433. ;    null           is a binary 0 used to terminate the description
  434. ;    user           is the user number (0-15) of the section (ascii)
  435. ;    drive           is the drive (A-P) number of the section (ascii)
  436. ;
  437. ; the table ends with a <name> of zero (binary).
  438. ;
  439. ; Note: be sure to make section names ALL-CAPS, because the
  440. ;    CCP converts command-line arguments to capitals. The
  441. ;    description may be in lower case, since it has nothing
  442. ;    to do with the matching process.
  443. ; Also: although the drive and user # is in ascii (for convenience
  444. ;    in setting up the table), be sure to use caps for the
  445. ;    drive designation.  No error checking is done on the values.
  446. ;
  447. table:    DB    'ARCHIVE',1,'Archives - .LBR files',0,'1A'
  448.     db    'ASSEM',1,'Assembly Language Sources',0,'3B'
  449.     db    'BASIC',1,'BASIC Language Sources',0,'5B'
  450.     db    'BIOS',1,'This system''s BIOS',0,'FB'
  451.     db    'C',1,'C Language Sources',0,'9B'
  452.     db    'CPPLUG',1,'CP/M Plus User''s Group Library - .LBR Files',0,'7B'
  453.     db    'DBASE',1,'dBase II Sources and Database',0,'6B'
  454.     db    'DOCS',1,'Documentation - .LBR Files',0,'8B'
  455.     db    'GAMES',1,'Games - .LBR Files',0,'4B'
  456.     db    'HDUTIL',1,'Hard Disk Utilities',0,'FA'
  457.     db    'OTHER',1,'Whatever fails classification',0,'BB'
  458.     db    'PASCAL',1,'PASCAL Language Sources',0,'2B'
  459.     db    'PL/I',1,'PL/I Language Sources',0,'1B'
  460.     db    'SYSTEMA',1,'System Files - No Access',0,'0A'
  461.     db    'SYSTEMB',1,'System Files - No Access',0,'0B'
  462.     db    'UPLOADS',1,'Recently Uploaded Software',0,'AB'
  463.     db    0        ;<<== end of table
  464. ;
  465. ; -----< end of SECTIONS table>-----
  466. ;
  467.     end    pbase        ;that's all.
  468.