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 / ZSYS / SIMTEL20 / ZCPR3 / TCSELECT.MQC / TCSELECT.MAC
Text File  |  2000-06-30  |  12KB  |  607 lines

  1. ; ZCPR3 TCAP Facility (Z3TCAP)
  2. ; Program Name:  TCSELECT
  3. ; Author:  Richard Conn
  4. ; Version:  1.1
  5. ; Date:  1 Mar 85
  6. ; Previous Versions: 1.0 (10 Mar 84)
  7. version    equ    11
  8.  
  9. ; Version 1.1 by Richard Conn: Added FILENABLE equate to allow writing
  10. ; files to disk.  If FILENABLE is FALSE, TCSELECT may only store in memory.
  11.  
  12. ;
  13. ;    TCSELECT allows the user to select an entry from a Z3TCAP.TCP
  14. ; file and store it into memory or a Z3T file.  TCSELECT is menu-driven.
  15. ; TCSELECT may be assembled to disable the ability to create a disk file
  16. ; (specifically for Z-NODE operation).
  17. ;
  18.  
  19. ;
  20. ;  Basic Equates
  21. ;
  22. false    equ    0
  23. true    equ    not false
  24. filenable    equ    true 
  25. entcnt    equ    20    ;number of entries per screen
  26. z3env    SET    0f400h    ;ZCPR3 Environment Descriptor
  27. fcb    equ    5ch
  28. tbuff    equ    80h
  29. ctrlc    equ    'C'-'@'
  30. cr    equ    0dh
  31. lf    equ    0ah
  32.  
  33. ;
  34. ;  ZCPR3 and SYSLIB References
  35. ;
  36.     ext    z3init,qprint,z3log,getenv
  37.     ext    codend,moveb
  38.     ext    print,pfn1,pstr,capine,crlf,cout,pafdc,comphd
  39.     ext    initfcb,pfind,f$open,f$read,r$read,f$close
  40.     ext    f$exist,gfa
  41.     ext    putud,getud,logud
  42. ;
  43.     if    filenable
  44.     ext    f$make,f$write,f$delete
  45.     endif
  46.  
  47. ;
  48. ; Environment Definition
  49. ;
  50.     if    z3env ne 0
  51. ;
  52. ; External ZCPR3 Environment Descriptor
  53. ;
  54.     jmp    start
  55.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  56.     db    1    ;External Environment Descriptor
  57. z3eadr:
  58.     dw    z3env
  59. start:
  60.     lhld    z3eadr    ;pt to ZCPR3 environment
  61. ;
  62.     else
  63. ;
  64. ; Internal ZCPR3 Environment Descriptor
  65. ;
  66.     MACLIB    Z3BASE.LIB
  67.     MACLIB    SYSENV.LIB
  68. z3eadr:
  69.     jmp    start
  70.     SYSENV
  71. start:
  72.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  73.     endif
  74.  
  75. ;
  76. ; Start of Program -- Initialize ZCPR3 Environment
  77. ;
  78.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  79.  
  80. ;
  81. ; Print Banner
  82. ;
  83.     call    qprint
  84.     db    'TCSELECT, Version '
  85.     db    (version/10)+'0','.',(version mod 10)+'0'
  86.     db    cr,lf,0
  87.  
  88. ;
  89. ; Check for Entry in FCB
  90. ;
  91.     lda    fcb+1    ;get first char
  92.     cpi    '/'    ;none if slash
  93.     jnz    start1
  94. ;
  95. ; Print Help Info
  96. ;
  97. help:
  98.     call    print
  99.     db    'TCSELECT - Select Entry from Z3TCAP.TCP'
  100. ;
  101.     if    filenable
  102. ;
  103.     db    cr,lf,'Syntax:'
  104.     db    cr,lf,'    TCSELECT outfile  -or-  TCSELECT outfile.typ'
  105.     db    cr,lf
  106.     db    cr,lf,'where "outfile" is the file to be generated by'
  107.     db    cr,lf,'the execution of TCSELECT.  If no file type is'
  108.     db    cr,lf,'given, a file type of Z3T is the default.'
  109.     db    cr,lf
  110. ;
  111.     endif
  112. ;
  113.     db    cr,lf,'Syntax:'
  114.     db    cr,lf,'    TCSELECT'
  115.     db    cr,lf
  116.     db    cr,lf,'where this alternate form may be used to store'
  117.     db    cr,lf,'the Z3TCAP entry for the selected terminal directly'
  118.     db    cr,lf,'into the Z3 Environment Descriptor.'
  119.     db    0
  120.     ret
  121. ;
  122. ; Resume Processing
  123. ;
  124. start1:
  125. ;
  126.     if    filenable
  127. ;
  128. ; Set Default File Type if None
  129. ;
  130.     lxi    d,fcb+9        ;pt to file type
  131.     lxi    h,deftyp    ;pt to default file type
  132.     mvi    b,3        ;3 bytes
  133.     ldax    d        ;get first char
  134.     cpi    ' '        ;none if space
  135.     cz    moveb        ;set default file type
  136. ;
  137.     endif
  138. ;
  139. ; Begin Reading Z3TCAP.TCP
  140. ;
  141.     call    putud        ;save current location
  142.     lxi    d,z3tfcb    ;try to open Z3TCAP.TCP
  143.     call    initfcb        ;init FCB
  144.     mvi    a,0ffh        ;search current also
  145.     call    pfind        ;look for file
  146.     jnz    start2        ;file found
  147. ;
  148. ; File Z3TCAP.TCP Not Found
  149. ;
  150. fnferr:
  151.     call    print
  152.     db    'File ',0
  153.     lxi    d,z3tfcb+1    ;print file name
  154.     call    pfn1
  155.     call    print
  156.     db    ' Not Found - Aborting',0
  157.     ret
  158. ;
  159. ; Extract Z3TCAP Index
  160. ;
  161. start2:
  162.     call    logud        ;log into DU in BC
  163.     lxi    d,z3tfcb    ;pt to FCB
  164.     call    f$open        ;open file
  165.     jnz    fnferr
  166.     call    codend        ;read file into buffer
  167.     mvi    c,0        ;set block counter
  168.  
  169. ;
  170. ; Load Z3TCAP Index
  171. ;
  172. loadi:
  173.     inr    c        ;increment block counter
  174.     push    b
  175.     lxi    d,z3tfcb    ;pt to FCB
  176.     call    f$read        ;read next block
  177.     jnz    rerr        ;read error
  178.     lxi    d,tbuff        ;copy from TBUFF
  179.     push    h        ;save ptr to this block
  180.     xchg
  181.     mvi    b,128        ;128 bytes
  182.     call    moveb
  183.     pop    h        ;pt to this block
  184.     lxi    d,16        ;every 16
  185.     mvi    b,8        ;8 entries possible
  186. ;
  187. ; Check for End of Index
  188. ;
  189. loadi1:
  190.     mov    a,m        ;end of index if space
  191.     cpi    ' '
  192.     jz    loadi2
  193.     dad    d        ;pt to next
  194.     dcr    b        ;count down
  195.     jnz    loadi1
  196.     pop    b        ;get count and load next
  197.     jmp    loadi        ;HL pts to next block to load
  198. ;
  199. ; Error in Reading File
  200. ;
  201. rerr:
  202.     pop    psw        ;clear stack
  203.     call    print
  204.     db    cr,lf,'File Read Error',0
  205.     ret
  206. ;
  207. ; Reached End of Index
  208. ;
  209. loadi2:
  210.     shld    z3tcver        ;save ptr to version number
  211. loadi3:
  212.     dad    d        ;compute address of next block after last
  213.     dcr    b
  214.     jnz    loadi3
  215.     shld    scratch        ;scratch area
  216.     pop    b        ;get record number of next block
  217.     mov    a,c
  218.     sta    rec1        ;save count
  219.     lxi    d,z3tfcb    ;close file
  220.     call    f$close
  221. ;
  222. ; Print menu of terminals
  223. ;
  224. menu:
  225.     mvi    a,1        ;set menu number
  226.     sta    menunum
  227.     call    codend        ;pt to first terminal
  228.     shld    curtable    ;save ptr
  229. menu1:
  230.     call    prmenu        ;print menu pted to by HL
  231.     call    print
  232.     db    cr,lf,'Enter Selection',0
  233.     call    chk1st        ;first menu?
  234.     lxi    h,lstmsg    ;pt to last message
  235.     cz    pstr
  236.     call    chknth        ;last menu?
  237.     lxi    h,nxtmsg    ;pt to next message
  238.     cz    pstr
  239.     call    print
  240.     db    ', or ^C to Exit - ',0
  241.     call    capine        ;get response
  242.     call    crlf        ;new line
  243.     cpi    ctrlc        ;abort?
  244.     rz
  245.     cpi    '+'        ;next?
  246.     jz    nxtmenu
  247.     cpi    '-'        ;last?
  248.     jz    lstmenu
  249.     sui    'A'        ;convert to digit
  250.     jc    menuerr        ;print error message
  251.     mov    c,a        ;result in C
  252.     mvi    a,entcnt-1    ;selection limit?
  253.     cmp    c        ;range error?
  254.     jc    menuerr
  255. ;
  256. ; Set ptr to menu entry
  257. ;    On input, C = offset in 20-terminal menu and MENUNUM is menu (1..)
  258. ;
  259.     lda    menunum        ;get menu number
  260.     dcr    a        ;adjust to 0 offset
  261.     mvi    d,0        ;HL = number
  262.     mov    e,a
  263.     lxi    h,0        ;init sum
  264.     mvi    b,entcnt    ;multiply by number of entries
  265. mult:
  266.     dad    d        ;+menunumber
  267.     dcr    b        ;count down
  268.     jnz    mult        ;B=0 on exit
  269.     dad    b        ;compute offset from record 1 for entry
  270.     jmp    lterm        ;load terminal now with offset in HL
  271. ;
  272. ; HL Now Contains Terminal Number (Zero Relative)
  273. ;
  274. lterm:
  275.     lda    rec1        ;get location of terminal data record 1
  276.     mov    c,a
  277.     dad    b        ;HL contains random record number of terminal
  278. ;
  279. ; HL Now Contains Random Record Number for Terminal in File (Zero Relative)
  280. ; Reopen Z3TCAP.TCP
  281. ;
  282.     lxi    d,z3tfcb    ;pt to FCB of file
  283.     call    initfcb        ;reinit it
  284.     call    f$open
  285. ;
  286. ; Position to Correct Record and Read it in
  287. ;
  288.     call    r$read        ;read random record in HL
  289.     call    f$close        ;close file
  290. ;
  291. ; Copy Into Scratch Area
  292. ;
  293.     lhld    scratch        ;pt to scratch area
  294.     lxi    d,tbuff        ;pt to TBUFF
  295.     xchg
  296.     mvi    b,128        ;128 bytes
  297.     call    moveb
  298.     xchg            ;HL pts to scratch
  299. ;
  300. ; Confirm Selection
  301. ;
  302.     call    print
  303.     db    cr,lf,'  Selected Terminal is: ',0
  304.     call    prent        ;print name
  305.     call    print
  306.     db    ' -- Confirm (Y/N)? ',0
  307.     call    capine        ;get input
  308.     call    crlf
  309.     cpi    'Y'
  310.     jnz    menu1        ;continue
  311. ;
  312. ; Check for FCB and do a memory fill if no file given
  313. ;
  314.     if    filenable
  315. ;
  316.     lda    fcb+1        ;anything in FCB?
  317.     cpi    ' '
  318.     jz    memory        ;place SCRATCH into Z3 Env Descriptor
  319. ;
  320. ; Create Target File
  321. ;
  322.     call    getud        ;return home
  323.     lxi    d,fcb        ;pt to FCB
  324.     call    z3log        ;log into proper directory
  325.     call    f$exist        ;test of presence of file
  326.     jz    make2        ;create file
  327.     call    gfa        ;get file attributes
  328.     ani    1        ;R/O?
  329.     jz    make1
  330.     call    print
  331.     db    cr,lf,'File ',0
  332.     lxi    d,fcb+1
  333.     call    pfn1
  334.     call    print
  335.     db    ' is Read/Only',0
  336.     ret
  337. make1:
  338.     call    f$delete    ;delete file
  339. make2:
  340.     call    f$make        ;create file
  341.     cpi    0ffh        ;error
  342.     jnz    writef
  343.     call    print
  344.     db    cr,lf,'File Create Error',0
  345.     ret
  346. ;
  347. ; Write Block to File
  348. ;
  349. writef:
  350.     lhld    scratch        ;pt to entry
  351.     lxi    d,tbuff        ;copy into buffer
  352.     mvi    b,128        ;128 bytes
  353.     call    moveb
  354.     lxi    d,fcb        ;pt to FCB
  355.     call    f$write        ;write block
  356.     jnz    werr
  357.     call    f$close        ;close file
  358.     call    print
  359.     db    cr,lf,'File ',0
  360.     lxi    d,fcb+1
  361.     call    pfn1
  362.     call    print
  363.     db    ' Created',0
  364.     ret
  365. ;
  366. ; Can't Write File
  367. ;
  368. werr:
  369.     call    print
  370.     db    cr,lf,'File Write Error',0
  371.     ret
  372. ;
  373.     endif        ;filenable -- MEMORY follows
  374.  
  375. ;
  376. ; Place Z3TCAP Entry into Z3 Environment Descriptor
  377. ;
  378. memory:
  379.     call    getenv        ;pt to env desc
  380.     lxi    d,80h        ;pt to TCAP entry
  381.     dad    d
  382.     xchg            ;DE pts to entry
  383.     lhld    scratch        ;pt to scratch area
  384.     mvi    b,128        ;copy 128 bytes
  385.     call    moveb
  386.     call    print
  387.     db    cr,lf,' ZCPR3 Environment Descriptor Loaded',0
  388.     ret
  389. ;
  390. ; Invalid Selection
  391. ;
  392. menuerr:
  393.     call    print
  394.     db    ' -- Error: Invalid Selection',0
  395.     jmp    menu1
  396. ;
  397. ; Advance to next menu
  398. ;
  399. nxtmenu:
  400.     call    chknth        ;at end?
  401.     jz    nmenu
  402.     call    print
  403.     db    ' -- Error: Already at Last Menu',0
  404.     jmp    menu1
  405. nmenu:
  406.     lhld    curtable    ;pt to current table
  407.     lxi    d,16*entcnt    ;advance to next
  408.     dad    d
  409.     shld    curtable
  410.     lda    menunum        ;increment menu number
  411.     inr    a
  412.     sta    menunum
  413.     jmp    menu1
  414. ;
  415. ; Backup to last menu
  416. ;
  417. lstmenu:
  418.     call    chk1st        ;at beginning?
  419.     jz    lmenu
  420.     call    print
  421.     db    ' -- Error: Already at First Menu',0
  422.     jmp    menu1
  423. lmenu:
  424.     lhld    curtable    ;pt to current table
  425.     lxi    d,-16*entcnt    ;backup
  426.     dad    d
  427.     shld    curtable
  428.     lda    menunum        ;decrement menu number
  429.     dcr    a
  430.     sta    menunum
  431.     jmp    menu1
  432. ;
  433. ; PRMENU
  434. ;    PRMENU performs the following functions:
  435. ;        1. Sets flag if at 1st menu
  436. ;        2. Sets flag if at last menu
  437. ;        3. Prints menu in 2 columns
  438. ;
  439. prmenu:
  440.     call    print
  441.     db    cr,lf,'** Terminal Menu ',0
  442.     lda    menunum        ;print menu number
  443.     call    pafdc        ;print as floating
  444.     call    print
  445.     db    ' for Z3TCAP Version ',0
  446.     lhld    z3tcver        ;get ptr to version
  447.     inx    h        ;pt to version number
  448. prmenu0:
  449.     mov    a,m        ;get char
  450.     inx    h        ;pt to next
  451.     call    cout        ;print char
  452.     cpi    ' '        ;done if space
  453.     jnz    prmenu0
  454.     call    print
  455.     db    ' **',cr,lf,cr,lf,0
  456.     xra    a
  457.     sta    m1flag        ;set not at 1st menu
  458.     sta    mnflag        ;set not at nth menu
  459. ;
  460. ; Determine if at 1st menu
  461. ;
  462.     call    codend        ;pt to terminal table
  463.     xchg            ;... in DE
  464.     lhld    curtable    ;set 1st menu flag
  465.     call    comphd        ;compare
  466.     jnz    prm1
  467.     mvi    a,0ffh        ;set flag
  468.     sta    m1flag
  469. ;
  470. ; Determine if at nth menu
  471. ;
  472. prm1:
  473.     push    h        ;save ptr to current table
  474.     lxi    d,16        ;size of table entry
  475.     mvi    b,entcnt    ;entcnt entries per screen
  476. prm2:
  477.     mov    a,m        ;end?
  478.     cpi    ' '        ;no entry?
  479.     jz    prm3
  480.     dad    d        ;advance
  481.     dcr    b        ;count down
  482.     jnz    prm2
  483.     jmp    prm4
  484. prm3:
  485.     mvi    a,0ffh        ;at nth menu
  486.     sta    mnflag        ;set flag
  487. ;
  488. ; Determine menu bounds
  489. ;
  490. prm4:
  491.     lxi    h,0        ;clear ptr to col2
  492.     shld    col2
  493.     pop    h        ;get ptr to current table
  494.     mvi    b,entcnt/2    ;try to advance entcnt/2 entries
  495. prm5:
  496.     mov    a,m        ;no next entry?
  497.     cpi    ' '
  498.     jz    prm6
  499.     dad    d        ;advance to next
  500.     dcr    b        ;count down
  501.     jnz    prm5
  502.     shld    col2        ;save ptr to column 2
  503. ;
  504. ; Print menu
  505. ;
  506. prm6:
  507.     lhld    col2        ;get ptr to column 2
  508.     xchg            ;... in DE
  509.     lhld    curtable    ;get ptr to column 1
  510.     mvi    b,entcnt/2    ;entcnt/2 lines max
  511.     mvi    c,'A'        ;current letter
  512. prm7:
  513.     mov    a,m        ;get first char?
  514.     cpi    ' '        ;done?
  515.     rz
  516.     mov    a,c        ;output letter
  517.     call    prentry        ;print entry
  518.     xchg            ;HL pts to col 2
  519.     mov    a,h        ;done?
  520.     ora    l
  521.     jz    prm8
  522.     mov    a,m        ;empty?
  523.     cpi    ' '
  524.     jz    prm8
  525.     mov    a,c        ;get char
  526.     adi    10        ;add offset
  527.     call    prentry
  528. prm8:
  529.     inr    c        ;increment menu letter
  530.     xchg            ;restore HL/DE
  531.     call    crlf
  532.     dcr    b        ;count down
  533.     jnz    prm7
  534.     ret
  535. ;
  536. ; Print entry whose letter is in A and whose text is pted to by HL
  537. ;   Advance HL
  538. ;
  539. prentry:
  540.     call    cout        ;output char
  541.     call    print
  542.     db    '.  ',0
  543. prent:
  544.     push    b        ;save regs
  545.     mvi    b,16        ;16 chars
  546. prent1:
  547.     mov    a,m        ;get char
  548.     inx    h        ;pt to next
  549.     call    cout        ;print char
  550.     dcr    b
  551.     jnz    prent1
  552.     call    print
  553.     db    '        ',0    ;separator
  554.     pop    b
  555.     ret
  556. ;
  557. ; Check to see if this is the first menu
  558. ;
  559. chk1st:
  560.     lda    m1flag        ;get flag
  561.     ora    a
  562.     ret
  563. ;
  564. ; Check to see if this is the last menu
  565. ;
  566. chknth:
  567.     lda    mnflag        ;get flag
  568.     ora    a
  569.     ret
  570. ;
  571. ; Buffers
  572. ;
  573. z3tfcb:
  574.     db    0
  575.     db    'Z3TCAP  TCP'
  576.     ds    24        ;36 bytes total
  577. ;
  578.     if    filenable
  579. ;
  580. deftyp:
  581.     db    'Z3T'        ;default file type
  582. ;
  583.     endif
  584. ;
  585. nxtmsg:
  586.     db    ', + for Next',0
  587. lstmsg:
  588.     db    ', - for Last',0
  589. m1flag:
  590.     ds    1    ;1st menu flag
  591. mnflag:
  592.     ds    1    ;nth menu flag
  593. col2:
  594.     ds    2    ;pointer to column 2 entries
  595. rec1:
  596.     ds    1    ;number of 1st data record
  597. menunum:
  598.     ds    1    ;number of current menu
  599. z3tcver:
  600.     ds    2    ;ptr to ZCPR3 TCAP Version Number
  601. scratch:
  602.     ds    2    ;ptr to scratch area
  603. curtable:
  604.     ds    2    ;current table ptr
  605.  
  606.     end
  607.