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-AM05.ZZ0 / ZMO-AM05.Z80
Text File  |  2000-06-30  |  22KB  |  964 lines

  1.  .comment \
  2.  
  3.     zmp 1.5 overlay, version 1.0
  4.     computer: ampro lb+
  5.     terminal: wyse 50   (optional)
  6.  
  7.     - works with or without nzcom present.
  8.     - displays baud rate, data bits, stop bits and parity in the
  9.       wyse 50's host field (top line, above scrollable screen)
  10.           if you set the equate hostline true. otherwise these are
  11.       just shown on your screen when set.
  12.     - provides a dtrexit equate which, when set true, will prompt
  13.       you to see if you want DTR signal turned off when you exit
  14.       ZMP. i have an old bell dataphone 1200 modem, and the only
  15.       way i've found to keep it from answering my phone automatically
  16.       when i don't want it to is to keep DTR off except when in a
  17.       modem program. DTR is automatically turned on on entry to ZMP
  18.       in any case. the prompt allows you to exit a terminal session 
  19.       temporarily to your o/s level for whatever reason, without
  20.       disconnecting your session.
  21.     - screen print function not currently implemented.
  22.     - be sure to set ALL config equates (in praticular the disk/user
  23.       for overlay files).
  24.  
  25.                         al grabauskas
  26.                         12/6/88
  27.  
  28.             i'm reachable at:    lillipute z-nodes 1&2
  29.                         (312) 649-1730
  30.                         (312) 664-1730
  31.  
  32.                         the advocate
  33.                         (312) 939-4411
  34.  
  35. \
  36.  
  37. ;-----------------------------------------------------------------------------
  38. ;
  39. ;    Sample Overlay for ZMP (Z-Modem Program)
  40. ;
  41. ;    Name    ZMO-BLNK.Z80
  42. ;
  43. ;    Dated Sep 14, 1988
  44. ;
  45. ;    Written by -
  46. ;      Ron Murray, c/o Z-Node 62, 061-9-450-0200, Perth, Western Australia.
  47. ;
  48. ;    Modified to ZMP v1.2 standard rjm 15/9/88
  49. ;    Modified to ZMP v1.3 standard rjm 11/10/88
  50. ;    Modified to ZMP v1.4 standard rjm 20/11/88
  51. ; 89/04/12 - Modified to ZMP v1.5        - George Conover
  52. ;
  53. ;
  54. ;-----------------------------------------------------------------------------
  55. ;
  56. ;
  57. ;    System-dependent code overlay for ZMODEM
  58. ;
  59. ;
  60. ;
  61. ;    Insert your own code as necessary in this file. Code contained herein
  62. ; has been written in Z80 code for use with M80 or SLR. Assemble as follows:
  63. ;
  64. ;    SLR ZMO-xx01/h
  65. ;    MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
  66. ; or
  67. ;    M80 =ZMO-xx01.Z80
  68. ;    RELHEX ZMO-xx01
  69. ;    MLOAD ZMP.COM=ZMODEM.COM,ZMO-xx01.HEX
  70. ;
  71. ;
  72. ;       (Don't use L80 without changing the source for assembly as a
  73. ;         cseg file.)
  74. ;
  75. ;-----------------------------------------------------------------------------
  76. ;
  77. ;
  78. ; Notes on modifying this file:
  79. ;
  80. ;    C requires that functions do not change either index register (IX or IY).
  81. ; If your overlay requires either of these to be changed, ensure they are
  82. ; restored to the original values on return.
  83. ;    Since collecting parameters from C functions can be tricky, only change
  84. ; the parts marked 'Insert your own code here'. Do NOT modify the jump
  85. ; table at the start. Do NOT modify the entry/exit sections of each
  86. ; function. Do NOT pass 'GO'. Do NOT collect $200.
  87. ;    Apart from defining modem functions, this file also defines terminal
  88. ; characteristics. Examples provided are for ADM-3A (with a few of my own
  89. ; additions). Modify to suit your own terminal. An inline print routine
  90. ; is provided for printing strings in the usual way: usage is
  91. ;
  92. ;    call    print
  93. ;    db    'required string',0
  94. ;
  95. ;-----------------------------------------------------------------------------
  96. ;
  97. ;
  98. ;    Don't forget to set your clock speed at the clkspd variable.
  99. ;
  100. ;
  101. ;    If you find your overlay exceeds the maximum size (currently 0400h),
  102. ; you will have to contact me for another version. If too many people need 
  103. ; to do it, we haven't allowed enough room.
  104. ;
  105. ; Ron Murray 15/8/88
  106. ;
  107. ;
  108. ;
  109. ;---------------------------------------------------------------------------
  110.  
  111. false    equ    0
  112. true    equ    not false
  113.  
  114. ;------------------------------------------------------------------------------
  115.  
  116. ; User-set variables: 
  117.  
  118. ; configuration equates for ampro overlay
  119. dtrexit    equ    true        ; if true, the userout: routine will prompt
  120.                 ; you to see if you want to turn off DTR
  121.                 ; completely on exiting ZMP. DTR is automati-
  122.                 ; cally turned on when entering ZMP. turning
  123.                 ; DTR off prevents some modems from auto-
  124.                 ; answering the phone. the prompt allows you
  125.                 ; to leave a session temporarily to your o/s
  126.                 ; and not disconnect.
  127.  
  128. hostline    equ    true        ; controls whether your line parameters are
  129.                 ; displayed in the host field of a wyse 
  130.                 ; terminal at all times in ZMP, or if they
  131.                 ; are simply echoed to the screen when set.
  132.  
  133. clkspd    equ    4        ; Processor clock speed in MHz
  134. debug    equ    false        ; to allow debugging of overlay with Z8E etc.
  135. ; end configuration equates for ampro overlay
  136.  
  137. ;Set the following two equates to the drive and user area which will contain
  138. ;   ZMP's .OVR files, .CFG file, .FON file and .HLP file. Set both to zero
  139. ;   (null) to locate them on the drive from which ZMP was invoked.
  140.  
  141. overdrive    equ    'F'    ; Drive to find overlay files on ('A'-'P')
  142. overuser    equ    15    ; User area to find files
  143.  
  144. ;------------------------------------------------------------------------------
  145.  
  146.  
  147. ; NOT user-set variables
  148.  
  149. userdef    equ    0145h        ; origin of this overlay
  150.                 ; This address should not change with
  151.                 ; subsequent revisions.
  152. mspeed    equ    03ch        ; location of current baud rate. 
  153. ovsize    equ    0400h        ; max size of this overlay
  154.  
  155. ; ampro definitions
  156.  
  157. ioint    equ    57        ;BIOS call of initialization routine
  158. siob    equ    52h        ;Relative location in bios
  159. siob1    equ    53h        ;*eag*
  160. siob3    equ    55h        ;*eag*
  161. siob5    equ    57h        ;*eag*
  162. ct1    equ    42h        ;*eag*
  163.  
  164. ;    port definitions
  165.  
  166. modctl    equ    8ch        ; modem control port b
  167. moddat    equ    88h        ; modem data port b
  168.  
  169. ;    bit definitions
  170.  
  171. mdrcvb    equ    01h        ; Modem receive ready bit (dav)
  172. mdsndb    equ    04h        ; Modem send ready bit
  173.  
  174. mdparer    equ    010h        ; parity error
  175. mdovrrn    equ    020h        ; overrun error
  176. mdfram    equ    030h        ; framing error
  177. mderrf    equ    mdparer+mdovrrn+mdfram ; *eag*
  178.  
  179. mddtrof    equ    068h        ; turn off dtr, rts
  180. mddtron    equ    0eah        ; restore normal, 8 bits, rts on, etc.
  181.  
  182. ; end ampro specific equates
  183.  
  184. esc    equ    1bh
  185. ctrlq    equ    11h
  186. cr    equ    0dh
  187. lf    equ    0ah
  188. bdos    equ    5
  189.  
  190.     .z80            ; use z80 code
  191.     aseg            ; absolute
  192.  
  193.      if    debug
  194.     org    100h        ; so you can debug it with cebug, zsid, etc
  195.      else
  196.     org    userdef
  197.      endif
  198.  
  199.  
  200. esc    equ    1bh
  201. ctrlq    equ    11h
  202. cr    equ    0dh
  203. lf    equ    0ah
  204. bdos    equ    5
  205.  
  206. codebgn    equ    $
  207.  
  208. ;Jump table for the overlay: do NOT change this
  209. jump_tab:
  210.     jp    scrnpr        ; screen print
  211.     jp    mrd        ; modem read with timeout
  212.     jp    mchin        ; get a character from modem
  213.     jp    mchout        ; send a character to the modem
  214.     jp    mordy        ; test for tx buffer empty
  215.     jp    mirdy        ; test for character received
  216.     jp    sndbrk        ; send break
  217.     jp    cursadd        ; cursor addressing
  218.     jp    cls        ; clear screen
  219.     jp    invon        ; inverse video on
  220.     jp    invoff        ; inverse video off
  221.     jp    hide        ; hide cursor
  222.     jp    show        ; show cursor
  223.     jp    savecu        ; save cursor position
  224.     jp    rescu        ; restore cursor position
  225.     jp    mint        ; service modem interrupt
  226.     jp    invec        ; initialise interrupt vectors
  227.     jp    dinvec        ; de-initialise interrupt vectors
  228.     jp    mdmerr        ; test uart flags for error
  229.     jp    dtron        ; turn DTR on
  230.     jp    dtroff        ; turn DTR OFF
  231.     jp    init        ; initialise uart
  232.     jp    wait        ; wait seconds
  233.     jp    mswait        ; wait milliseconds
  234.     jp    userin        ; user-defined entry routine
  235.     jp    userout        ; user-defined exit routine
  236.     jp    getvars        ; get system variables
  237.       JP    SETPORT        ; Set port (0 or 1)
  238.  
  239. ; Spare jumps for compatibility with future versions
  240.     jp    spare        ; spare for later use
  241.     jp    spare        ; spare for later use
  242.     jp    spare        ; spare for later use
  243.     jp    spare        ; spare for later use
  244.     jp    spare        ; spare for later use
  245.     jp    spare        ; spare for later use
  246.  
  247. ;
  248. ; Main code starts here
  249. ;
  250. ;Screen print function
  251. scrnpr:
  252.                 ; <== Insert your own code here
  253.     call    print
  254.     db    'This function not supported.',cr,lf,0
  255.                 ; <== End of your own code
  256. spare:
  257.     ret
  258.  
  259. ; User-defined entry routine: leave empty if not needed
  260.  
  261. ;------------------------------------------------------------------------------
  262. ; this is a routine that locates the warm boot address whether nz-com is
  263. ; running or not and stores it at the word biospt. this allows access to 
  264. ; ampro specific offsets in the bios. (note that this is bios base addr+3).
  265. ;
  266. ; note that this assumes the nz-com bios released with nz-src.lbr (vers. 1.4)
  267. ; if that isn't what you have you'll likely need to modify what's below.
  268.  
  269. eyectof    equ    5ah        ; Offset to "NZ-COM" eyecatcher
  270.                 ;   from virtual bios base.
  271. nzceye:    db    'NZ-COM'    ; Eyecatcher to match
  272. eyelen    equ    $-nzceye    ; Length of eyecatcher
  273.  
  274. ; end most likely user mods    ----------------------------------------------
  275.  
  276. userin:
  277.     push    hl
  278.     push    de
  279.     push    bc
  280.     push    af
  281.  
  282.     ld    hl,(1)        ; This is some bios address..
  283.     ld    l,eyectof    ; Hl = ptr to "NZ-COM" eyecatcher
  284.     ld    de,nzceye    ; Ptr to an internal copy of it
  285.     ld    b,eyelen    ; Length
  286.  
  287. nzckloop:
  288.     ld    a,(de)        ; Get a char
  289.     cp    (hl)        ; Compare to char at hl
  290.     jr    nz,nonzc    ; No nz-com
  291.     inc    hl        ; Bump ptr
  292.     inc    de        ; Bump ptr
  293.     dec    b        ; Decrement length
  294.     jr    nz,nzckloop    ; Repeat if apropos
  295.  
  296.     ld    a,(109h)    ; get pointer to ENV descriptor
  297.     ld    l,a
  298.     ld    a,(10ah)
  299.     ld    h,a
  300.     inc    hl        ; bump past jp opcode to console stat vector
  301.     ld    e,(hl)        ; Get real console status vector
  302.     inc    hl
  303.     ld    d,(hl)
  304.     ex    de,hl        ; Put it in hl
  305.     dec    hl        ; Convert to warm boot vector
  306.     dec    hl
  307.     dec    hl
  308.     jr    biosret        ; And return bios addr in biospt
  309.  
  310. nonzc:
  311.     ld    hl,(1)        ; Get original pointer
  312.  
  313. biosret:
  314.     ld    (biospt),hl    ; and save it
  315.     call    initall        ; set up rest of the details
  316.     call    dtron        ; make sure DTR is set
  317.     pop    af        ; Restore regs and return
  318.     pop    bc
  319.     pop    de
  320.     pop    hl
  321.     ret
  322.  
  323. ; User-defined exit routine: leave empty if not needed
  324. userout:
  325.     call    print        ; kill host message display on wyse
  326.     db    esc,'A31',cr,0    ; host msg field = dim underscore
  327.  
  328.      if    dtrexit
  329.     call    print        ; dtr off yet?
  330.     db    'Kill DTR? (default no) ',0
  331.     call    cyn        ; get yes/no answer
  332.     ret    nz        ; not a "yes"
  333.     jp    dtroff        ; do it
  334.      else
  335.     ret
  336.      endif            ; if dtrexit
  337.  
  338. ;
  339. ; Y/N input from console
  340. ;
  341. cyn:
  342.     push    bc        ; save regs
  343.     push    de
  344.     push    hl
  345.     ld    c,1
  346.     call    bdos        ; print it
  347.     or    a,' '        ; make small case
  348.     cp    a,'y'        ; yes?
  349.     pop    hl
  350.     pop    de
  351.     pop    bc
  352.     ret
  353.  
  354. ;Get a character from the modem: return in HL
  355. mchin:
  356.     push    bc
  357.                 ; <== Insert your own code here
  358.  
  359.     in    a,(moddat)    ; in modem data port
  360.  
  361.                 ; <== End of your own code
  362.  
  363.     ld    l,a        ; put in HL
  364.     ld    h,0
  365.     or    a        ; set/clear Z
  366.     pop    bc
  367.     ret
  368.  
  369. ;Send a character to the modem
  370. mchout:
  371.     ld    hl,2        ; get the character
  372.     add    hl,sp
  373.     ld    a,(hl)
  374.                 ; <== Insert your own code here
  375.  
  376.     out    (moddat),a    ; out modem data port
  377.  
  378.                 ; <== End of your own code
  379.     ret            ; done
  380.  
  381. ;Test for output ready: return TRUE (1) in HL if ok
  382. mordy:
  383.                 ; <== Insert your own code here
  384.  
  385.     in    a,(modctl)    ; in modem control port
  386.     and    mdsndb        ; bit to test for send ready
  387.     jr    z,monr        ; modem not ready
  388.     ld    hl,1        ; indicate ready
  389.     jr    mordyret
  390. monr:    ld    hl,0        ; indicate not ready
  391. mordyret:
  392.                 ; <== End of your own code
  393.  
  394.     ld    a,l        ; set/clear Z
  395.     or    a
  396.     ret
  397.  
  398. ;Test for character at modem: return TRUE (1) in HL if so
  399. mirdy:
  400.                 ; <== Insert your own code here
  401.  
  402.     in    a,(modctl)    ; in modem control port
  403.     and    mdrcvb        ; bit to test for receive ready
  404.     jr    z,minr        ; modem not ready
  405.     ld    hl,1        ; indicate ready
  406.     jr    mirdyret
  407. minr:    ld    hl,0        ; indicate not ready
  408. mirdyret:
  409.                 ; <== End of your own code
  410.     ld    a,l        ; set/clear Z
  411.     or    a
  412.     ret
  413.  
  414. ;Send a break to the modem: leave empty if your system can't do it
  415. sndbrk:
  416.                 ; <== Insert your own code here
  417.  
  418.     ld    a,5        ; *eag*
  419.     out    (modctl),a    ; send to the status port
  420.     ld    a,mddtrof    ; turn off dtr, rts, send break
  421.     out    (modctl),a    ; *eag*
  422.  
  423.                 ; <== end of your own code
  424.  
  425.     ld    hl,300        ; wait 300 mS
  426.     call    waithlms
  427.  
  428.                 ; <== insert your own code here
  429.                 ; To restore
  430.  
  431.  
  432.                 ; <== End of your own code
  433.     ret
  434.  
  435.  
  436. ;Test UART flags for error: return TRUE (1) in HL if error.
  437. mdmerr:
  438.                 ; <== Insert your own code here
  439.  
  440.     in    a,(modctl)    ; in modem control port
  441.     and    mderrf        ; bits to test: parity, overrun, framing
  442.     jr    z,mnerr        ; no error
  443.     ld    hl,1        ; indicate error
  444.     jr    merrret
  445. mnerr:    ld    hl,0        ; indicate no error
  446. merrret:
  447.                 ; <== End of your own code
  448.     ld    a,l        ; set/clear Z
  449.     or    a
  450.     ret
  451.  
  452. ;Turn DTR ON
  453. dtron:
  454.                 ; <== Insert your own code here
  455.  
  456.     ld    a,5        ; *eag*
  457.     out    (modctl),a    ; *eag*
  458.     ld    a,mddtron    ; restore normal, 8 bits, rts on, etc.
  459.     out    (modctl),a    ; *eag*
  460.  
  461.                 ; <== End of your own code
  462.     ret
  463.  
  464. ;Turn DTR OFF
  465. dtroff:
  466.                 ; <== Insert your own code here
  467.  
  468.     ld    a,5        ; *eag*
  469.     out    (modctl),a    ; send to the status port
  470.     ld    a,mddtrof    ; turn off dtr, rts, send break
  471.     out    (modctl),a    ; *eag*
  472.  
  473.                 ; <== End of your own code
  474.     ret
  475.  
  476.  
  477.  
  478. ;Initialise the uart
  479.  
  480. init:
  481.  
  482.     ld    hl,2        ; get parameters
  483.     add    hl,sp
  484.     ex    de,hl
  485.     call    getparm        ; in HL
  486.     ld    (brate),hl    ; baud rate
  487.     call    getparm
  488.     ld    (parity),hl    ; parity
  489.     call    getparm
  490.     ld    (data),hl    ; data bits (BINARY 7 or 8)
  491.     call    getparm
  492.     ld    (stop),hl    ; stop bits (BINARY 1 or 2)
  493.  
  494.  
  495.                 ; <== Insert your own code here
  496.                 ; using values below
  497. ;*eag*    begin insertion
  498.  
  499. initall:            ; alternate entry point for userin
  500.     ld    de,(brate)    ; Code to de
  501.     ld    hl,baudtb    ; Offset into table
  502.     add    hl,de
  503.     ld    a,(hl)        ; Fetch code
  504.     or    a        ; 0? (means unsupported code)
  505.     jp    z,pbexit    ; exit if so
  506.     ld    (bsave1),a    ; Save it
  507.  
  508.     ld    a,(brate)    ; get brate
  509.     ld    (mspeed),a    ; don't forget to load mspeed with the
  510.                 ; current brate value if the new rate is
  511.                 ; valid. 
  512.  
  513.     ld    hl,baudtx    ; Offset into second table
  514.     add    hl,de
  515.     ld    a,(hl)        ; Get second value
  516.     ld    (bsave2),a    ; Save it also
  517.  
  518.     ld    hl,(biospt)    ; Get location of bios
  519.     ld    l,ct1        ; Add 42h to reach ct1 in i/o table
  520.     ld    a,47h
  521.     ld    (hl),a
  522.     inc    hl        ; Move to next location
  523.     ld    a,(bsave1)    ; Get first table value
  524.     ld    (hl),a        ; Store it
  525.     ld    a,(bsave2)    ; Get second table value
  526.     ld    b,a        ; And save it
  527.     ld    l,siob1        ; Move ahead to siob+1 values
  528.     ld    a,(hl)        ; Get current value
  529.     and    3fh
  530.     or    b        ; Or it with second value
  531.     ld    (hl),a        ; Store it in work table
  532.     inc    hl
  533.     inc    hl
  534.     ld    a,(hl)        ; Get last value and make
  535.     or    80h        ; Sure msb is set
  536.     ld    (hl),a        ; Put it back in working table
  537.  
  538.     ld    a,(data)    ; 7 or 8 data bits
  539.     sbc    a,7        ; kill offset
  540.     ld    h,0
  541.     ld    l,a
  542.     ld    de,bittbl    ; Load lookup table
  543.     add    hl,de        ; get bit pattern
  544.     ld    c,(hl)        ; Save selection value
  545.     ld    hl,(biospt)    ; Get bios address
  546.     ld    l,siob3        ; Move to siob+3
  547.     ld    a,(hl)        ; Wr5 info
  548.     and    9fh        ; Mask
  549.     or    c        ; Add selection
  550.     ld    (hl),a        ; Store it
  551.     ld    a,c        ; Get selection
  552.     rla
  553.     ld    c,a        ; Shift selection left
  554.     ld    l,siob5        ; Move to siob+5
  555.     ld    a,(hl)        ; Wr3 info
  556.     and    3fh        ; Mask
  557.     or    c
  558.     ld    (hl),a        ; Store it
  559.  
  560.     ld    a,(parity)    ; get parity
  561.     cp    'N'
  562.     jr    z,parno
  563.     cp    'E'
  564.     jr    z,parev
  565.     cp    'O'
  566.     jr    z,parod
  567.     jp    pbexit
  568.  
  569. parno:    ld    c,00h
  570.     jr    setpar
  571.  
  572. parev:    ld    c,03h
  573.     jr    setpar
  574.  
  575. parod:    ld    c,01h
  576.  
  577. setpar:    ld    hl,(biospt)    ; Get bios address
  578.     ld    l,siob1        ; Go to siob+1
  579.     ld    a,(hl)
  580.     and    0fch
  581.     or    c
  582.     ld    (hl),a
  583.  
  584.     ld    a,(stop)    ; stop bits
  585.     sbc    a,1        ; kill offset
  586.     ld    h,0
  587.     ld    l,a
  588.     ld    de,stptbl    ; bit patterns
  589.     add    hl,de        ; ptr to bit pattern
  590.     ld    c,(hl)        ; get result
  591.     ld    hl,(biospt)    ; Get bios address
  592.     ld    l,53h        ; Shift to bios+1
  593.     ld    a,(hl)
  594.     and    0f3h
  595.     or    c
  596.     ld    (hl),a
  597.  
  598.     ld    hl,(brate)    ; get baud code
  599.     sla    l        ; *2
  600.     sla    l        ; *4
  601.     ld    de,pbauds    ; base of printable baud table
  602.     add    hl,de        ; printable baud
  603.     ld    de,baudshw    ; dest
  604.     ld    bc,4        ; len
  605.     ldir            ; move it
  606.  
  607.     ld    a,(parity)    ; display that
  608.     ld    (parshw),a
  609.  
  610.     ld    a,(data)    ; display that
  611.     add    a,'0'        ; make ascii
  612.     ld    (bitshw),a
  613.  
  614.     ld    a,(stop)    ; display that
  615.     add    a,'0'        ; make ascii
  616.     ld    (stopshw),a
  617.  
  618.     call    print        ; display stuff on wyse
  619.  
  620. ;    the next few lines set the host message field on the wyse-50
  621. ;    to the following string, which displays your currently set
  622. ;    line parameters (baud, bits, parity and stop bits) in a 
  623. ;    permanent host field at the top of your terminal. if hostline
  624. ;    equate is not set true, they will just be shown on the screen
  625. ;    whenever they are set.
  626.  
  627.      if    hostline
  628.     db    esc,'A3p'    ; host msg field = dim underscore
  629.     db    esc,"F"        ; set set message
  630.      endif
  631.  
  632.     db    '          Baud: '
  633. baudshw:
  634.     db    '    '        ; printable baud rate
  635.     db    ' Bits: '
  636. bitshw:
  637.     db    ' '        ; bits per char
  638.     db    ' Parity: '
  639. parshw:
  640.     db    ' '        ; parity
  641.     db    ' Stop: '
  642. stopshw:
  643.     db    ' '        ; stop bits
  644.  
  645.     db    cr,lf,0
  646.  
  647.     jp    ioinit        ; Do the initialization
  648.  
  649. ;*eag*    end insertion
  650.  
  651.                 ; <== End of your own code
  652.     ret
  653.  
  654. ;*eag*    begin insertion
  655.  
  656. ioinit:
  657.  
  658.     ld    a,ioint        ; Offset into bios jump table
  659.     ld    hl,(biospt)    ; Address of bios in hl
  660.     ld    l,a        ; Add offset
  661.     jp    (hl)        ; Go there with auto return
  662.  
  663. ;    routine to handle unsupported baud rates
  664.  
  665. pbexit:
  666.     call print
  667.     db    'Unsupported.',cr,lf,0
  668.     ret
  669.  
  670. ; table of baud rate divisors for supported rates
  671.  
  672. baudtb:    db    0,208,139    ; 110,300,450
  673.     db    208,0,104    ; 600,710,1200
  674.     db    52,26,13,0    ; 2400,4800,9600,19200
  675.  
  676. baudtx:    db    0,80h,80h
  677.     db    40h,0,40h
  678.     db    40h,40h,40h,0
  679.  
  680. pbauds:    db    ' 110',' 300',' 450',' 600',' 710'
  681.     db    '1200','2400','4800','9600',' 19K'
  682.  
  683. bsave1:    db    0        ; Current setting from
  684. bsave2:    db    0        ; Tables - uninitialized
  685.  
  686. bittbl:    db    20h,60h        ; 7 or 8 data bits
  687.  
  688. stptbl:    db    04h,0ch        ; 1 or 2 stop bits
  689.  
  690. biospt:    dw    0
  691.  
  692. ;*eag*    end insertion
  693.  
  694. ;--------------------------------------------------------------------------
  695.  
  696. stop:    dw    1        ; stop bits
  697. parity:    dw    'N'        ; parity
  698. data:    dw    8        ; data bits
  699. brate:    dw    5        ; baud rate:
  700.  
  701. ;--------------------------------------------------------------------------
  702. ;Values of brate for each baud rate
  703. ;
  704. ; baud rate    brate
  705. ;
  706. ;   110         0
  707. ;   300         1
  708. ;   450         2
  709. ;   600         3
  710. ;   710         4
  711. ;  1200         5
  712. ;  2400         6
  713. ;  4800         7
  714. ;  9600         8
  715. ; 19200         9
  716. ; 38400        10
  717. ; 57600         11
  718. ; 76800         12
  719. ;
  720.  
  721. ;
  722. ; Set the port. ZMP supplies either 0 or 1 as a parameter.
  723. ;
  724. setport:
  725.     ld    hl,2        ; get port number
  726.     add    hl,sp
  727.     ex    de,hl
  728.     call    getparm        ; in HL (values are 0 and 1)
  729.  
  730.                 ; <== Insert your own code here
  731.  
  732.                 ; <== End of your own code
  733.     ret
  734. ;****************************************************************************
  735. ;Video terminal sequences: these are for ADM-3A: Modify as you wish
  736. ;Cursor addressing: 
  737. cursadd:
  738.     ld    hl,2        ; get parameters
  739.     add    hl,sp
  740.     ex    de,hl
  741.     call    getparm        ; in HL
  742.     ld    (row),hl    ; row
  743.     call    getparm
  744.     ld    (col),hl    ; column
  745.                 ; <== Insert your own code here
  746.                 ; using values in row and col
  747.     call    print
  748.     db    esc,'=',0    ; ADM-3A leadin
  749.     ld    a,(row)        ; row first
  750.     add    a,' '        ; add offset
  751.     call    cout
  752.     ld    a,(col)        ; sane for column
  753.     add    a,' '
  754.     call    cout
  755.                 ; <== end of your own code
  756.     ret
  757.  
  758. row:    ds    2        ; row
  759. col:    ds    2        ; column
  760.  
  761. ;clear screen:
  762. cls:
  763.     call    print
  764.     db    01ah,0
  765.     ret
  766.  
  767. ;inverse video on:
  768. invon:
  769.     call    print
  770.     db    esc,')',0
  771.     ret
  772.  
  773. ;inverse video off:
  774. invoff:
  775.     call    print
  776.     db    esc,'(',0
  777.     ret
  778.  
  779. ;turn off cursor:
  780. hide:
  781.     call    print
  782.     db    esc,'`0',0    ; wyse 50 cursor off
  783.     ret
  784.  
  785. ;turn on cursor:
  786. show:
  787.     call    print
  788.     db    esc,'`1',0    ; wyse 50 cursor on
  789.     ret
  790.  
  791. ;save cursor position:
  792. savecu:
  793.     ret
  794.  
  795. ;restore cursor position:
  796. rescu:
  797.     ret
  798.  
  799. ;****************************************************************************
  800.  
  801. ;Service modem interrupt:
  802. mint:
  803.     ret            ; my system doesn't need this
  804.  
  805. ;Initialise interrupt vectors:
  806. invec:
  807.     ret            ; ditto
  808.  
  809. ;De-initialise interrupt vectors:
  810. dinvec:
  811.     ret            ; ditto
  812.  
  813. ;****************** End of user-defined code ********************************
  814. ;        Do not change anything below here.
  815.  
  816. ;Modem character test for 100 ms
  817. mrd:
  818.     push    bc        ; save bc
  819.     ld    bc,100        ; set limit
  820. mrd1:
  821.     call    mirdy        ; char at modem?
  822.     jr    nz,mrd2        ; yes, exit
  823.     ld    hl,1        ; else wait 1ms
  824.     call    waithlms
  825.     dec    bc        ; loop till done
  826.     ld    a,b
  827.     or    c
  828.     jr    nz,mrd1
  829.     ld    hl,0        ; none there, result=0
  830.     xor    a
  831. mrd2:
  832.     pop    bc
  833.     ret
  834.  
  835. ; Inline print routine: destroys A and HL
  836.  
  837. print:
  838.     ex    (sp),hl        ; get address of string
  839. ploop:
  840.     ld    a,(hl)        ; get next
  841.     inc    hl        ; bump pointer
  842.     or    a        ; done if zero
  843.     jr    z,pdone
  844.     call    cout        ; else print
  845.     jr    ploop        ; and loop
  846. pdone:
  847.     ex    (sp),hl        ; restore return address
  848.     ret            ; and quit
  849.  
  850. ;
  851. ;Output a character in A to the console
  852. ;
  853. cout:
  854.     push    bc        ; save regs
  855.     push    de
  856.     push    hl
  857.     ld    e,a        ; character to E
  858.     ld    c,2
  859.     call    bdos        ; print it
  860.     pop    hl
  861.     pop    de
  862.     pop    bc
  863.     ret
  864.  
  865. ;Wait(seconds)
  866. wait:
  867.     ld    hl,2
  868.     add    hl,sp
  869.     ex    de,hl        ; get delay size
  870.     call    getparm
  871.                 ; fall thru to..
  872. ;Wait seconds in HL
  873. waithls:
  874.     push    bc        ; save bc
  875.     push    de        ; de
  876.     push    ix        ; and ix
  877.     ld    ix,0        ; then point ix to 0
  878.                 ; so we don't upset memory-mapped i/o
  879.  
  880. ;Calculate values for loop constants. Need to have two loops to avoid
  881. ;   16-bit overflow with clock speeds above 9 MHz.
  882.  
  883. outerval    equ    (clkspd / 10) + 1
  884. innerval    equ    (6667 / outerval) * clkspd
  885.  
  886. wait10:
  887.     ld    b,outerval
  888.  
  889. wait11:
  890.     ld    de,innerval
  891.  
  892. wait12:
  893.     bit    0,(ix)        ; time-wasters
  894.     bit    0,(ix)
  895.     bit    0,(ix)        ; 20 T-states each
  896.     bit    0,(ix)
  897.     bit    0,(ix)
  898.     bit    0,(ix)
  899.     dec    de
  900.     ld    a,e
  901.     ld    a,d
  902.     or    e
  903.     jr    nz,wait12    ; 150 T-states per inner loop
  904.     djnz    wait11        ; decrement outer loop
  905.     dec    hl        ; ok, decrement count in hl
  906.     ld    a,h
  907.     or    l
  908.     jr    nz,wait10
  909.     pop    ix        ; done -- restore ix
  910.     pop    de        ; de
  911.     pop    bc        ; and bc
  912.     ret
  913.  
  914. ;Wait milliseconds
  915. mswait:
  916.     ld    hl,2
  917.     add    hl,sp
  918.     ex    de,hl        ; get delay size
  919.     call    getparm
  920.                 ; fall thru to..
  921. ;Wait milliseconds in HL
  922. waithlms:
  923.     push    de
  924. w1ms0:
  925.     ld    de,39 * clkspd
  926. w1ms1:
  927.     dec    de
  928.     ld    a,d
  929.     or    e
  930.     jr    nz,w1ms1
  931.     dec    hl
  932.     ld    a,h
  933.     or    l
  934.     jr    nz,w1ms0
  935.     pop    de
  936.     ret
  937.  
  938. ;Get next parameter from (de) into hl
  939. getparm:
  940.     ex    de,hl        ; get address into hl
  941.     ld    e,(hl)        ; get lo
  942.     inc    hl
  943.     ld    d,(hl)        ; then hi
  944.     inc    hl        ; bump for next
  945.     ex    de,hl        ; result in hl, address still in de
  946.     ret
  947.  
  948. ;Get address of user-defined variables
  949.  
  950. getvars:
  951.     ld    hl,uservars
  952.     ret
  953.  
  954. uservars:
  955.     dw    overdrive    ; .OVR etc. drive/user
  956.     dw    overuser
  957.  
  958.  
  959.      if    ($ - codebgn) gt ovsize
  960. toobig:    jp    errval        ; Overlay too large!
  961.      endif
  962.  
  963.     end
  964.