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 / 22RSX / BYERSX.ARK / BRTV-1.BYE < prev    next >
Text File  |  1985-12-06  |  10KB  |  376 lines

  1. ; BRTV-1.BYE - BYERSX insert for TeleVideo TS-802 - 85/11/14
  2. ;
  3. ; Rename this file RSXIO.INC for automatic inclusion in BYERSX.
  4. ;
  5. ;         SIO I/O and CTC baudrate generator
  6. ;
  7. ;        Note:  This is an insert, not an overlay.
  8. ;
  9. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  10. ;
  11. ; 85/12/04 Created from BRKP-1.BYE    - C.B. Falconer
  12. ;
  13. ; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
  14. ;
  15. ;
  16. ; Modem port equates
  17. datport    equ    20H;        Modem data port
  18. stport    equ    datport+2;    Modem status port
  19. bport    equ    08H;        Modem baud rate port
  20. ;
  21. ; Status port masks
  22. drdy    equ    1;        Data available
  23. ordy    equ    4;        Transmit buffer empty
  24. dcd    equ    8;        Data carrier detect
  25. ;
  26. ; First Byte of CTC Command for baud rate changes
  27. bdcmd    equ    47H
  28. ;
  29. ; Baudrate table
  30. ;
  31. bd110    equ    0ffh;        not available
  32. bd300    equ    80H;        300 baud
  33. bd450    equ    0ffh;        not available
  34. bd600    equ    40H;        600 baud
  35. bd710    equ    0ffh;        not available
  36. bd1200    equ    20H;        1200 bps
  37. bd2400    equ    10H;        2400 bps
  38. bd4800    equ    08h;        4800 bps
  39. bd9600    equ    04h;        9600 bps
  40. bd19200    equ    02h;        19200 bps
  41. ;
  42. ; ZSIO WRn bits and fields (selected)
  43. ; WR0:            (low 3 bits are next reg. id)
  44. noop    equ    0
  45. rsints    equ    10h;    reset external/status interrupts
  46. chreset    equ    18h;    channel reset
  47. ;
  48. ; WR1:
  49. rxintdis equ    0;    (on mask 38h). Disable rcv. interrupts
  50. ;
  51. ; WR2:            (interrupt vector, channel B only)
  52. ;
  53. ; WR3:
  54. rxmask    equ    0c0h;    mask for rx wd. lgh. commands
  55. rx7bit    equ    040h;    7 bits per char
  56. rx8bit    equ    0c0h;    8 bits per char
  57. ;
  58. rxenbl    equ    1;    rx enable
  59. ;
  60. ; WR4:
  61. ;    mask 0c0h. internal clock divider
  62. clkx16    equ    040h;    divide by 16
  63. ;    mask 00ch. stop bits
  64. stops1    equ    4;    1 stop bit
  65. stops15    equ    8;    1.5 stop bits
  66. stops2    equ    0ch;    2 stop bits
  67. stopmsk    equ    00ch;    mask stop bits field
  68. ;    mask 003h. Parity, values 0,1,3 useful only
  69. pareven    equ    2
  70. parodd    equ    0;    bit 1 field
  71. parenbl    equ    1
  72. paroff    equ    0;    bit 0 field
  73. parmask    equ    3;    parity field mask
  74. ;
  75. ; WR5:
  76. dtr    equ    080h;    data terminal ready output
  77. ;    mask 060h.  Transmit bits/char
  78. tx7bit    equ    020h
  79. tx8bit    equ    060h
  80. txmask    equ    060h;    mask for transmit field
  81. ;    individual bits
  82. sndbrk    equ    10h;    send a break
  83. txenbl    equ    8;    transmit enable
  84. rts    equ    2;    request to send output
  85. ;
  86. ;    -----------------------------------------------
  87. ;
  88. ; Disconnect and initialize the ZSIO.  Connect any interrupt
  89. ; systems here.  MDQUIT is the inverse procedure
  90. ; a,f
  91. mdinit:    call    mdgo;        reinit port, synchronize
  92.     call    mdstop;        drop dtr line, hangup
  93.     push    d
  94.     lxi    d,2000
  95.     call    dodelay;    2000 millisec delay
  96.     pop    d
  97. ;    "    "
  98. ; enable the modem. Set stop bits, parity, word length
  99. ; Zsio/Televideo/Kaypro II/4/20/2x initialization
  100. ; a,f
  101. mdgo:    push    h
  102.     push    b
  103.     lxi    h,tbl1;        init the SIO chip
  104.     mov    b,m;        count of items
  105.     inx    h
  106.     mov    c,m;        port id
  107.     inx    h
  108.  db    0edh,0b3h;    outir/otir        ** Z80 code ** <<
  109.     pop    b
  110.     pop    h
  111.     ori    0ffh;        signal success
  112.     ret
  113. ;
  114. ; This table sets the default configuration.
  115. ; It is modified by the SETBAUD command (wd lgh, stops, parity)
  116. tbl1:    db    tbl1lgh,stport
  117.     db    noop;            force ctl reg access
  118.     db    chreset;        throw out of mode
  119.     db    1,rxintdis;        disable all interrupts
  120. wr3:    db    3,rx8bit + rxenbl;    reg 3, enable receive
  121. wr4:    db    4,clkx16+stops1;    reg 4, set ascii params
  122. wr5:    db    5,dtr+tx8bit+txenbl+rts; reg 5, enable send,dtr,rts
  123. tbl1lgh    equ    $-tbl1-2
  124. ;
  125. ; Reinitialize the modem and hang up the phone by dropping DTR and
  126. ; leaving it inactive.  This can inactivate interrupt systems.
  127. ; Inverse of mdinit.  Return 0ffh for success, 0 failure, w/flags
  128. ; a,f
  129. mdquit:
  130. ;    "    "
  131. ; Hang up by dropping DTR and leaving it inactive.
  132. ; Return 0ffh for success, 0 for failure, with flags. 
  133. ; Inverse of mdgo.
  134. ; a,f
  135. mdstop:    mvi    a,5;        Setup to write register 5
  136.     out    stport
  137.     lda    wr5+1;        get present configuration
  138.     ani    (NOT dtr) AND (NOT rts)
  139.     out    stport
  140.     ori    0ffh;        Success
  141.     ret
  142. ;
  143. ; See if we still have a carrier
  144. ; if not, return with the zero flag set
  145. ; a,f
  146. mdcarck:
  147.     mvi    a,rsints;        Reset status
  148.     out    stport
  149.     in    stport;        Get status
  150.     ani    dcd;        Check for carrier detect
  151.     rz
  152.     ori    0ffh
  153.     ret
  154. ;
  155. ; Input a character from the modem port. No check for ready
  156. ; a,f
  157. mdinp:    in    datport;    Get character
  158.     ret
  159. ;
  160. ; Check the status to see if a character is available. If not, return
  161. ; with the zero flag set. If yes, use 0FFH to clear the flag.
  162. ; a,f
  163. mdinst:    in    stport
  164.     ani    drdy;        Check receive ready bit
  165.     rz;            not ready
  166.     ori    0ffh;        ready, set flags
  167.     ret
  168. ;
  169. ; Send a character to the modem.  No check for ready
  170. ; f (allowed)
  171. mdoutp:    out    datport;    Send it
  172.     ret
  173. ;
  174. ; See if the output is ready for another character
  175. ; a,f
  176. mdoutst:
  177.     in    stport
  178.     ani    ordy;        Check transmit ready bit
  179.     rz;            not ready
  180.     ori    0ffh;        ready, set flags
  181.     ret
  182. ;
  183. ; Send a break (a) millisec long.  Return nz and 0ffh.
  184. ; Don't drop DTR.  We want to keep the connection up.
  185. ; If not capable, return 0 and z flag
  186. ; a,f
  187. sendbk:    push    d
  188.     push    psw
  189.     mvi    a,5
  190.     out    stport
  191.     lda    wr5+1;        get present configuration
  192.     ori    sndbrk
  193.     out    stport
  194.     pop    d;        orig (a) to d
  195.     mov    e,d
  196.     mvi    d,0
  197.     call    dodelay
  198.     pop    d;        restore entry
  199.     jmp    mdgo;        end break and signal success
  200. ;
  201. ; Generalized baud setting per (a).
  202. ; Input 0 for no action
  203. ; 0 and zero flag if good, else 0ffh and nz flag.
  204. ; a,f
  205. setbaud:
  206.     push    psw
  207.     call    setparity;    uses hi order bits
  208.     pop    psw
  209.     ani    0fh;        baud field
  210.     rz;            0, ignore
  211.     cpi    11
  212.     jnc    badbd;        invalid request
  213.     push    h
  214.     lxi    h,bdtbl-1;    for 1 based value
  215.     add    l
  216.     mov    l,a
  217.     adc    h
  218.     sub    l
  219.     mov    h,a
  220.     mov    a,m
  221.     pop    h
  222.     inr    a
  223.     jz    badbd;        baud rate not available
  224.     dcr    a
  225.     push    psw
  226.     mvi    a,bdcmd
  227.     out    bport;        Send 1st byte of command
  228.     pop    psw
  229.     out    bport;        Send the byte
  230.     xra    a;        Say rate is OK
  231.     ret
  232. badbd:    ori    0ffh;        with error signal
  233.     ret
  234. ;
  235. ; Table of bit patterns for baud rates. Not visible externally
  236. bdtbl:    db    bd110,  bd300,  bd450,  bd600,  bd710
  237.     db    bd1200, bd2400, bd4800, bd9600, bd19200
  238. ;
  239. ; set parity on bit weights 20,10h of (a).
  240. ; values: 10h = no parity, 20h=odd, 30h = even parity
  241. ; set stop bits on bit weights 80h,40h
  242. ; values: 40h = 1 stop, 80h = 1.5 stops, 0c0h = 2 stops
  243. ; zero fields for no change.
  244. ; a,f
  245. setparity:
  246.     push    b
  247.     push    d
  248.     push    h
  249.     mov    e,a;        save configuration
  250.     ani    030h
  251.     jz    sp2;        no parity changes
  252.     mvi    d,paroff
  253.     lxi    b,256*tx8bit + rx8bit;    8 bits for no parity
  254.     cpi    20h
  255.     jc    sp1;        parity is turned off
  256.     mvi    d,pareven + parenbl
  257.     lxi    b,256*tx7bit + rx7bit;    7 bits for parity
  258.     cpi    30h
  259.     jz    sp1;        even parity
  260.     mvi    d,parodd + parenbl
  261. sp1:    lxi    h,wr3+1;    b holds new txbits, c new rxbits,
  262.     mov    a,m;          d new parity bits
  263.     ani    NOT rxmask
  264.     ora    c
  265.     mov    m,a;        set receive wd length
  266.     lxi    h,wr5+1
  267.     mov    a,m
  268.     ani    NOT txmask
  269.     ora    b
  270.     mov    m,a;        set transmit wd length
  271.     lxi    h,wr4+1
  272.     mov    a,m
  273.     ani    NOT parmask
  274.     ora    d
  275.     mov    m,a;        set parity
  276. sp2:    mov    a,e
  277.     ani    0c0h
  278.     jz    sp4;        no stop bit changes
  279.     mvi    b,stops1
  280.     cpi    010h
  281.     jz    sp3;        1 stop bit
  282.     mvi    b,stops15
  283.     cpi    020h
  284.     jz    sp3;        1.5 stop bits
  285.     mvi    b,stops2;    else 2 stop bits
  286. sp3:    lxi    h,wr4+1;    b holds new stop configuration
  287.     mov    a,m
  288.     ani    NOT stopmsk
  289.     ora    b
  290.     mov    m,a;        set stop bits
  291. sp4:    pop    h
  292.     pop    d
  293.     pop    b
  294.     jmp    mdgo;        make the physical changes
  295. ;
  296. ; For non-intelligent modems.  Go off hook and connect.
  297. ; Return 0ffh for success, else 0 (with flags)
  298. ; a,f
  299. mdansw:
  300.     xra    a;        not implemented here
  301.     ret
  302. ;
  303. ; For non intelligent modems.  Is the phone ringing
  304. ; 0 and z flag if not, 0ffh and nz flag if ringing
  305. mdring:    xra    a;        not ringing
  306.     ret
  307. ;
  308. ; For disk control, the following indicates that the application
  309. ; will not require disk access in the immediate future.  If possible
  310. ; drive motors should be stopped.  No harm if unable to perform
  311. ; a,f
  312. dskstp:    ret
  313. ; For disk control, the following indicates that the application
  314. ; will require disk access in the immediate future.  If possible
  315. ; drive motors should be started.  No harm if unable to perform
  316. ; a,f
  317. dskrun:    ret
  318. ;
  319. ; ----------------------- Timer interface --------------------------
  320. ;
  321. ;        ---- CUSTOMIZE TO YOUR INSTALLATION ----
  322. ;
  323. ; These two routines are called with either
  324. ;   de = 0ffffh for a query (return current value in hl) )
  325. ;   de = other  to set the appropriate value, and return in (hl)
  326. ; The returned value should be 0ffffh if no timer system installed.
  327. ;
  328. ; The date is kept in the following format (note 0ffffh is invalid)
  329. ;    MSbit    yyyyyyy mmmm ddddd   LSbit
  330. ; with y field (0..127) the offset from 1980 (dates to 2107)
  331. ;      m field (1..12)  the numerical month  (Jan to Dec)
  332. ;      d field (1..31)  the day of month
  333. ; (Identical to MSDOS format)
  334. ; a,f,h,l
  335. sgdate:    lxi    h,0ffffh;    Not implemented
  336.     ret
  337. ;
  338. ; The time is kept in the following format (note 0ffffh is invalid)
  339. ;   MSbit     hhhhh mmmmmm sssss  LS bit
  340. ; with h field (0..23)  hour of day (0 is midnight)
  341. ;      m field (0..59)  minute of hour
  342. ;      s field (0..29)  seconds DIV 2 (resolution 2 seconds)
  343. ; (Identical to MSDOS format)
  344. ; a,f,h,l
  345. sgtime:    lxi    h,0ffffh;    Not implemented
  346.     ret
  347. ;
  348. ; This is used only where the host system has no real-time clock.
  349. ; This allows simulation of that clock, with lousy accuracy.
  350. ; Adds 1 minute to the internally stored time value.  If a clock
  351. ; system exists this should simply return.
  352. ; a,f,h,l (allowed)
  353. add1min:
  354.     ret
  355. ;
  356. ; ------------ I/O Dependant Function Key actions -------------
  357. ;
  358. ; The following are called when the ATTN char is followed by one
  359. ; of the digits '0' thru '9'.  It is suggested that the digit '0'
  360. ; be reserved for performing screen dumps.  A simple "ret" 
  361. ; eliminates any key from the function repetoire.
  362. ; a,f,h,l (allowed)
  363. f0k:
  364. f1k:
  365. f2k:
  366. f3k:
  367. f4k:
  368. f5k:
  369. f6k:
  370. f7k:
  371. f8k:
  372. f9k:    ret;        eliminate all these
  373. ;            end
  374. ; ------------------------------------------------
  375. ╙o