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

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