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 / CPM / MODEMS / ZMODEM / ZMO-TV05.Z80 < prev    next >
Text File  |  2000-06-30  |  14KB  |  704 lines

  1. ;  PROGRAM: ZMO-TV05.Z80
  2. ;  AUTHOR:  Michael Evenson
  3. ;  VERSION: 1.5
  4. ;  DATE:  10 Nov, 1988
  5. ;-----------------------------------------------------------------------
  6. ;    This overlay is set up for Televideo TS80x(H) using modem port.
  7. ;     Uses a Z80SIO AND A Z80CTC.
  8. ;        flags must be set for Televideo TS806, TS816, or TS802(H)
  9. ;        currently does not support TS803 (STI) or TS804 (MPM system)
  10. ;-----------------------------------------------------------------------
  11. ; 89/04/12 - Modified to ZMP v1.5        - George Conover
  12. ; 89/03/15 - Removed the beginning remarks to make the file
  13. ;            smaller. If you need the remarks there are in the
  14. ;            file ZMP-BLNK.Z80             - George Conover
  15. ; 89/03/14 - Modified to ZMP v1.4        - George Conover
  16. ; 88/11/10 - First version of this file        - Michael Evenson
  17. ;
  18. ;    Written by -
  19. ;      Ron Murray, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  20. ;-----------------------------------------------------------------------
  21. NO    EQU    0
  22. YES    EQU    NOT NO
  23.  
  24. ; User-set variables: ***********
  25.  
  26. CLKSPD    EQU    4        ; Processor clock speed in MHz
  27. DEBUG    EQU    NO
  28.  
  29. ;Set the following two equates to the drive and user area which will contain
  30. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  31. ;   (null) to locate them on the drive from which ZMP was invoked.
  32.  
  33. OVERDRIVE    EQU    'A'    ; Drive to find overlay files on ('A'-'P')
  34. OVERUSER    EQU    0    ; User area to find files
  35.  
  36. ;------------------------------------------------------------------------------
  37.  
  38.  
  39. ; NOT user-set variables
  40. USERDEF    EQU    00145H        ; origin of this overlay
  41.                 ; This address should remain constant
  42.                 ; with subsequent revisions.
  43. MSPEED    EQU    003CH        ; current baud rate id
  44. OVSIZE    EQU    0400H        ; max size of this overlay
  45.  
  46.     .Z80            ; use z80 code
  47.     ASEG            ; absolute
  48.  
  49.      IF    DEBUG
  50.     ORG    100H        ; so you can debug it with cebug, zsid, etc
  51.      ELSE
  52.     ORG    USERDEF
  53.      ENDIF
  54.  
  55. ;    be sure to set the correct system and port identifier here
  56. ;        (only one of each please)
  57.  
  58. TS802    EQU    YES
  59. TS806    EQU    NO
  60. TS816    EQU    NO
  61.  
  62. MODEMP    EQU    YES
  63. PRINTP    EQU    NO
  64.  
  65. ;
  66.  
  67. ESC    EQU    1BH
  68. CTRLQ    EQU    11H
  69. CR    EQU    0DH
  70. LF    EQU    0AH
  71. BDOS    EQU    5
  72.  
  73.  
  74. ; Televideo specific equates  ******************************************
  75.  
  76.      IF    TS802
  77.       IF    MODEMP
  78. MDATA    EQU    020H
  79. MSTAT    EQU    022H
  80. CTC    EQU    08H
  81.       ELSE
  82. MDATA    EQU    021H
  83. MSTAT    EQU    023H
  84. CTC    EQU    09H
  85.      ENDIF
  86.  
  87.      ELSE
  88.  
  89.       IF    TS806
  90.        IF    MODEMP
  91. MDATA    EQU    050H
  92. MSTAT    EQU    052H
  93. CTC    EQU    80H
  94.        ELSE
  95. MDATA    EQU    051H
  96. MSTAT    EQU    053H
  97. CTC    EQU    81H
  98.        ENDIF
  99.       ELSE
  100.        IF    TS816
  101.         IF    MODEMP
  102. MDATA    EQU    059H        ; channel B
  103. MSTAT    EQU    05BH
  104. CTC    EQU    C1H        ; CTC 1
  105.         ELSE
  106. MDATA    EQU    058H        ; channel A
  107. MSTAT    EQU    05AH
  108. CTC    EQU    C0H        ; CTC 0
  109.         ENDIF
  110.        ENDIF
  111.       ENDIF
  112.      ENDIF
  113.  
  114. RDA    EQU    0
  115. TBE    EQU    2
  116. MODE    EQU    47H
  117. ONHOOK    EQU    7FH
  118. ONLINE    EQU    80H
  119. ERROR    EQU    70H
  120. BREAK    EQU    0F8H
  121. RESET    EQU    30H
  122. ;            ******************************************
  123.  
  124. ; Main code starts here
  125.  
  126. CODEBGN    EQU    $
  127.  
  128. ;Jump table for the overlay: do NOT change this
  129. JUMP_TAB:
  130.     JP    SCRNPR        ; screen print
  131.     JP    MRD        ; modem read with timeout
  132.     JP    MCHIN        ; get a character from modem
  133.     JP    MCHOUT        ; send a character to the modem
  134.     JP    MORDY        ; test for tx buffer empty
  135.     JP    MIRDY        ; test for character received
  136.     JP    SNDBRK        ; send break
  137.     JP    CURSADD        ; cursor addressing
  138.     JP    CLS        ; clear screen
  139.     JP    INVON        ; inverse video on
  140.     JP    INVOFF        ; inverse video off
  141.     JP    HIDE        ; hide cursor
  142.     JP    SHOW        ; show cursor
  143.     JP    SAVECU        ; save cursor position
  144.     JP    RESCU        ; restore cursor position
  145.     JP    MINT        ; service modem interrupt
  146.     JP    INVEC        ; initialise interrupt vectors
  147.     JP    DINVEC        ; de-initialise interrupt vectors
  148.     JP    MDMERR        ; test uart flags for error
  149.     JP    DTRON        ; turn DTR on
  150.     JP    DTROFF        ; turn DTR OFF
  151.     JP    INIT        ; initialise uart
  152.     JP    WAIT        ; wait seconds
  153.     JP    MSWAIT        ; wait milliseconds
  154.     JP    USERIN        ; user-defined entry routine
  155.     JP    USEROUT        ; user-defined exit routine
  156.     JP    GETVARS        ; get system variables
  157.       JP    SETPORT        ; Set port (0 or 1)
  158. ;
  159. ; Spare jumps for compatibility with future versions
  160. ;
  161.     JP    SPARE        ; spare for later use
  162.     JP    SPARE        ; spares for later use
  163.     JP    SPARE        ; spares for later use
  164.     JP    SPARE        ; spares for later use
  165.     JP    SPARE        ; spares for later use
  166.     JP    SPARE        ; spares for later use
  167.  
  168. SPARE:    RET
  169.  
  170. ;-------------------------------------------------------------------------
  171.  
  172.  
  173. ;Screen print function
  174. SCRNPR:
  175.                 ; <== Insert your own code here
  176.     CALL    PRINT
  177.     DB    'This function not supported.',CR,LF,0
  178.                 ; <== End of your own code
  179.     RET
  180.  
  181.  
  182. ;Get a character from the modem: return in HL
  183. MCHIN:
  184.     PUSH    BC
  185.                 ; <== Insert your own code here
  186.  
  187. MCHIN2:
  188.     IN    A,(MSTAT)    ; check for char waiting
  189.     BIT    RDA,A
  190.     JR    Z,MCHIN2
  191.  
  192.     IN    A,(MDATA)    ; read the char
  193.  
  194.  
  195.                 ; <== End of your own code
  196.  
  197.  
  198.     LD    L,A        ; put in HL
  199.     LD    H,0
  200.     OR    A        ; set/clear Z
  201.     POP    BC
  202.     RET
  203.  
  204. ;Send a character to the modem
  205. MCHOUT:
  206.     LD    HL,2        ; get the character
  207.     ADD    HL,SP
  208.     LD    A,(HL)
  209.                 ; <== Insert your own code here
  210.  
  211.     PUSH    BC
  212.     LD    B,A        ; save the char
  213.  
  214. MCHOUT2:
  215.     IN    A,(MSTAT)    ; check for uart ready
  216.     BIT    TBE,A
  217.     JR    Z,MCHOUT2
  218.  
  219.     LD    A,B        ; char in a
  220.     OUT    (MDATA),A    ; send it
  221.     POP    BC
  222.  
  223.                 ; <== End of your own code
  224.     RET            ; done
  225.  
  226. ;Test for output ready: return TRUE (1) in HL if ok
  227. MORDY:
  228.                 ; <== Insert your own code here
  229.  
  230.     LD    HL,0
  231.     IN    A,(MSTAT)
  232.     BIT    TBE,A        ; transmit buffer empty
  233.     JR    Z,MORDY1
  234.     INC    HL
  235. MORDY1:
  236.  
  237.                 ; <== End of your own code
  238.  
  239.     LD    A,L        ; set/clear Z
  240.     OR    A
  241.     RET
  242.  
  243. ;Test for character at modem: return TRUE (1) in HL if so
  244. MIRDY:
  245.                 ; <== Insert your own code here
  246.  
  247.     LD    HL,0
  248.     IN    A,(MSTAT)
  249.     BIT    RDA,A        ; received data available
  250.     JR    Z,MIRDY1
  251.     INC    HL
  252. MIRDY1:
  253.  
  254.                 ; <== End of your own code
  255.     LD    A,L        ; set/clear Z
  256.     OR    A
  257.     RET
  258.  
  259. ;Send a break to the modem: leave empty if your system can't do it
  260. SNDBRK:
  261.                 ; <== Insert your own code here
  262.     LD    A,5
  263.     OUT    (MSTAT),A
  264.     LD    A,BREAK        ; F8
  265.     OUT    (MSTAT),A
  266.  
  267.     LD    HL,300        ; wait 300 mS
  268.     CALL    WAITHLMS
  269.  
  270.     LD    A,5
  271.     OUT    (MSTAT),A
  272.     LD    A,ONLINE    ; 68
  273.     OUT    (MSTAT),A
  274.  
  275.     LD    A,3
  276.     OUT    (MSTAT),A
  277.     LD    A,0E1H
  278.     OUT    (MSTAT),A    ; E1
  279.  
  280.                 ; <== End of your own code
  281.     RET
  282. ;
  283. ;Test UART flags for error: return TRUE (1) in HL if error.
  284. MDMERR:
  285.                 ; <== Insert your own code here
  286.     LD    HL,0
  287.     IN    A,(MSTAT)
  288.     AND    ERROR
  289.     JR    Z,MDMER2
  290.     INC    HL
  291. MDMER2:
  292.                 ; <== End of your own code
  293.     LD    A,L        ; set/clear Z
  294.     OR    A
  295.     RET
  296.  
  297.  
  298.  
  299. ;Turn DTR ON
  300. DTRON:
  301.                 ; <== Insert your own code here
  302.     LD    A,5
  303.     OUT    (MSTAT),A
  304.  
  305.     LD    A,(COMBYT)    ; get the one we used last time
  306.     OR    ONLINE        ; 80h - set bit 7 high
  307.     LD    (COMBYT),A    ; save it for next time
  308.     OUT    (MSTAT),A    ; go
  309.  
  310.                 ; <== End of your own code
  311.     RET
  312.  
  313.  
  314.  
  315. ;Turn DTR OFF
  316. DTROFF:
  317.                 ; <== Insert your own code here
  318.  
  319.     LD    A,5
  320.     OUT    (MSTAT),A
  321.  
  322.     LD    A,(COMBYT)    ; get the one we used last time
  323.     AND    ONHOOK        ; 7Fh - clear bit 7
  324.     LD    (COMBYT),A    ; save it for next time
  325.     OUT    (MSTAT),A    ; go
  326.  
  327.                 ; <== End of your own code
  328.     RET
  329.  
  330.  
  331.  
  332. ;Initialise the SIO +++
  333. ; The SIO is set up in four steps:
  334. ;     1)  Reset
  335. ;       2)  Reg 4 - clock, stop bits, parity
  336. ;    3)  Reg 5 - dtr, Tx bits, Brk, TxEn, rts
  337. ;    4)  Reg 3 - Rx bits, RxEn
  338.  
  339. INIT:
  340.  
  341.     LD    HL,2        ; get parameters
  342.     ADD    HL,SP
  343.     EX    DE,HL
  344.     CALL    GETPARM        ; in HL
  345.     LD    (BRATE),HL    ; baud rate
  346.     CALL    GETPARM
  347.     LD    (PARITY),HL    ; parity
  348.     CALL    GETPARM
  349.     LD    (DATA),HL    ; data bits
  350.     CALL    GETPARM
  351.     LD    (STOP),HL    ; stop bits
  352.  
  353.  
  354.                 ; <== Insert your own code here
  355.                 ; using values below
  356.  
  357.     PUSH    BC
  358.  
  359.     LD    A,0
  360.     OUT    (MSTAT),A    ; point to reg 0
  361.     LD    A,18H        ; reset
  362.     OUT    (MSTAT),A    ;                *** step 1
  363.  
  364.     LD    A,4        ; point to wrt reg 4
  365.     OUT    (MSTAT),A
  366.     LD    E,44H        ; assume  x16, 1 stop, No parity
  367.     LD    A,(STOP)    ; set stop bits
  368.     CP    2        ; set 2 if required
  369.     JR    NZ,SETPAR
  370.     SET    3,E
  371.  
  372. SETPAR:
  373.     LD    A,(PARITY)    ; set parity bits
  374.     CP    'O'
  375.     JR    NZ,SETPA2
  376.     SET    0,E        ; ODD
  377.     JR    SETPA3
  378.  
  379. SETPA2:    CP    'E'
  380.     JR    NZ,SETPA3
  381.     SET    0,E
  382.     SET    1,E        ; EVEN
  383.  
  384. SETPA3:    LD    A,E
  385.     OUT    (MSTAT),A    ;                *** step 2
  386.  
  387.  
  388.  
  389.     LD    A,5        ; point to wrt reg 5 - dtr, Tx bits, etc
  390.     OUT    (MSTAT),A
  391.     LD    E,0EAH        ; assume dtr, TX 8 bits, TxEn, rts
  392.     LD    A,(DATA)
  393.     CP    7
  394.     JR    NZ,SETBI2
  395.     RES    6,E        ; 7 bits
  396.  
  397. SETBI2:    LD    A,E
  398.     OUT    (MSTAT),A    ;                *** step 3
  399.     
  400.     LD    A,3        ; point to wrt reg 3
  401.     OUT    (MSTAT),A
  402.     LD    E,0C1H        ; assume 8 bits
  403.     LD    A,(DATA)
  404.     CP    7
  405.     JR    NZ,SETBI3
  406.     RES    7,E        ; 7 bits
  407.  
  408. SETBI3:    LD    A,E
  409.     OUT    (MSTAT),A    ;                *** step 4
  410.  
  411.  
  412. SETBRATE:
  413.     LD    DE,(BRATE)    ; get baud rate value (0-10)
  414.     LD    HL,BRVAL
  415.     ADD    HL,DE
  416.     LD    A,(HL)        ; get value from table
  417.     OR    A        ; 0 = not valid
  418.     JR    Z,SETBRX    ; so quit
  419.     LD    A,MODE        ; 47h
  420.     OUT    (CTC),A        ; select the correct timer and mode of the CTC
  421.     LD    A,(HL)        ; then get value back
  422.     OUT    (CTC),A        ; do it
  423.     LD    A,(BRATE)
  424.     LD    (MSPEED),A    ; tell zmp it's ok
  425. SETBRX:
  426.     POP    BC
  427.     RET
  428.  
  429.  
  430.  
  431. BRATE:    DW    7        ; baud rate:
  432. PARITY:    DW    'N'        ; parity
  433. DATA:    DW    8        ; data bits
  434. STOP:    DW    1        ; stop bits
  435. COMBYT:    DB    0EAH        ; save it here
  436.  
  437. ;Values for Z80CTC control reg for each baud rate: 0 if invalid
  438. BRVAL:
  439.     DB     0    ;   110        0
  440.     DB    80H    ;   300        1
  441.     DB     0    ;   450        2
  442.     DB    40H    ;   600        3
  443.     DB     0    ;   710        4
  444.     DB    20H    ;  1200        5
  445.     DB    10H    ;  2400        6
  446.     DB    08H    ;  4800        7
  447.     DB    04H    ;  9600        8
  448.     DB    02H    ; 19200        9
  449.     DB    0    ; 38400           10
  450.     DB    0    ; 57600           11
  451.     DB    0    ; 76800           12
  452.  
  453. ;
  454. ; Set the port. ZMP supplies either 0 or 1 as a parameter.
  455. ;
  456. setport:
  457.     ld    hl,2        ; get port number
  458.     add    hl,sp
  459.     ex    de,hl
  460.     call    getparm        ; in HL (values are 0 and 1)
  461.  
  462.                 ; <== Insert your own code here
  463.  
  464.                 ; <== End of your own code
  465.     ret
  466. ;****************************************************************************
  467. ;Video terminal sequences: these are for Televideo TS950: Modify as you wish
  468. ;Cursor addressing: 
  469. CURSADD:
  470.     LD    HL,2        ; get parameters
  471.     ADD    HL,SP
  472.     EX    DE,HL
  473.     CALL    GETPARM        ; in HL
  474.     LD    (ROW),HL    ; row
  475.     CALL    GETPARM
  476.     LD    (COL),HL    ; column
  477.                 ; <== Insert your own code here
  478.                 ; using values in row and col
  479.     CALL    PRINT
  480.     DB    ESC,'=',0    ; ADM-3A leadin
  481.     LD    A,(ROW)        ; row first
  482.     ADD    A,' '        ; add offset
  483.     CALL    COUT
  484.     LD    A,(COL)        ; sane for column
  485.     ADD    A,' '
  486.     CALL    COUT
  487.                 ; <== end of your own code
  488.     RET
  489.  
  490. ROW:    DS    2        ; row
  491. COL:    DS    2        ; column
  492.  
  493.  
  494. ;Clear screen:
  495. CLS:
  496.     CALL    PRINT
  497.     DB    ESC,'*',0
  498.     RET
  499.  
  500. ;Inverse video on:
  501. INVON:
  502.     CALL    PRINT
  503.     DB    ESC,'G4',0
  504.     RET
  505.  
  506. ;Inverse video off:
  507. INVOFF:
  508.     CALL    PRINT
  509.     DB    ESC,'G0',0
  510.     RET
  511.  
  512. ;Turn off cursor:
  513. HIDE:
  514.     CALL    PRINT
  515.     DB    ESC,'.1',0
  516.     RET
  517.  
  518. ;Turn on cursor:
  519. SHOW:
  520.     CALL    PRINT
  521.     DB    ESC,'.2',0
  522.     RET
  523.  
  524. ;Save cursor position:
  525. SAVECU:
  526.     RET
  527.  
  528. ;Restore cursor position:
  529. RESCU:
  530.     RET
  531.  
  532. ;User-defined entry routine: leave empty if not used
  533. USERIN:
  534.     RET
  535.  
  536. ;User-defined exit routine: leave empty if not used
  537. USEROUT:
  538.     RET
  539.  
  540.  
  541. ;****************************************************************************
  542.  
  543. ;Service modem interrupt:
  544. MINT:
  545.     RET            ; my system doesn't need this
  546.  
  547. ;Initialise interrupt vectors:
  548. INVEC:
  549.     RET            ; ditto
  550.  
  551. ;De-initialise interrupt vectors:
  552. DINVEC:
  553.     RET            ; ditto
  554.  
  555. ;****************** End of user-defined code ********************************
  556. ;        Do not change anything below here.
  557.  
  558. ;Modem character test for 100 ms
  559. MRD:
  560.     PUSH    BC        ; save bc
  561.     LD    BC,100        ; set limit
  562. MRD1:
  563.     CALL    MIRDY        ; char at modem?
  564.     JR    NZ,MRD2        ; yes, exit
  565.     LD    HL,1        ; else wait 1ms
  566.     CALL    WAITHLMS
  567.     DEC    BC        ; loop till done
  568.     LD    A,B
  569.     OR    C
  570.     JR    NZ,MRD1
  571.     LD    HL,0        ; none there, result=0
  572.     XOR    A
  573. MRD2:
  574.     POP    BC
  575.     RET
  576.  
  577. ; Inline print routine: destroys A and HL
  578.  
  579. PRINT:
  580.     EX    (SP),HL        ; get address of string
  581. PLOOP:
  582.     LD    A,(HL)        ; get next
  583.     INC    HL        ; bump pointer
  584.     OR    A        ; done if zero
  585.     JR    Z,PDONE
  586.     CALL    COUT        ; else print
  587.     JR    PLOOP        ; and loop
  588. PDONE:
  589.     EX    (SP),HL        ; restore return address
  590.     RET            ; and quit
  591.  
  592. ;
  593. ;Output a character in A to the console
  594. ;
  595. COUT:
  596.     PUSH    BC        ; save regs
  597.     PUSH    DE
  598.     PUSH    HL
  599.     LD    E,A        ; character to E
  600.     LD    C,2
  601.     CALL    BDOS        ; print it
  602.     POP    HL
  603.     POP    DE
  604.     POP    BC
  605.     RET
  606.  
  607. ;Wait(seconds)
  608. WAIT:
  609.     LD    HL,2
  610.     ADD    HL,SP
  611.     EX    DE,HL        ; get delay size
  612.     CALL    GETPARM
  613.                 ; fall thru to..
  614. ;Wait seconds in HL
  615. WAITHLS:
  616.     PUSH    BC        ; save bc
  617.     PUSH    DE        ; de
  618.     PUSH    IX        ; and ix
  619.     LD    IX,0        ; then point ix to 0
  620.                 ; so we don't upset memory-mapped i/o
  621.  
  622. ;Calculate values for loop constants. Need to have two loops to avoid
  623. ;   16-bit overflow with clock speeds above 9 MHz.
  624.  
  625. OUTERVAL    EQU    (CLKSPD / 10) + 1
  626. INNERVAL    EQU    (6667 / OUTERVAL) * CLKSPD
  627.  
  628. WAIT10:
  629.     LD    B,OUTERVAL
  630.  
  631. WAIT11:
  632.     LD    DE,INNERVAL
  633.  
  634. WAIT12:
  635.     BIT    0,(IX)        ; time-wasters
  636.     BIT    0,(IX)
  637.     BIT    0,(IX)        ; 20 T-states each
  638.     BIT    0,(IX)
  639.     BIT    0,(IX)
  640.     BIT    0,(IX)
  641.     DEC    DE
  642.     LD    A,E
  643.     LD    A,D
  644.     OR    E
  645.     JR    NZ,WAIT12    ; 150 T-states per inner loop
  646.     DJNZ    WAIT11        ; decrement outer loop
  647.     DEC    HL        ; ok, decrement count in hl
  648.     LD    A,H
  649.     OR    L
  650.     JR    NZ,WAIT10
  651.     POP    IX        ; done -- restore ix
  652.     POP    DE        ; de
  653.     POP    BC        ; and bc
  654.     RET
  655.  
  656. ;Wait milliseconds
  657. MSWAIT:
  658.     LD    HL,2
  659.     ADD    HL,SP
  660.     EX    DE,HL        ; get delay size
  661.     CALL    GETPARM
  662.                 ; fall thru to..
  663. ;Wait milliseconds in HL
  664. WAITHLMS:
  665.     PUSH    DE
  666. W1MS0:
  667.     LD    DE,39 * CLKSPD
  668. W1MS1:
  669.     DEC    DE
  670.     LD    A,D
  671.     OR    E
  672.     JR    NZ,W1MS1
  673.     DEC    HL
  674.     LD    A,H
  675.     OR    L
  676.     JR    NZ,W1MS0
  677.     POP    DE
  678.     RET
  679.  
  680. ;Get next parameter from (de) into hl
  681. GETPARM:
  682.     EX    DE,HL        ; get address into hl
  683.     LD    E,(HL)        ; get lo
  684.     INC    HL
  685.     LD    D,(HL)        ; then hi
  686.     INC    HL        ; bump for next
  687.     EX    DE,HL        ; result in hl, address still in de
  688.     RET
  689. ;
  690. ;Get address of user-defined variables
  691. ;
  692. GETVARS:
  693.     LD    HL,USERVARS
  694.     RET
  695. USERVARS:
  696.     DW    OVERDRIVE    ; .OVR etc. drive/user
  697.     DW    OVERUSER
  698.  
  699.      IF    ($ - CODEBGN) GT OVSIZE
  700. TOOBIG:    JP    ERRVAL        ; Overlay too large!
  701.      ENDIF
  702.  
  703.     END
  704.