home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / zsys / simtel20 / zcpr3 / show.mac < prev    next >
Encoding:
Text File  |  1994-07-13  |  30.9 KB  |  1,753 lines

  1. ;
  2. ; Program: SHOW
  3. ; Author: Richard Conn
  4. ; Version: 1.0
  5. ; Date: 5 Mar 84
  6. ;
  7. version    equ    10
  8. z3env    SET    0f400h
  9.  
  10. ;
  11. ;    The purpose of SHOW is to display various details about the ZCPR3
  12. ; System to the ZCPR3 user.  Details on the ZCPR3 Environment Descriptor,
  13. ; what facilities are available, and what the status of these facilities
  14. ; is are included.
  15. ;
  16.  
  17. ;
  18. ; Basic Equates
  19. ;
  20. fcb    equ    5ch
  21. cr    equ    0dh
  22. lf    equ    0ah
  23. ctrlc    equ    'C'-'@'
  24. ctrlr    equ    'R'-'@'
  25.  
  26. ;
  27. ; External References
  28. ;
  29.     ext    envptr
  30.     ext    tinit,dinit                ;from VLIB
  31.     ext    z3vinit,cls,gotoxy,gxymsg,vprint,at    ;from VLIB
  32.     ext    getiop
  33.     ext    retud,pfn1
  34.     ext    getpath,dutdir,bbline,eval16
  35.     ext    capine,cout,crlf,print,pstr,getmsg,padc,pafdc,phl4hc,pa2hc
  36.     ext    shempty,shfull,getsh
  37.     ext    geter1,geterc,puter1,puterc
  38.     ext    getfcp,getrcp,getefcb
  39.     ext    getndr
  40.     ext    strtzex,stopzex
  41.  
  42. ;
  43. ; Environment Definition
  44. ;
  45.     if    z3env ne 0
  46. ;
  47. ; External ZCPR3 Environment Descriptor
  48. ;
  49.     jmp    start
  50.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  51.     db    1    ;External Environment Descriptor
  52. z3eadr:
  53.     dw    z3env
  54. start:
  55.     lhld    z3eadr    ;pt to ZCPR3 environment
  56. ;
  57.     else
  58. ;
  59. ; Internal ZCPR3 Environment Descriptor
  60. ;
  61.     MACLIB    Z3BASE.LIB
  62.     MACLIB    SYSENV.LIB
  63. z3eadr:
  64.     jmp    start
  65.     SYSENV
  66. start:
  67.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  68.     endif
  69.  
  70. ;
  71. ; Start of Program -- Initialize ZCPR3 Environment
  72. ;
  73.     call    z3vinit    ;initialize the ZCPR3 Env and the VLIB Env
  74.     shld    dumpstrt    ;set beginning address of memory dump
  75.     lda    fcb+1    ;check for E option (error handler)
  76.     cpi    ' '    ;no option, so proceed
  77.     jz    show
  78.     cpi    'E'    ;install SHOW as error handler
  79.     jz    errins
  80.     call    print
  81.     db    'SHOW  Version '
  82.     db    (version/10)+'0','.',(version mod 10)+'0'
  83.     db    cr,lf,'Syntax:'
  84.     db    cr,lf,'  SHOW    <-- Invoke Normally'
  85.     db    cr,lf,'  SHOW E    <-- Install as Error Handler'
  86.     db    0
  87.     ret
  88. ;
  89. ; Install SHOW as an error handler
  90. ;
  91. errins:
  92.     call    getefcb    ;pt to name of command
  93.     jnz    errins1
  94.     lxi    h,showcmd-1    ;pt to command line
  95. errins1:
  96.     inx    h    ;pt to first char
  97.     push    h    ;save ptr
  98.     lxi    d,8    ;skip to file type field
  99.     dad    d
  100.     mvi    m,0    ;store ending 0
  101.     pop    h
  102.     call    puterc    ;store error handler command line
  103.     mvi    a,0ffh    ;turn on error handlers
  104.     call    puter1
  105.     call    print
  106.     db    'SHOW Installed as an Error Handler',0
  107.     ret
  108. ;
  109. ; Print Menu and Accept Command
  110. ;
  111. show:
  112.     call    tinit    ;init terminal
  113.     call    stopzex    ;stop ZEX if running
  114.     call    banner    ;print banner
  115.     call    gxymsg
  116.     db    3,31
  117.     db    '--> ',1,'SHOW Menu',2,' <--',0
  118.     mvi    h,7    ;begin on row 7
  119.     mvi    l,10    ;column 10
  120.     shld    infoxy
  121.     call    dispxy    ;position for display
  122.     call    vprint
  123.     db    '      '
  124.     db      ' PACKAGE DATA       ',0
  125.     call    dispxy    ;position for display
  126.     call    vprint
  127.     db    ' C -- '
  128.     db    1,'Command Packages    ',2,0
  129.     call    dispxy    ;position for display
  130.     call    vprint
  131.     db    ' I -- '
  132.     db    1,'Input/Output Package',2,0
  133.     call    dispxy    ;position for display
  134.     call    dispxy    ;position for display
  135.     call    vprint
  136.     db    '      '
  137.     db      ' ENVIRONMENT        ',0
  138.     call    dispxy    ;position for display
  139.     call    vprint
  140.     db    ' E -- '
  141.     db    1,'Error Handler       ',2,0
  142.     call    dispxy    ;position for display
  143.     call    vprint
  144.     db    ' M -- '
  145.     db    1,'Memory Utility      ',2,0
  146.     call    dispxy    ;position for display
  147.     call    vprint
  148.     db    ' N -- '
  149.     db    1,'Named Directory     ',2,0
  150.     call    dispxy    ;position for display
  151.     call    vprint
  152.     db    ' P -- '
  153.     db    1,'Path Expression     ',2,0
  154.     call    dispxy
  155.     call    vprint
  156.     db    ' S -- '
  157.     db    1,'Shell Stack         ',2,0
  158.     mvi    h,7    ; row 7
  159.     mvi    l,40    ; column 40
  160.     shld    infoxy
  161.     call    dispxy
  162.     call    vprint
  163.     db    '      '
  164.     db      'ZCPR3 SYSTEM DATA   ',0
  165.     call    dispxy
  166.     call    vprint
  167.     db    ' 1 -- '
  168.     db    1,'Env Descriptor      ',2,0
  169.     call    dispxy
  170.     call    vprint
  171.     db    ' 2 -- '
  172.     db    1,'Message Buffers     ',2,0
  173.     call    dispxy
  174.     call    vprint
  175.     db    ' 3 -- '
  176.     db    1,'CRT and Printer Data',2,0
  177.     call    dispxy
  178.     call    vprint
  179.     db    ' 4 -- '
  180.     db    1,'System File Defns   ',2,0
  181.     call    dispxy
  182.     call    dispxy
  183.     call    dispxy
  184.     call    vprint
  185.     db    ' X -- '
  186.     db    1,'Exit',2,0
  187. ;
  188. ; Input Command from User
  189. ;
  190. getcmd:
  191.     call    gxymsg    ;print prompt
  192.     db    23,10,'SHOW Command? ',0
  193.     call    capine    ;get command
  194. getcmd1:
  195.     call    ctabscan    ;scan for and process command
  196.     call    print    ;print error message
  197.     db    7,0    ;beep
  198.     jmp    getcmd
  199. ;
  200. ; Print Banner
  201. ;
  202. banner:
  203.     call    cls    ;clear screen
  204.     call    gxymsg    ;print banner message
  205.     db    1,27    ;row/col
  206.     db    '>>>> '
  207.     db    'SHOW Version '
  208.     db    (version/10)+'0','.',(version mod 10)+'0'
  209.     db    ' <<<<',0
  210.     ret
  211. ;
  212. ; Command Table
  213. ;
  214. ctable:
  215.     db    '1'    ;Env Desc
  216.     dw    envdes
  217.     db    '2'    ;Messages
  218.     dw    msg
  219.     db    '3'    ;CRT and Printer
  220.     dw    cpdata
  221.     db    '4'    ;File Names
  222.     dw    fnames
  223.     db    'C'    ;Command Package Status
  224.     dw    command
  225.     db    'E'    ;Error Handler Display
  226.     dw    errorh
  227.     db    'I'    ;I/O Package Display
  228.     dw    iopack
  229.     db    'M'    ;Memory Utility
  230.     dw    memory
  231.     db    'N'    ;Named Directory Data
  232.     dw    namedir
  233.     db    'P'    ;Path Display
  234.     dw    pdisp
  235.     db    'S'    ;Shell Stack Display
  236.     dw    shstack
  237.     db    'X'    ;Exit
  238.     dw    exit
  239.     db    ctrlc    ;Exit
  240.     dw    exit
  241.     db    cr    ;New Screen
  242.     dw    show
  243.     db    ' '    ;New Screen
  244.     dw    show
  245.     db    ctrlr    ;New Screen
  246.     dw    show
  247.     db    0    ;end of table
  248. ;
  249. ; Scan for and transfer control to command routine
  250. ;
  251. ctabscan:
  252.     lxi    h,ctable    ;pt to command table
  253.     mov    c,a        ;command in C
  254. ctab1:
  255.     mov    a,m        ;get char from table
  256.     ora    a        ;done?
  257.     rz
  258.     cmp    c        ;check for match
  259.     jz    ctab2
  260.     inx    h        ;skip address
  261.     inx    h
  262.     inx    h        ;pt to next command char
  263.     jmp    ctab1
  264. ctab2:
  265.     inx    h        ;pt to address
  266.     mov    a,m        ;get low
  267.     inx    h
  268.     mov    h,m        ;get high
  269.     mov    l,a        ;HL pts to command
  270.     pop    psw        ;clear stack
  271.     pchl            ;"goto" command
  272. ;
  273. ; **** Deinitialize Terminal and Exit to ZCPR3 ****
  274. ;
  275. exit:
  276.     call    strtzex        ;resume ZEX if running
  277.     jmp    dinit        ;deinit terminal
  278. ;
  279. ; **** Memory Dumper ****
  280. ;
  281. memory:
  282.     call    banner
  283.     call    gxymsg
  284.     db    3,25
  285.     db    '--> ',1,'Memory Display at ',0
  286.     lhld    dumpstrt    ;start of dump address
  287.     call    phl4hc
  288.     call    vprint
  289.     db    2,' <--',cr,lf,0
  290.     mvi    b,16
  291. mem1:
  292.     shld    cline    ;set current line ptr
  293.     call    crlf    ;new line
  294.     call    phl4hc    ;print address
  295.     call    vprint
  296.     db    1,' --',2,0
  297.     mvi    c,16    ;count for elements
  298. mem2:
  299.     mov    a,c    ;extra space?
  300.     ani    3
  301.     mvi    a,' '    ;extra space
  302.     cz    cout
  303.     mov    a,m    ;get next byte
  304.     call    pa2hc    ;print as hex
  305.     mvi    a,' '    ;space
  306.     call    cout
  307.     inx    h    ;pt to next
  308.     dcr    c    ;count down
  309.     jnz    mem2
  310.     call    vprint
  311.     db    1,'| ',2,0
  312.     lhld    cline    ;pt to current line again
  313.     mvi    c,16    ;count again
  314. mem3:
  315.     mov    a,m    ;get next byte
  316.     ani    7fh    ;mask MSB
  317.     cpi    ' '
  318.     jnc    mem4
  319.     mvi    a,'.'    ;dot fill
  320. mem4:
  321.     call    cout
  322.     inx    h    ;pt to next
  323.     dcr    c    ;count down
  324.     jnz    mem3
  325.     dcr    b    ;count down major loop
  326.     jnz    mem1
  327.     call    gxymsg    ;print prompt
  328.     db    23,10
  329.     db    1,'Command (<=last, >=next, A=adr, SHOW Cmd)? ',2,0
  330.     call    capine    ;get input
  331.     cpi    'A'    ;address?
  332.     jz    memadr
  333.     cpi    '>'    ;advance?
  334.     jz    memnext
  335.     cpi    '.'    ;advance?
  336.     jz    memnext
  337.     cpi    '<'    ;backup?
  338.     jz    memback
  339.     cpi    ','    ;backup?
  340.     jz    memback
  341.     jmp    getcmd1    ;process otherwise
  342. memadr:
  343.     call    print
  344.     db    'ddress (Hex)? ',0
  345.     mvi    a,0ffh    ;capitalize
  346.     call    bbline    ;get line from user
  347. mema1:
  348.     mov    a,m    ;skip leading spaces
  349.     inx    h    ;pt to next char
  350.     cpi    ' '
  351.     jz    mema1
  352.     dcx    h    ;pt to first char
  353.     call    eval16    ;evaluate as hex
  354.     xchg        ;result in HL
  355.     shld    dumpstrt    ;set new start address
  356.     jmp    memory    ;restart
  357. memnext:
  358.     lhld    dumpstrt    ;advance 1 page
  359.     inr    h
  360.     shld    dumpstrt
  361.     jmp    memory    ;restart
  362. memback:
  363.     lhld    dumpstrt    ;backup 1 page
  364.     dcr    h
  365.     shld    dumpstrt
  366.     jmp    memory    ;restart
  367. ;
  368. ; **** ZCPR3 Messages ****
  369. ;
  370. msg:
  371.     call    banner
  372.     call    gxymsg
  373.     db    3,25
  374.     db    '--> ',1,'ZCPR3 System Messages',2,' <--',0
  375.     mvi    h,5    ; row 5
  376.     mvi    l,5    ; column 5
  377.     shld    infoxy
  378.     mvi    a,22h    ; offset
  379.     call    compenv    ; pt to address of messages
  380.     mov    a,m
  381.     inx    h
  382.     mov    h,m
  383.     mov    l,a    ; HL pts to first message
  384.     call    dispxy
  385.     call    vprint
  386.     db    1,'Error Handler Defined? ',2,0
  387.     mov    a,m    ; get flag
  388.     call    pryn
  389.     mov    a,m    ; get flag again
  390.     ora    a    ; defined?
  391.     jz    msg1
  392.     push    h
  393.     lxi    d,10h    ; pt to error command line
  394.     dad    d
  395.     call    dispxy
  396.     call    vprint
  397.     db    1,' Error Handler:        ',2,0
  398.     call    pstr
  399.     pop    h
  400. msg1:
  401.     inx    h
  402.     call    dispxy
  403.     call    dispxy
  404.     call    vprint
  405.     db    1,'Current IF Level:      ',2,0
  406.     mvi    b,8    ; set IF count
  407.     mov    c,m    ; get IF flag
  408. iftst:
  409.     mov    a,c    ; get flag
  410.     rlc
  411.     mov    c,a    ; save flag
  412.     jc    iftst1
  413.     dcr    b    ; count down
  414.     jnz    iftst
  415. iftst1:
  416.     mov    a,b    ; get char
  417.     call    padc
  418.     inx    h    ; pt to IF active flag
  419.     inx    h    ; pt to command status
  420.     shld    cstat    ; save address
  421.     inx    h    ; pt to error address
  422.     inx    h
  423.     inx    h    ; pt to program error code
  424.     call    dispxy
  425.     call    dispxy
  426.     call    vprint
  427.     db    1,'Program Error Code:    ',2,0
  428.     mov    a,m
  429.     call    padc
  430.     inx    h    ; pt to ZEX message byte
  431.     inx    h    ; pt to ZEX running flag
  432.     call    dispxy
  433.     call    dispxy
  434.     call    vprint
  435.     db    1,'ZEX Running?           ',2,0
  436.     mov    a,m
  437.     call    pryn
  438.     mov    a,m    ; make sure we have char
  439.     inx    h    ; skip ZEX data
  440.     inx    h
  441.     inx    h
  442.     ora    a    ; ZEX running?
  443.     jz    nozex
  444.     mov    e,m    ; get low-order
  445.     inx    h
  446.     mov    d,m    ; get high-order
  447.     call    dispxy
  448.     call    vprint
  449.     db    1,'Address of ZEX Buffer: ',2,0
  450.     xchg
  451.     call    phl4hc    ; print address
  452.     xchg
  453.     jmp    scb    ; process shell control byte now
  454. nozex:
  455.     inx    h
  456. scb:
  457.     inx    h    ; pt to shell control byte
  458.     push    h
  459.     mvi    h,5    ; row 5
  460.     mvi    l,40    ; column 40
  461.     shld    infoxy
  462.     pop    h
  463.     call    dispxy
  464.     call    vprint
  465.     db    1,'Shell Control --',2,0
  466.     call    dispxy
  467.     call    vprint
  468.     db    1,' Enable Shell Comment? ',2,0
  469.     mov    a,m
  470.     ani    1
  471.     call    pryn
  472.     call    dispxy
  473.     call    vprint
  474.     db    1,' Enable Shell Echo?    ',2,0
  475.     mov    a,m
  476.     ani    10b
  477.     call    pryn
  478.     call    dispxy
  479.     call    vprint
  480.     db    1,' Enable Shell Wait?    ',2,0
  481.     mov    a,m
  482.     ani    80h
  483.     call    pryn
  484.     push    h    ; save ptr to next message byte
  485.     lhld    cstat    ; get ptr to command status
  486.     call    dispxy
  487.     call    dispxy
  488.     call    vprint
  489.     db    1,'Command Status:        ',2,0
  490.     mov    a,m    ; get it
  491.     ani    3    ; 2 LSBs
  492.     jz    csnorm
  493.     cpi    1
  494.     jz    csshell
  495.     call    print
  496.     db    'Error',0
  497.     inx    h    ; pt to error address
  498.     mov    a,m    ; get low
  499.     inx    h
  500.     mov    h,m    ; get high
  501.     mov    l,a
  502.     call    dispxy
  503.     call    vprint
  504.     db    1,' Error Command         ',2,0
  505.     call    dispxy
  506.     call    print
  507.     db    '     ',0
  508. erprt:
  509.     mov    a,m    ; get char
  510.     cpi    ' '+1    ; end of command with space or less?
  511.     jc    csdone
  512.     cpi    ';'    ; end of command with new command?
  513.     jz    csdone
  514.     call    cout    ; print char
  515.     inx    h
  516.     jmp    erprt
  517. csnorm:
  518.     call    print
  519.     db    'Normal',0
  520.     jmp    csdone
  521. csshell:
  522.     call    print
  523.     db    'Shell',0
  524. csdone:
  525.     pop    h    ; restore ptr
  526.     lxi    d,35    ; jump to registers
  527.     dad    d
  528.     push    h
  529.     mvi    h,17    ; row 17
  530.     mvi    l,5    ; column 5
  531.     shld    infoxy
  532.     pop    h
  533.     call    dispxy
  534.     call    vprint
  535.     db    1,'Registers --',2,0
  536.     call    dispxy    ; new line
  537.     mvi    b,10    ; 10 times
  538.     mvi    c,0
  539. regl:
  540.     call    vprint
  541.     db    1,'  ',0
  542.     mvi    a,10+'0'    ; compute reg char
  543.     sub    b    ; get value
  544.     call    cout
  545.     call    vprint
  546.     db    '=',2,0
  547.     mov    a,m    ; get value
  548.     inx    h    ; pt to next
  549.     call    padc    ; print
  550.     inr    c    ; every 4
  551.     mov    a,c    ; get count
  552.     ani    3
  553.     cz    dispxy    ; new line
  554.     dcr    b    ; count down
  555.     jnz    regl
  556.     lxi    d,6    ; skip to user-defined values
  557.     dad    d
  558.     push    h
  559.     mvi    h,17    ; row 17
  560.     mvi    l,40    ; column 40
  561.     shld    infoxy
  562.     pop    h
  563.     call    dispxy
  564.     call    vprint
  565.     db    1,'User-Defined Area --',2,0
  566.     call    dispxy    ; new line
  567.     mvi    b,16    ; 16 times
  568.     mvi    c,0
  569. regl1:
  570.     call    vprint
  571.     db    '   ',0
  572.     mov    a,m    ; get value
  573.     inx    h    ; pt to next
  574.     call    padc    ; print
  575.     inr    c    ; every 4
  576.     mov    a,c    ; get count
  577.     ani    3
  578.     cz    dispxy    ; new line
  579.     dcr    b    ; count down
  580.     jnz    regl1
  581.     jmp    getcmd
  582. ;
  583. ; **** System File Definitions ****
  584. ;
  585. fnames:
  586.     call    banner
  587.     call    gxymsg
  588.     db    3,27
  589.     db    '--> ',1,'System File Names',2,' <--',0
  590.     mvi    h,5    ; row 5
  591.     mvi    l,24    ; column 24
  592.     shld    infoxy
  593.     call    dispxy
  594.     call    vprint
  595.     db    1,'Shell Variable File: ',2,0
  596.     mvi    a,47h    ; offset
  597.     call    compenv
  598.     xchg        ; DE pts to file name
  599.     call    pfn    ; print file name
  600.     call    dispxy
  601.     mvi    b,'1'    ; set counter
  602. fnames1:
  603.     lxi    h,11    ; offset to next file
  604.     dad    d    ; pt to next file name
  605.     xchg
  606.     call    dispxy
  607.     call    vprint
  608.     db    1,'File Name ',0
  609.     mov    a,b
  610.     call    cout    ; print number
  611.     call    vprint
  612.     db    ':         ',2,0
  613.     call    pfn    ; print file name
  614.     inr    b    ; next name
  615.     mov    a,b    ; get next
  616.     cpi    '4'+1    ; done?
  617.     jnz    fnames1
  618.     jmp    getcmd
  619. ;
  620. ; Print File Name for FNAMES
  621. ;
  622. pfn:
  623.     ldax    d    ; get first char
  624.     cpi    ' '    ; none?
  625.     jnz    pfn1    ; print name
  626.     lxi    h,8    ; check type
  627.     dad    d
  628.     mov    a,m    ; get first char of type
  629.     cpi    ' '    ; none?
  630.     jnz    pfn1    ; print name
  631.     call    print
  632.     db    'Undefined',0
  633.     ret
  634. ;
  635. ; **** CRT and Printer Data ****
  636. ;
  637. cpdata:
  638.     call    banner
  639.     call    gxymsg
  640.     db    3,26
  641.     db    '--> ',1,'CRT and Printer Data',2,' <--',0
  642.     mvi    h,5    ; row 5
  643.     mvi    l,5    ; column 5
  644.     shld    infoxy
  645.     call    dispxy
  646.     call    vprint
  647.     db    1,'CRT -- Selection: ',2,0
  648.     mvi    a,2fh    ; offset
  649.     call    prbyte    ; print byte value there
  650.     call    dispxy
  651.     call    vprint
  652.     db    1,' CRT 0',2,0
  653.     mvi    a,31h    ; print data at 31H
  654.     call    cprt
  655.     call    dispxy
  656.     call    dispxy
  657.     call    vprint
  658.     db    1,'LST -- Selection: ',2,0
  659.     mvi    a,30h    ; offset
  660.     call    prbyte    ; print byte value there
  661.     call    dispxy
  662.     call    vprint
  663.     db    1,' LST 0',2,0
  664.     mvi    a,37h    ; offset
  665.     call    lprt
  666.     call    dispxy
  667.     call    dispxy
  668.     call    vprint
  669.     db    1,' LST 2',2,0
  670.     mvi    a,3fh    ; offset
  671.     call    lprt
  672.     mvi    h,6    ; row 6
  673.     mvi    l,40    ; column 40
  674.     shld    infoxy
  675.     call    dispxy
  676.     call    vprint
  677.     db    1,' CRT 1',2,0
  678.     mvi    a,34h    ; print data at 34H
  679.     call    cprt
  680.     call    dispxy
  681.     call    dispxy
  682.     call    dispxy
  683.     call    vprint
  684.     db    1,' LST 1',2,0
  685.     mvi    a,3bh    ; offset
  686.     call    lprt
  687.     call    dispxy
  688.     call    dispxy
  689.     call    vprint
  690.     db    1,' LST 3',2,0
  691.     mvi    a,43h    ; offset
  692.     call    lprt
  693.     jmp    getcmd
  694. ;
  695. ; Print CRT Data
  696. ;
  697. cprt:
  698.     call    compenv    ; compute offset
  699.     call    dispxy
  700.     call    vprint
  701.     db    1,'   Width:      ',2,0
  702.     mov    a,m
  703.     call    padc
  704.     call    vprint
  705.     db    ' Cols',0
  706.     call    dispxy
  707.     call    vprint
  708.     db    1,'   Lines/Text: ',2,0
  709.     inx    h
  710.     mov    a,m
  711.     call    padc
  712.     call    vprint
  713.     db    ' / ',0
  714.     inx    h
  715.     mov    a,m
  716.     call    padc
  717.     ret
  718. ;
  719. ; Print LST Data
  720. ;
  721. lprt:
  722.     call    compenv    ; compute offset
  723.     call    dispxy
  724.     call    vprint
  725.     db    1,'   Width:      ',2,0
  726.     mov    a,m
  727.     call    padc
  728.     call    vprint
  729.     db    ' Cols',0
  730.     call    dispxy
  731.     call    vprint
  732.     db    1,'   Lines/Text: ',2,0
  733.     inx    h
  734.     mov    a,m
  735.     call    padc
  736.     call    vprint
  737.     db    ' / ',0
  738.     inx    h
  739.     mov    a,m
  740.     call    padc
  741.     inx    h
  742.     call    dispxy
  743.     call    vprint
  744.     db    1,'   Form Feed?  ',2,0
  745.     mov    a,m
  746.     call    pryn
  747.     ret
  748.  
  749. ;
  750. ; **** Print Environment Descriptor Data ****
  751. ;
  752. envdes:
  753.     call    banner
  754.     call    gxymsg
  755.     db    3,25
  756.     db    '--> ',1,'Environment Descriptor',2,' <--',0
  757.     mvi    h,5    ; row 5
  758.     mvi    l,5    ; column 5
  759.     shld    infoxy
  760.     call    dispxy
  761.     call    vprint
  762.     db    1,'>> Addresses <<',2,0
  763.     call    dispxy
  764.     call    vprint
  765.     db    1,' Command Line Buffer:    ',2,0
  766.     mvi    a,18h    ; offset
  767.     call    pradr    ; print address
  768.     call    dispxy
  769.     call    vprint
  770.     db    1,' Command-Search Path:    ',2,0
  771.     mvi    a,9    ; offset
  772.     call    pradr    ; print address
  773.     call    dispxy
  774.     call    vprint
  775.     db    1,' Environment Descriptor: ',2,0
  776.     lhld    envptr    ; get ptr
  777.     call    phl4hc
  778.     call    dispxy
  779.     call    vprint
  780.     db    1,' Externals --',2,0
  781.     call    dispxy
  782.     call    vprint
  783.     db    1,'   File Control Block:   ',2,0
  784.     mvi    a,24h
  785.     call    pradr
  786.     call    dispxy
  787.     call    vprint
  788.     db    1,'   System Stack:         ',2,0
  789.     mvi    a,26h
  790.     call    pradr
  791.     call    dispxy
  792.     call    vprint
  793.     db    1,' Message Buffer:         ',2,0
  794.     mvi    a,22h
  795.     call    pradr
  796.     call    dispxy
  797.     call    vprint
  798.     db    1,' Named Directory Buffer: ',2,0
  799.     mvi    a,15h
  800.     call    pradr
  801.     call    dispxy
  802.     call    vprint
  803.     db    1,' Packages --',2,0
  804.     call    dispxy
  805.     call    vprint
  806.     db    1,'    Flow Command:        ',2,0
  807.     mvi    a,12h
  808.     call    pradr
  809.     call    dispxy
  810.     call    vprint
  811.     db    1,'    Input/Output:        ',2,0
  812.     mvi    a,0fh
  813.     call    pradr
  814.     call    dispxy
  815.     call    vprint
  816.     db    1,'    Resident Command:    ',2,0
  817.     mvi    a,0ch
  818.     call    pradr
  819.     call    dispxy
  820.     call    vprint
  821.     db    1,' Shell Stack Buffer:     ',2,0
  822.     mvi    a,1eh
  823.     call    pradr
  824.     call    dispxy
  825.     call    vprint
  826.     db    1,' Wheel Byte:             ',2,0
  827.     mvi    a,29h
  828.     call    pradr
  829.     mvi    h,5    ; row 5
  830.     mvi    l,40    ; column 40
  831.     shld    infoxy
  832.     call    dispxy
  833.     call    vprint
  834.     db    1,'>> Data Elements <<',2,0
  835.     call    dispxy
  836.     call    vprint
  837.     db    1,' Sizes --',2,0
  838.     call    dispxy
  839.     call    vprint
  840.     db    1,'   Command Line:      ',2,0
  841.     mvi    a,1ah
  842.     call    prbyte
  843.     call    vprint
  844.     db    ' Chars',0
  845.     call    dispxy
  846.     call    vprint
  847.     db    1,'   External Path:     ',2,0
  848.     mvi    a,0bh
  849.     call    prbyte
  850.     call    vprint
  851.     db    ' Elts',0
  852.     call    dispxy
  853.     call    vprint
  854.     db    1,'   Named Dir Entries: ',2,0
  855.     mvi    a,17h
  856.     call    prbyte
  857.     call    dispxy
  858.     call    vprint
  859.     db    1,'   Package, FCP:      ',2,0
  860.     mvi    a,14h
  861.     call    prbyte
  862.     call    pr128
  863.     call    dispxy
  864.     call    vprint
  865.     db    1,'   Package, IOP:      ',2,0
  866.     mvi    a,11h
  867.     call    prbyte
  868.     call    pr128
  869.     call    dispxy
  870.     call    vprint
  871.     db    1,'   Package, RCP:      ',2,0
  872.     mvi    a,0eh
  873.     call    prbyte
  874.     call    pr128
  875.     call    dispxy
  876.     call    vprint
  877.     db    1,'   Shell Stack Elts:  ',2,0
  878.     mvi    a,20h
  879.     call    prbyte
  880.     call    dispxy
  881.     call    dispxy
  882.     call    vprint
  883.     db    1,' DU Form Allowed?     ',2,0
  884.     mvi    a,2eh
  885.     call    compenv
  886.     mov    a,m    ; get byte
  887.     call    pryn
  888.     call    dispxy
  889.     call    vprint
  890.     db    1,' Max Disk and User:   ',2,0
  891.     mvi    a,2ch
  892.     call    compenv
  893.     mov    a,m
  894.     adi    '@'
  895.     call    cout
  896.     inx    h
  897.     mov    a,m
  898.     call    pafdc
  899.     call    dispxy
  900.     call    vprint
  901.     db    1,' Processor Speed:     ',2,0
  902.     mvi    a,2bh
  903.     call    prbyte
  904.     call    vprint
  905.     db    ' MHz',0
  906.     call    dispxy
  907.     call    vprint
  908.     db    1,' Quiet Operation?     ',2,0
  909.     mvi    a,28h
  910.     call    compenv
  911.     mov    a,m    ; get byte
  912.     call    pryn
  913.     jmp    getcmd
  914. ;
  915. ; Print 128-Byte Block Message
  916. ;
  917. pr128:
  918.     call    vprint
  919.     db    ' Blocks',0
  920.     ret
  921. ;
  922. ; Print address pted to by A offset as 4 hex chars
  923. ;
  924. pradr:
  925.     call    compenv    ; pt to address
  926.     mov    e,m    ; get address
  927.     inx    h
  928.     mov    d,m
  929.     xchg
  930.     jmp    phl4hc
  931. ;
  932. ; Print byte pted to by A offset as dec chars
  933. ;
  934. prbyte:
  935.     call    compenv    ; compute offset (in HL)
  936.     mov    a,m    ; get byte
  937.     jmp    padc
  938. ;
  939. ; Add A to Base Address in ENVPTR
  940. ;  Return Result in HL
  941. ;
  942. compenv:
  943.     lhld    envptr    ; get base address
  944.     add    l    ; add offset
  945.     mov    l,a
  946.     mov    a,h
  947.     aci    0
  948.     mov    h,a
  949.     ret
  950. ;
  951. ; **** Display Input/Output Package Function ****
  952. ;
  953. iopack:
  954.     call    banner
  955.     call    gxymsg
  956.     db    3,26
  957.     db    '--> ',1,'Input/Output Package',2,' <--',0
  958.     call    getiop    ;check for initialization
  959.     mov    a,h
  960.     ora    l    ;must NOT be zero
  961.     jnz    iopack0
  962.     call    gxymsg
  963.     db    5,23,'Input/Output Packages Not Available',0
  964.     jmp    getcmd
  965. iopack0:
  966.     call    status    ;check for drivers
  967.     jnz    iopack1
  968.     call    gxymsg
  969.     db    5,22,'Input/Output Redirection Not Available',0
  970.     jmp    getcmd
  971. iopack1:
  972.     call    dispcon    ;successive displays
  973.     call    disprdr
  974.     call    gxymsg
  975.     db    23,10,'Strike Any Key For Next Screen - ',0
  976.     call    capine
  977.     call    banner
  978.     call    gxymsg
  979.     db    3,26
  980.     db    '--> ',1,'Input/Output Package',2,' <--',0
  981.     call    disppun
  982.     call    displst
  983.     jmp    getcmd
  984. dispcon:
  985.     call    vprint
  986.     db    cr,lf,cr,lf,1,'Console',0
  987.     mvi    a,0    ;select CON:
  988.     call    disp
  989.     jmp    curr
  990. displst:
  991.     call    vprint
  992.     db    cr,lf,cr,lf,1,'Printer',0
  993.     mvi    a,3    ;select LST:
  994.     call    disp
  995.     jmp    curr
  996. disprdr:
  997.     call    vprint
  998.     db    cr,lf,cr,lf,1,'Reader ',0
  999.     mvi    a,1    ;select RDR:
  1000.     call    disp
  1001.     jmp    curr
  1002. disppun:
  1003.     call    vprint
  1004.     db    cr,lf,cr,lf,1,'Punch  ',0
  1005.     mvi    a,2    ;select PUN:
  1006.     call    disp
  1007. ;
  1008. ;  Print Name of Current Device
  1009. ;
  1010. curr:
  1011.     push    h    ;save ptr
  1012.     mov    b,a    ;save number in B
  1013.     push    b    ;save B
  1014.     call    vprint
  1015.     db    cr,lf,1,' Assignment is ',2,0
  1016.     push    b    ;save B
  1017.     call    status    ;get status
  1018.     pop    b    ;get B
  1019.     inr    b    ;add 1 for offset
  1020.     dcx    h    ;back up
  1021. curr1:
  1022.     inx    h    ;pt to next
  1023.     inx    h
  1024.     dcr    b    ;count down
  1025.     jnz    curr1
  1026.     pop    b    ;get logical number in B
  1027.     mov    c,m    ;get physical number in C
  1028.     call    pname0    ;print first part of name only
  1029.     pop    h    ;get ptr
  1030.     ret
  1031. ;
  1032. ;  Print Names of All Physical Devices for a Logical Device
  1033. ;
  1034. disp:
  1035.     push    h    ;save char ptr
  1036.     push    psw    ;save device number
  1037.     call    vprint
  1038.     db    ' Devices --',2,0
  1039.     mov    b,a    ;logical device in B
  1040.     push    b    ;save for later
  1041.     push    b    ;save it
  1042.     call    status    ;get status report
  1043.     pop    b    ;get logical device number
  1044.     inr    b    ;add 1 for offset
  1045.     dcx    h    ;back up
  1046.     dcx    h
  1047. disp1:
  1048.     inx    h    ;pt to next
  1049.     inx    h
  1050.     dcr    b    ;count down
  1051.     jnz    disp1
  1052.     pop    b    ;get B back
  1053.     mov    c,m    ;get count of devices
  1054.     mov    a,c    ;check for none
  1055.     ora    a
  1056.     jz    disp3
  1057. disp2:
  1058.     push    b    ;save values
  1059.     dcr    c    ;pt to next name
  1060.     call    print
  1061.     db    cr,lf,'    ',0
  1062.     call    pnamer    ;print name (B=logical, C=physical)
  1063.     pop    b    ;get count
  1064.     dcr    c    ;count down
  1065.     jnz    disp2
  1066. disp3:
  1067.     pop    psw
  1068.     pop    h
  1069.     ret
  1070. ;
  1071. ;  Routine to Print Name of Selected Device
  1072. ;    B=logical number, C=physical number
  1073. ;
  1074. pnamer:
  1075.     push    b    ;save BC
  1076.     call    pname0    ;print first part of name
  1077.     call    vprint    ;print separator
  1078.     db    1,' - ',2,0
  1079.     call    pstr    ;print rest as string
  1080.     pop    b    ;restore BC
  1081.     ret
  1082. ;
  1083. ;  Print first part of selected device name
  1084. ;
  1085. pname0:
  1086.     call    namer    ;get ptr to string
  1087.     mvi    b,8    ;at most 8 chars
  1088. pname1:
  1089.     mov    a,m    ;get char
  1090.     inx    h    ;pt to next char
  1091.     cpi    ' '    ;end of name?
  1092.     jz    pname2
  1093.     call    cout    ;print char
  1094.     dcr    b    ;count down
  1095.     jnz    pname1
  1096.     ret
  1097. pname2:
  1098.     mvi    a,' '    ;print spaces
  1099.     call    cout
  1100.     dcr    b    ;count down
  1101.     jnz    pname2
  1102.     ret
  1103.  
  1104. ;
  1105. ;  Basic Interface Routines
  1106. ;
  1107. status:
  1108.     lxi    d,0    ;Offset 0
  1109. runit:
  1110.     call    getiop    ;device driver base
  1111.     dad    d
  1112.     pchl
  1113. select:
  1114.     lxi    d,3    ;Offset 3
  1115.     jmp    runit
  1116. namer:
  1117.     lxi    d,6    ;Offset 6
  1118.     jmp    runit
  1119.  
  1120. ;
  1121. ; **** Display Path Function ****
  1122. ;
  1123. pdisp:
  1124.     call    banner
  1125.     call    gxymsg
  1126.     db    3,28
  1127.     db    '--> ',1,'Path Expressions',2,' <--',0
  1128.     mvi    h,6    ; row 6
  1129.     mvi    l,10    ; column 10
  1130.     shld    infoxy
  1131.     call    dispxy
  1132.     call    vprint
  1133.     db    1,'Symbolic Form',2,0
  1134.     call    dispxy
  1135.     call    vprint
  1136.     db    '     ',0
  1137.     call    getpath    ; pt to external path
  1138. pdisp1:
  1139.     mov    a,m    ; get disk
  1140.     ora    a    ; done?
  1141.     jz    adisp
  1142.     cpi    '$'    ; current?
  1143.     jz    pdisp2
  1144.     adi    '@'    ; convert to letter
  1145. pdisp2:
  1146.     call    cout    ; print disk letter
  1147.     inx    h    ; pt to user
  1148.     mov    a,m    ; get user number
  1149.     cpi    '$'    ; current?
  1150.     jnz    pdisp3
  1151.     call    cout    ; print current indicator
  1152.     jmp    pdisp4
  1153. pdisp3:
  1154.     call    pafdc    ; print user number
  1155. pdisp4:
  1156.     call    colon
  1157.     inx    h    ; pt to next element
  1158.     mov    a,m    ; done?
  1159.     ora    a    ; 0=yes
  1160.     cnz    arrow
  1161.     jmp    pdisp1
  1162. ;
  1163. ;  Print Absolute Path
  1164. ;
  1165. adisp:
  1166.     call    dispxy
  1167.     call    dispxy
  1168.     call    vprint
  1169.     db    1,'DU Form      ',2,0
  1170.     call    dispxy
  1171.     call    vprint
  1172.     db    '     ',0
  1173.     call    retud    ; get current user/disk
  1174.     call    getpath    ; pt to external path
  1175. adisp1:
  1176.     mov    a,m    ; get disk
  1177.     ora    a    ; done?
  1178.     jz    ndisp
  1179.     cpi    '$'    ; current?
  1180.     jnz    adisp2
  1181.     mov    a,b    ; get current disk
  1182.     inr    a    ; adjust to 1 to n
  1183. adisp2:
  1184.     adi    '@'    ; convert to letter
  1185.     call    cout    ; print disk letter
  1186.     inx    h    ; pt to user
  1187.     mov    a,m    ; get user
  1188.     cpi    '$'    ; current?
  1189.     jnz    adisp3
  1190.     mov    a,c    ; get current user
  1191. adisp3:
  1192.     call    pafdc    ; print user
  1193.     call    colon
  1194.     inx    h    ; pt to next
  1195.     mov    a,m    ; done?
  1196.     ora    a
  1197.     cnz    arrow
  1198.     jmp    adisp1
  1199. ;
  1200. ;  Print Named Path
  1201. ;
  1202. ndisp:
  1203.     call    dispxy
  1204.     call    dispxy
  1205.     call    vprint
  1206.     db    1,'DIR Form     ',2,0
  1207.     call    dispxy
  1208.     call    vprint
  1209.     db    '     ',0
  1210.     call    getpath    ; pt to external path
  1211. ndisp1:
  1212.     call    retud    ; get current user and disk in C and B
  1213.     mov    a,m    ; get disk
  1214.     ora    a    ; done?
  1215.     jz    getcmd
  1216.     cpi    '$'    ; current?
  1217.     jz    ndisp2
  1218.     mov    b,a    ; disk in B
  1219.     dcr    b    ; adjust to 0 to n-1
  1220. ndisp2:
  1221.     inx    h    ; pt to user
  1222.     mov    a,m    ; get it
  1223.     cpi    '$'    ; current?
  1224.     jz    ndisp3
  1225.     mov    c,a    ; user in C
  1226. ndisp3:
  1227.     inx    h    ; pt to next
  1228.     push    h    ; save ptr
  1229.     call    udscan    ; scan dirs for user/disk and print its name
  1230.     pop    h    ; get ptr
  1231.     call    colon
  1232.     mov    a,m    ; done?
  1233.     ora    a
  1234.     cnz    arrow
  1235.     jmp    ndisp1
  1236.  
  1237. ;
  1238. ;  Print Colon
  1239. ;
  1240. colon:
  1241.     mvi    a,':'    ; print colon
  1242.     jmp    cout
  1243.  
  1244. ;
  1245. ;  Print Arrow
  1246. ;
  1247. arrow:
  1248.     call    vprint
  1249.     db    1,' --> ',2,0
  1250.     ret
  1251.  
  1252. ;
  1253. ;  Scan directories for user and disk in C and B
  1254. ;    Print name if found or "Noname" if not
  1255. ;
  1256. udscan:
  1257.     call    dutdir    ; convert to name
  1258.     jz    udscan1    ; error return if no name
  1259.     mvi    b,8    ; 8 chars max
  1260. udsprn:
  1261.     mov    a,m    ; get name char
  1262.     cpi    ' '    ; done?
  1263.     rz
  1264.     call    cout    ; print char
  1265.     inx    h    ; pt to next
  1266.     dcr    b    ; count down
  1267.     jnz    udsprn
  1268.     ret
  1269. udscan1:
  1270.     call    vprint
  1271.     db    'Noname',0
  1272.     ret
  1273.  
  1274. ;
  1275. ; **** Print Named Directory Info ****
  1276. ;
  1277. namedir:
  1278.     call    banner
  1279.     call    gxymsg
  1280.     db    3,26
  1281.     db    '--> ',1,'Named Directory Data',2,' <--',0
  1282.     call    getndr    ;get location of directory
  1283.     jnz    ndir1
  1284.     call    gxymsg
  1285.     db    5,22
  1286.     db    'Named Directory Buffer Not Available',0
  1287.     jmp    getcmd
  1288. ;
  1289. ; Print Names of Directory Elements
  1290. ;
  1291. ndir1:
  1292.     call    gxymsg
  1293.     db    5,25
  1294.     db    '-- Named Directory Entries --',0
  1295.     mvi    d,7    ;set row
  1296.     mvi    e,7    ;set column
  1297.     xchg
  1298.     call    gotoxy    ;position cursor
  1299.     xchg
  1300.     mvi    c,0    ;set entry count
  1301.     mvi    b,1    ;set disk 1
  1302. ;
  1303. ; Print Each Resident Command Name
  1304. ;
  1305. ndir2:
  1306.     mov    a,m    ;get table entry
  1307.     ora    a    ;end of table?
  1308.     jz    getcmd
  1309. ;
  1310. ; DE is carried over all of this as starting row/column
  1311. ;
  1312.     cmp    b    ;same disk?
  1313.     jz    ndir3
  1314. ;
  1315. ; Advance to Next Set of Entries for New Disk
  1316. ;
  1317.     mvi    c,0    ;reset counter
  1318.     mov    b,a    ;set new disk
  1319.     xchg        ;position for new disk
  1320.     inr    h    ;blank line
  1321.     inr    h
  1322.     call    gotoxy    ;position on screen
  1323.     xchg
  1324. ndir3:
  1325.     push    b    ;save counters
  1326. ;
  1327. ; Print DU:
  1328. ;
  1329.     mov    a,m    ;get disk
  1330.     adi    '@'    ;convert to letter (A to P)
  1331.     call    cout
  1332.     inx    h    ;pt to user
  1333.     mov    a,m    ;get user
  1334.     call    padc    ;print user number
  1335.     call    print    ;print separator
  1336.     db    ': ',0
  1337.     inx    h    ;pt to name
  1338. ;
  1339. ; Print DIR
  1340. ;
  1341.     mvi    b,8    ;print name
  1342. ndir4:
  1343.     mov    a,m    ;get char
  1344.     call    cout
  1345.     inx    h    ;pt to next
  1346.     dcr    b    ;count down
  1347.     jnz    ndir4
  1348. ;
  1349. ; Advance to Next and Print Separator
  1350. ;
  1351.     lxi    b,8    ;skip over password
  1352.     dad    b
  1353.     call    print    ;print separator
  1354.     db    '  ',0
  1355.     pop    b    ;get counters
  1356. ;
  1357. ; New Line Counter
  1358. ;
  1359.     inr    c    ;increment entry counter
  1360.     mov    a,c    ;check for done
  1361.     ani    3    ;every 4
  1362.     jnz    ndir2
  1363. ;
  1364. ; Position in Next Line
  1365. ;
  1366.     xchg        ;position cursor
  1367.     inr    h    ;next row
  1368.     call    gotoxy
  1369.     xchg
  1370.     jmp    ndir2
  1371.  
  1372. ;
  1373. ; **** Print Command Status ****
  1374. ;
  1375. command:
  1376.     call    banner
  1377.     call    gxymsg
  1378.     db    3,25
  1379.     db    '--> ',1,'Command Package Status',2,' <--',0
  1380.     call    gxymsg
  1381.     db    5,25
  1382.     db    '---- ',1,'FLOW COMMAND PACKAGE',2,' ----',0
  1383.     call    getfcp    ;get FCP data
  1384.     jnz    flow0
  1385.     call    gxymsg
  1386.     db    7,20
  1387.     db    'Flow Command Facility Not Available',0
  1388.     jmp    rcp
  1389. ;
  1390. ; Check for Flow Command Package Loaded
  1391. ;
  1392. flow0:
  1393.     mov    a,m    ;get first byte
  1394.     ora    a    ;0=none loaded
  1395.     jnz    flow1
  1396.     call    gxymsg
  1397.     db    7,25
  1398.     db    'No Flow Command Package Loaded',0
  1399.     jmp    rcp
  1400. ;
  1401. ; Print Flow Command Package Info
  1402. ;
  1403. flow1:
  1404.     call    gxymsg
  1405.     db    7,20
  1406.     db    1,'Flow Commands:',2,0
  1407.     lxi    d,5    ;skip to command size byte
  1408.     dad    d
  1409.     mov    b,m    ;get command size
  1410.     inx    h    ;pt to first command
  1411.     call    at
  1412.     db    8,22
  1413. ;
  1414. ; Print Flow Command Names
  1415. ;
  1416. flow2:
  1417.     mov    a,m    ;get first char
  1418.     ora    a    ;end of table?
  1419.     jz    flow4
  1420.     push    b    ;save counter
  1421. flow3:
  1422.     mov    a,m    ;get char
  1423.     inx    h    ;pt to next
  1424.     call    cout    ;print char
  1425.     dcr    b    ;count down
  1426.     jnz    flow3
  1427.     call    print
  1428.     db    '  ',0
  1429.     inx    h    ;skip over address
  1430.     inx    h
  1431.     pop    b    ;get counter
  1432.     jmp    flow2
  1433. ;
  1434. ; Print Flow Command Arguments
  1435. ;
  1436. flow4:
  1437.     call    gxymsg
  1438.     db    9,20
  1439.     db    1,'IF Options:',2,0
  1440.     call    at
  1441.     db    10,22
  1442.     inx    h    ;pt to first option
  1443. ;
  1444. ; Print Each Option
  1445. ;
  1446. flow5:
  1447.     mov    a,m    ;get next char
  1448.     ora    a    ;done?
  1449.     jz    flow6
  1450.     call    cout    ;print char
  1451.     inx    h    ;pt to 2nd char
  1452.     mov    a,m    ;get it and print
  1453.     call    cout
  1454.     call    print
  1455.     db    '  ',0    ;space over
  1456.     inx    h    ;skip address
  1457.     inx    h
  1458.     inx    h
  1459.     jmp    flow5
  1460. ;
  1461. ; Print Current IF Level
  1462. ;
  1463. flow6:
  1464.     call    gxymsg
  1465.     db    11,20
  1466.     db    1,'Current IF Level: ',2,0
  1467.     call    getmsg    ;pt to ZCPR3 messages
  1468.     inx    h    ;pt to IF byte
  1469.     mov    a,m    ;get IF byte
  1470.     mvi    c,'0'    ;assume level 0
  1471.     ora    a    ;see if at last IF level
  1472.     jz    flow8
  1473. flow7:
  1474.     inr    c    ;advance to next level
  1475.     rrc        ;rotate bits
  1476.     ani    7fh    ;mask out MSB
  1477.     jnz    flow7    ;continue looping until no 1 bits
  1478. flow8:
  1479.     mov    a,c    ;get digit
  1480.     call    cout    ;print it
  1481. ;
  1482. ; Print RCP Data
  1483. ;
  1484. rcp:
  1485.     call    gxymsg
  1486.     db    14,23
  1487.     db    '---- ',1,'RESIDENT COMMAND PACKAGE',2,' ----',0
  1488.     call    getrcp    ;get RCP data
  1489.     jnz    rcp0
  1490.     call    gxymsg
  1491.     db    16,20
  1492.     db    'Resident Command Facility Not Available',0
  1493.     jmp    getcmd
  1494. ;
  1495. ; Check for Resident Command Package Loaded
  1496. ;
  1497. rcp0:
  1498.     mov    a,m    ;get first byte
  1499.     ora    a    ;0=none loaded
  1500.     jnz    rcp1
  1501.     call    gxymsg
  1502.     db    16,23
  1503.     db    'No Resident Command Package Loaded',0
  1504.     jmp    getcmd
  1505. ;
  1506. ; Print Resident Command Package Info
  1507. ;
  1508. rcp1:
  1509.     call    gxymsg
  1510.     db    16,20
  1511.     db    1,'Resident Commands:',2,0
  1512.     lxi    d,5    ;skip to command size byte
  1513.     dad    d
  1514.     mov    b,m    ;get command size
  1515.     mvi    c,0    ;set count
  1516.     inx    h    ;pt to first command
  1517.     mvi    d,17    ;set row
  1518.     mvi    e,22    ;set column
  1519.     xchg
  1520.     call    gotoxy    ;position cursor
  1521.     xchg
  1522. ;
  1523. ; Print Each Resident Command Name
  1524. ;
  1525. rcp2:
  1526.     mov    a,m    ;get table entry
  1527.     ora    a    ;end of table?
  1528.     jz    getcmd
  1529.     push    b    ;save counters
  1530. rcp3:
  1531.     mov    a,m    ;get char
  1532.     inx    h    ;pt to next
  1533.     call    cout
  1534.     dcr    b    ;count down
  1535.     jnz    rcp3
  1536.     call    print
  1537.     db    '  ',0
  1538.     inx    h    ;pt to next command
  1539.     inx    h
  1540.     pop    b    ;get counters
  1541.     inr    c    ;increment entry counter
  1542.     mov    a,c    ;check for done
  1543.     ani    7    ;every 8
  1544.     jnz    rcp2
  1545.     xchg        ;position cursor
  1546.     inr    h    ;next row
  1547.     call    gotoxy
  1548.     xchg
  1549.     jmp    rcp2
  1550.  
  1551. ;
  1552. ; **** Print Error Handler Data ****
  1553. ;
  1554. errorh:
  1555.     call    banner
  1556.     call    gxymsg
  1557.     db    3,27
  1558.     db    '--> ',1,'Error Handler Data',2,' <--',0
  1559.     call    getmsg    ;get message address
  1560.     jnz    errh1
  1561.     call    gxymsg
  1562.     db    5,20
  1563.     db    'ZCPR3 Messages Not Available on this System',0
  1564.     jmp    getcmd
  1565. errh1:
  1566.     call    gxymsg
  1567.     db    5,27
  1568.     db    1,'Error Handler Engaged? ',2,0
  1569.     call    geter1    ;error handler engaged?
  1570.     push    psw
  1571.     call    pryn    ;print yes/no
  1572.     pop    psw
  1573.     jz    getcmd    ;exit display
  1574.     call    gxymsg
  1575.     db    6,27
  1576.     db    1,'Error Handler Command: ',2,0
  1577.     call    geterc    ;get command line
  1578.     call    pstr
  1579.     call    gxymsg
  1580.     db    7,30
  1581.     db    1,'Command Status: ',2,0
  1582.     mvi    a,22h    ; offset to message ptr
  1583.     call    compenv    ; pt to message ptr
  1584.     mov    a,m
  1585.     inx    h
  1586.     mov    h,m
  1587.     mov    l,a    ; HL pts to messages
  1588.     inx    h    ; pt to command status message
  1589.     inx    h
  1590.     inx    h
  1591.     mov    a,m    ; get it
  1592.     ani    3    ; 2 LSBs
  1593.     jz    errh3
  1594.     cpi    1
  1595.     jz    errh4
  1596.     call    print
  1597.     db    'Error',0
  1598.     inx    h    ; pt to error address
  1599.     mov    a,m    ; get low
  1600.     inx    h
  1601.     mov    h,m    ; get high
  1602.     mov    l,a
  1603.     call    gxymsg
  1604.     db    9,5
  1605.     db    1,'Error Command --',2,0
  1606.     call    vprint
  1607.     db    cr,lf,1,' --> ',2,0
  1608. errh2:
  1609.     mov    a,m    ; get char
  1610.     inx    h    ; pt to next
  1611.     ora    a    ; end of line?
  1612.     jz    errh5
  1613.     cpi    ';'    ; end of command with new command?
  1614.     jnz    errh2a
  1615.     call    vprint
  1616.     db    1,';',2,cr,lf,1,' --> ',2,0
  1617.     jmp    errh2
  1618. errh2a:
  1619.     call    cout    ; print char
  1620.     jmp    errh2
  1621. errh3:
  1622.     call    print
  1623.     db    'Normal',0
  1624.     jmp    errh5
  1625. errh4:
  1626.     call    print
  1627.     db    'Shell',0
  1628. errh5:
  1629.     jmp    getcmd
  1630.  
  1631. ;
  1632. ; **** Print Shell Stack Data ****
  1633. ;
  1634. shstack:
  1635.     call    banner
  1636.     call    gxymsg
  1637.     db    3,28
  1638.     db    '--> ',1,'Shell Stack Data',2,' <--',0
  1639.     call    getsh    ;get shell data
  1640.     jnz    shs0
  1641.     call    gxymsg
  1642.     db    5,20
  1643.     db    'Shell Stack NOT Available on this System',0
  1644.     jmp    getcmd
  1645. ;
  1646. ; Print Empty/Full Messages
  1647. ;
  1648. shs0:
  1649.     call    gxymsg
  1650.     db    5,30
  1651.     db    'Shell Stack Empty? ',0
  1652.     call    shempty
  1653.     jz    shsem
  1654.     mvi    a,0    ; set not empty
  1655.     jmp    shsnem
  1656. shsem:
  1657.     mvi    a,1    ; set empty
  1658. shsnem:
  1659.     call    pryn
  1660.     call    gxymsg
  1661.     db    6,30
  1662.     db    'Shell Stack Full?  ',0
  1663.     call    shfull
  1664.     jz    shsfu
  1665.     mvi    a,0    ; set not full
  1666.     jmp    shsnfu
  1667. shsfu:
  1668.     mvi    a,1    ; set full
  1669. shsnfu:
  1670.     call    pryn
  1671. ;
  1672. ; Print Shell Stack Content Data
  1673. ;
  1674.     call    gxymsg
  1675.     db    8,27
  1676.     db    '--- Shell Stack Content ---',0
  1677.     mvi    h,10    ;row 10
  1678.     mvi    l,20    ;col 20
  1679.     shld    infoxy    ;save position
  1680.     call    getsh    ;get shell stack data
  1681.     mov    e,b    ;get element size in DE
  1682.     mvi    d,0
  1683.     mov    b,a    ;get element count in B
  1684.     mvi    c,'1'    ;get digit in C
  1685. shs1:
  1686.     mov    a,m    ;check for element in stack
  1687.     ora    a    ;0=empty
  1688.     jz    shs2
  1689.     call    dispxy    ;position for display
  1690.     call    vprint
  1691.     db    1,'Elt ',0
  1692.     mov    a,c    ;get digit
  1693.     call    cout    ;print as decimal
  1694.     inr    c    ;next digit
  1695.     call    vprint
  1696.     db    ' -- ',2,0
  1697.     push    h
  1698.     call    pstr    ;print entry
  1699.     pop    h
  1700.     dad    d    ;pt to next
  1701.     dcr    b    ;count down
  1702.     jnz    shs1
  1703. shs2:
  1704.     mov    a,c    ;see if anything printed
  1705.     cpi    '1'
  1706.     jnz    getcmd
  1707.     lhld    infoxy    ;position on screen
  1708.     call    gotoxy
  1709.     call    print
  1710.     db    '     Empty',0
  1711.     jmp    getcmd
  1712.  
  1713. ;
  1714. ; Position Display at INFOXY address and advance
  1715. ;
  1716. dispxy:
  1717.     push    h    ;save HL
  1718.     lhld    infoxy    ;get screen position
  1719.     call    gotoxy    ;go there
  1720.     inr    h    ;advance to next line
  1721.     shld    infoxy    ;set screen position
  1722.     pop    h    ;restore HL
  1723.     ret
  1724. ;
  1725. ; If A=0, print Yes, else print No
  1726. ;
  1727. pryn:
  1728.     ora    a
  1729.     jnz    pryes
  1730.     call    print
  1731.     db    'NO',0
  1732.     ret
  1733. pryes:
  1734.     call    print
  1735.     db    'YES',0
  1736.     ret
  1737.  
  1738. ;
  1739. ; Buffers
  1740. ;
  1741. showcmd:
  1742.     db    'SHOW    ',0
  1743. infoxy:
  1744.     ds    2    ;address on screen of next line to print
  1745. cstat:
  1746.     ds    2    ;command status ptr
  1747. dumpstrt:
  1748.     ds    2    ;address of next byte to start memory dump
  1749. cline:
  1750.     ds    2    ;address of current line
  1751.  
  1752.     end
  1753.