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 / ERROR2.MAC < prev    next >
Text File  |  2000-06-30  |  8KB  |  368 lines

  1. ;
  2. ; Program: ERROR2
  3. ; Author: Richard Conn
  4. ; Version: 1.0
  5. ; Date: 5 Mar 84
  6. ;
  7. version    equ    10
  8.  
  9. ;
  10. ;    This error handler displays the error line to the user and
  11. ; provides him with four options as to how to process this line:
  12. ;        1. Replace the command in error with a new command
  13. ;        2. Skip the command in error and resume execution
  14. ;            with the next command
  15. ;        3. Replace the command line as it now stands
  16. ;        4. Throw away the command line and resume user
  17. ;            control
  18. ;
  19. ;    Unlike ERROR1, ERROR2 is screen-oriented, using the Z3TCAP
  20. ; for support.
  21. ;
  22. ;    This program is transportable from one ZCPR3 system to another
  23. ; provided it is reassembled with the correct address for the ZCPR3
  24. ; Environment Descriptor (Z3ENV) or DDT is used to patch this address
  25. ; (which is the first two bytes after the opening JMP).  If an external
  26. ; ZCPR3 Environment Descriptor is not available, one will have to be
  27. ; provided by setting the Z3ENV equate to 0 and providing SYSENV.LIB in
  28. ; the current directory at assembly time.
  29. ;
  30.  
  31. ;
  32. ; Equates for Key Values
  33. ;
  34. z3env    SET    0f400h    ;address of ZCPR3 environment
  35. cmtch    equ    ';'    ;comment character
  36. cr    equ    0dh
  37. lf    equ    0ah
  38.  
  39. ;
  40. ; External Z3LIB and SYSLIB Routines
  41. ;
  42.     ext    z3vinit
  43.     ext    print,pstr,codend,capine,bbline,crlf,moveb
  44.     ext    erradr,puter1,puterc        ;Error Handler Routines
  45.     ext    qprint                ;Quiet Mode Prints
  46.     ext    getenv,getefcb,getcl1,qerror    ;Z3 Messages et al
  47.     ext    at,cls,stndout,stndend,gotoxy,vprint,gxymsg    ;VLIB Routines
  48.  
  49. ;
  50. ; Environment Definition
  51. ;
  52.     if    z3env ne 0
  53. ;
  54. ; External ZCPR3 Environment Descriptor
  55. ;
  56.     jmp    start
  57.     db    'Z3ENV'    ;This is a ZCPR3 Utility
  58.     db    1    ;External Environment Descriptor
  59. z3eadr:
  60.     dw    z3env
  61. start:
  62.     lhld    z3eadr    ;pt to ZCPR3 environment
  63. ;
  64.     else
  65. ;
  66. ; Internal ZCPR3 Environment Descriptor
  67. ;
  68.     MACLIB    Z3BASE.LIB
  69.     MACLIB    SYSENV.LIB
  70. z3eadr:
  71.     jmp    start
  72.     SYSENV
  73. start:
  74.     lxi    h,z3eadr    ;pt to ZCPR3 environment
  75.     endif
  76.  
  77. ;
  78. ; Start of Program -- Initialize ZCPR3 Environment
  79. ;
  80.     call    z3vinit    ;initialize the ZCPR3 Environment
  81. ;
  82. ; Print Banner
  83. ;
  84.     call    qprint
  85.     db    'ERROR2, Version '
  86.     db    (version/10)+'0','.',(version mod 10)+'0'
  87.     db    cr,lf,0
  88. ;
  89. ; Determine if Program Invoked as an Error Handler or By the User
  90. ;
  91.     call    qerror    ;error?
  92.     jz    handler    ;handle error
  93. ;
  94. ; Invoked by the User, so Install as an Error Handler
  95. ;
  96.     call    getenv        ;must have a Z3TCAP entry
  97.     lxi    d,80h        ;pt to Z3TCAP
  98.     dad    d
  99.     mov    a,m        ;must not be space or less
  100.     cpi    ' '+1
  101.     jnc    start0
  102.     call    print
  103.     db    cr,lf,' No Z3TCAP - Aborting',0
  104.     ret
  105. ;
  106. ; Determine Name of Routine
  107. ;
  108. start0:
  109.     call    getefcb        ;pt to external FCB
  110.     jz    start1        ;proceed if external FCB not available
  111. ;
  112. ; Make Name Invoked by User the Name of the Error Handler
  113. ;
  114.     inx    h        ;pt to first char
  115.     lxi    d,ername    ;pt to name of error handler message
  116.     mvi    b,8        ;at most 8 bytes
  117.     call    moveb        ;copy into buffer
  118. ;
  119. ; Make Command Line in Buffer the Error Handler
  120. ;
  121. start1:
  122.     lxi    h,ername    ;make name in buffer the error handler
  123.     call    puterc        ;set command
  124.     mvi    a,0ffh        ;set error code
  125.     call    puter1        ;set message
  126.     call    print
  127.     db    ' Error Handler Installed',0
  128.     ret
  129. ;
  130. ; Handle Error
  131. ;
  132. handler:
  133.     call    erradr        ;get address of error line
  134.     xchg            ;HL pts to free area, DE pts to error line
  135.     call    codend        ;get ptr to free area
  136.     shld    badcmd        ;save ptr to bad command
  137. ;
  138. ; Extract Bad Command and Store It in Memory Starting at BADCMD
  139. ;    DE pts to bad command, HL pts to location to store it at
  140. ;
  141. savebad:
  142.     ldax    d        ;get next char
  143.     mov    m,a        ;put it
  144.     ora    a        ;done?
  145.     jz    sbad1
  146.     cpi    cmtch        ;check for comment
  147.     jz    sbad1
  148.     inx    h        ;pt to next
  149.     inx    d
  150.     jmp    savebad
  151. ;
  152. ; Set ending 0 in bad command buffer and check for continuation
  153. ;
  154. sbad1:
  155.     mvi    m,0        ;store ending zero
  156.     inx    h        ;pt to next
  157.     cpi    cmtch        ;more?
  158.     jnz    sbad2
  159.     inx    d        ;pt to rest of command
  160. sbad2:
  161.     shld    restcmd        ;save rest of command line
  162. ;
  163. ; Extract Rest of Command Line and Store It in Memory Starting at RESTCMD
  164. ;
  165. saverest:
  166.     ldax    d        ;get next
  167.     mov    m,a        ;put it
  168.     inx    h        ;pt to next
  169.     inx    d
  170.     ora    a        ;done?
  171.     jnz    saverest
  172.     shld    scratch        ;save ptr to scratch area
  173. ;
  174. ; Prompt User for Action
  175. ;
  176. prompt:
  177.     call    cls    ;clear screen
  178.     call    gxymsg
  179.     db    3,22
  180.     db    '>>>> ',1,'VIDEO ERROR HANDLER',2,' <<<<',0
  181.     call    gxymsg
  182.     db    5,28
  183.     db    '-- Error  Line --',0
  184.     call    at
  185.     db    6,10
  186.     call    stndout    ;reverse video
  187.     call    erradr        ;get address of error line
  188.     call    pstr
  189.     call    stndend    ;normal video
  190.     mvi    h,10    ;position cursor
  191.     mvi    l,15
  192.     shld    infoxy
  193.     call    gxymsg
  194.     db    8,30
  195.     db    '-- Options --',0
  196.     call    atinfo
  197.     call    vprint
  198.     db    '1. Replace Command in Error with a New Command',0
  199.     call    atinfo
  200.     call    vprint
  201.     db    '   Replace ',1,0
  202.     lhld    badcmd
  203.     call    pstr
  204.     call    atinfo
  205.     call    atinfo
  206.     call    vprint
  207.     db    2,'2. Advance to Next Command and Resume Processing',0
  208.     call    atinfo
  209.     call    vprint
  210.     db    '   Advance to ',1,0
  211.     lhld    restcmd
  212.     call    pstr
  213.     call    atinfo
  214.     call    atinfo
  215.     call    vprint
  216.     db    2,'3. Replace Entire Line with a New Line',0
  217.     call    atinfo
  218.     call    vprint
  219.     db    '   Replace ',1,0
  220.     call    erradr        ;pt to error line
  221.     call    pstr
  222.     call    atinfo
  223.     call    atinfo
  224.     call    vprint
  225.     db    2,'4. Throw Away Entire Line and Continue',0
  226.     call    atinfo
  227.     call    vprint
  228.     db    '   Throw Away ',1,0
  229.     call    erradr        ;pt to error line
  230.     call    pstr
  231.     call    stndend
  232. userin:
  233.     call    gxymsg
  234.     db    22,20
  235.     db    'Select Option - ',0
  236.     call    capine
  237.     cpi    '1'    ;option 1
  238.     jz    replace    ;replace command in error
  239.     cpi    '2'    ;option 2
  240.     jz    advance    ;advance to next command
  241.     cpi    '3'    ;option 3
  242.     jz    newline    ;enter new line
  243.     cpi    '4'    ;option 4
  244.     jz    flush    ;throw away line
  245.     call    print
  246.     db    8,'  Invalid Option - Retry',0    ;backspace over error
  247.     jmp    userin
  248. ;
  249. ; Position at INFOXY and advance ptr to next line
  250. ;
  251. atinfo:
  252.     lhld    infoxy    ;pt to next position
  253.     call    gotoxy    ;go there
  254.     inr    h    ;next line
  255.     shld    infoxy
  256.     ret
  257. ;
  258. ; Replace Command in Error
  259. ;
  260. replace:
  261.     call    print
  262.     db    '   Replacement Command?',cr,lf,'  ',0
  263.     lhld    restcmd    ;pt to rest of command line in DE
  264.     xchg
  265.     mvi    a,0ffh    ;capitalize
  266.     call    bbline    ;get line from user
  267.     call    build    ;build and run command
  268.     jmp    prompt    ;continue if error
  269. ;
  270. ; Advance to Rest of Command Line
  271. ;
  272. advance:
  273.     lhld    restcmd    ;pt to it
  274.     xchg
  275.     lxi    h,empty    ;HL pts to empty command, DE pts to tail
  276.     call    build    ;build and run command
  277.     jmp    prompt    ;continue if error
  278. ;
  279. ; Enter New Line
  280. ;
  281. newline:
  282.     call    print
  283.     db    '   New Command?',cr,lf,'  ',0
  284.     mvi    a,0ffh    ;capitalize
  285.     call    bbline    ;get line from user
  286.     lxi    d,empty    ;HL pts to user command, DE pts to empty command
  287.     call    build    ;build and run command
  288.     jmp    prompt    ;continue if error
  289. ;
  290. ; Flush Commands
  291. ;
  292. flush:
  293.     ret        ;simply exit if no more commands
  294. ;
  295. ; Build New Command Line in SCRATCH Area and Run it by returning to ZCPR3
  296. ;   On input, HL pts to header, DE pts to tail
  297. ;
  298. build:
  299.     lxi    b,1    ;set char count (1 for ending zero)
  300.     push    d    ;save ptr to tail
  301.     push    h    ;save ptr to header
  302.     lhld    scratch    ;pt to scratch area
  303.     pop    d    ;get ptr to header
  304.     ldax    d    ;get first char
  305.     ora    a    ;any there?
  306.     cnz    copy    ;copy line into buffer
  307.     pop    d    ;get ptr to tail
  308.     ldax    d    ;anything there?
  309.     ora    a
  310.     jz    bldt    ;terminate build if not
  311.     mvi    m,cmtch    ;begin with semicolon
  312.     inx    h    ;pt to next
  313.     call    copy
  314. bldt:
  315.     mvi    m,0    ;store ending zero
  316. ;
  317. ; Store Command Line into MCL Buffer
  318. ;
  319.     call    getcl1    ;pt to command line
  320.     cmp    c    ;check for char count within range
  321.     rc
  322.     mov    a,b    ;check for line too long
  323.     ora    a    ;line too long?
  324.     rnz        ;error if so
  325.     lxi    d,4    ;pt to first char
  326.     push    h    ;save ptr to current
  327.     dad    d
  328.     pop    d    ;get ptr to current
  329.     xchg        ;DE pts to first char position, HL pts to CL buffer
  330.     mov    m,e    ;set address to resume processing
  331.     inx    h
  332.     mov    m,d
  333.     lhld    scratch        ;pt to new line
  334.     xchg            ;in DE, while HL pts to first char position
  335.     call    copy        ;copy it
  336.     mov    m,a        ;store ending zero
  337.     pop    d        ;clear stack
  338.     ret            ;resume processing
  339. ;
  340. ; Copy string pted to by DE into buffer pted to by HL
  341. ;
  342. copy:
  343.     ldax    d    ;get next char
  344.     ora    a    ;done?
  345.     rz
  346.     mov    m,a    ;store it
  347.     inx    b    ;increment count
  348.     inx    h    ;pt to next
  349.     inx    d
  350.     jmp    copy
  351. ;
  352. ; Buffers
  353. ;
  354. ername:
  355.     db    'ERROR2  ',0    ;name of error handler
  356. empty:
  357.     db    0    ;empty command line
  358. infoxy:
  359.     ds    2    ;xy-coordinate for display
  360. badcmd:
  361.     ds    2    ;ptr to bad command extracted
  362. restcmd:
  363.     ds    2    ;ptr to tail of bad command line
  364. scratch:
  365.     ds    2    ;ptr to scratch area used to build new lines
  366.  
  367.     end
  368.