home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / cpmhelp / sio.hlp < prev    next >
Text File  |  1994-07-27  |  17KB  |  306 lines

  1. General Information
  2. Dectecting a 'Received Character Available'
  3. Detecting a 'Transmit Buffer Empty'
  4. Detecting a 'Clear To Send (CTS)'
  5. Detecting a 'Interupt Pending'
  6. Detecting a 'Break or Abort'
  7. Resetting the chip
  8. Selecting Data Bits, Stop bits, Parity status
  9. Using the interrupt abilities
  10. :General Information
  11. The Z80 SIO chip allows two serial type devices to be attached to it.
  12. It also has three interrupt lines on it that can be daisy chained.
  13.  
  14. The Z80 SIO has three internal registers that can be read for status
  15. of the serial  device and seven registers for selecting options. For
  16. a  simplified  description  of this  chip, we  will assume  that the
  17. serial device we are working with  is RS232. We  will also not cover
  18. all of  the functions that  this chip offers, rather,  we will cover
  19. just what is needed to select data bits, stop  bits, parity, and the
  20. interupt request functions.
  21. :Dectecting a 'Received Character Available'
  22.    Read Register 0 (RR0)  is the internal  register  that is used to
  23.    get the  received character available flag. It  is located in the
  24.    least significant bit of the byte,  so, when you wish to look for
  25.    a received  character  available flag, the  following code can be
  26.    used: (Kaypro 10 example)
  27.  
  28.    IN     A,(STATUS)            ;Read in  the status byte  into REGA
  29.    AND    01H                   ;And a with 1 to check for available
  30.    CP     01H                   ;Compare a with  the bit number need
  31.    JNZ    NOBYTE                ;If bit 1 not  set, no character now
  32.    IN     A,(DATA)              ;If character  available, into  REGA
  33.    RET                          ;Return  from  subroutine  to sender
  34. :Detecting a 'Transmit Buffer Empty'
  35.    Read Register 0  (RR0) is the  internal register that  is used to
  36.    get the  transmit  buffer empty flag.  It is  located in  the bit
  37.    location 2 (Starting with 0, counting left), so  when you wish to
  38.    see if the  transmit  buffer is empty, the  following code can be
  39.    used: (Kaypro 10 example)
  40.  
  41.    PUSH   AF                    ;Store  the  byte  in 'A'  to  stack
  42.    TRANS:                       ;Place entry point for transmit here
  43.    IN     A,(STATUS)            ;Read in  the status  byte into REGA
  44.    AND    04H                   ;And a  with 4  to  check  for empty
  45.    CP     04H                   ;Compare a with  the bit number need
  46.    JNZ    TRANS                 ;Continue to loop to  transmit until
  47.    POP    AF                    ;Restore the byte to transmit into A
  48.    OUT    (DATA),A              ;Output the byte to transmit to port
  49.    RET                          ;Return  from  subroutine  to sender
  50. :Detecting a 'Clear To Send (CTS)'
  51.    Read register 0 (RR0)  is the internal register  that is  used to
  52.    get the clear to  send flag. It is located in the  bit location 5
  53.    (Starting with 0, counting  left), so when  you wish to  see if a
  54.    clear to send is being offered, you can use the following code:
  55.  
  56.    CHECK:                       ;Set entry point to wait for CTS sig
  57.    IN     A,(STATUS)            ;Get  the  status  byte  into   REGA
  58.    AND    20H                   ;And a with  20H to check  for a CTS
  59.    CP     20H                   ;Compare a with  the bit number need
  60.    JNZ    CHECK                 ;If not set,  continue to loop until
  61.    RET                          ;Return  from  subroutine  to sender
  62. :Detecting a 'Interupt Pending'
  63.    Read register 0  (RR0) is the  internal register that  is used to
  64.    get the interupt pending flag. It is located  in the bit location
  65.    1, (Starting with 0, counting left),  so when you wish to  see if
  66.    interupt is awaiting service, the following code can be used:
  67.  
  68.    IN     A,(STATUS)            ;Get the status byte into register A
  69.    AND    02H                   ;And  a  with  2  to  set  the  flag
  70.    CP     02H                   ;Compare a with  the bit number need
  71.    RET    NZ                    ;If no interupt is  awaiting, return
  72.    JP     SERVICE               ;If bit  set, service  the  interupt
  73. :Detecting a 'Break or Abort'
  74.    Read register 0  (RR0) is the  internal register that  is used to
  75.    get the break or abort flag. It is located in  the bit location 7
  76.    (Starting with 0, counting  left), so when  you wish to  see if a
  77.    break or an abort was requested, the following code can be used:
  78.  
  79.    IN     A,(STATUS)            ;Get the status byte into register A
  80.    AND    80H                   ;And  a  with  80  to  set  the flag
  81.    CP     80H                   ;Compare a with  the bit number need
  82.    RET    NZ                    ;If   no   abort  or  break,  return
  83.    JP     ABORT                 ;If flag  was set,  go to  the abort
  84. :Resetting the chip
  85. The first operation of the chip  before requesting the parameters of
  86. the operations we will be doing is to reset  the chip. We do this by
  87. writing an 18H to Write Register 0 (WR0). Before we do that, we need
  88. to select Write register 0.
  89.  
  90.    LD    A,00H                  ;Load a with a zero for the register
  91.    OUT   (STATUS),A             ;And  select Write  Register 0 (RR0)
  92.    LD    A,18H                  ;Load a with  00011000 to reset chip
  93.    OUT   (STATUS),A             :Output  byte to  the status/control
  94. :Selecting Data Bits, Stop bits, Parity status
  95. Receive and transmit can operate  at different parameters reguarding
  96. to data bits, stop bits, and the like. Here are examples:  (In these
  97. examples, the  receive enable, transmit enable, data  terminal ready
  98. get selected)
  99.  
  100. Receive at 5 data bits a character:
  101.    LD    A,03H                  ;Load a with three for register sel.
  102.    OUT   (STATUS),A             ;And  select Write  Register 3 (WR3)
  103.    LD    A,01H                  ;Load a with 00000001 for 5 data bit
  104.    OUT   (STATUS),A             ;Output  byte to  the status/control
  105.  
  106. Receive at 6 data bits a character:
  107.    LD    A,03H                  ;Load a with three for register sel.
  108.    OUT   (STATUS),A             ;And  select Write  Register 3 (WR3)
  109.    LD    A,41H                  ;Load a with 01000001 for 6 data bit
  110.    OUT   (STATUS),A             ;Output  byte to  the status/control
  111. ~
  112. Receive at 7 data bits a character:
  113.    LD    A,03H                  ;Load a with three for register sel.
  114.    OUT   (STATUS),A             ;And  select Write  Register 3 (WR3)
  115.    LD    A,81H                  ;Load a with 10000001 for 7 data bit
  116.    OUT   (STATUS),A             ;Output  byte to  the status/control
  117.  
  118. Receive at 8 data bits a character:
  119.    LD    A,03H                  ;Load a with three for register sel.
  120.    OUT   (STATUS),A             ;And  select Write  Register 3 (WR3)
  121.    LD    A,C1H                  ;Load a with 11000001 for 8 data bit
  122.    OUT   (STATUS),A             ;Output  byte to  the status/control
  123. ~
  124. Transmit at 5 data bits a character:
  125.    LD    A,05H                  ;Load a with  five for register sel.
  126.    OUT   (STATUS),A             ;And  select Write  Register 5 (WR5)
  127.    LD    A,88H                  ;Load a with 10001000 for 5 data bit
  128.    OUT   (STATUS),A             ;Output  byte to  the status/control
  129.  
  130. Transmit at 6 data bits a character:
  131.    LD    A,05H                  ;Load a with  five for register sel.
  132.    OUT   (STATUS),A             ;And  select Write  Register 5 (WR5)
  133.    LD    A,0A8H                 ;Load a with 10101000 for 6 data bit
  134.    OUT   (STATUS),A             ;Output  byte to  the status/control
  135. ~
  136. Transmit at 7 data bits a character:
  137.    LD    A,05H                  ;Load a with  five for register sel.
  138.    OUT   (STATUS),A             ;And  select Write  Register 5 (WR5)
  139.    LD    A,0C8H                 ;Load a with 11001000 for 7 data bit
  140.    OUT   (STATUS),A             ;Output  byte to  the status/control
  141.  
  142. Transmit at 8 data bits a character:
  143.    LD    A,05H                  ;Load a with  five for register sel.
  144.    OUT   (STATUS),A             ;And  select Write  Register 5 (WR5)
  145.    LD    A,0E8H                 ;Load a with 11101000 for 8 data bit
  146.    OUT   (STATUS),A             ;Output  byte to  the status/control
  147. ~
  148. No parity, 1 stop bit, X16 clock:
  149.    LD    A,04H                  ;Load a with  four for register sel.
  150.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  151.    LD    A,44H                  ;Load a with 01000100 for 1 stop bit
  152.    OUT   (STATUS),A             ;Output  byte to  the status/control
  153.  
  154. No parity, 1.5 stop bit, X16 clock:
  155.    LD    A,04H                  ;Load a with  four for register sel.
  156.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  157.    LD    A,48H                  ;Load a with 01001000 for  1.5 stops
  158.    OUT   (STATUS),A             ;Output  byte to  the status/control
  159.  
  160. No parity, 2 stop bits, X16 clock:
  161.    LD    A,04H                  ;Load a with  four for register sel.
  162.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  163.    LD    A,4CH                  ;Load a with 01001100 for 2 stop bit
  164.    OUT   (STATUS),A             ;Output  byte to  the status/control
  165. ~
  166. Odd parity, 1 stop bit, X16 clock:
  167.    LD    A,04H                  ;Load a with  four for register sel.
  168.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  169.    LD    A,45H                  ;Load a with 01000101 for 1 stop bit
  170.    OUT   (STATUS),A             ;Output  byte to  the status/control
  171.  
  172. Odd parity, 1.5 stop bit, X16 clock:
  173.    LD    A,04H                  ;Load a with  four for register sel.
  174.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  175.    LD    A,49H                  ;Load a with 01001001 for  1.5 stops
  176.    OUT   (STATUS),A             ;Output  byte to  the status/control
  177.  
  178. Odd parity, 2 stop bits, X16 clock:
  179.    LD    A,04H                  ;Load a with  four for register sel.
  180.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  181.    LD    A,4DH                  ;Load a with 01001101 for 2 stop bit
  182.    OUT   (STATUS),A             ;Output  byte to  the status/control
  183. ~
  184. Even parity, 1 stop bit, X16 clock:
  185.    LD    A,04H                  ;Load a with  four for register sel.
  186.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  187.    LD    A,47H                  ;Load a with 01000111 for 1 stop bit
  188.    OUT   (STATUS),A             ;Output  byte to  the status/control
  189.  
  190. Even parity, 1.5 stop bit, X16 clock:
  191.    LD    A,04H                  ;Load a with  four for register sel.
  192.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  193.    LD    A,4BH                  ;Load a with 01001011 for  1.5 stops
  194.    OUT   (STATUS),A             ;Output  byte to  the status/control
  195.  
  196. Even parity, 2 stop bits, X16 clock:
  197.    LD    A,04H                  ;Load a with  four for register sel.
  198.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  199.    LD    A,4FH                  ;Load a with 01001111 for 2 stop bit
  200.    OUT   (STATUS),A             ;Output  byte to  the status/control
  201. ~
  202. No parity, 1 stop bit, X1 clock:
  203.    LD    A,04H                  ;Load a with  four for register sel.
  204.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  205.    LD    A,04H                  ;Load a with 00000100 for 1 stop bit
  206.    OUT   (STATUS),A             ;Output  byte to  the status/control
  207.  
  208. No parity, 1.5 stop bit, X1 clock:
  209.    LD    A,04H                  ;Load a with  four for register sel.
  210.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  211.    LD    A,08H                  ;Load a with 00001000 for  1.5 stops
  212.    OUT   (STATUS),A             ;Output  byte to  the status/control
  213.  
  214. No parity, 2 stop bits, X1 clock:
  215.    LD    A,04H                  ;Load a with  four for register sel.
  216.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  217.    LD    A,0CH                  ;Load a with 00001100 for 2 stop bit
  218.    OUT   (STATUS),A             ;Output  byte to  the status/control
  219. ~
  220. Odd parity, 1 stop bit, X1 clock:
  221.    LD    A,04H                  ;Load a with  four for register sel.
  222.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  223.    LD    A,05H                  ;Load a with 00000101 for 1 stop bit
  224.    OUT   (STATUS),A             ;Output  byte to  the status/control
  225.  
  226. Odd parity, 1.5 stop bit, X1 clock:
  227.    LD    A,04H                  ;Load a with  four for register sel.
  228.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  229.    LD    A,09H                  ;Load a with 00001001 for  1.5 stops
  230.    OUT   (STATUS),A             ;Output  byte to  the status/control
  231.  
  232. Odd parity, 2 stop bits, X1 clock:
  233.    LD    A,04H                  ;Load a with  four for register sel.
  234.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  235.    LD    A,0DH                  ;Load a with 00001101 for 2 stop bit
  236.    OUT   (STATUS),A             ;Output  byte to  the status/control
  237. ~
  238. Even parity, 1 stop bit, X1 clock:
  239.    LD    A,04H                  ;Load a with  four for register sel.
  240.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  241.    LD    A,07H                  ;Load a with 00000111 for 1 stop bit
  242.    OUT   (STATUS),A             ;Output  byte to  the status/control
  243.  
  244. Even parity, 1.5 stop bit, X1 clock:
  245.    LD    A,04H                  ;Load a with  four for register sel.
  246.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  247.    LD    A,0BH                  ;Load a with 00001011 for  1.5 stops
  248.    OUT   (STATUS),A             ;Output  byte to  the status/control
  249.  
  250. Even parity, 2 stop bits, X1 clock:
  251.    LD    A,04H                  ;Load a with  four for register sel.
  252.    OUT   (STATUS),A             ;And  select Write  Register 4 (WR4)
  253.    LD    A,0FH                  ;Load a with 00001111 for 2 stop bit
  254.    OUT   (STATUS),A             ;Output  byte to  the status/control
  255. :Using the interrupt abilities
  256. The chip has three  interupt enable  modes. They are an  interupt on
  257. first character,   interupt on  all characters  ignoring parity, and
  258. interupt on all  character using parity.  The parity may  or may not
  259. determine the address of where the interupt will jump to.
  260.  
  261. You load your interupt register  (I) with the most  significant byte
  262. of where the interupt routine is going to reside in memory. You give
  263. the Z80SIO chip the least significant byte of the 16 bit address. On
  264. an interupt, the 8 bit  value in register I  and the  8 bit value in
  265. the Z80SIO are combined to give a 16 bit address to jump  to. In the
  266. examples  given,  the   Z80SIO  is  offered  a  zero  as  the  least
  267. significant byte (LSB), and A0  is offered  as the  most significant
  268. byte (MSB).  On interupts,  the program  counter will go  to address
  269. A000H.
  270. ~
  271. Interupt on first character only:
  272.     IM    2                     ;Enable interupt  with external LSB
  273.     LD    A,01H                 ;Load a with  one for  register sel.
  274.     OUT   (STATUS),A            :And  select write  register 1 (WR1)
  275.     LD    A,08H                 ;Load  a  with  00001000  for  first
  276.     OUT   (STATUS),A            ;And select  interupt on first  byte
  277.     LD    A,02H                 ;Load a with  two for  register sel.
  278.     OUT   (STATUS),A            ;And select write  register 2 (WR2).
  279.     LD    A,00H                 ;Load a with LSB of interupt address
  280.     OUT   (STATUS),A            ;set the least significant byte zero
  281.     LD    I,0A0H                ;Load MSB with A  for address A000H.
  282. ~
  283. Interupt on All characters don't Ignore the parity:
  284.     IM    2                     ;Enable interupt  with external LSB
  285.     LD    A,01H                 ;Load a with  one for  register sel.
  286.     OUT   (STATUS),A            :And  select write  register 1 (WR1)
  287.     LD    A,10H                 ;Load  a  with  00010000  for  first
  288.     OUT   (STATUS),A            ;And select  interupt on first  byte
  289.     LD    A,02H                 ;Load a with  two for  register sel.
  290.     OUT   (STATUS),A            ;And select write  register 2 (WR2).
  291.     LD    A,00H                 ;Load a with LSB of interupt address
  292.     OUT   (STATUS),A            ;set the least significant byte zero
  293.     LD    I,0A0H                ;Load MSB with A  for address A000H.
  294. ~
  295. Interupt on All characters Ignore parity:
  296.     IM    2                     ;Enable interupt  with external LSB
  297.     LD    A,01H                 ;Load a with  one for  register sel.
  298.     OUT   (STATUS),A            :And  select write  register 1 (WR1)
  299.     LD    A,18H                 ;Load  a  with  00011000  for  first
  300.     OUT   (STATUS),A            ;And select  interupt on first  byte
  301.     LD    A,02H                 ;Load a with  two for  register sel.
  302.     OUT   (STATUS),A            ;And select write  register 2 (WR2).
  303.     LD    A,00H                 ;Load a with LSB of interupt address
  304.     OUT   (STATUS),A            ;set the least significant byte zero
  305.     LD    I,0A0H                ;Load MSB with A  for address A000H.
  306.