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 / DEVICE.MAC < prev    next >
Text File  |  2000-06-30  |  11KB  |  577 lines

  1. ;
  2. ;  PROGRAM:  DEVICE3
  3. ;  AUTHOR:  RICHARD CONN
  4. ;  VERSION:  1.0
  5. ;  DATE:  4 Apr 84
  6. ;  PREVIOUS VERSION:  None
  7. ;  DERIVATION:  DEVICE2 from ZCPR2
  8. ;
  9. VERS    EQU    10
  10. z3env    SET    0f400h
  11.  
  12. ;
  13. ;    DEVICE is a program which enables the user to manipulate the
  14. ; extended ZCPR3 redirectable device drivers.  It allows the user to
  15. ; perform the following functions:
  16. ;
  17. ;        o Display the Names of the Current Devices
  18. ;        o Set One or More of the Current Devices
  19. ;        o Ask for Help
  20. ;
  21. ;    The format of the DEVICE command is:
  22. ;
  23. ;        DEVICE        <-- Enter Interactive Mode
  24. ;        DEVICE //    <-- Ask for Help
  25. ;
  26. ;    In Interactive Mode, DEVICE commands are:
  27. ;
  28. ;        DISPLAY ALL    <-- Display Names of All Devices
  29. ;        DISPLAY CON    <-- Display Names of Consoles
  30. ;        DISPLAY LST    <-- Display Names of Printers
  31. ;        DISPLAY RDR    <-- Display Names of Readers
  32. ;        DISPLAY PUN    <-- Display Names of Punches
  33. ;
  34. ;        CON: name    <-- Select Console
  35. ;        LST: name    <-- Select Printer
  36. ;        RDR: name    <-- Select Reader
  37. ;        PUN: name    <-- Select Punch
  38. ;
  39.  
  40. ;
  41. ;  Constants
  42. ;
  43. fcb    equ    5ch
  44. cr    equ    0dh
  45. lf    equ    0ah
  46.  
  47. ;
  48. ;  SYSLIB Routines
  49. ;
  50.     ext    z3init,getiop
  51.     ext    cin,cout,epstr,eprint,cline,bline,codend,caps
  52.  
  53. ;
  54. ; Environment Definition
  55. ;
  56.     if    z3env ne 0
  57. ;
  58. ; External ZCPR3 Environment Descriptor
  59. ;
  60.     jmp    start
  61.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  62.     db    1    ;External Environment Descriptor
  63. z3eadr:
  64.     dw    z3env
  65. start:
  66.     lhld    z3eadr    ;pt to ZCPR3 environment
  67. ;
  68.     else
  69. ;
  70. ; Internal ZCPR3 Environment Descriptor
  71. ;
  72.     MACLIB    Z3BASE.LIB
  73.     MACLIB    SYSENV.LIB
  74. z3eadr:
  75.     jmp    start
  76.     SYSENV
  77. start:
  78.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  79.     endif
  80.  
  81. ;
  82. ; Start of Program -- Initialize ZCPR3 Environment
  83. ;
  84.     call    z3init    ;initialize the ZCPR3 Env and the VLIB Env
  85.  
  86. ;
  87. ;  Start of Program
  88. ;
  89.  
  90.     call    getiop    ;check for initialization
  91.     mov    a,h
  92.     ora    l    ;must NOT be zero
  93.     jnz    start0
  94.     call    banner
  95.     call    eprint
  96.     db    cr,lf,'DEVICE NOT Initialized with I/O Base',0
  97. abort:
  98.     call    eprint
  99.     db    ' -- Aborting',0
  100.     ret
  101.  
  102. start0:
  103.     call    status    ;check for drivers
  104.     jnz    start1
  105.     call    banner
  106.     call    eprint
  107.     db    cr,lf,'Redirection Not Supported',0
  108.     jmp    abort
  109.  
  110. start1:
  111.     lda    fcb+1    ;get first char of argument
  112.     cpi    '/'    ;help?
  113.     jnz    command    ;run command subroutine
  114.  
  115. ;
  116. ;  Print Help Message
  117. ;
  118. help:
  119.     call    banner
  120.     call    eprint
  121.     db    cr,lf,'DEVICE - Interactive Redirectable I/O Driver Selection'
  122.     db    cr,lf,'Syntax:'
  123.     db    cr,lf,'   DEVICE      <-- Enter Interactive Mode'
  124.     db    cr,lf,'   DEVICE //   <-- Print Help Message'
  125.     db    0
  126.     ret
  127. ;
  128. ; Print General Help Message
  129. ;
  130. genhelp:
  131.     call    eprint
  132.     db    'Enter Command Character:'
  133.     db    cr,lf,'  D - Display all or selected devices'
  134.     db    cr,lf,'  C - Select Console Device'
  135.     db    cr,lf,'  L - Select List Device'
  136.     db    cr,lf,'  P - Select Punch Device'
  137.     db    cr,lf,'  R - Select Reader Device'
  138.     db    cr,lf,'  X - Exit Program'
  139.     db    0
  140.     ret
  141. ;
  142. ; Print Display Help Message
  143. ;
  144. disphelp:
  145.     call    eprint
  146.     db    cr,lf,'Enter Devices to Display:'
  147.     db    cr,lf,'  A - All'
  148.     db    cr,lf,'  C - Consoles'
  149.     db    cr,lf,'  L - Lists'
  150.     db    cr,lf,'  P - Punches'
  151.     db    cr,lf,'  R - Readers'
  152.     db    0
  153.     ret
  154. ;
  155. ; Print Banner
  156. ;
  157. banner:
  158.     call    eprint
  159.     db    'DEVICE3, Version '
  160.     db    (vers/10)+'0','.',(vers mod 10)+'0',0
  161.     ret
  162. ;
  163. ;  Skip to Non-Blank Routine
  164. ;
  165. sblank:
  166.     mov    a,m    ;get char
  167.     inx    h    ;pt to next
  168.     cpi    ' '    ;blank?
  169.     jz    sblank    ;continue if so
  170.     dcx    h    ;pt to non-blank
  171.     ret
  172.  
  173. ;
  174. ;  COMMAND -- This is an interactive mainline which allows user input,
  175. ;    runs command lines via DOCMD, and permits Help and Comments
  176. ;
  177. command:
  178.     call    banner
  179.     call    eprint
  180.     db    ' - Interactive I/O Device Selection Utility'
  181.     db    cr,lf,'Strike ? for Help'
  182.     db    0
  183. cloop:
  184.     call    eprint
  185.     db    cr,lf,'DEVICE3 Command? ',0
  186.     lxi    h,majcmd    ;process major command
  187.     call    ccheck    ;look for and run command
  188.     mov    a,b    ;get char
  189.     call    cout    ;echo it
  190.     call    eprint
  191.     db    ' - Invalid Command',0
  192.     jmp    cloop
  193. ;
  194. ; Command Table for Major Commands
  195. ;
  196. majcmd:
  197.     db    '?'    ;help
  198.     dw    genhelp
  199.     db    ' '    ;skip command
  200.     dw    exit1
  201.     db    cr    ;skip command
  202.     dw    exit1
  203.     db    'D'    ;display devices
  204.     dw    display
  205.     db    'C'    ;Select Console
  206.     dw    console
  207.     db    'L'    ;Select List
  208.     dw    list
  209.     db    'P'    ;Select Punch
  210.     dw    punch
  211.     db    'R'    ;Select Reader
  212.     dw    reader
  213.     db    'X'    ;Exit
  214.     dw    exit
  215.     db    0    ;end of table
  216. ;
  217. ; Display major command
  218. ;
  219. display:
  220.     pop    psw    ;clear return address
  221.     call    eprint
  222.     db    'Display Devices for ',0
  223.     lxi    h,discmd    ;table of display commands
  224.     call    ccheck
  225.     mov    a,b
  226.     call    cout    ;print error command
  227.     call    eprint
  228.     db    ' - Invalid Command',cr,lf,0
  229.     jmp    display
  230. ;
  231. ; Display Command Table
  232. ;
  233. discmd:
  234.     db    '?'    ;help
  235.     dw    disphelp
  236.     db    cr    ;exit
  237.     dw    exit1
  238.     db    ' '    ;exit
  239.     dw    exit1
  240.     db    'A'    ;all
  241.     dw    dispall
  242.     db    'C'    ;console
  243.     dw    dispcon
  244.     db    'L'    ;list
  245.     dw    displst
  246.     db    'P'    ;punch
  247.     dw    disppun
  248.     db    'R'    ;reader
  249.     dw    disprdr
  250.     db    0    ;end of table
  251.  
  252. ;
  253. ; Console major command
  254. ;
  255. console:
  256.     call    eprint
  257.     db    'Select Console ',0
  258.     call    getname
  259.     mvi    a,0    ;select CON:
  260.     jmp    assign
  261. ;
  262. ; List major command
  263. ;
  264. list:
  265.     call    eprint
  266.     db    'Select List ',0
  267.     call    getname
  268.     mvi    a,3    ;select LST:
  269.     jmp    assign
  270. ;
  271. ; Punch major command
  272. ;
  273. punch:
  274.     call    eprint
  275.     db    'Select Punch ',0
  276.     call    getname
  277.     mvi    a,2    ;select PUN:
  278.     jmp    assign
  279. ;
  280. ; Reader major command
  281. ;
  282. reader:
  283.     call    eprint
  284.     db    'Select Reader ',0
  285.     call    getname
  286.     mvi    a,1    ;select RDR:
  287.     jmp    assign
  288. ;
  289. ; Exit major command
  290. ;
  291. exit:
  292.     call    eprint
  293.     db    'Exit',0
  294.     pop    psw    ;clear stack
  295. exit1:
  296.     ret        ;exit to OS or DEVICE (if entry at EXIT1)
  297. ;
  298. ; Check for Command in A in Table Pted to by HL
  299. ;
  300. ccheck:
  301.     call    cin    ;get user input
  302.     call    caps    ;capitalize it
  303.     mov    b,a    ;save command in B
  304. cc1:
  305.     mov    a,m    ;get command letter
  306.     ora    a    ;end of table?
  307.     rz
  308.     cmp    b    ;match?
  309.     jz    cc2
  310.     inx    h    ;skip to next
  311.     inx    h
  312.     inx    h
  313.     jmp    cc1
  314. cc2:
  315.     inx    h    ;pt to address
  316.     mov    e,m    ;get low
  317.     inx    h
  318.     mov    d,m    ;get high
  319.     lxi    h,cloop    ;set return address
  320.     xthl        ;return address on stack
  321.     xchg        ;address of routine in HL
  322.     pchl        ;"call" routine
  323. ;
  324. ; Get Device Name from User
  325. ;   Return with NZ if name input, else reissue command
  326. ;
  327. getname:
  328.     call    eprint
  329.     db    ' [Enter a Device Name] ',0
  330.     call    codend    ;pt to end of available code
  331.     mvi    m,20    ;set length of line
  332.     mvi    a,0ffh    ;capitalize
  333.     call    bline
  334.     call    sblank    ;skip to non-blank
  335.     mov    a,m    ;empty line?
  336.     ora    a    ;0=yes
  337.     jz    gnabort    ;abort input if so
  338.     shld    name    ;set ptr to name
  339.     ret        ;NZ means name present
  340. gnabort:
  341.     pop    psw    ;clear stack
  342.     ret        ;return to main command processor
  343.  
  344. ;
  345. ;  Do Assignment in General
  346. ;
  347. assign:
  348.     mov    b,a    ;save A in B
  349.     sta    logical    ;save logical device number
  350.     inr    b    ;add 1 for offset
  351.     call    status    ;get device status
  352.     dcx    h    ;pt to previous
  353.     dcx    h
  354. asgn1:
  355.     inx    h    ;pt to next
  356.     inx    h
  357.     dcr    b    ;count down
  358.     jnz    asgn1
  359.     mov    c,m    ;get number of devices in C
  360.     mov    a,c    ;check for value of zero
  361.     ora    a
  362.     jnz    asgn2
  363.     call    eprint
  364.     db    cr,lf,' Invalid Device Name: ',0
  365.     lhld    name    ;pt to error name
  366.     call    epstr    ;print name
  367.     ret
  368. asgn2:
  369.     lda    logical    ;get logical device number
  370.     mov    b,a    ;... in B
  371.     push    b    ;save device count
  372.     dcr    c    ;pt to previous
  373.     call    namer    ;get name
  374.     xchg        ;name pted to by DE
  375.     lhld    name    ;user's name pted to by HL
  376. asgn3:
  377.     ldax    d    ;get name of device
  378.     cpi    ' '+1    ;done?
  379.     jc    asgn3a
  380.     cmp    m    ;compare to user
  381.     jnz    asgn4
  382.     inx    h    ;pt to next
  383.     inx    d
  384.     jmp    asgn3
  385. asgn3a:
  386.     mov    a,m    ;get user
  387.     cpi    ' '+1    ;done?
  388.     jc    asgn3b
  389.     cpi    ','    ;done?
  390.     jnz    asgn4
  391. asgn3b:
  392.     pop    b    ;match -- C-1 is selected device
  393.     dcr    c    ;decrement
  394.     call    select    ;select device
  395.     lda    logical    ;get logical device in A
  396.     call    curr    ;print name of device selected
  397.     lhld    name    ;pt to name for scan continuation
  398.     ret
  399. asgn4:
  400.     pop    b    ;count down
  401.     dcr    c    ;count down
  402.     jnz    asgn2    ;continue
  403.     lhld    name    ;pt to invalid name
  404.     call    eprint
  405.     db    cr,lf,'Invalid Name at -- ',0
  406.     call    epstr
  407.     lhld    name    ;pt to name for scan continuation
  408.     ret
  409.  
  410. ;
  411. ; Display Devices
  412. ;
  413. dispall:
  414.     call    eprint
  415.     db    'All Devices',cr,lf
  416.     db    ' CON: Devices --',0
  417.     call    dc1    ;successive displays
  418.     call    eprint
  419.     db    cr,lf,' RDR: Devices --',0
  420.     call    dr1
  421.     call    eprint
  422.     db    cr,lf,'Strike Any Key -- ',0
  423.     call    cin
  424.     call    eprint
  425.     db    cr,lf,' PUN: Devices --',0
  426.     call    dp1
  427.     call    eprint
  428.     db    cr,lf,' LST: Devices --',0
  429.     jmp    dl1
  430. dispcon:
  431.     call    eprint
  432.     db    'CON: Devices',0
  433. dc1:
  434.     mvi    a,0    ;select CON:
  435.     call    disp
  436.     jmp    curr
  437. displst:
  438.     call    eprint
  439.     db    'LST: Devices',0
  440. dl1:
  441.     mvi    a,3    ;select LST:
  442.     call    disp
  443.     jmp    curr
  444. disprdr:
  445.     call    eprint
  446.     db    'RDR: Devices',0
  447. dr1:
  448.     mvi    a,1    ;select RDR:
  449.     call    disp
  450.     jmp    curr
  451. disppun:
  452.     call    eprint
  453.     db    'PUN: Devices',0
  454. dp1:
  455.     mvi    a,2    ;select PUN:
  456.     call    disp
  457. ;
  458. ;  Print Name of Current Device
  459. ;
  460. curr:
  461.     push    h    ;save ptr
  462.     mov    b,a    ;save number in B
  463.     push    b    ;save B
  464.     call    eprint
  465.     db    cr,lf,' Current Assignment: ',0
  466.     push    b    ;save B
  467.     call    status    ;get status
  468.     pop    b    ;get B
  469.     inr    b    ;add 1 for offset
  470.     dcx    h    ;back up
  471. curr1:
  472.     inx    h    ;pt to next
  473.     inx    h
  474.     dcr    b    ;count down
  475.     jnz    curr1
  476.     pop    b    ;get logical number in B
  477.     mov    c,m    ;get physical number in C
  478.     call    pname0    ;print first part of name only
  479.     pop    h    ;get ptr
  480.     ret
  481. ;
  482. ;  Print Names of All Physical Devices for a Logical Device
  483. ;
  484. disp:
  485.     push    h    ;save char ptr
  486.     push    psw    ;save device number
  487.     mov    b,a    ;logical device in B
  488.     push    b    ;save for later
  489.     push    b    ;save it
  490.     call    status    ;get status report
  491.     pop    b    ;get logical device number
  492.     inr    b    ;add 1 for offset
  493.     dcx    h    ;back up
  494.     dcx    h
  495. disp1:
  496.     inx    h    ;pt to next
  497.     inx    h
  498.     dcr    b    ;count down
  499.     jnz    disp1
  500.     pop    b    ;get B back
  501.     mov    c,m    ;get count of devices
  502.     mov    a,c    ;check for none
  503.     ora    a
  504.     jz    disp3
  505. disp2:
  506.     push    b    ;save values
  507.     dcr    c    ;pt to next name
  508.     call    eprint
  509.     db    cr,lf,'    ',0
  510.     call    pnamer    ;print name (B=logical, C=physical)
  511.     pop    b    ;get count
  512.     dcr    c    ;count down
  513.     jnz    disp2
  514. disp3:
  515.     pop    psw
  516.     pop    h
  517.     ret
  518. ;
  519. ;  Routine to Print Name of Selected Device
  520. ;    B=logical number, C=physical number
  521. ;
  522. pnamer:
  523.     push    b    ;save BC
  524.     call    pname0    ;print first part of name
  525.     call    eprint    ;print separator
  526.     db    ' - ',0
  527.     call    epstr    ;print rest as string
  528.     pop    b    ;restore BC
  529.     ret
  530. ;
  531. ;  Print first part of selected device name
  532. ;
  533. pname0:
  534.     call    namer    ;get ptr to string
  535.     mvi    b,8    ;at most 8 chars
  536. pname1:
  537.     mov    a,m    ;get char
  538.     inx    h    ;pt to next char
  539.     cpi    ' '    ;end of name?
  540.     jz    pname2
  541.     call    cout    ;print char
  542.     dcr    b    ;count down
  543.     jnz    pname1
  544.     ret
  545. pname2:
  546.     mvi    a,' '    ;print spaces
  547.     call    cout
  548.     dcr    b    ;count down
  549.     jnz    pname2
  550.     ret
  551.  
  552. ;
  553. ;  Basic Interface Routines
  554. ;
  555. status:
  556.     lxi    d,0    ;Offset 0
  557. runit:
  558.     call    getiop    ;device driver base
  559.     dad    d
  560.     pchl
  561. select:
  562.     lxi    d,3    ;Offset 3
  563.     jmp    runit
  564. namer:
  565.     lxi    d,6    ;Offset 6
  566.     jmp    runit
  567.  
  568. ;
  569. ;  Buffers
  570. ;
  571. logical:
  572.     ds    1    ;Logical Device Number
  573. name:
  574.     ds    2    ;Pointer to User-Supplied Name
  575.  
  576.     end
  577.