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 / BBSING / MBBS / MB8251-2.ASM < prev    next >
Assembly Source File  |  2000-06-30  |  8KB  |  273 lines

  1. ;***********************************************************************
  2. ;
  3. ;              MBYE  (Modular BYE)
  4. ;             8251A USART routines
  5. ;        Version 2.0 - by Kim Levitt - 02/20/84
  6. ;
  7. ;    This version is for a 8251A I/O with CTC timer to set speed,
  8. ; or for a Morrow Micro Decision using the 8251A baud rate multiplier
  9. ; to change baud rates. (Set your printer port baud rate switches to
  10. ; 1200 baud and connect your modem to this port.)
  11. ;
  12. ;    These routines will allow the easy patching of MBYE for any 
  13. ; type of modem/serial port combination.  Certain routines must return
  14. ; status flags, so please be careful to set the flags as directed.
  15. ;
  16. ; This version is for the Intel 8251A chip that is hooked up to an ex-
  17. ; ternal modem. Since the 8251A cannot detect rings (RI), set NORING EQU
  18. ; YES in the main program. Also, since the 8251A cannot detect carrier,
  19. ; you should wire pin 8 (DCD) from your modem to pin 6 (DSR) on your
  20. ; port, which the 8251 reads to determine if carrier is present.
  21. ;
  22. ;=======================================================================
  23. ;
  24. ; 02/20/84  Added equates and code for MicroDecisions   - Kim Levitt
  25. ; 02/07/84  Fixed and renamed to work with MBYE        - Kim Levitt
  26. ; 11/27/83  Altered and renamed to work with BYE3    - Irv Hoff
  27. ; 10/04/83  Modified for use with 8251A I/O with
  28. ;        CTC timer to set speed.            - Irv Hoff
  29. ; 10/04/82  Routines added, no fuss, mess, or frills.    - Paul Traina
  30. ;
  31. ;=======================================================================
  32. ;
  33. ; Set this equate to YES if you are running on a Morrow MicroDecision
  34. ;
  35. MICROD:    EQU    YES        ;Yes, if Morrow MicroDecision
  36. ;
  37.      IF    MICROD
  38. BASEP:    EQU    0FEH        ;MicroDecision base port address
  39.      ENDIF
  40. ;
  41.      IF    NOT MICROD
  42. BASEP:    EQU    28H        ;Set to your modem's UART base port
  43. RCVPORT:EQU    20H        ;Set to recv speed CTC port
  44. XMTPORT:EQU    1AH        ;Set to xmit speed CTC port
  45.      ENDIF
  46. ;
  47. ; The following define the port address to use.
  48. ;
  49. DATPORT:EQU    BASEP        ;Data port
  50. STPORT:    EQU    BASEP+1        ;Status/Control port
  51. ;
  52. ; The following are STPORT commands (output these to STPORT)
  53. ;
  54. MODINS:    EQU    01001110B    ;8 bits, no parity, 1 stop bit, 16x
  55. OFFINS:    EQU    00010000B    ;drop DTR and disable RCV/XMT
  56. ONINS:    EQU    00010111B    ;reset flags, send DTR, enable rx & tx
  57. RSTINS:    EQU    01000010B    ;reset USART and send DTR
  58. ;
  59. ; The following are STPORT status masks
  60. ;
  61. DAV:    EQU    00000010B    ;data available
  62. TBMT:    EQU    00000001B    ;transmit buffer empty
  63. DSR:    EQU    10000000B    ;data set ready (no DCD avail)
  64. FE:    EQU    00100000B    ;framing error
  65. OE:    EQU    00010000B    ;overrun error
  66. ERR:    EQU    OE+FE        ;overrun and framing error
  67. ;
  68.      IF    NOT MICROD
  69. ;
  70. ; The following are CTC timer baud rates divisors.
  71. ;
  72. BD300:    EQU    32        ;9600/300  =  300 bps
  73. BD450:    EQU    21        ;9600/450  =  450 bps
  74. BD1200:    EQU    8        ;9600/1200 = 1200 bps
  75. ;
  76.      ENDIF
  77. ;
  78. ;=======================================================================
  79. ;
  80. ; If any of your routines zaps anything other than the Accumulator, then
  81. ; you must preserve all other registers.
  82. ;
  83. ;=======================================================================
  84. ;
  85. ; This routine should turn off everything on the modem, and get it ready
  86. ; to wait for a ring.  (Also hang it up) (lowers DTR)
  87. ;
  88. MDINIT:
  89.     MVI    A,RSTINS    ;reset UART
  90.     OUT    STPORT
  91.     CALL    UDELAY
  92. ;
  93.      IF    NOT MICROD
  94.     MVI    A,MODINS    ;x16 clk, 1 stop bit, etc.
  95.      ENDIF
  96. ;
  97.      IF    MICROD AND SPDBYTE
  98.     LDA    MSPEED        ;if multi speed, check speed byte
  99.     CPI    5        ;if not 1200 baud now, set to 300
  100.     JNZ    INIT300
  101.     MVI    A,MODINS    ;else set to 1200
  102.     JMP    INITSET
  103.      ENDIF
  104. ;
  105.      IF    MICROD
  106. INIT300:
  107.     MVI    A,MODINS+1    ;x64 clk for 300 initially
  108.      ENDIF
  109. ;
  110. INITSET:
  111.     OUT    STPORT
  112.     CALL    UDELAY
  113.     MVI    A,OFFINS    ;Clear DTR
  114.     OUT    STPORT        ;causing hangup
  115.     RET            ;return
  116. ;
  117. ; The following routine will make the modem answer the phone. (raise DTR)
  118. ;
  119. MDANSW:
  120.     MVI    A,ONINS        ;turn on DTR, etc.
  121.     OUT    STPORT
  122.     RET            ;return
  123. ;
  124. ; The following is a routine to determine if there is a character wait-
  125. ; ing to be received,  if none, the Zero flag will be set, otherwise it
  126. ; returns with FF in register A.  Remember that the system will like you
  127. ; a little more if you also mask out framing, parity, and overrun errors.
  128. ;
  129. MDINST:
  130.     IN    STPORT        ;get status
  131.     ANI    DAV        ;got a character?
  132.     RZ            ;return if none
  133.     IN    STPORT        ;get status again
  134.     ANI    ERR        ;check for framing and overrun
  135.     JZ    MDINST1        ;no errors
  136.     MVI    A,ONINS        ;reset error flags
  137.     OUT    STPORT
  138.     XRA    A        ;return false
  139.     RET
  140. ;
  141. MDINST1:
  142.     ORI    0FFH        ;We have a character
  143.     RET
  144. ;
  145. ; The following is a routine to determine if the transmit buffer is
  146. ; empty.  If it is, it will return with the Zero flag clear.  If the
  147. ; transmitter is busy, then it will return with the Zero flag set.
  148. ;
  149. MDOUTST:
  150.     IN    STPORT
  151.     ANI    TBMT
  152.     RET
  153. ;
  154. ; The following is a routine that will check to make sure we still have
  155. ; carrier.  If there is no carrier, it will return with the Zero flag
  156. ; set.
  157. ;
  158. MDCARCK:
  159.     IN    STPORT    ;get status
  160.     ANI    DSR    ;check if Data Set Ready is on (no DCD)
  161.     RET        ;(wire modem pin 8 to port pin 6 for carrier read)
  162. ;
  163. ; The following is a routine that will input one character from the
  164. ; modem port.  If there is nothing there, it will return garbage...
  165. ; so use the MDINST routine first.
  166. ;
  167. MDINP:
  168.     IN    DATPORT        ;get character
  169.     ANI    7FH        ;strip parity and other garbage
  170.     RET
  171. ;
  172. ; The following is a routine that will output one character in register
  173. ; A to the modem.  REMEMBER, that is register A, not register C.
  174. ;  
  175. ; ** Use MDOUTST first to see if buffer is empty **
  176. ;
  177. MDOUTP:
  178.     OUT    DATPORT        ;send it
  179.     RET
  180. ;
  181. ; These next routines set the proper baud rates for the modem.  If you
  182. ; do not support the particular rate, then simply set the appropriate
  183. ; S110 - S1200 equates in the main program. If the baud rate change
  184. ; is successful, make SURE the Zero flag is set.
  185. ;
  186.      IF    NOT MICROD    ;if non-MicroDecision (CTC)
  187. ;
  188. ; Set up for 300 bps
  189. ;
  190. SET300:
  191.     MVI    B,BD300        ;load 300 bps
  192.     JMP    SETSPD
  193. ;
  194. ; Set up for 450 bps
  195. ;
  196. SET450:
  197.     MVI    B,BD450        ;load 450 bps
  198.     JMP    SETSPD
  199. ;
  200. ; Set up for 1200 bps
  201. ;
  202. SET1200:
  203.     MVI    B,BD1200    ;poke in 1200 bps
  204. ;
  205. SETSPD:
  206.     MVI    A,47H
  207.     OUT    RCVPORT
  208.     OUT    XMTPORT
  209.     MOV    A,B        ;get the speed value back
  210.     OUT    RCVPORT
  211.     OUT    XMTPORT
  212.     XRA    A        ;say it is ok
  213.     RET
  214. ;
  215.      ENDIF    ;NOT MICROD
  216. ;
  217.      IF    MICROD
  218. ;
  219. ; On MicroDecisions, there is no software controllable baud rate chip,
  220. ; (at least not on the MD1 and MD2, anyway), so only two baud rates
  221. ; can be selected, either 300 or 1200 baud, by using the baud rate
  222. ; factor variable of the 8251A to change baud rates instead of an
  223. ; external baud rate chip. Be sure to set up your dip switches so that
  224. ; 1200 is the baud rate for your printer port and attach your modem
  225. ; there. Set the switches to 1200 even if it is a 300 only modem, as
  226. ; the software will switch to 300 only if switches are set up right.
  227. ;
  228. ;
  229. SET300:
  230.     MVI    B,MODINS+1    ;x64 clk for 300 baud
  231.     JMP    SETBAUD        ;change baud rate
  232. ;
  233. SET1200:
  234.     MVI    B,MODINS    ;x16 clk for 1200 baud
  235. SETBAUD:
  236.     MVI    A,RSTINS    ;return to mode instruction reg
  237.     OUT    STPORT
  238.     CALL    UDELAY
  239.     MOV    A,B        ;get clk multiplier
  240.     OUT    STPORT
  241.     JMP    UDELAY        ;pause and return
  242. ;
  243. SET450:
  244. ;
  245.      ENDIF    ;MICROD
  246. ;
  247. ; The following routines returns a 255 because we were not able to set to
  248. ; the proper baud rate because the serial port can't handle it.
  249. ; (Use S110-S1200 equates and SINGLE equate to select from valid baud
  250. ; rates you wish to support. (in main pgm))
  251. ;
  252. SET110:
  253. SET600:
  254. SET710:
  255. ;
  256. SETINV:
  257.     MVI    A,0FFH
  258.     ORA    A        ;make sure the Zero flag isn't set
  259.     RET
  260. ;
  261. ; 8251 specific USART delay
  262. ;
  263. UDELAY:
  264.     NOP
  265.     NOP
  266.     NOP
  267.     RET
  268. ;
  269. ; Ok, that's all of the modem dependent routines that MBYE uses, so if
  270. ; you patch this file into your copy of MBYE, it should work out well.
  271. ;
  272. ;***********************************************************************
  273. ;