home *** CD-ROM | disk | FTP | other *** search
/ Esprit de Apple Corps / EDAC-2.iso / Graphics / Bulla.Disk / TN.IIGS.018 < prev    next >
Text File  |  1990-08-23  |  25KB  |  545 lines

  1. Apple II
  2. Technical Notes
  3. _____________________________________________________________________________
  4.                                                   Developer Technical Support
  5.  
  6. Apple IIgs
  7. #18:    Do-It-Yourself SCC Access
  8.  
  9. Revised by:  Jim Luther                                             July 1990
  10. Written by:  Jim Luther, Mike Askins, Matt Deatherage & Jim Mensch  June 1987
  11.  
  12. This Technical Note describes how to install and remove a interrupt handler 
  13. routine for the Z8530 Serial Communications Controller (SCC) on the Apple IIgs 
  14. without breaking other parts of the system.  This Note includes many 
  15. suggestions that, if unheeded, could come back to haunt you in the form of bug 
  16. fixes to your program.
  17. Changes since March 1990:  Added a method for finding which serial port 
  18. AppleTalk is using under GS/OS.
  19. _____________________________________________________________________________
  20.  
  21. Free Serial Routines Inside
  22.  
  23. The Z8530 SCC has 2 serial channels, supports several synchronous and 
  24. asynchronous data communications protocols, and has 9 read registers and 16 
  25. write registers per channel.  (Compare this to the 5 registers of the 6551 
  26. Asynchronous Communications Interface Adapter.)  To program the SCC correctly, 
  27. you must understand five things:  the SCC, the Apple IIgs hardware environment 
  28. in which the SCC lives, the Apple IIgs interrupt handler firmware, the 
  29. interrupt support provided by the operating system, and the data communication 
  30. protocol you want to use.  If you don't understand all of these components, 
  31. stick to the serial firmware.
  32.  
  33. The Apple IIgs serial firmware is a robust environment for almost every 
  34. asynchronous serial programming application.  If you want to handle all SCC 
  35. operations and SCC interrupts on the IIgs without using the serial firmware, 
  36. then you must really know the firmware won't do the job for you or you 
  37. wouldn't be going to a lot of trouble to recreate the services the firmware 
  38. routines already provide.
  39.  
  40.  
  41. Don't Eat Your Serial with Your Mouth Open
  42.  
  43. Your mother has rules and so does Apple.  On many systems, your application 
  44. may be sharing the SCC chip with System Software such as AppleTalk or the 
  45. serial firmware.  If you want to access the SCC chip directly without breaking 
  46. the system (or the system breaking you), then follow these simple rules.
  47.  
  48. Rule #1:  Before using a serial port, make sure AppleTalk is not already 
  49. using it.
  50.  
  51. If AppleTalk is active, it uses one of the serial ports.  The user selects 
  52. which serial port AppleTalk uses with the Control Panel.  Before using one of 
  53. the serial ports, you should always check to make sure AppleTalk is not using 
  54. that port.  If AppleTalk is using the serial port your application wants to 
  55. use, tough luck; tell the user about it, but don't even think about using that 
  56. port.
  57.  
  58. Under ProDOS 8, use the method shown in the following sample code to determine 
  59. if AppleTalk is using a serial port:
  60.  
  61. ;
  62. ; This routine checks to see which serial port, if any, AppleTalk is using.
  63. ; The routine sets a flag byte, ApTalkPort, and the accumulator to indicate
  64. ; which port (if any) AppleTalk is using.
  65. ;    $00 = AppleTalk is not using a serial port
  66. ;    $01 = AppleTalk is using serial port 1 (printer port)
  67. ;    $02 = AppleTalk is using serial port 2 (modem port)
  68. ; Note:  This method should be used under ProDOS 8 only.  Under GS/OS, use the
  69. ;        .AppleTalk driver's GetPort DStatus subcall.
  70. ;
  71. ; Enter routine in emulation mode
  72. ;
  73.                     longa off
  74.                     longi off
  75.                     mcopy 2/AInclude/M16.MiscTool
  76.  
  77. WhichPort           start
  78.  
  79. IDROUTINE           equ $FE1F           returns system ID information
  80.  
  81.                     stz ApTalkPort      default to not AppleTalk
  82.  
  83.                     jsr IDROUTINE       call to the system ID routine
  84.                     cpy #$03
  85.                     bcs NewIIGS
  86.  
  87. OldIIGS             anop                this is a pre-ROM 03 IIGS
  88.                     clc                 to native mode
  89.                     xce
  90.                     rep #$30            16 bit m and x
  91.                     longa on
  92.                     longi on
  93.                     
  94.                     pea $0000           space for result
  95.                     pea $0021           Slot 1 setting
  96.                     _ReadBParam         read battery RAM parameter
  97. ;                                         (2 byte result left on stack)
  98.  
  99.                     pea $0000           space for result
  100.                     pea $0027           Slot 7 setting
  101.                     _ReadBParam         read battery RAM parameter
  102.                     pla                 get slot 7 setting (2 bytes)
  103.  
  104.                     sec                 emulation mode
  105.                     xce
  106.                     longa off
  107.                     longi off
  108.  
  109.                     beq FindYourCard    AppleTalk is active
  110.                     pla                 remove slot 1 setting LSB (1 byte)
  111.                     bra OldExit
  112.  
  113. FindYourCard        inc ApTalkPort      default to port 1
  114.                     pla                 is slot 1 "your card"? (1 byte)
  115.                     beq ItsPort2        no, must be port 2
  116.                     bra OldExit
  117.  
  118. ItsPort2            inc ApTalkPort      port 2 is AppleTalk
  119.  
  120. OldExit             pla                 remove slot 1 setting MSB (1 byte)
  121.                     lda ApTalkPort
  122.                     rts                 return to caller
  123.  
  124. NewIIGS             anop                ROM 03 or greater IIGS
  125.                     clc                 to native mode
  126.                     xce
  127.                     rep #$30            16 bit m and x
  128.                     longa on
  129.                     longi on
  130.  
  131.                     pea $0000           space for result
  132.                     pea $000C           port 2 type
  133.                     _ReadBParam         read battery RAM parameter
  134. ;                                         (2 byte result left on stack)
  135.  
  136.                     pea $0000           space for result
  137.                     pea $0000           port 1 type
  138.                     _ReadBParam         read battery RAM parameter
  139.                     pla                 get port 1 setting (2 bytes)
  140.  
  141.                     sec                 emulation mode
  142.                     xce
  143.                     longa off
  144.                     longi off
  145.  
  146.                     cmp #$02            is port 1 AppleTalk?
  147.                     bne TryPort2        no
  148.                     inc ApTalkPort      yes
  149.                     pla               then remove port 2 setting LSB (1 byte)
  150.                     bra NewExit           and exit
  151.  
  152. TryPort2            pla                 get port 2 setting LSB (1 byte)
  153.                     cmp #$02            is port 2 AppleTalk?
  154.                     bne NewExit         no
  155.                     lda #$02            yes
  156.                     sta ApTalkPort
  157.  
  158. NewExit             pla                 remove port 2 setting MSB (1 byte)
  159.                     lda ApTalkPort
  160.                     rts                 return to caller
  161.  
  162. ApTalkPort          entry
  163.                     ds  1               will be 0, 1, or 2
  164.                     end
  165.  
  166. Under GS/OS, use the method shown in the following sample code to determine if 
  167. AppleTalk is using a serial port:
  168.  
  169. ;
  170. ; This routine checks to see which serial port, if any, AppleTalk is using.
  171. ; The routine sets a flag byte, ApTalkPort, and the accumulator to indicate
  172. ; which port (if any) AppleTalk is using.
  173. ;    $0000 = AppleTalk is not using a serial port
  174. ;    $0001 = AppleTalk is using serial port 1 (printer port)
  175. ;    $0002 = AppleTalk is using serial port 2 (modem port)
  176. ; Note:  This method should be used under GS/OS only.
  177. ;
  178. ; Enter routine in native 16 bit mode
  179. ;
  180.                     longa on
  181.                     longi on
  182.                     mcopy 2/AInclude/M16.GSOS
  183.  
  184. CheckPort           Start
  185.  
  186. GetPort             equ $8001           The .AppleTalk DStatus subcall to get
  187. ;                                       the port number AppleTalk is currently
  188. ;                                       using.
  189.  
  190.                     phb                 save data bank
  191.                     phk                 data bank = code bank
  192.                     plb
  193.  
  194.                     lda #$0001          start with device #1
  195.                     sta DIdevNum
  196.  
  197. FindATDriver        anop
  198.                     _DInfoGS DInfoParms ;call Dinfo
  199.                     bcs DIError         stop searching if error
  200.                     lda DIdeviceIDNum
  201.                     cmp #$001D          is it the AppleTalk main driver?
  202.                     beq ATDriverFound   yes
  203.                     inc DIdevNum        check the
  204.                     bra FindATDriver    next device number
  205.  
  206. ATDriverFound       anop
  207.                     lda DIdevNum        store device number
  208.                     sta DSdevNum        in the DStatus parm list
  209.                     _DStatusGS DStatusParms ;call DStatus
  210.                     lda portNum         get the port number
  211.                     sta ApTalkPort
  212.                     bra Exit
  213.  
  214. DIError             anop
  215. ;                   cmp #$0011          invalid device number, so the
  216. ;                   beq NotFound        AppleTalk main driver wasn't found
  217. ;
  218. ; Add your code to handle any other errors from DInfo here, because the
  219. ; end of the device list was not found.
  220.  
  221. NotFound            stz ApTalkPort      neither port is in use
  222.                     bra Exit
  223.  
  224. Exit                anop
  225.                     lda ApTalkPort
  226.                     plb                 restore data bank
  227.                     rtl                 return to caller
  228.  
  229. ApTalkPort          entry
  230.                     ds 2                will be 0, 1, or 2
  231.  
  232. DInfoParms          anop
  233.                     dc i2'8'            pCount = 8 parameters
  234. DIdevNum            dc i2'1'            devNum
  235.                     dc a4'NameBuffer'   devName
  236.                     ds 2                characteristics
  237.                     ds 4                totalBlocks
  238.                     ds 2                slotNum
  239.                     ds 2                unitNum
  240.                     ds 2                version
  241. DIdeviceIDNum       ds 2                deviceIDNum
  242.  
  243. NameBuffer          anop
  244.                     dc i2'31'           Class 1 input string. Max Length=31
  245.                     ds 33
  246.  
  247. DStatusParms        anop
  248.                     dc i2'5'            pCount = 5 parameters
  249. DSdevNum            ds 2                devNum
  250.                     dc i2'GetPort'      statusCode = GetPort
  251.                     dc a4'GetPortSList' statusList = GetPortSList
  252.                     dc i4'2'            requestCount = 2
  253.                     ds 4                transferCount
  254.  
  255. GetPortSList        anop                the GetPort subcall's statusList
  256. portNum             ds 2     $0001 = AppleTalk is using port 1 (printer port)
  257. ;                            $0002 = AppleTalk is using port 2 
  258. (modem port)
  259.                     dc i2'0'
  260.  
  261.                     end
  262.  
  263. Rule #2:    Don't use the SCC Interrupt Handler Vector.
  264.  
  265. Contrary to what you may have read in a previous version of this Note, you 
  266. cannot reliably attach your SCC interrupt handler to the SCC Interrupt Handler 
  267. Vector (vector reference number $0009).  The Apple IIgs serial firmware owns 
  268. the SCC Interrupt Handler Vector (or at least it thinks it does).  Anytime the 
  269. serial firmware is used, there is a chance that the serial firmware can grab 
  270. the SCC Interrupt Handler Vector for its use.  CDAs and NDAs that print, the 
  271. Print Manager tool set, the Text tool set, and the generated GS/OS character 
  272. drivers associated with the serial ports are examples of code that can and do 
  273. use the serial firmware.
  274.  
  275. The only safe place to connect into the interrupt chain is through the 
  276. operating system.  The ProDOS 8 and GS/OS ProDOS 16 call, ALLOC_INTERRUPT is 
  277. the correct place to attach your interrupt handler.  The GS/OS BindInt call 
  278. cannot be used to attach your interrupt handler to the SCC Interrupt Handler 
  279. Vector (VRN $0009) for the same reason that you cannot use the SCC Interrupt 
  280. Handler Vector directly.
  281.  
  282. Rule #3:    Be very, very careful with SCC Write Register 9 (WR9).
  283.  
  284. The Z8530 SCC has four registers which are shared by both channels (ports).  
  285. Of those four, only two are commonly used in the Apple IIgs, RR3 and WR9.  
  286. RR3, which only exists in channel A, lets you check the interrupt pending bits 
  287. for both SCC channels.  WR9 is the Master Interrupt Control register for both 
  288. SCC channels and contains the Reset command bits.
  289.  
  290. You must never reset the channel AppleTalk is using (resetting the channel 
  291. AppleTalk is using kills AppleTalk).  This means you should never perform a 
  292. Force Hardware Reset command (11xxxxxx to WR9) even though the Z8530 Serial 
  293. Communications Controller Technical Manual tells you to in the SCC 
  294. initialization procedure.  A hardware reset is performed at system startup, so 
  295. you shouldn't need to perform a channel reset, even to the channel you are 
  296. using.
  297.  
  298. The interrupt control bits (bits D5 - D0) in WR9 should not be modified (an 
  299. exception is when you are installing your own SCC interrupt handler).  
  300. AppleTalk expects the interrupt control bits to always be 001010.  If you find 
  301. the need to perform a channel reset on your channel, remember that the 
  302. interrupt control bits are programmed at the same time as a channel reset.
  303.  
  304.  
  305. Hints for the Serial Adventure
  306.  
  307. Next are a few hints for those who would like to explore the world of knocking 
  308. on the registers of the Z8530 SCC.
  309.  
  310. Hint #1:    Synchronize your code with the SCC logic.
  311.  
  312. Before writing to the SCC chip for the first time, you should make an attempt 
  313. to ensure your code is synchronized with the SCC's logic.  This needs to be 
  314. done only once when you are initializing the SCC.  This can be accomplished 
  315. with a single read of SCC Read Register 0 (RR0).  For example, if you're using 
  316. serial port 2 (the modem port), the following code reads RR0 of SCC channel B:
  317.  
  318.                     longa off           must be using 8-bit accumulator
  319.                     lda $C038           read RR0 of SCC Channel B
  320.  
  321. Hint #2:    Watch out for interrupts from the other SCC channel.
  322.  
  323. Except for RR0, WR0, and the two SCC data registers, all SCC registers are 
  324. accessed in a two-step process.  First, the register number you want to select 
  325. is written to WR0.  After the register number is set, the next read from or 
  326. write to the command register accesses the register selected in the first 
  327. step.  Because several of the SCC registers are shared between the two SCC 
  328. channels and because code accessing them may not always be yours (i.e., 
  329. AppleTalk), interrupts should be disabled during the two steps.  The following 
  330. code shows two quick subroutines to access the SCC's Read and Write registers 
  331. while preventing interrupts between the register number set and the register 
  332. read or write steps:
  333.  
  334.                     longa off           must be using 8-bit accumulator
  335.                     longi off             and index registers
  336. ;
  337. ; Write to a SCC command register - channel A or B.
  338. ; Input:  A = value to store
  339. ;         X = SCC register number ($0-$F)
  340. ;         Y = $01  channel A
  341. ;             $00  channel B
  342. ;
  343. WriteSCC            php                 save the current interrupt status
  344.                     sei                 disable interrupts
  345.                     pha                 save value to write
  346.                     txa                 get SCC register number from X
  347.                     sta $C038,y         set the register number
  348.                     pla                 restore value to write
  349.                     sta $C038,y         write the value
  350.                     plp                 restore the interrupt status
  351.                     rts
  352.  
  353. ;
  354. ; Read from a SCC command register - channel A or B.
  355. ; Input:  A = SCC register number ($0-$F)
  356. ;         Y = $01  channel A
  357. ;             $00  channel B
  358. ; Output: A = register value
  359. ;
  360. ReadSCC             php                 save the current interrupt status
  361.                     sei                 disable interrupts
  362.                     sta $C038,y         set the SCC register number
  363.                     lda $C038,y         get the value from the SCC register
  364.                     xba                 look ahead 2 lines...
  365.                     plp                 restore the interrupt status
  366.                     xba                 set N and Z flags for exit
  367.                     rts
  368.  
  369. Just to be complete, here's how RR0, WR0, the receive buffer, and the transmit 
  370. buffer SCC registers are accessed on the Apple IIgs:
  371.  
  372.                     longa off           must be using 8-bit accumulator
  373.                     longi off             and index registers
  374. ;
  375. ; Read RR0 - channel A or B
  376. ; Input:  Y = $01  channel A
  377. ;             $00  channel B
  378. ; Output: A = RR0 register value
  379. ;
  380. ReadRR0             lda $C038,y         get the value from RR0
  381.                     rts
  382. ;
  383. ; Write WR0 - channel A or B
  384. ; Input:  A = value to store at WR0
  385. ;         Y = $01  channel A
  386. ;             $00  channel B
  387. ;
  388. WriteWR0            sta $C038,y         write the value to WR0
  389.                     rts
  390. ;
  391. ; Read from SCC receive buffer - channel A or B
  392. ; Input:  Y = $01  channel A
  393. ;             $00  channel B
  394. ; Output: A = value of data received
  395. ;
  396. ReadData            lda $C03A,y         get the value from SCC data register
  397.                     rts
  398. ;
  399. ; Write to SCC transmit buffer - channel A or B
  400. ; Input:  A = value of data to transmit
  401. ;         Y = $01  channel A
  402. ;             $00  channel B
  403. ;
  404. WriteData           sta $C03A,y         write the value to SCC data register
  405.                     rts
  406.  
  407. Hint #3:    All SCC channels are not created equal.
  408.  
  409. In the IIgs, the SCC's receive and transmit clocks for both channels are 
  410. driven by a single crystal oscillator circuit.  This is accomplished by 
  411. connecting a 3.6864 MHz crystal between the /RTxC and /SYNC pins of channel A.  
  412. Channel B's /RTxC pin is connected to Channel A's /SYNC pin to drive 
  413. channel B's clocks from channel A's oscillator circuit.
  414.  
  415. Because of this single circuit, Write Register 11 (WR11) bit 7 must be set to 
  416. 1 for SCC channel A and must be set to 0 for SCC channel B.
  417.  
  418. Hint #4:    RR3 is available only in SCC channel A.
  419.  
  420. When your interrupt handler is checking to see if the interrupt condition was 
  421. caused by your SCC channel, remember to always look at RR3 in SCC channel A.  
  422. RR3 in channel A contains the interrupt pending bits for both SCC channels.  
  423. RR3 in channel B always returns all zeros, which doesn't tell you a lot about 
  424. what's happening.
  425.  
  426.  
  427. Don't be a Serial Killer
  428.  
  429. How to Install and Remove your SCC Interrupt Handler
  430.  
  431. If you're going to handle serial I/O and don't want your application to have 
  432. to poll the SCC chip all the time to see if something has happened, you 
  433. probably want to install an interrupt handling routine that is called every 
  434. time a SCC chip condition you want to know about occurs.  This section of the 
  435. Note shows how to install and remove your own SCC interrupt handler.
  436.  
  437. The steps for installing your SCC interrupt handler are:
  438.  
  439.   1.  Ensure the serial firmware's Input and Output buffering is 
  440.       disabled.  The state of I/O buffering can be checked by looking at 
  441.       bit 14 of the ModeBitImage parameter returned by the GetModeBits 
  442.       extended interface call.  I/O buffering can be disabled with the 
  443.       firmware's BD control command.
  444.   2.  Disable the SCC Master Interrupt Enable (WR9, bit 3) briefly while 
  445.       performing the next six steps.  The value you should write to WR9 
  446.       is 00000010.
  447.   3.  Get the address of the system interrupt flag byte, SerFlag.  The 
  448.       ROM version determines the method of finding the address of 
  449.       SerFlag.  In ROM version 01 and later, you can get the address 
  450.       with a call to the Miscellaneous Tools GetAddr using a reference 
  451.       number of $000E.  With ROM version 00 (the original IIgs ROM), the 
  452.       address of SerFlag is $E10104.  Refer to the Apple II 
  453.       Miscellaneous Technical Note #7, Apple II Family Identification 
  454.       for information on identifying Apple IIgs ROM versions.
  455.   4.  Once you have the correct address of SerFlag, preserve the byte's 
  456.       current value, then turn on the bits in the byte which reflect the 
  457.       port from which you are handling interrupts.  The bits for the 
  458.       different ports are as follows (note the relationship of the bits 
  459.       of RR3 to SerFlag):
  460.  
  461.           Port 1:    ORA    #%00111000
  462.           Port 2:    ORA    #%00000111
  463.  
  464.  
  465.   5.  Initialize the SCC modes.  The Z8530 Serial Communications 
  466.       Controller Technical Manual  shows the order the SCC registers 
  467.       must be programmed.  However, you must stray from the manual 
  468.       slightly due to the hardware implementation of the SCC in the 
  469.       IIgs.  A typical initialization sequence to set the SCC up for 
  470.       asynchronous serial communications through channel B (the modem 
  471.       port) would look similar to the following:
  472.  
  473.       SCC Register  Value     Comment
  474.       RR0           -         ensure synchronization with SCC
  475.       WR4           01000100  x16 clock, 1 stop, no parity
  476.       WR3           11000000  8 bit receive data, auto enables off, 
  477.                               receiver disabled
  478.       WR5           01100010  DTR is active, 8 bit transmit data, no break, 
  479.                               transmit disabled, RTS is inactive
  480.       WR11          01010000  no Xtal on channel B, receive and 
  481.                               transmit clock = baud rate generator output
  482.       WR12          01011110  low byte of baud rate generator
  483.                               time constant = $5E - 1200 baud
  484.       WR13          00000000  high byte of baud rate generator 
  485.                               time constant = $00 - 1200 baud
  486.       WR14          00000000  no local loopback or auto echo, /DTR follows 
  487.                               inverted DTR bit in WR5, use /RTxC for 
  488.                               baud rate generator clock, 
  489.                               disable baud rate generator
  490.       WR14          00000001  enable the baud rate generator
  491.       WR3           11000001  receiver enabled
  492.       WR5           01101010  transmit enabled
  493.       WR15          00000000  no interrupts on this channel for now...
  494.  
  495.   6.  Tell the SCC which external and status conditions can cause an 
  496.       interrupt by setting the appropriate bits in WR15.  This step is 
  497.       not needed unless you are setting bit 0 of WR1 (External/Status 
  498.       Master Interrupt Enable) in the next step.
  499.   7.  Enable the interrupts modes you want by setting the appropriate 
  500.       bits in WR1 (00010011 for all SCC interrupt conditions).
  501.   8.  Use ALLOC_INTERRUPT to add your interrupt handler to the operating 
  502.       system's interrupt vector table.  The interrupt identification 
  503.       number returned by ALLOC_INTERRUPT is needed when you remove your 
  504.       interrupt handler.
  505.   9.  Reenable the SCC Master Interrupt flag (WR9, bit 3).  The value 
  506.       you should write to WR9 is 00001010.
  507.  
  508. The interrupt handling routine must conform to the rules listed in the 
  509. ProDOS 8 Technical Reference Manual and GS/OS Reference, Volume 2.
  510.  
  511. When you get ready to shut down your application, you need to remove your 
  512. interrupt handler.  The steps for removing the SCC interrupt handler you 
  513. installed are as follows:
  514.  
  515.   1.  Disable the SCC Master Interrupt Enable (WR9, bit 3) briefly while 
  516.       performing the next six steps.  The value you should write to WR9 
  517.       is 00000010.
  518.   2.  Disable all interrupts modes for your port by writing a $00 to WR1.
  519.   3.  Remove any character that might be left in the receive data 
  520.       register by reading it once.
  521.   4.  Clear any pending transmit overrun and external and status 
  522.       interrupts by writing 11010000 to WR0.
  523.   5.  Clear any pending transmit interrupt by writing 00101000 to WR0.
  524.   6.  Use DEALLOC_INTERRUPT to remove your interrupt handler from the 
  525.       operating system's interrupt vector table.
  526.   7.  Restore SerFlag to its original value.
  527.   8.  Reenable the SCC Master Interrupt flag (WR9, bit 3).  The value 
  528.       you should write to WR9 is 00001010.
  529.  
  530.  
  531. Further Reference
  532. _____________________________________________________________________________
  533.   o  Apple IIgs Toolbox Reference Manual, Volume 1
  534.   o  Apple IIgs Firmware Reference Manual
  535.   o  Apple IIgs Hardware Reference Manual, Second Edition
  536.   o  GS/OS Reference, Volumes 1 and 2
  537.   o  ProDOS 8 Technical Reference Manual
  538.   o  Apple II Miscellaneous Technical Note #7, Apple II Family Identification
  539.   o  GS/OS Technical Note #9, Interrupt Handling Anomalies
  540.   o  Z8530 Serial Communications Controller Technical Manual  
  541.      (Zilog Corporation)
  542.   o  Z85C30 Serial Communications Controller Technical Manual 
  543.      (Advanced Micro Devices, Inc.)
  544.  
  545.