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-R405.Z80 < prev    next >
Text File  |  2000-06-30  |  16KB  |  710 lines

  1. ;-----------------------------------------------------------------------------
  2. ;
  3. ;
  4. ;    Overlay for ZMP (Z-Modem Program)
  5. ;
  6. ;    Name    ZMO-R405.Z80
  7. ;
  8. ;    Dated   17 Apr 1989
  9. ;
  10. ;    Written by -
  11. ;      Ron Murray, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  12. ;      Modified by Wayne Dowie for the TRS 80 Model 4/4p,  27 August 1988
  13. ;      Modified to v1.3 standard rjm 12/10/88
  14. ;         Modified to v1.5 standard by Leo M. Cavanaugh 04/17/89
  15. ;
  16. ;    Rename subsequent versions as ZMO-R4xx.Z80 etc
  17. ;
  18. ;    This overlay is set up for the Tandy TRS 80 Model 4/4p
  19. ;     using the Western Digital type TR 1602B/1865 etc. and the BR 1941 
  20. ;     /BR 1943 baud rate generator.
  21. ;
  22. ;-----------------------------------------------------------------------------
  23. ;
  24. ;
  25. ;    System-dependent code overlay for ZMODEM
  26. ;
  27. ;
  28. ;    Insert your own code as necessary in this file. Code contained herein
  29. ; has been written in Z80 code for use with M80 or SLR. Assemble as follows:
  30. ;
  31. ;    SLR ZMO-R4xx/A
  32. ;    MLOAD ZMP.COM=ZMPX.COM,ZMO-R4XX
  33. ; or
  34. ;    M80 =ZMO-R4xx/z
  35. ;    RELHEX ZMO-R4xx
  36. ;    MLOAD ZMP.COM=ZMPX.COM,ZMO-R4xx
  37. ;
  38. ;
  39. ;       (Don't use L80 without changing the source for assembly as a
  40. ;         cseg file.)
  41. ;
  42. ;-----------------------------------------------------------------------------
  43. ;
  44. ;
  45. ; Notes on modifying this file:
  46. ;
  47. ;    C requires that functions do not change either index register
  48. ; (IX or IY), nor the BC register pair. If your overlay requires any of
  49. ; these to be changed, ensure they are restored to the original values
  50. ; on return.
  51. ;    Since collecting parameters from C functions can be tricky, only change
  52. ; the parts marked 'Insert your own code here'. Do NOT modify the jump
  53. ; table at the start. Do NOT modify the entry/exit sections of each
  54. ; function. Do NOT pass 'GO'. Do NOT collect $200.
  55. ;    Apart from defining modem functions, this file also defines terminal
  56. ; characteristics. Most have been set up for ADM-3A (with a few of my own
  57. ; additions). Modify to suit your own terminal. An inline print routine
  58. ; is provided for printing strings in the usual way: usage is
  59. ;
  60. ;    call    print
  61. ;    db    'required string',0
  62. ;-----------------------------------------------------------------------------
  63. ;
  64. ;
  65. ;    Don't forget to set your clock speed at the clkspd variable.
  66. ;
  67. ;
  68. ;    If you find your overlay exceeds the maximum size (currently 0400h),
  69. ; you will have to contact me for another version. If too many people need 
  70. ; to do it, we haven't allowed enough room.
  71. ;
  72. ; Ron Murray 15/8/88
  73. ;
  74. ;
  75. ;
  76. ;
  77. ;
  78. ;
  79. ;
  80. ;
  81. ;
  82. ;-----------------------------------------------------------------------------
  83.  
  84. false    equ    0
  85. true    equ    not false
  86.  
  87.  
  88. ; User-set variables: ***********
  89.  
  90. clkspd    equ    4        ; Processor clock speed in MHz
  91.  
  92. debug    equ    false
  93.  
  94. userdef    equ    00145h        ; origin of this overlay
  95.                 ; This address should remain constant
  96.                 ; with subsequent revisions.
  97.  
  98. ; NOT user-set variables
  99. mspeed    equ    003ch        ; baud rate id
  100.  
  101. ;Set the following two equates to the drive and user area which will contain
  102. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  103. ;   (null) to locate them on the drive from which ZMP was invoked.
  104.  
  105. overdrive    equ    'A'    ; Drive to find overlay files on ('A'-'P')
  106. overuser    equ    0    ; User area to find files
  107. ovsize    equ    0400h        ; max size of this overlay
  108.  
  109.     .z80            ; use z80 code
  110.     aseg            ; absolute
  111.  
  112.      if    debug
  113.     org    100h        ; so you can debug it with cebug, zsid, etc
  114.      else
  115.     org    userdef
  116.      endif
  117.  
  118. esc    equ    1bh
  119. ctrlq    equ    11h
  120. cr    equ    0dh
  121. lf    equ    0ah
  122. bdos    equ    5
  123.  
  124.  
  125. ; Tandy specific equates  
  126. mdata    equ    0EBh    ;Modem data port
  127. mstat    equ    0EAh    ;Modem Status for BREAK,DTR,RTS
  128. mrset    equ    0E8h    ;Master Reset and Modem Status for CTS,DSR,CD,RI
  129. brg    equ    0E9h    ;Baud rate generator port BR 1943
  130. break    equ    2    ;BREAK bit 2, 0 = BREAK 1 = NO BREAK
  131. error    equ    38h    ;For bits 5,4,3 (any a 1)
  132. dtr    equ    1    ;DTR bit 1, 1=OFF, 0=ON
  133. nstp    equ    4    ;Bit 4 is No of STOP bits, 1=2 stop bits, 0=1 stop bit
  134. paroe    equ    7    ;Parity ODD/EVEN bit 7, 1=EVEN, 0=ODD  
  135. paron    equ    3    ;Parity ON/OFF bit 3, 1=OFF, 0=ON
  136. rda    equ    7    ;Bit 7 received byte available, 1=data available
  137. rts    equ    0    ;RTS bit 0, 1=OFF, 0=ON
  138. tbe    equ    6    ;Bit 6 transmit holding register empty, 1=empty
  139. wls1    equ    6    ;Word Length Select bit 6  (See explanation below)
  140. wls2    equ    5    ;Word Length Select bit 5
  141. ;
  142. ;    D6    D5
  143. ;    wls1    wls2    No of bits
  144. ;    0    0    5
  145. ;    1    0    6
  146. ;    0    1    7
  147. ;    1    1    8
  148. ;
  149. ;
  150. ;
  151. ;
  152. ;
  153. ;
  154. ;Jump table for the overlay: do NOT change this
  155. jump_tab:
  156.     jp    scrnpr        ; screen print
  157.     jp    mrd        ; modem read with timeout
  158.     jp    mchin        ; get a character from modem
  159.     jp    mchot        ; send a character to the modem
  160.     jp    mordy        ; test for tx buffer empty
  161.     jp    mirdy        ; test for character received
  162.     jp    sndbrk        ; send break
  163.     jp    cursadd        ; cursor addressing
  164.     jp    cls        ; clear screen
  165.     jp    invon        ; inverse video on
  166.     jp    invoff        ; inverse video off
  167.     jp    hide        ; hide cursor
  168.     jp    show        ; show cursor
  169.     jp    savecu        ; save cursor position
  170.     jp    rescu        ; restore cursor position
  171.     jp    mint        ; service modem interrupt
  172.     jp    invec        ; initialise interrupt vectors
  173.     jp    dinvec        ; de-initialise interrupt vectors
  174.     jp    mdmerr        ; test uart flags for error
  175.     jp    dtron        ; turn DTR on
  176.     jp    dtroff        ; turn DTR OFF
  177.     jp    init        ; initialise uart
  178.     jp    wait        ; wait seconds
  179.     jp    mswait        ; wait milliseconds
  180.     jp    userin        ; user-defined entry routine
  181.     jp    userout        ; user-defined exit routine
  182.      jp    getvars        ; get system variables
  183.     jp    setport        ; set the modem port being used
  184. ; Spare jumps for compatibility with future versions
  185.     jp    spare        ; spare for later use
  186.     jp    spare        ; spare for later use
  187.     jp    spare        ; spare for later use
  188.     jp    spare        ; spare for later use
  189.     jp    spare        ; spare for later use
  190.  
  191. spare:    ret
  192.  
  193.  
  194. ;
  195. ; Main code starts here
  196. ;
  197. codebgn    equ    $
  198. ;
  199. ; Screen print function
  200. scrnpr:
  201.                 ; <== Insert your own code here
  202.     call    print
  203.     db    'This function not supported.',cr,lf,0
  204.                 ; <== End of your own code
  205.     ret
  206.  
  207.  
  208. ; Get a character from the modem: return in HL
  209. mchin:
  210.     push    bc
  211.                 ; <== Insert your own code here
  212.  
  213. mchin2:
  214.     in    a,(mstat)    ; check for char waiting
  215.     bit    rda,a
  216.     jr    z,mchin2
  217.  
  218.     in    a,(mdata)    ; read the char
  219.  
  220.  
  221.                 ; <== End of your own code
  222.  
  223.  
  224.     ld    l,a        ; put in HL
  225.     ld    h,0
  226.     or    a        ; set/clear Z
  227.     pop    bc
  228.     ret
  229.  
  230. ; Send a character to the modem
  231. mchot:
  232.     ld    hl,2        ; get the character
  233.     add    hl,sp
  234.     ld    a,(hl)
  235.                 ; <== Insert your own code here
  236.  
  237.     push    bc
  238.     ld    b,a        ; save the char
  239.  
  240. mchot2:
  241.     in    a,(mstat)    ; check for uart ready
  242.     bit    tbe,a
  243.     jr    z,mchot2
  244.  
  245.     ld    a,b        ; char in a
  246.     out    (mdata),a    ; send it
  247.     pop    bc
  248.  
  249.                 ; <== End of your own code
  250.     ret            ; done
  251.  
  252. ; Test for output ready: return TRUE (1) in HL if ok
  253. mordy:
  254.                 ; <== Insert your own code here
  255.  
  256.     ld    hl,0
  257.     in    a,(mstat)
  258.     bit    tbe,a        ; transmit buffer empty
  259.     jr    z,mordy1
  260.     inc    hl
  261. mordy1:
  262.  
  263.                 ; <== End of your own code
  264.  
  265.     ld    a,l        ; set/clear Z
  266.     or    a
  267.     ret
  268.  
  269. ; Test for character at modem: return TRUE (1) in HL if so
  270. mirdy:
  271.                 ; <== Insert your own code here
  272.  
  273.     ld    hl,0
  274.     in    a,(mstat)
  275.     bit    rda,a        ; received data available
  276.     jr    z,mirdy1
  277.     inc    hl
  278. mirdy1:
  279.  
  280.                 ; <== End of your own code
  281.     ld    a,l        ; set/clear Z
  282.     or    a
  283.     ret
  284.  
  285. ; Send a break to the modem: leave empty if your system can't do it
  286. sndbrk:
  287.                 ; <== Insert your own code here
  288.     ld    a,(combyt)    ;Get byte 
  289.     res    break,a        ; reset bit 2
  290.     out    (mstat),a    ; output to status register
  291.  
  292.     push    af        ; save it
  293.     ld    hl,300        ; 300 mS delay
  294.     call    waitms
  295.     pop    af
  296.  
  297.     set    break,a        ; set bit 2
  298.     out    (mstat),a    ; output to status register
  299.                 ; <== End of your own code
  300.     ret
  301.  
  302.  
  303. ; Test UART flags for error: return TRUE (1) in HL if error.
  304. mdmerr:
  305.                 ; <== Insert your own code here
  306.     ld    hl,0
  307.     in    a,(mstat)
  308.     and    error        ; 38h for bits 5,4,3 (any a 1) 0011 1000
  309.     jr    z,mdmer2    ; Go if no errors
  310.     inc    hl
  311.     in    a,(mdata)    ;Throw away the byte
  312.     out    (mrset),a    ;Reset UART by outing anything to E8h
  313. mdmer2:
  314.                 ; <== End of your own code
  315.     ld    a,l        ; set/clear Z
  316.     or    a
  317.     ret
  318.  
  319. ; Turn DTR ON
  320. dtron:
  321.                 ; <== Insert your own code here
  322.  
  323.     ld    hl,combyt    ;Get current status
  324.     res    dtr,(hl)    ;Turn DTR ON bit 1 = 0
  325.     ld    a,(hl)        ;
  326.     out    (mstat),a    ;Write to status port
  327.                 ; <== End of your own code
  328.     ret
  329.  
  330. ; Turn DTR OFF
  331. dtroff:
  332.                 ; <== Insert your own code here
  333.  
  334.     ld    hl,combyt    ;Get current status
  335.     set    dtr,(hl)    ;Turn DTR OFF bit 1 = 1
  336.     ld    a,(hl)        ;
  337.     out    (mstat),a    ;Write to status port
  338.  
  339.                 ; <== End of your own code
  340.     ret
  341.  
  342. ; Initialise the UART +++
  343. ;
  344. ; Tandy information is incorrect where it states that an out to E8h with
  345. ; bit 1 set will allow subsequent outs to EAh to access the UART status 
  346. ; register while an out to E8h with say 0h will only access the various 
  347. ; RS 232 lines without affecting the UART set-up.  The reality is that 
  348. ; all outs to EAh will affect the UART settings so "combyt" is used to 
  349. ; hold the current settings so it can be modified and re-written to 
  350. ; EAh with the DTR, RTS or BREAK bits conditioned appropriately.  
  351. ; Wayne Dowie. VK 6WD.
  352. ;
  353. init:
  354.  
  355.     ld    hl,2        ; get parameters
  356.     add    hl,sp
  357.     ex    de,hl
  358.     call    getparm        ; in HL
  359.     ld    (brate),hl    ; baud rate
  360.     call    getparm
  361.     ld    (parity),hl    ; parity
  362.     call    getparm
  363.     ld    (data),hl    ; data bits
  364.     call    getparm
  365.     ld    (stop),hl    ; stop bits
  366.                 
  367.                 ; <== Insert your own code here
  368.                 ; using values below
  369.     push    bc
  370.  
  371.     
  372.     ld    a,02h        ;To access UART control reg. (02h)
  373.     out    (mrset),a    ; to port E8h (As per Tandy book 
  374.                 ; which is wrong).
  375.  
  376.     
  377.     ld    hl,combyt    ;Point to  current status byte
  378.     ld    a,06Ch        ;Assume 8,N,1, No BREAK and RTS ON
  379.     ld    (hl),a        ;Store current status
  380.     ld    a,(stop)    ; set stop bits
  381.     cp    2        ; set 2 if required
  382.     jr    nz,setpar    ;If 1 stop then go to parity set
  383.     set    nstp,(hl)    ;Otherwise set bit 4 for 2 stop bits
  384.  
  385. setpar:
  386.     ld    a,(parity)    ; set parity bits
  387.     cp    'O'
  388.     jr    nz,setpa2    ;If not ODD go to check for EVEN
  389.     res    paroe,(hl)    ;Reset bit 7 for ODD parity
  390.     res    paron,(hl)    ;Reset bit 3 to turn ON parity.
  391.     jr    setbits
  392.  
  393. setpa2:    cp    'E'        ;Check for EVEN parity
  394.     jr    nz,setbits    ; default to 'N'
  395.     set    paroe,(hl)    ;Set bit 7 for EVEN parity
  396.     res    paron,(hl)    ;Reset bit 3 to turn ON parity.
  397.  
  398. setbits:ld    a,(data)
  399.     cp    7        ; not an ascii '7'
  400.     jr    nz,setbi2    ;If not 7 write to port
  401.     res    wls1,(hl)    ;For 7 bit word length
  402.     set    wls2,(hl)    ;  "         "
  403.  
  404. setbi2:    
  405.  
  406.     ld    a,(hl)        ;Get current status 
  407.     out    (mstat),a    ;Write to status port
  408.  
  409. setbrate:
  410.     ld    de,(brate)    ; get baud rate value (0-10)
  411.     ld    hl,brval    ;Set-up pointer to baud rate value in table
  412.     add    hl,de        ;
  413.     ld    a,(hl)        ;
  414.     or    a        ; don't do if invalid
  415.     jr    z,setbrx
  416.     out    (brg),a        ;To port 0E9h
  417.     ld    a,(brate)    ; ok, tell zmp it's ok
  418.     ld    (mspeed),a
  419. setbrx:
  420.     pop    bc
  421.                 ; <== End of your own code
  422.     ret
  423. ;
  424. ; Set the port. ZMP supplies either 0 or 1 as a parameter. You're on your
  425. ; own here -- your system is bound to be different from any other! You may
  426. ; implement a software switch on all the modem-dependent routines, or perhaps
  427. ; you can have one or two centralised routines for accessing the UARTs and
  428. ; modify the code from this routine to select one or the other. (Who said
  429. ; there was anything wrong with self-modifying code?). If you have only one
  430. ; UART port, or if you don't want to go through all the hassles, just have
  431. ; this routine returning with no changes made. Note that ZMP calls this
  432. ; routine twice -- once for each port value -- on initialisation.
  433. ;
  434. setport:
  435. ;    ld    hl,2        ; get port number
  436. ;    add    hl,sp
  437. ;    ex    de,hl
  438. ;    call    getparm        ; in HL (values are 0 and 1)
  439.  
  440.                 ; <== Insert your own code here
  441.  
  442.                 ; <== End of your own code
  443.     ret
  444.  
  445. port:    ds    1
  446.  
  447.  
  448. brate:    dw    5        ; baud rate:
  449. parity:    dw    'N'        ; parity
  450. data:    dw    8        ; data bits
  451. stop:    dw    1        ; stop bits
  452. combyt:    db    06Ch        ;To store current set-up (init val = 8,1,n)
  453.  
  454.  
  455. ; Values for Western Digital BR1941/BR1943, for each baud rate: 0 if invalid
  456. ;
  457. brval:
  458.     db    22h    ;   110        0
  459.     db    55h    ;   300        1
  460.     db    0    ;   450        2
  461.     db    66h    ;   600        3
  462.     db    0    ;   710        4
  463.     db    77h    ;  1200        5
  464.     db    0AAh    ;  2400        6
  465.     db    0CCh    ;  4800        7
  466.     db    0EEh    ;  9600        8
  467.     db    0FFh    ; 19200        9
  468.     db    0    ; 38400        10
  469.     db    0    ; 57600        11
  470.     db    0    ; 76800        12
  471.  
  472. ;
  473. ;Video terminal sequences: these are for ADM-3A: Modify as you wish
  474. ; Cursor addressing: 
  475. cursadd:
  476.     ld    hl,2        ; get parameters
  477.     add    hl,sp
  478.     ex    de,hl
  479.     call    getparm        ; in HL
  480.     ld    (row),hl    ; row
  481.     call    getparm
  482.     ld    (col),hl    ; column
  483.                 ; <== Insert your own code here
  484.                 ; using values in row and col
  485.     call    print
  486.     db    esc,'=',0    ; ADM-3A leadin
  487.     ld    a,(row)        ; row first
  488.     add    a,' '        ; add offset
  489.     call    cout
  490.     ld    a,(col)        ; sane for column
  491.     add    a,' '
  492.     call    cout
  493.                 ; <== end of your own code
  494.     ret
  495.  
  496. row:    ds    2        ; row
  497. col:    ds    2        ; column
  498.  
  499.  
  500. ; Clear screen:
  501. cls:
  502.     call    print
  503.     db    0Eh,1Ah,0    ;CLS and turn inverse OFF  
  504.     ret
  505.  
  506. ; Inverse video on:
  507. invon:
  508.     call    print
  509.     db    0Fh,0
  510.     ret
  511.  
  512. ; Inverse video off:
  513. invoff:
  514.     call    print
  515.     db    0Eh,0
  516.     ret
  517.  
  518. ; Turn off cursor:
  519. hide:
  520.     call    print
  521.     db    esc,30h,0
  522.     ret
  523.  
  524. ; Turn on cursor:
  525. show:
  526.     call    print
  527.     db    esc,31h,0
  528.     ret
  529.  
  530. ; Save cursor position:
  531. savecu:
  532.     ret
  533.  
  534. ; Restore cursor position:
  535. rescu:
  536.     ret
  537.  
  538. ;
  539.  
  540. ; Service modem interrupt:
  541. mint:
  542.     ret            ; my system doesn't need this
  543.  
  544. ; Initialise interrupt vectors:
  545. invec:
  546.     ret            ; ditto
  547.  
  548. ; De-initialise interrupt vectors:
  549. dinvec:
  550.     ret            ; ditto
  551.  
  552. ; User-defined entry routine: leave empty if not used
  553. userin:
  554.     ret
  555.  
  556. ; User-defined exit  routine: leave empty if not used
  557. userout:
  558.     ret
  559.  
  560.  
  561. ; End of user-defined code 
  562.  
  563. ;Modem character test for 100 ms
  564. mrd:
  565.     push    bc        ; save bc
  566.     ld    bc,100        ; set limit
  567. mrd1:
  568.     call    mirdy        ; char at modem?
  569.     jr    nz,mrd2        ; yes, exit
  570.     ld    hl,1        ; else wait 1ms
  571.     call    waitms
  572.     dec    bc        ; loop till done
  573.     ld    a,b
  574.     or    c
  575.     jr    nz,mrd1
  576.     ld    hl,0        ; none there, result=0
  577.     xor    a
  578. mrd2:
  579.     pop    bc
  580.     ret
  581.  
  582. ; Inline print routine: destroys A and HL
  583.  
  584. print:
  585.     ex    (sp),hl        ; get address of string
  586. ploop:
  587.     ld    a,(hl)        ; get next
  588.     inc    hl        ; bump pointer
  589.     or    a        ; done if zero
  590.     jr    z,pdone
  591.     call    cout        ; else print
  592.     jr    ploop        ; and loop
  593. pdone:
  594.     ex    (sp),hl        ; restore return address
  595.     ret            ; and quit
  596.  
  597. ;
  598. ;Output a character in A to the console
  599. ;
  600. cout:
  601.     push    bc        ; save regs
  602.     push    de
  603.     push    hl
  604.     ld    e,a        ; character to E
  605.     ld    c,2
  606.     call    bdos        ; print it
  607.     pop    hl
  608.     pop    de
  609.     pop    bc
  610.     ret
  611.  
  612. ;Wait(seconds)
  613. wait:
  614.     ld    hl,2
  615.     add    hl,sp
  616.     ex    de,hl        ; get delay size
  617.     call    getparm
  618.                 ; fall thru to..
  619. ;Wait seconds in HL
  620. waits:
  621.     push    bc        ; save bc
  622.     push    de        ; de
  623.     push    ix        ; and ix
  624.     ld    ix,0        ; then point ix to 0
  625.                 ; so we don't upset memory-mapped i/o
  626.  
  627. ;Calculate values for loop constants. Need to have two loops to avoid
  628. ;   16-bit overflow with clock speeds above 9 MHz.
  629.  
  630. outerval    equ    (clkspd / 10) + 1
  631. innerval    equ    (6667 / outerval) * clkspd
  632.  
  633. wait10:
  634.     ld    b,outerval
  635.  
  636. wait11:
  637.     ld    de,innerval
  638.  
  639. wait12:
  640.     bit    0,(ix)        ; time-wasters
  641.     bit    0,(ix)
  642.     bit    0,(ix)        ; 20 T-states each
  643.     bit    0,(ix)
  644.     bit    0,(ix)
  645.     bit    0,(ix)
  646.     dec    de
  647.     ld    a,e
  648.     ld    a,d
  649.     or    e
  650.     jr    nz,wait12    ; 150 T-states per inner loop
  651.     djnz    wait11        ; decrement outer loop
  652.     dec    hl        ; ok, decrement count in hl
  653.     ld    a,h
  654.     or    l
  655.     jr    nz,wait10
  656.     pop    ix        ; done -- restore ix
  657.     pop    de        ; de
  658.     pop    bc        ; and bc
  659.     ret
  660.  
  661. ;Wait milliseconds
  662. mswait:
  663.     ld    hl,2
  664.     add    hl,sp
  665.     ex    de,hl        ; get delay size
  666.     call    getparm
  667.                 ; fall thru to..
  668. ;Wait milliseconds in HL
  669. waitms:
  670.     push    de
  671. w1ms0:
  672.     ld    de,39 * clkspd
  673. w1ms1:
  674.     dec    de
  675.     ld    a,d
  676.     or    e
  677.     jr    nz,w1ms1
  678.     dec    hl
  679.     ld    a,h
  680.     or    l
  681.     jr    nz,w1ms0
  682.     pop    de
  683.     ret
  684.  
  685. ;Get next parameter from (de) into hl
  686. getparm:
  687.     ex    de,hl        ; get address into hl
  688.     ld    e,(hl)        ; get lo
  689.     inc    hl
  690.     ld    d,(hl)        ; then hi
  691.     inc    hl        ; bump for next
  692.     ex    de,hl        ; result in hl, address still in de
  693.     ret
  694.  
  695. ;Get address of user-defined variables
  696. getvars:
  697.     ld    hl,uservars
  698.     ret
  699. uservars:
  700.     dw    overdrive    ; .OVR etc. drive/user
  701.     dw    overuser
  702.  
  703.      if    ($ - codebgn) gt ovsize
  704. toobig:    jp    errval        ; Overlay too large!
  705.      endif
  706.  
  707.     end
  708.  
  709.  
  710.