mirror of
				https://github.com/dekuNukem/USB4VC.git
				synced 2025-10-31 11:26:46 -07:00 
			
		
		
		
	
		
			
				
	
	
		
			1732 lines
		
	
	
		
			82 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			1732 lines
		
	
	
		
			82 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!-- $Id$ -->
 | ||
| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 | ||
| <html><head>
 | ||
| 	<title>Linux/m68k for Macintosh - Mac Plus hardware</title>
 | ||
| 	<link href="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/mac68k.css" type="text/css" rel="stylesheet" media="">
 | ||
| 	<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
 | ||
| </head>
 | ||
| <body class="gray">
 | ||
| 
 | ||
| <table class="fullheight" width="100%" cellspacing="0" cellpadding="0" border="0">
 | ||
| 	<tbody><tr valign="top">
 | ||
| 		<td valign="top">
 | ||
| 			<table class="nomargin" cellspacing="0" cellpadding="10" border="0">
 | ||
| 				<tbody><tr class="leftbartop" valign="top"><td><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/macpenguin.gif" alt="MacPenguin"></td></tr>
 | ||
| 				<tr><td>
 | ||
| 					<table class="nomargin" cellspacing="0" cellpadding="0" border="0">
 | ||
| 				<tbody><tr class="menu"><td class="menu"><a href="http://www.mac.linux-m68k.org/">home</a></td></tr>
 | ||
| 				<tr class="menu"><td class="menu"><a href="http://www.mac.linux-m68k.org/docs/">documentation</a></td></tr>
 | ||
| 				<tr class="menu"><td class="menu"><a href="http://www.mac.linux-m68k.org/download/">downloads</a></td></tr>
 | ||
| 				<tr class="menu"><td class="menu"><a href="http://www.mac.linux-m68k.org/status/">status</a></td></tr>
 | ||
| 				<tr class="menu"><td class="menu"><a class="active" href="http://www.mac.linux-m68k.org/devel/">development</a></td></tr>
 | ||
| 				<tr><td class="submenu" nowrap="nowrap"><font size="-1">  <a href="http://www.mac.linux-m68k.org/devel/macspecs.php">specifications</a></font></td></tr>
 | ||
| 				<tr><td class="submenu" nowrap="nowrap"><font size="-1">  <a href="http://www.mac.linux-m68k.org/devel/macalmanac.php">Mac Almanac II</a></font></td></tr>
 | ||
| 				<tr><td class="submenu" nowrap="nowrap"><font size="-1">  <a href="http://www.mac.linux-m68k.org/devel/iwm.php">IWM information</a></font></td></tr>
 | ||
| 				<tr><td class="submenu" nowrap="nowrap"><font size="-1">  <a href="http://www.mac.linux-m68k.org/devel/plushw.php">Mac Plus information</a></font></td></tr>
 | ||
| 				<tr class="menu"><td class="menu"><a href="http://www.mac.linux-m68k.org/resources/">resources</a></td></tr>
 | ||
| <!-- $Id$ -->
 | ||
| 					</tbody></table>
 | ||
| 				</td></tr>
 | ||
| 			</tbody></table>
 | ||
| 		</td>
 | ||
| 		<td class="gray" width="100%" valign="top" height="100%">
 | ||
| 			<table class="fullheight" width="100%" cellspacing="0" cellpadding="0" border="0">
 | ||
| 				<tbody><tr class="gray">
 | ||
| 					<td> </td>
 | ||
| 					<td><b>::development::Mac Plus technical information</b></td>
 | ||
| 					<td> </td>
 | ||
| 				</tr>
 | ||
| 				<tr class="white">
 | ||
| 					<td><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/curve_lefttop.gif" alt=""></td>
 | ||
| 					<td class="bordertop"></td>
 | ||
| 					<td><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/curve_righttop.gif" alt=""></td>
 | ||
| 				</tr>
 | ||
| 				<tr class="white">
 | ||
| 					<td class="borderleft"></td>
 | ||
| 					<td width="100%" valign="top" height="100%">
 | ||
| 
 | ||
| <pre>+ KY Overview of the Hardware
 | ||
| + C  OVERVIEW OF THE HARDWARE                                MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Macintosh and Macintosh Plus computers contain a Motorola MC68000
 | ||
| microprocessor clocked at 7.8336 megahertz, random access memory (RAM),
 | ||
| read-only memory (ROM), and several chips that enable them to communicate
 | ||
| with external devices. There are five I/O devices:  the video display; the
 | ||
| sound generator; a Synertek SY6522 Versatile Interface Adapter (VIA) for the
 | ||
| mouse and keyboard; a Zilog Z8530 Serial Communications Controller (SCC) for
 | ||
| serial communication; and an Apple custom chip, called the IWM ("Integrated
 | ||
| Woz Machine") for disk control. 
 | ||
| 
 | ||
| In addition to the five I/O devices found in the Macintosh 128K, 512K, and
 | ||
| 512K enhanced (the video display, sound generator, VIA, SCC and IWM), the
 | ||
| Macintosh Plus contains a NCR 5380 Small Computer Standard Interface (SCSI)
 | ||
| chip for high-speed parallel communication with devices such as hard disks. 
 | ||
| 
 | ||
| Features of the Macintosh 512K enhanced (not found in the Macintosh 128K and
 | ||
| 512K)  are: 
 | ||
| 
 | ||
|   *  800K internal disk drive
 | ||
|   *  128K ROM
 | ||
| 
 | ||
| Features of the Macintosh Plus are:
 | ||
| 
 | ||
|   *  800K internal disk drive
 | ||
|   *  128K ROM
 | ||
|   *  SCSI high-speed peripheral port
 | ||
|   *  1Mb RAM, expandable to 2Mb, 2.5Mb, or 4Mb.
 | ||
|   *  2 Mini-8 connectors for serial ports, replacing the 2 DB-9 connectors
 | ||
|      found on the Macintosh 128K, 512K, and 512K enhanced.
 | ||
|   *  keyboard with built-in cursor keys and numeric keypad
 | ||
| 
 | ||
| The Macintosh uses memory-mapped I/O, which means that each device in the
 | ||
| system is accessed by reading or writing to specific locations in the
 | ||
| address space of the computer. Each device contains logic that recognizes
 | ||
| when it's being accessed and responds in the appropriate manner. 
 | ||
| 
 | ||
| The MC68000 can directly access 16 megabytes (Mb) of address space. In the
 | ||
| Macintosh, this is divided into four equal sections. The first four Mb are
 | ||
| for RAM, the second four Mb are for ROM, the third are for the SCC, and the
 | ||
| last four are for the IWM and the VIA. Since each of the devices within the
 | ||
| blocks has far fewer than four Mb of individually addressable locations or
 | ||
| registers, the addresses within each block "wrap around" and are repeated
 | ||
| several times within the block. 
 | ||
| 
 | ||
| In the Macintosh Plus, the 16 Mb of addressable space is also divided into
 | ||
| four equal sections. The first four megabytes are for RAM, the second four
 | ||
| megabytes are for ROM and SCSI, the third are for the SCC, and the last four
 | ||
| are for the IWM and the VIA.  Since the devices within each block may have
 | ||
| far fewer than four megabytes of individually addressable locations or
 | ||
| registers, the addressing for a device may "wrap around" (a particular
 | ||
| register appears at several different addresses) within its block. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  RAM
 | ||
| 
 | ||
| RAM is the "working memory" of the system. Its base address is address 0.
 | ||
| The first 256 bytes of RAM (addresses 0 through $FF) are used by the MC68000
 | ||
| as exception vectors; these are the addresses of the routines that gain
 | ||
| control whenever an exception such as an interrupt or a trap occurs. (The
 | ||
| summary at the end of this chapter includes a list of all the exception
 | ||
| vectors.) RAM also contains the system and application heaps, the stack, and
 | ||
| other information used by applications. In addition, the following hardware
 | ||
| devices share the use of RAM with the MC68000: 
 | ||
| 
 | ||
|   *  the video display, which reads the information for the display from
 | ||
|      one of two screen buffers
 | ||
|   *  the sound generator, which reads its information from one of two
 | ||
|      sound buffers
 | ||
|   *  the disk speed controller, which shares its data space with the
 | ||
|      sound buffers
 | ||
| 
 | ||
| The MC68000 accesses to RAM are interleaved (alternated) with the video
 | ||
| display's accesses during the active portion of a screen scan line (video
 | ||
| scanning is described in the next section). The sound generator and disk
 | ||
| speed controller are given the first access after each scan line. At all
 | ||
| other times, the MC68000 has uninterrupted access to RAM, increasing the
 | ||
| average RAM access rate to about 6 megahertz (MHz). 
 | ||
| 
 | ||
| The Macintosh Plus RAM is provided in four packages known as Single In-line
 | ||
| Memory Modules (SIMMs). Each SIMM contains eight surface-mounted Dynamic RAM
 | ||
| (DRAM) chips on a small printed circuit board with electrical "finger"
 | ||
| contacts along one edge. Various RAM configurations are possible depending
 | ||
| on whether two or four SIMMs are used and on the density of the DRAM chips
 | ||
| that are plugged into the SIMMs: 
 | ||
| 
 | ||
|   *  If the SIMMs contain 256K-bit DRAM chips, two SIMMs will provide 512K
 | ||
|      bytes of RAM, or four SIMMs will provide 1Mb of RAM (this is the standard
 | ||
|      configuration).
 | ||
|   *  If the SIMMs contain 1M-bit DRAM chips, two SIMMs will provide 2Mb of
 | ||
|      RAM, or four SIMMs will provide 4Mb of RAM.
 | ||
|   *  If two of the SIMMs contain 1M-bit DRAM chips, and two of the SIMMs
 | ||
|      contain 256K-bit DRAM chips, then these four SIMMs will provide 2.5Mb
 | ||
|      of RAM. For this configuration, the 1M-bit SIMMs must be placed in the
 | ||
|      sockets closest to the 68000 CPU.
 | ||
| 
 | ||
| Warning:  Other configurations, such as a single SIMM or a pair of SIMMs
 | ||
|           containing DRAMs of different density, are not allowed. If only
 | ||
|           two SIMMs are installed, they must be placed in the sockets closest
 | ||
|           to the MC68000.
 | ||
| 
 | ||
| The SIMMs can be changed by simply releasing one and snapping in another.
 | ||
| However, there are also two resistors on the Macintosh Plus logic board (in
 | ||
| the area labelled "RAM SIZE") which tell the electronics how much RAM is
 | ||
| installed. If two SIMMs are plugged in, resistor R9 (labeled "ONE ROW") must
 | ||
| be installed; if four SIMMs are plugged in, this resistor must be removed.
 | ||
| Resistor R8 (labelled "256K BIT") must be installed if all of the SIMMs
 | ||
| contain 256K-bit DRAM chips. If either two or four of the SIMMs contain
 | ||
| 1M-bit chips, resistor R8 must be removed. 
 | ||
| 
 | ||
| Each time you turn on the Macintosh Plus, system software does a memory test
 | ||
| and determines how much RAM is present in the machine. This information is
 | ||
| stored in the global variable MemTop, which contains the address (plus one)
 | ||
| of the last byte in RAM. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  ROM
 | ||
| 
 | ||
| ROM is the system's permanent read-only memory. Its base address, $400000,
 | ||
| is available as the constant romStart and is also stored in the global
 | ||
| variable ROMBase. ROM contains the routines for the Toolbox and Operating
 | ||
| System, and the various system traps. Since the ROM is used exclusively by
 | ||
| the MC68000, it's always accessed at the full processor rate of 7.83 MHz. 
 | ||
| 
 | ||
| The address space reserved for the device I/O contains blocks devoted to
 | ||
| each of the devices within the computer. This region begins at address
 | ||
| $800000 and continues to the highest address at $FFFFFF. 
 | ||
| 
 | ||
| Note:  Since the VIA is involved in some way in almost every operation of the
 | ||
|        Macintosh, the following sections frequently refer to the VIA and
 | ||
|        VIA-related constants. The VIA itself is described later, and all the
 | ||
|        constants are listed in the summary at the end of this chapter.
 | ||
| 
 | ||
| The Macintosh Plus contains two 512K-bit (64K x 8) ROM chips, providing 128K
 | ||
| bytes of ROM. This is the largest size of ROM that can be installed in a
 | ||
| Macintosh 128K, 512K, or 512K enhanced. The Macintosh Plus ROM sockets,
 | ||
| however, can accept ROM chips of up to 1M-bit (128K x 8) in size. A
 | ||
| configuration of two 1M-bit ROM chips would provide 256K bytes of ROM. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The Video Interface
 | ||
| + C  THE VIDEO INTERFACE                                     MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The video display is created by a moving electron beam that scans across the
 | ||
| screen, turning on and off as it scans in order to create black and white
 | ||
| pixels. Each pixel is a square, approximately 1/74 inch on a side. 
 | ||
| 
 | ||
| To create a screen image, the electron beam starts at the top left corner of
 | ||
| the screen (see Figure 1). The beam scans horizontally across the screen
 | ||
| from left to right, creating the top line of graphics. When it reaches the
 | ||
| last pixel on the right end of the top line it turns off, and continues past
 | ||
| the last pixel to the physical right edge of the screen. Then it flicks
 | ||
| invisibly back to the left edge and moves down one scan line. After tracing
 | ||
| across the black border, it begins displaying the data in the second scan
 | ||
| line. The time between the display of the rightmost pixel on one line and
 | ||
| the leftmost pixel on the next is called the horizontal blanking interval. 
 | ||
| When the electron beam reaches the last pixel of the last (342nd) line on
 | ||
| the screen, it traces out to the right edge and then flicks up to the top
 | ||
| left corner, where it traces the left border and then begins once again to
 | ||
| display the top line. The time between the last pixel on the bottom line and
 | ||
| the first one on the top line is called the vertical blanking interval. At
 | ||
| the beginning of the vertical blanking interval, the VIA generates a
 | ||
| vertical blanking interrupt. 
 | ||
| 
 | ||
| The pixel clock rate (the frequency at which pixels are displayed) is
 | ||
| 15.6672 MHz, or about .064 microseconds (usec) per pixel. For each scan
 | ||
| line, 512 pixels are drawn on the screen, requiring 32.68 usec. The
 | ||
| horizontal blanking interval takes the time of an additional 192 pixels, or
 | ||
| 12.25 usec. Thus, each full scan line takes 44.93 usec, which means the
 | ||
| horizontal scan rate is 22.25 kilohertz. 
 | ||
| 
 | ||
| ***Refer to Figure 1.***
 | ||
| 
 | ||
| Figure 1-Video Scanning Pattern
 | ||
| 
 | ||
| A full screen display consists of 342 horizontal scan lines, occupying
 | ||
| 15367.65 usec, or about 15.37 milliseconds (msec). The vertical blanking
 | ||
| interval takes the time of an additional 28 scan lines-1258.17 usec, or
 | ||
| about 1.26 msec. This means the full screen is redisplayed once every
 | ||
| 16625.8 usec. That's about 16.6 msec per frame, which means the vertical
 | ||
| scan rate (the full screen display frequency) is 60.15 hertz. 
 | ||
| 
 | ||
| The video generator uses 21,888 bytes of RAM to compose a bit-mapped video
 | ||
| image 512 pixels wide by 342 pixels tall. Each bit in this range controls a
 | ||
| single pixel in the image:  A 0 bit is white, and a 1 bit is black. 
 | ||
| 
 | ||
| There are two screen buffers (areas of memory from which the video circuitry
 | ||
| can read information to create a screen display):  the main buffer and the
 | ||
| alternate buffer.  The starting addresses of the screen buffers depend on
 | ||
| how much memory you have in your Macintosh. In a Macintosh 128K, the main
 | ||
| screen buffer starts at $1A700 and the alternate buffer starts at $12700;
 | ||
| for a 512K Macintosh, add $60000 to these numbers. 
 | ||
| 
 | ||
| Warning:  To be sure you don't use the wrong area of memory and to maintain
 | ||
|           compatibility with future Macintosh systems, you should get the
 | ||
|           video base address and bit map dimensions from screenBits (see
 | ||
|           the QuickDraw chapter).
 | ||
| 
 | ||
| Each scan line of the screen displays the contents of 32 consecutive words
 | ||
| of memory, each word controlling 16 horizontally adjacent pixels. In each
 | ||
| word, the high-order bit (bit 15) controls the leftmost pixel and the
 | ||
| low-order bit (bit 0) controls the rightmost pixel. The first word in each
 | ||
| scan line follows the last word on the line above it. The starting address
 | ||
| of the screen is thus in the top left corner, and the addresses progress
 | ||
| from there to the right and down, to the last byte in the extreme bottom
 | ||
| right corner. 
 | ||
| 
 | ||
| Normally, the video display doesn't flicker when you read from or write to
 | ||
| it, because the video memory accesses are interleaved with the processor
 | ||
| accesses. But if you're creating an animated image by repeatedly drawing the
 | ||
| graphics in quick succession, it may appear to flicker if the electron beam
 | ||
| displays it when your program hasn't finished updating it, showing some of
 | ||
| the new image and some of the old in the same frame. 
 | ||
| 
 | ||
| One way to prevent flickering when you're updating the screen continuously
 | ||
| is to use the vertical and horizontal blanking signals to synchronize your
 | ||
| updates to the scanning of video memory. Small changes to your screen can be
 | ||
| completed entirely during the interval between frames (the first 1.26 msec
 | ||
| following a vertical blanking interrupt), when nothing is being displayed on
 | ||
| the screen. When making larger changes, the trick is to keep your changes
 | ||
| happening always ahead of the spot being displayed by the electron beam, as
 | ||
| it scans byte by byte through the video memory. Changes you make in the
 | ||
| memory already passed over by the scan spot won't appear until the next
 | ||
| frame. If you start changing your image when the vertical blanking interrupt
 | ||
| occurs, you have 1.26 msec of unrestricted access to the image. After that,
 | ||
| you can change progressively less and less of your image as it's scanned
 | ||
| onto the screen, starting from the top (the lowest video memory address).
 | ||
| From vertical blanking interrupt, you have only 1.26 msec in which to change
 | ||
| the first (lowest address) screen location, but you have almost 16.6 msec to
 | ||
| change the last (highest address) screen location. 
 | ||
| 
 | ||
| Another way to create smooth, flicker-free graphics, especially useful with
 | ||
| changes that may take more 16.6 msec, is to use the two screen buffers as
 | ||
| alternate displays.  If you draw into the one that's currently not being
 | ||
| displayed, and then switch the buffers during the next vertical blanking,
 | ||
| your graphics will change all at once, producing a clean animation. (See the
 | ||
| Vertical Retrace Manager chapter to find out how to specify tasks to be
 | ||
| performed during vertical blanking.) 
 | ||
| 
 | ||
| If you want to use the alternate screen buffer, you'll have to specify this
 | ||
| to the Segment Loader (see the Segment Loader chapter for details). To
 | ||
| switch to the alternate screen buffer, clear the following bit of VIA data
 | ||
| register A (vBase+vBufA): 
 | ||
| 
 | ||
|   vPage2    .EQU    6    ;0 = alternate screen buffer
 | ||
| 
 | ||
| For example:
 | ||
| 
 | ||
|   BCLR    #vPage2,vBase+vBufA
 | ||
| 
 | ||
| To switch back to the main buffer, set the same bit.
 | ||
| 
 | ||
| Warning:  Whenever you change a bit in a VIA data register, be sure to
 | ||
|           leave the other bits in the register unchanged.
 | ||
| 
 | ||
| Warning:  The alternate screen buffer may not be supported in future
 | ||
|           versions of the Macintosh.
 | ||
| 
 | ||
| The starting addresses of the Macintosh Plus screen buffers depend on the
 | ||
| amount of memory present in the machine. The following table shows the
 | ||
| starting address of the main and the alternate screen buffer for various
 | ||
| memory configurations of the Macintosh Plus: 
 | ||
| 
 | ||
|   System                   Main Screen    Alternate
 | ||
| 
 | ||
|   Macintosh Plus, 1Mb      $FA700         $F2700
 | ||
|   Macintosh Plus, 2Mb      $1FA700        $1F2700
 | ||
|   Macintosh Plus, 2.5Mb    $27A700        $272700
 | ||
|   Macintosh Plus, 4Mb      $3FA700        $3F2700
 | ||
| 
 | ||
| Warning:  To ensure that software will run on Macintoshes of different memory
 | ||
|           size, as well as on future Macintoshes, use the address stored in
 | ||
|           the global variable ScrnBase. Also, the alternate screen buffer may
 | ||
|           not be available in future versions of the Macintosh and may not be
 | ||
|           found in some software configurations of current Macintoshes.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The Sound Generator
 | ||
| + C  THE SOUND GENERATOR                                     MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Macintosh sound circuitry uses a series of values taken from an area of
 | ||
| RAM to create a changing waveform in the output signal. This signal drives a
 | ||
| small speaker inside the Macintosh and is connected to the external sound
 | ||
| jack on the back of the computer. If a plug is inserted into the external
 | ||
| sound jack, the internal speaker is disabled. The external sound line can
 | ||
| drive a load of 600 or more ohms, such as the input of almost any audio
 | ||
| amplifier, but not a directly connected external speaker. 
 | ||
| 
 | ||
| The sound generator may be turned on or off by writing 1 (off) or 0 (on) to
 | ||
| the following bit of VIA data register B (vBase+vBufB): 
 | ||
| 
 | ||
|   vSndEnb    .EQU    7    ;0 = sound enabled, 1 = disabled
 | ||
| 
 | ||
| For example:
 | ||
| 
 | ||
|   BSET    #vSndEnb,vBase+vBufB    ;turn off sound
 | ||
| 
 | ||
| By storing a range of values in the sound buffer, you can create the
 | ||
| corresponding waveform in the sound channel. The sound generator uses a form
 | ||
| of pulse-width encoding to create sounds. The sound circuitry reads one word
 | ||
| in the sound buffer during each horizontal blanking interval (including the
 | ||
| "virtual" intervals during vertical blanking) and uses the high-order byte
 | ||
| of the word to generate a pulse of electricity whose duration (width) is
 | ||
| proportional to the value in the byte. Another circuit converts this pulse
 | ||
| into a voltage that's attenuated (reduced) by a three-bit value from the
 | ||
| VIA. This reduction corresponds to the current setting of the volume level.
 | ||
| To set the volume directly, store a three-bit number in the low-order bits
 | ||
| of VIA data register A (vBase+vBufA). You can use the following constant to
 | ||
| isolate the bits involved: 
 | ||
| 
 | ||
|   vSound    .EQU    7    ;sound volume bits
 | ||
| 
 | ||
| Here's an example of how to set the sound level:
 | ||
| 
 | ||
|   MOVE.B    vBase+vBufA,D0    ;get current value of register A
 | ||
|   ANDI.B    #255-vSound,D0    ;clear the sound bits
 | ||
|   ORI.B     #3,D0             ;set medium sound level
 | ||
|   MOVE.B    D0,vBase+vBufA    ;put the data back
 | ||
| 
 | ||
| After attenuation, the sound signal is passed to the audio output line.  The
 | ||
| sound circuitry scans the sound buffer at a fixed rate of 370 words per
 | ||
| video frame, repeating the full cycle 60.15 times per second. To create
 | ||
| sounds with frequencies other than multiples of the basic scan rate, you
 | ||
| must store phase-shifted patterns into the sound buffer between each scan.
 | ||
| You can use the vertical and horizontal blanking signals (available in the
 | ||
| VIA) to synchronize your sound buffer updates to the buffer scan. You may
 | ||
| find that it's much easier to use the routines in the Sound Driver to do
 | ||
| these functions. 
 | ||
| 
 | ||
| Warning:  The low-order byte of each word in the sound buffer is used to
 | ||
|           control the speed of the motor in the disk drive. Don't store
 | ||
|           any information there, or you'll interfere with the disk I/O.
 | ||
| 
 | ||
| There are two sound buffers, just as there are two screen buffers. The
 | ||
| address of the main sound buffer is stored in the global variable SoundBase
 | ||
| and is also available as the constant soundLow. The main sound buffer is at
 | ||
| $1FD00 in a 128K Macintosh, and the alternate buffer is at $1A100; for a
 | ||
| 512K Macintosh, add $60000 to these values.  Each sound buffer contains 370
 | ||
| words of data. As when you want to use the alternate screen buffer, you'll
 | ||
| have to specify to the Segment Loader that you want the alternate buffer
 | ||
| (see the Segment Loader chapter for details). To select the alternate sound
 | ||
| buffer for output, clear the following bit of VIA data register A
 | ||
| (vBase+vBufA): 
 | ||
| 
 | ||
|   vSndPg2    .EQU    3    ;0 = alternate sound buffer
 | ||
| 
 | ||
| To return to the main buffer, set the same bit.
 | ||
| 
 | ||
| Warning:  Be sure to switch back to the main sound buffer before doing a
 | ||
|           disk access, or the disk won't work properly.
 | ||
| 
 | ||
| Warning:  The alternate sound buffer may not be supported in future
 | ||
|           versions of the Macintosh.
 | ||
| 
 | ||
| There's another way to generate a simple, square-wave tone of any frequency,
 | ||
| using almost no processor intervention. To do this, first load a constant
 | ||
| value into all 370 sound buffer locations (use $00's for minumum volume,
 | ||
| $FF's for maximum volume).  Next, load a value into the VIA's timer 1
 | ||
| latches, and set the high-order two bits of the VIA's auxiliary control
 | ||
| register (vBase+vACR) for "square wave output" from timer 1. The timer will
 | ||
| then count down from the latched value at 1.2766 usec/count, over and over,
 | ||
| inverting the vSndEnb bit of VIA register B (vBase+vBufB) after each count
 | ||
| down. This takes the constant voltage being generated from the sound buffer
 | ||
| and turns it on and off, creating a square-wave sound whose period is
 | ||
| 
 | ||
|   2 * 1.2766 usec * timer 1's latched value
 | ||
| 
 | ||
| Note:  You may want to disable timer 1 interrupts during this process (bit 6
 | ||
|        in the VIA's interrupt enable register, which is at vBase+vIER).
 | ||
| 
 | ||
| To stop the square-wave sound, reset the high-order two bits of the
 | ||
| auxiliary control register. 
 | ||
| 
 | ||
| Note:  See the SY6522 technical specifications for details of the VIA
 | ||
|        registers. See also "Sound Driver Hardware" in the Sound Driver
 | ||
|        chapter.
 | ||
| 
 | ||
| Figure 2 shows a block diagram for the sound port.
 | ||
| 
 | ||
| The starting addresses of the Macintosh Plus sound buffers depend on the
 | ||
| amount of memory present in the machine. The following table shows the
 | ||
| starting address of the main and the alternate sound buffer for various
 | ||
| memory configurations of the Macintosh Plus: 
 | ||
| 
 | ||
|   System                   Main Sound    Alternate
 | ||
|   Macintosh Plus, 1Mb      $FFD00        $FA100
 | ||
|   Macintosh Plus, 2Mb      $1FFD00       $1FA100
 | ||
|   Macintosh Plus, 2.5Mb    $27FD00       $27A100
 | ||
|   Macintosh Plus, 4Mb      $3FFD00       $3FA100
 | ||
| 
 | ||
| Warning:  To ensure that software will run on Macintoshes of different memory
 | ||
|           size, as well as future Macintoshes, use the address stored in the
 | ||
|           global variable SoundBase. Also, the alternate sound buffer may not
 | ||
|           be available in future versions of the Macintosh and may not be found
 | ||
|           in some software configurations of current Macintoshes.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The SCC
 | ||
| + C  THE SCC                                                 MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The two serial ports are controlled by a Zilog Z8530 Serial Communications
 | ||
| Controller (SCC). The port known as SCC port A is the one with the modem
 | ||
| icon on the back of the Macintosh. SCC port B is the one with the printer
 | ||
| icon. 
 | ||
| 
 | ||
| Macintosh serial ports conform to the EIA standard RS422, which differs from
 | ||
| the more common RS232C standard. While RS232C modulates a signal with
 | ||
| respect to a common ground ("single-ended" transmission), RS422 modulates
 | ||
| two signals against each other ("differential" transmission). The RS232C
 | ||
| receiver senses whether the received signal is sufficiently negative with
 | ||
| respect to ground to be a logic "1", whereas the RS422 receiver simply
 | ||
| senses which line is more negative than the other. This makes RS422 more
 | ||
| immune to noise and interference, and more versatile over longer distances.
 | ||
| If you ground the positive side of each RS422 receiver and leave unconnected
 | ||
| the positive side of each transmitter, you've converted to EIA standard
 | ||
| RS423, which can be used to communicate with most RS232C devices over
 | ||
| distances up to fifty feet or so. 
 | ||
| 
 | ||
| ***Refer to Figure 2.***
 | ||
| 
 | ||
| Figure 2-Diagram of Sound Port
 | ||
| 
 | ||
| The serial inputs and outputs of the SCC are connected to the ports through
 | ||
| differential line drivers (26LS30) and receivers (26LS32). The line drivers
 | ||
| can be put in the high-impedance mode between transmissions, to allow other
 | ||
| devices to transmit over those lines. A driver is activated by lowering the
 | ||
| SCC's Request To Send (RTS) output for that port. Port A and port B are
 | ||
| identical except that port A (the modem port)  has a higher interrupt
 | ||
| priority, making it more suitable for high-speed communication. 
 | ||
| 
 | ||
| Figure 3 shows the DB-9 pinout for the SCC output jacks.
 | ||
| 
 | ||
| ***Refer to Figure 3.***
 | ||
| 
 | ||
| Figure 3-Pinout for SCC Output Jacks
 | ||
| 
 | ||
| Warning:  Do not draw more than 100 milliamps at +12 volts, and
 | ||
|           200 milliamps at +5 volts from all connectors combined.
 | ||
| 
 | ||
| Each port's input-only handshake line (pin 7) is connected to the SCC's
 | ||
| Clear To Send (CTS) input for that port, and is designed to accept an
 | ||
| external device's Data Terminal Ready (DTR) handshake signal. This line is
 | ||
| also connected to the SCC's external synchronous clock (TRxC) input for that
 | ||
| port, so that an external device can perform high-speed synchronous data
 | ||
| exchange. Note that you can't use the line for receiving DTR if you're using
 | ||
| it to receive a high-speed data clock. 
 | ||
| 
 | ||
| The handshake line is sensed by the Macintosh using the positive
 | ||
| (noninverting) input of one of the standard RS422 receivers (26LS32 chip),
 | ||
| with the negative input grounded.  The positive input was chosen because
 | ||
| this configuration is more immune to noise when no active device is
 | ||
| connected to pin 7. 
 | ||
| 
 | ||
| Note:  Because this is a differential receiver, any handshake or clock signal
 | ||
|        driving it must be "bi-polar", alternating between a positive voltage
 | ||
|        and a negative voltage, with respect to the internally grounded negative
 | ||
|        input. If a device tries to use ground (0 volts) as one of its handshake
 | ||
|        logic levels, the Macintosh will receive that level as an indeterminate
 | ||
|        state, with unpredicatbale results.
 | ||
| 
 | ||
| The SCC itself (at its PCLK pin) is clocked at 3.672 megahertz. The internal
 | ||
| synchronous clock (RTxC) pins for both ports are also connected to this
 | ||
| 3.672 MHz clock. This is the clock that, after dividing by 16, is normally
 | ||
| fed to the SCC's internal baud-rate generator. 
 | ||
| 
 | ||
| The SCC chip generates level-2 processor interrupts during I/O over the
 | ||
| serial lines.  For more information about SCC interrupts, see the Device
 | ||
| Manager chapter. 
 | ||
| 
 | ||
| The locations of the SCC control and data lines are given in the following
 | ||
| table as offsets from the constant sccWBase for writes, or sccRBase for
 | ||
| reads. These base addresses are also available in the global variables SCCWr
 | ||
| and SCCRd. The SCC is on the upper byte of the data bus, so you must use
 | ||
| only even-addressed byte reads (a byte read of an odd SCC read address tries
 | ||
| to reset the entire SCC). When writing, however, you must use only
 | ||
| odd-addressed byte writes (the MC68000 puts your data on both bytes of the
 | ||
| bus, so it works correctly). A word access to any SCC address will shift the
 | ||
| phase of the computer's high-frequency timing by 128 nanoseconds (system
 | ||
| software adjusts it correctly during the system startup process). 
 | ||
| 
 | ||
|   Location          Contents
 | ||
| 
 | ||
|   sccWBase+aData    Write data register A
 | ||
|   sccRBase+aData    Read data register A
 | ||
|   sccWBase+bData    Write data register B
 | ||
|   sccRBase+bData    Read data register B
 | ||
|   sccWBase+aCtl     Write control register A
 | ||
|   sccRBase+aCtl     Read control register A
 | ||
|   sccWBase+bCtl     Write control register B
 | ||
|   sccRBase+bCtl     Read control register B
 | ||
| 
 | ||
| Warning:  Don't access the SCC chip more often than once every 2.2 usec. The
 | ||
|           SCC requires that much time to let its internal lines stabilize.
 | ||
| 
 | ||
| Refer to the technical specifications of the Zilog Z8530 for the detailed
 | ||
| bit maps and control methods (baud rates, protocols, and so on) of the SCC. 
 | ||
| 
 | ||
| Figure 4 shows a circuit diagram for the serial ports.
 | ||
| 
 | ||
| ***Refer to Figure 4.***
 | ||
| 
 | ||
| Figure 4-Diagram of Serial Ports
 | ||
| 
 | ||
| The Macintosh Plus uses two Mini-8 connectors for the two serial ports,
 | ||
| replacing the two DB-9 connectors used for the serial ports on the Macintosh
 | ||
| 128K, 512K, and 512K enhanced. 
 | ||
| 
 | ||
| The Mini-8 connectors provide an output handshake signal, but do not provide
 | ||
| the +5 volts and +12 volts found on the Macintosh 128K, 512K, and 512K
 | ||
| enhanced serial ports. 
 | ||
| 
 | ||
| The output handshake signal for each Macintosh Plus serial port originates
 | ||
| at the SCC's Data Terminal Ready (DTR) output for that port, and is driven
 | ||
| by an RS423 line driver. Other signals provided include input
 | ||
| handshake/external clock, Transmit Data + and -, and Receive Data + and -. 
 | ||
| 
 | ||
| Figure 5 shows the Mini-8 pinout for the SCC serial connectors.
 | ||
| 
 | ||
| ***Refer to Figure 5.***
 | ||
| 
 | ||
| Figure 5-Pinout for SCC Serial Connectors
 | ||
| 
 | ||
| Figure 6 shows a circuit diagram for the Macintosh Plus serial ports.
 | ||
| 
 | ||
| ***Refer to Figure 6.***
 | ||
| 
 | ||
| Figure 6-Circuit Diagram for the Macintosh Plus Serial Ports
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The.Mouse
 | ||
| + C  THE MOUSE                                               MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The DB-9 connector labeled with the mouse icon connects to the Apple mouse
 | ||
| (Apple II, Apple III, Lisa, and Macintosh mice are electrically identical).
 | ||
| The mouse generates four square-wave signals that describe the amount and
 | ||
| direction of the mouse's travel. Interrupt-driven routines in the Macintosh
 | ||
| ROM convert this information into the corresponding motion of the pointer on
 | ||
| the screen. By turning an option called mouse scaling on or off in the
 | ||
| Control Panel desk accessory, the user can change the amount of screen
 | ||
| pointer motion that corresponds to a given mouse motion, depending on how
 | ||
| fast the mouse is moved; for more information about mouse scaling, see the
 | ||
| discussion of parameter RAM in the Operating System Utilities chapter. 
 | ||
| 
 | ||
| Note:  The mouse is a relative-motion device; that is, it doesn't report
 | ||
|        where it is, only how far and in which direction it's moving. So if
 | ||
|        you want to connect graphics tablets, touch screens, light pens, or
 | ||
|        other absolute-position devices to the mouse port, you must either
 | ||
|        convert their coordinates into motion information or install your
 | ||
|        own device-handling routines.
 | ||
| 
 | ||
| The mouse operates by sending square-wave trains of information to the
 | ||
| Macintosh that change as the velocity and direction of motion change. The
 | ||
| rubber-coated steel ball in the mouse contacts two capstans, each connected
 | ||
| to an interrupter wheel:  Motion along the mouse's X axis rotates one of the
 | ||
| wheels and motion along the Y axis rotates the other wheel. 
 | ||
| 
 | ||
| The Macintosh uses a scheme known as quadrature to detect which direction
 | ||
| the mouse is moving along each axis. There's a row of slots on an
 | ||
| interrupter wheel, and two beams of infrared light shine through the slots,
 | ||
| each one aimed at a phototransistor detector. The detectors are offset just
 | ||
| enough so that, as the wheel turns, they produce two square-wave signals
 | ||
| (called the interrupt signal and the quadrature signal) 90 degrees out of
 | ||
| phase. The quadrature signal precedes the interrupt signal by 90 degrees
 | ||
| when the wheel turns one way, and trails it when the wheel turns the other
 | ||
| way. 
 | ||
| 
 | ||
| The interrupt signals, X1 and Y1, are connected to the SCC's DCDA and DCDB
 | ||
| inputs, respectively, while the quadrature signals, X2 and Y2, go to inputs
 | ||
| of the VIA's data register B. When the Macintosh is interrupted (from the
 | ||
| SCC) by the rising edge of a mouse interrupt signal, it checks the VIA for
 | ||
| the state of the quadrature signal for that axis:  If it's low, the mouse is
 | ||
| moving to the left (or down), and if it's high, the mouse is moving to the
 | ||
| right (or up). When the SCC interrupts on the falling edge, a high
 | ||
| quadrature level indicates motion to the left (or down) and a low quadrature
 | ||
| level indicates motion to the right (or up): 
 | ||
| 
 | ||
|   SCC                VIA                 Mouse
 | ||
| 
 | ||
|   Mouse interrupt    Mouse quadrature    Motion direction in
 | ||
|   X1 (or Y1)         X2 (or Y2)          X (or Y) axis
 | ||
|   Positive edge      Low                 Left (or down)
 | ||
|                      High                Right (or up)
 | ||
|   Negative edge      Low                 Right (or up)
 | ||
|                      High                Left (or down)
 | ||
| 
 | ||
| Figure 7 shows the interrupt (Y1) and quadrature (Y2) signals when the mouse
 | ||
| is moved downwards. 
 | ||
| 
 | ||
| The switch on the mouse is a pushbutton that grounds pin 7 on the mouse
 | ||
| connector when pressed. The state of the button is checked by software
 | ||
| during each vertical blanking interrupt. The small delay between each check
 | ||
| is sufficient to debounce the button. You can look directly at the mouse
 | ||
| button's state by examining the following bit of VIA data register B
 | ||
| (vBase+vBufB): 
 | ||
| 
 | ||
|   vSW    .EQU    3    ;0 = mouse button is down
 | ||
| 
 | ||
| If the bit is clear, the mouse button is down. However, it's recommended
 | ||
| that you let the Operating System handle this for you through the event
 | ||
| mechanism. 
 | ||
| 
 | ||
| Figure 8 shows the DB-9 pinout for the mouse jack at the back of the Macintosh.
 | ||
| 
 | ||
| ***Refer to Figure 7.***
 | ||
| 
 | ||
| Figure 7-Mouse Mechanism
 | ||
| 
 | ||
| ***Refer to Figure 8.***
 | ||
| 
 | ||
| Figure 8-Pinout for Mouse Jack
 | ||
| 
 | ||
| Warning:  Do not draw more than 200 milliamps at +5 volts from all
 | ||
|           connectors combined.
 | ||
| 
 | ||
| Figure 9 shows a circuit diagram for the mouse port.
 | ||
| 
 | ||
| ***Refer to Figure 9.***
 | ||
| 
 | ||
| Figure 9-Diagram of Mouse Port
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The Keyboard and Keypad
 | ||
| + C  THE KEYBOARD AND KEYPAD                                 MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Macintosh keyboard and numeric keypad each contain an Intel 8021
 | ||
| microprocessor that scans the keys. The 8021 contains ROM and RAM, and is
 | ||
| programmed to conform to the interface protocol described below. 
 | ||
| 
 | ||
| The keyboard plugs into the Macintosh through a four-wire RJ-11
 | ||
| telephone-style jack.  If a numeric keypad is installed in the system, the
 | ||
| keyboard plugs into it and it in turn plugs into the Macintosh. Figure 10
 | ||
| shows the pinout for the keyboard jack on the Macintosh, on the keyboard
 | ||
| itself, and on the numeric keypad. 
 | ||
| 
 | ||
| ***Refer to Figure 10.***
 | ||
| 
 | ||
| Figure 10-Pinout for Keyboard Jack
 | ||
| 
 | ||
| Warning:  Do not draw more than 200 milliamps at +5 volts from all
 | ||
|           connectors combined.
 | ||
| 
 | ||
| The Macintosh Plus keyboard, which includes a built-in numeric keypad,
 | ||
| contains a microprocessor that scans the keys. The microprocessor contains
 | ||
| ROM and RAM, and is programmed to conform to the same keyboard interface
 | ||
| protocol described below. 
 | ||
| 
 | ||
| The Macintosh Plus keyboard reproduces all of the key-down transitions
 | ||
| produced by the keyboard and optional keypad used by the Macintosh 128K,
 | ||
| 512K, and 512K enhanced;  the Macintosh Plus keyboard is also completely
 | ||
| compatible with these other machines.  If a key transition occurs for a key
 | ||
| that used to be on the optional keypad in lowercase, the Macintosh Plus
 | ||
| keyboard still responds to an Inquiry command by sending back the Keypad
 | ||
| response ($79) to the Macintosh Plus. If a key transition occurs for an key
 | ||
| that used to be on the optional keypad in uppercase, the Macintosh Plus
 | ||
| keyboard responds to an Inquiry command by sending back the Shift Key-down
 | ||
| Transition response ($71), followed by the Keypad response ($79). The
 | ||
| responses for key-down transitions on the original Macintosh and Macintosh
 | ||
| Plus are shown (in hexadecimal) in Figure 11. 
 | ||
| 
 | ||
| ***Refer to Figure 11.***
 | ||
| 
 | ||
| Figure 11-Key-Down Transitions
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Keyboard Communication Protocol
 | ||
| 
 | ||
| The keyboard data line is bidirectional and is driven by whatever device is
 | ||
| sending data. The keyboard clock line is driven by the keyboard only. All
 | ||
| data transfers are synchronous with the keyboard clock. Each transmission
 | ||
| consists of eight bits, with the highest-order bits first. 
 | ||
| 
 | ||
| When sending data to the Macintosh, the keyboard clock transmits eight
 | ||
| 330-usec cycles (160 usec low, 170 usec high) on the normally high clock
 | ||
| line. It places the data bit on the data line 40 usec before the falling
 | ||
| edge of the clock line and maintains it for 330 usec. The data bit is
 | ||
| clocked into the Macintosh's VIA shift register on the rising edge of the
 | ||
| keyboard clock cycle. 
 | ||
| 
 | ||
| When the Macintosh sends data to the keyboard, the keyboard clock transmits
 | ||
| eight 400-usec cycles (180 usec low, 220 usec high) on the clock line. On
 | ||
| the falling edge of the keyboard clock cycle, the Macintosh places the data
 | ||
| bit on the data line and holds it there for 400 usec. The keyboard reads the
 | ||
| data bit 80 usec after the rising edge of the keyboard clock cycle. 
 | ||
| 
 | ||
| Only the Macintosh can initiate communication over the keyboard lines. On
 | ||
| power-up of either the Macintosh or the keyboard, the Macintosh is in
 | ||
| charge, and the external device is passive. The Macintosh signals that it's
 | ||
| ready to begin communication by pulling the keyboard data line low. Upon
 | ||
| detecting this, the keyboard starts clocking and the Macintosh sends a
 | ||
| command. The last bit of the command leaves the keyboard data line low; the
 | ||
| Macintosh then indicates it's ready to receive the keyboard's response by
 | ||
| setting the data line high. 
 | ||
| 
 | ||
| The first command the Macintosh sends out is the Model Number command. The
 | ||
| keyboard's response to this command is to reset itself and send back its
 | ||
| model number to the Macintosh. If no response is received for 1/2 second,
 | ||
| the Macintosh tries the Model Number command again. Once the Macintosh has
 | ||
| successfully received a model number from the keyboard, normal operation can
 | ||
| begin. The Macintosh sends the Inquiry command;  the keyboard sends back a
 | ||
| Key Transition response if a key has been pressed or released.  If no key
 | ||
| transition has occurred after 1/4 second, the keyboard sends back a Null
 | ||
| response to let the Macintosh know it's still there. The Macintosh then
 | ||
| sends the Inquiry command again. In normal operation, the Macintosh sends
 | ||
| out an Inquiry command every 1/4 second. If it receives no response within
 | ||
| 1/2 second, it assumes the keyboard is missing or needs resetting, so it
 | ||
| begins again with the Model Number command. 
 | ||
| 
 | ||
| There are two other commands the Macintosh can send:  the Instant command,
 | ||
| which gets an instant keyboard status without the 1/4-second timeout, and
 | ||
| the Test command, to perform a keyboard self-test. Here's a list of the
 | ||
| commands that can be sent from the Macintosh to the keyboard: 
 | ||
| 
 | ||
|   Command name    Value    Keyboard response
 | ||
|   Inquiry         $10      Key Transition code or Null ($7B)
 | ||
|   Instant         $14      Key Transition code or Null ($7B)
 | ||
|   Model Number    $16      Bit 0:    1
 | ||
|                            Bits 1-3: keyboard model number, 1-8
 | ||
|                            Bits 4-6: next device number, 1-8
 | ||
|                            Bit 7:    1 if another device connected
 | ||
|   Test            $36      ACK ($7D) or NAK ($77)
 | ||
| 
 | ||
| The Key Transition responses are sent out by the keyboard as a single byte: 
 | ||
| Bit 7 high means a key-up transition, and bit 7 low means a key-down. Bit 0
 | ||
| is always high.  The Key Transition responses for key-down transitions on
 | ||
| the keyboard are shown (in hexadecimal) in Figure 12. Note that these
 | ||
| response codes are different from the key codes returned by the keyboard
 | ||
| driver software. The keyboard driver strips off bit 7 of the response and
 | ||
| shifts the result one bit to the right, removing bit 0. For example,
 | ||
| response code $33 becomes $19, and $2B becomes $15. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Keypad Communication Protocol
 | ||
| 
 | ||
| When a numeric keypad is used, it must be inserted between the keyboard and
 | ||
| the Macintosh; that is, the keypad cable plugs into the jack on the front of
 | ||
| the Macintosh, and the keyboard cable plugs into a jack on the numeric
 | ||
| keypad. In this configuration, the timings and protocol for the clock and
 | ||
| data lines work a little differently:  The keypad acts like a keyboard when
 | ||
| communicating with the Macintosh, and acts like a Macintosh when
 | ||
| communicating over the separate clock and data lines going to the keyboard.
 | ||
| All commands from the Macintosh are now received by the keypad instead of
 | ||
| the keyboard, and only the keypad can communicate directly with the
 | ||
| keyboard. 
 | ||
| 
 | ||
| When the Macintosh sends out an Inquiry command, one of two things may
 | ||
| happen, depending on the state of the keypad. If no key transitions have
 | ||
| occurred on the keypad since the last Inquiry, the keypad sends an Inquiry
 | ||
| command to the keyboard and, later, retransmits the keyboard's response back
 | ||
| to the Macintosh. But if a key transition has occurred on the keypad, the
 | ||
| keypad responds to an Inquiry by sending back the Keypad response ($79) to
 | ||
| the Macintosh. In that case, the Macintosh immediately sends an Instant
 | ||
| command, and this time the keypad sends back its own Key Transition
 | ||
| response.  As with the keyboard, bit 7 high means key-up and bit 7 low means
 | ||
| key-down. 
 | ||
| 
 | ||
| The Key Transition responses for key-down transitions on the keypad are shown in
 | ||
| Figure 12.
 | ||
| 
 | ||
| ***Refer to Figure 12.***
 | ||
| 
 | ||
| Figure 12-Key-Down Transitions
 | ||
| 
 | ||
| Again, note that these response codes are different from the key codes
 | ||
| returned by the keyboard driver software. The keyboard driver strips off bit
 | ||
| 7 of the response and shifts the result one bit to the right, removing bit
 | ||
| 0. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The Floppy Disk Interface
 | ||
| + C  THE FLOPPY DISK INTERFACE                               MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Macintosh disk interface uses a design similar to that used on the Apple
 | ||
| II and Apple III computers, employing the Apple custom IWM chip. Another
 | ||
| custom chip called the Analog Signal Generator (ASG) reads the disk speed
 | ||
| buffer in RAM and generates voltages that control the disk speed. Together
 | ||
| with the VIA, the IWM and the ASG generate all the signals necessary to
 | ||
| read, write, format, and eject the 3 1/2-inch disks used by the Macintosh. 
 | ||
| 
 | ||
| The Macintosh Plus has an internal double-sided disk drive; an external double-sided
 | ||
| drive or the older single-sided drive, can be attached as well.
 | ||
| 
 | ||
| Note:  The external double-sided drive can be attached to a Macintosh 512K
 | ||
|        through the back of a Hard Disk 20. The Hard Disk 20 start-up software
 | ||
|        contains a device driver for this drive and the hierarchical (128K ROM)
 | ||
|        version of the File Manager.
 | ||
| 
 | ||
| The double-sided drive can format, read, and write both 800K double-sided
 | ||
| disks and 400K single-sided disks. The operation of the drive with
 | ||
| double-sided disks differs from that on single-sided disks. With
 | ||
| double-sided disks, a single mechanism positions two read/write heads-one
 | ||
| above the disk and one below-so that the drive can access two tracks
 | ||
| simultaneously-one on the top side, and a second, directly beneath the
 | ||
| first, on the bottom side. This lets the drive read or write two complete
 | ||
| tracks of information before it has to move the heads, significantly
 | ||
| reducing access time. For 400K disks, the double-sided drive restricts
 | ||
| itself to one side of the disk. 
 | ||
| 
 | ||
| Warning:  Applications (for instance, copy protection schemes) should never
 | ||
|           interfere with, or depend on, disk speed control. The double-sided
 | ||
|           drive controls its own motor speed, ignoring the speed signal (PWM)
 | ||
|           from the Analog Signal Generator (ASG).
 | ||
| 
 | ||
| The IWM controls four of the disk state-control lines (called CA0, CA1, CA2,
 | ||
| and LSTRB), chooses which drive (internal or external) to enable, and
 | ||
| processes the disk's read-data and write-data signals. The VIA provides
 | ||
| another disk state-control line called SEL. 
 | ||
| 
 | ||
| A buffer in RAM (actually the low-order bytes of words in the sound buffer)
 | ||
| is read by the ASG to generate a pulse-width modulated signal that's used to
 | ||
| control the speed of the disk motor. The Macintosh Operating System uses
 | ||
| this speed control to allow it to store more sectors of information in the
 | ||
| tracks closer to the edge of the disk by running the disk motor at slower
 | ||
| speeds. 
 | ||
| 
 | ||
| Figure 13 shows the DB-19 pinout for the external disk jack at the back of
 | ||
| the Macintosh. 
 | ||
| 
 | ||
| ***Refer to Figure 13.***
 | ||
| 
 | ||
| Figure 13-Pinout for Disk Jack
 | ||
| 
 | ||
| Warning:  This connector was designed for a Macintosh 3 1/2-inch disk drive,
 | ||
|           which represents a load of 500 milliamps at +12 volts, 500 milliamps
 | ||
|           at +5 volts, and 0 milliamps at -12 volts. If any other device uses
 | ||
|           this connector, it must not exceed these loads by more than 100
 | ||
|           milliamps at +12 volts, 200 milliamps at +5 volts, and 10 milliamps
 | ||
|           at -12 volts, including loads from all other connectors combined.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Controlling the Disk State-Control Lines
 | ||
| 
 | ||
| The IWM contains registers that can be used by the software to control the
 | ||
| state-control lines leading out to the disk. By reading or writing certain
 | ||
| memory locations, you can turn these state-control lines on or off. Other
 | ||
| locations set various IWM internal states. The locations are given in the
 | ||
| following table as offsets from the constant dBase, the base address of the
 | ||
| IWM; this base address is also available in a global variable named IWM. The
 | ||
| IWM is on the lower byte of the data bus, so use odd-addressed byte accesses
 | ||
| only. 
 | ||
| 
 | ||
|               Location to     Location to
 | ||
|   IWM line    turn line on    turn line off
 | ||
| 
 | ||
|   Disk state-control lines:
 | ||
|     CA0       dBase+ph0H      dBase+ph0L
 | ||
|     CA1       dBase+ph1H      dBase+ph1L
 | ||
|     CA2       dBase+ph2H      dBase+ph2L
 | ||
|     LSTRB     dBase+ph3H      dBase+ph3L
 | ||
| 
 | ||
|   Disk enable line:
 | ||
|     ENABLE    dBase+motorOn   dBase+motorOff
 | ||
| 
 | ||
|   IWM internal states:
 | ||
|     SELECT    dBase+extDrive  dBase+intDrive
 | ||
|     Q6        dBase+q6H       dBase+q6L
 | ||
|     Q7        dBase+q7H       dBase+q7L
 | ||
| 
 | ||
| To turn one of the lines on or off, do any kind of memory byte access (read
 | ||
| or write)  to the respective location. 
 | ||
| 
 | ||
| The CA0, CA1, and CA2 lines are used along with the SEL line from the VIA to
 | ||
| select from among the registers and data signals in the disk drive. The
 | ||
| LSTRB line is used when writing control information to the disk registers
 | ||
| (as described below), and the ENABLE line enables the selected disk drive.
 | ||
| SELECT is an IWM internal line that chooses which disk drive can be enabled: 
 | ||
| On selects the external drive, and off selects the internal drive. The Q6
 | ||
| and Q7 lines are used to set up the internal state of the IWM for reading
 | ||
| disk register information, as well as for reading or writing actual
 | ||
| disk-storage data. 
 | ||
| 
 | ||
| You can read information from several registers in the disk drive to find
 | ||
| out whether the disk is locked, whether a disk is in the drive, whether the
 | ||
| head is at track 0, how many heads the drive has, and whether there's a
 | ||
| drive connected at all. In turn, you can write to some of these registers to
 | ||
| step the head, turn the motor on or off, and eject the disk. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Reading from the Disk Registers
 | ||
| 
 | ||
| Before you can read from any of the disk registers, you must set up the
 | ||
| state of the IWM so that it can pass the data through to the MC68000's
 | ||
| memory space where you'll be able to read it. To do that, you must first
 | ||
| turn off Q7 by reading or writing dBase+q7L. Then turn on Q6 by accessing
 | ||
| dBase+q6H. After that, the IWM will be able to pass data from the disk's
 | ||
| RD/SENSE line through to you. 
 | ||
| 
 | ||
| Once you've set up the IWM for disk register access, you must next select
 | ||
| which register you want to read. To read one of the disk registers, first
 | ||
| enable the drive you want to use (by accessing dBase+intDrive or
 | ||
| dBase+extDrive and then dBase+motorOn)  and make sure LSTRB is low. Then set
 | ||
| CA0, CA1, CA2, and SEL to address the register you want. Once this is done,
 | ||
| you can read the disk register data bit in the high-order bit of dBase+q7L.
 | ||
| After you've read the data, you may read another disk register by again
 | ||
| setting the proper values in CA0, CA1, CA2, and SEL, and then reading
 | ||
| dBase+q7L. 
 | ||
| 
 | ||
| Warning:  When you're finished reading data from the disk registers, it's
 | ||
|           important to leave the IWM in a state that the Disk Driver will
 | ||
|           recognize. To be sure it's in a valid logic state, always turn Q6
 | ||
|           back off (by accessing dBase+q6L) after you've finished reading
 | ||
|           the disk registers.
 | ||
| 
 | ||
| The Following table shows how you must set the disk state-control lines to
 | ||
| read from the various disk registers and data signals: 
 | ||
| 
 | ||
|     State-control lines       Register
 | ||
|   CA2    CA1    CA0    SEL    addressed    Information in register
 | ||
| 
 | ||
|   0      0      0      0      DIRTN        Head step direction
 | ||
|   0      0      0      1      CSTIN        Disk in place
 | ||
|   0      0      1      0      STEP         Disk head stepping
 | ||
|   0      0      1      1      WRTPRT       Disk locked
 | ||
|   0      1      0      0      MOTORON      Disk motor running
 | ||
|   0      1      0      1      TKO          Head at track 0
 | ||
|   0      1      1      1      TACH         Tachometer
 | ||
|   1      0      0      0      RDDATA0      Read data, lower head
 | ||
|   1      0      0      1      RDDATA1      Read data, upper head
 | ||
|   1      1      0      0      SIDES        Single- or double-sided drive
 | ||
|   1      1      1      1      DRVIN        Drive installed
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Writing to the Disk Registers
 | ||
| 
 | ||
| To write to a disk register, first be sure that LSTRB is off, then turn on
 | ||
| CA0 and CA1. Next, set SEL to 0. Set CA0 and CA1 to the proper values from
 | ||
| the table below, then set CA2 to the value you want to write to the disk
 | ||
| register. Hold LSTRB high for at least one usec but not more than one msec
 | ||
| (unless you're ejecting a disk) and bring it low again. Be sure that you
 | ||
| don't change CA0-CA2 or SEL while LSTRB is high, and that CA0 and CA1 are
 | ||
| set high before changing SEL. 
 | ||
| 
 | ||
| The following table shows how you must set the disk state-control lines to
 | ||
| write to the various disk registers: 
 | ||
| 
 | ||
|     Control lines      Register
 | ||
|   CA1    CA0    SEL    addressed    Register function
 | ||
| 
 | ||
|   0      0      0      DIRTN        Set stepping direction
 | ||
|   0      1      0      STEP         Step disk head one track
 | ||
|   1      0      0      MOTORON      Turn on/off disk motor
 | ||
|   1      1      0      EJECT        Eject the disk
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Explanations of the Disk Registers
 | ||
| 
 | ||
| The information written to or read from the various disk registers can be
 | ||
| interpreted as follows: 
 | ||
| 
 | ||
|   *  The DIRTN signal sets the direction of subsequent head stepping:
 | ||
|      0 causes steps to go toward the inside track (track 79),
 | ||
|      1 causes them to go toward the outside track (track 0).
 | ||
|   *  CSTIN is 0 only when a disk is in the drive.
 | ||
|   *  Setting STEP to 0 steps the head one full track in the direction
 | ||
|      last set by DIRTN. When the step is complete (about 12 msec), the
 | ||
|      disk drive sets STEP back to 1, and then you can step again.
 | ||
|   *  WRTPRT is 0 whenever the disk is locked. Do not write to a disk
 | ||
|      unless WRTPRT is 1.
 | ||
|   *  MOTORON controls the state of the disk motor:  0 turns on the motor,
 | ||
|      and 1 turns it off. The motor will run only if the drive is enabled
 | ||
|      and a disk is in place; otherwise, writing to this line will have no
 | ||
|      effect.
 | ||
|   *  TKO goes to 0 only if the head is at track 0. This is valid beginning
 | ||
|      12 msec after the step that puts it at track 0.
 | ||
|   *  Writing 1 to EJECT ejects the disk from the drive. To eject a disk,
 | ||
|      you must hold LSTRB high for at least 1/2 second.
 | ||
|   *  The current disk speed is available as a pulse train on TACH. The TACH
 | ||
|      line produces 60 pulses for each rotation of the drive motor. The disk
 | ||
|      motor speed is controlled by the ASG as it reads the disk speed RAM buffer.
 | ||
|   *  RDDATA0 and RDDATA1 carry the instantaneous data from the disk head.
 | ||
|   *  SIDES is always 0 on single-sided drives and 1 on double-sided drives.
 | ||
|   *  DRVIN is always 0 if the selected disk drive is physically connected to
 | ||
|      the Macintosh, otherwise it floats to 1.
 | ||
| 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The Real-Time Clock
 | ||
| + C  THE REAL-TIME CLOCK                                     MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Macintosh real-time clock is a custom chip whose interface lines are
 | ||
| available through the VIA. The clock contains a four-byte counter that's
 | ||
| incremented once each second, as well as a line that can be used by the VIA
 | ||
| to generate an interrupt once each second. It also contains 20 bytes of RAM
 | ||
| that are powered by a battery when the Macintosh is turned off. These RAM
 | ||
| bytes, called parameter RAM, contain important data that needs to be
 | ||
| preserved even when the system power is not available. The Operating System
 | ||
| maintains a copy of parameter RAM that you can access in low memory.  To
 | ||
| find out how to use the values in parameter RAM, see the Operating System
 | ||
| Utilities chapter. 
 | ||
| 
 | ||
| The Macintosh Plus real-time clock is a new custom chip. The commands
 | ||
| described below for accessing the Macintosh 512K clock chip are also used to
 | ||
| access the new chip. The new chip includes additional parameter RAM that's
 | ||
| reserved by Apple. The parameter RAM information provided in the Operating
 | ||
| System Utilities chapter, as well as the descriptions of the routines used
 | ||
| for accessing that information, apply for the new clock chip as well. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Accessing the Clock Chip
 | ||
| 
 | ||
| The clock is accessed through the following bits of VIA data register B
 | ||
| (vBase+vBufB):
 | ||
| 
 | ||
|   rTCData    .EQU    0    ;real-time clock serial data line
 | ||
|   rTCClk     .EQU    1    ;real-time clock data-clock line
 | ||
|   rTCEnb     .EQU    2    ;real-time clock serial enable
 | ||
| 
 | ||
| These three bits constitute a simple serial interface. The rTCData bit is a
 | ||
| bidirectional serial data line used to send command and data bytes back and
 | ||
| forth. The rTCClk bit is a data-clock line, always driven by the processor
 | ||
| (you set it high or low yourself)  that regulates the transmission of the
 | ||
| data and command bits. The rTCEnb bit is the serial enable line, which
 | ||
| signals the real-time clock that the processor is about to send it serial
 | ||
| commands and data. 
 | ||
| 
 | ||
| To access the clock chip, you must first enable its serial function. To do
 | ||
| this, set the serial enable line (rTCEnb) to 0. Keep the serial enable line
 | ||
| low during the entire transaction; if you set it to 1, you'll abort the
 | ||
| transfer. 
 | ||
| 
 | ||
| Warning:  Be sure you don't alter any of bits 3-7 of VIA data register
 | ||
|           B during clock serial access.
 | ||
| 
 | ||
| A command can be either a write request or a read request. After the eight
 | ||
| bits of a write request, the clock will expect the next eight bits across
 | ||
| the serial data line to be your data for storage into one of the internal
 | ||
| registers of the clock. After receiving the eight bits of a read request,
 | ||
| the clock will respond by putting eight bits of its data on the serial data
 | ||
| line. Commands and data are transferred serially in eight-bit groups over
 | ||
| the serial data line, with the high-order bit first and the low-order bit
 | ||
| last. 
 | ||
| 
 | ||
| To send a command to the clock, first set the rTCData bit of VIA data
 | ||
| direction register B (vBase+vDirB) so that the real-time clock's serial data
 | ||
| line will be used for output to the clock. Next, set the rTCClk bit of
 | ||
| vBase+vBufB to 0, then set the rTCData bit to the value of the first
 | ||
| (high-order) bit of your data byte. Then raise (set to 1) the data-clock bit
 | ||
| (rTCClk). Then lower the data-clock, set the serial data line to the next
 | ||
| bit, and raise the data-clock line again. After the last bit of your command
 | ||
| has been sent in this way, you can either continue by sending your data byte
 | ||
| in the same way (if your command was a write request) or switch to receiving
 | ||
| a data byte from the clock (if your command was a read request). 
 | ||
| 
 | ||
| To receive a byte of data from the clock, you must first send a command
 | ||
| that's a read request. After you've clocked out the last bit of the command,
 | ||
| clear the rTCData bit of the data direction register so that the real-time
 | ||
| clock's serial data line can be used for input from the clock; then lower
 | ||
| the data-clock bit (rTCClk) and read the first (high-order) bit of the
 | ||
| clock's data byte on the serial data line. Then raise the data-clock, lower
 | ||
| it again, and read the next bit of data.  Continue this until all eight bits
 | ||
| are read, then raise the serial enable line (rTCEnb), disabling the data
 | ||
| transfer. 
 | ||
| 
 | ||
| The following table lists the commands you can send to the clock. A 1 in the
 | ||
| high-order bit makes your command a read request; a 0 in the high-order bit
 | ||
| makes your command a write request. (In this table, "z" is the bit that
 | ||
| determines read or write status, and bits marked "a" are bits whose values
 | ||
| depend on what parameter RAM byte you want to address.) 
 | ||
| 
 | ||
|   Command byte    Register addressed by the command
 | ||
| 
 | ||
|     z0000001      Seconds register 0 (lowest-order byte)
 | ||
|     z0000101      Seconds register 1
 | ||
|     z0001001      Seconds register 2
 | ||
|     z0001101      Seconds register 3 (highest-order byte)
 | ||
|     00110001      Test register (write only)
 | ||
|     00110101      Write-protect register (write only)
 | ||
|     z010aa01      RAM address 100aa ($10-$13)
 | ||
|     z1aaaa01      RAM address 0aaaa ($00-$0F)
 | ||
| 
 | ||
| Note that the last two bits of a command byte must always be 01.
 | ||
| 
 | ||
| If the high-order bit (bit 7) of the write-protect register is set, this
 | ||
| prevents writing into any other register on the clock chip (including
 | ||
| parameter RAM). Clearing the bit allows you to change any values in any
 | ||
| registers on the chip. Don't try to read from this register; it's a
 | ||
| write-only register. 
 | ||
| 
 | ||
| The two highest-order bits (bits 7 and 6) of the test register are used as
 | ||
| device control bits during testing, and should always be set to 0 during
 | ||
| normal operation.  Setting them to anything else will interfere with normal
 | ||
| clock counting. Like the write-protect register, this is a write-only
 | ||
| register; don't try to read from it. 
 | ||
| 
 | ||
| All clock data must be sent as full eight-bit bytes, even if only one or two
 | ||
| bits are of interest. The rest of the bits may not matter, but you must send
 | ||
| them to the clock or the write will be aborted when you raise the serial
 | ||
| enable line. 
 | ||
| 
 | ||
| It's important to use the proper sequence if you're writing to the clock's
 | ||
| seconds registers. If you write to a given seconds register, there's a
 | ||
| chance that the clock may increment the data in the next higher-order
 | ||
| register during the write, causing unpredictable results. To avoid this
 | ||
| possibility, always write to the registers in low-to-high order. Similarly,
 | ||
| the clock data may increment during a read of all four time bytes, which
 | ||
| could cause invalid data to be read. To avoid this, always read the time
 | ||
| twice (or until you get the same value twice). 
 | ||
| 
 | ||
| Warning:  When you've finished reading from the clock registers, always end
 | ||
|           by doing a final write such as setting the write-protect bit. Failure
 | ||
|           to do this may leave the clock in a state that will run down the
 | ||
|           battery more quickly than necessary.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  The One-Second Interrupt
 | ||
| 
 | ||
| The clock also generates a VIA interrupt once each second (if this interrupt
 | ||
| is enabled). The enable status for this interrupt can be read from or
 | ||
| written to bit 0 of the VIA's interrupt enable register (vBase+vIER). When
 | ||
| reading the enable register, a 1 bit indicates the interrupt is enabled, and
 | ||
| 0 means it's disabled. Writing $01 to the enable register disables the
 | ||
| clock's one-second interrupt (without affecting any other interrupts), while
 | ||
| writing $81 enables it again. See the Device Manager chapter for more
 | ||
| information about writing your own interrupt handlers. 
 | ||
| 
 | ||
| Warning:  Be sure when you write to bit 0 of the VIA's interrupt enable
 | ||
|           register that you don't change any of the other bits.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The SCSI Interface
 | ||
| + C  THE SCSI INTERFACE                                      MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| Note:  This section refers to the Macintosh Plus.  Earlier Macintosh models
 | ||
|        are not equipped with a SCSI interface.
 | ||
| 
 | ||
| The NCR 5380 Small Computer Standard Interface (SCSI) chip controls a
 | ||
| high-speed parallel port for communicating with up to seven SCSI peripherals
 | ||
| (such as hard disks, streaming tapes, and high speed printers). The
 | ||
| Macintosh Plus SCSI port can be used to implement all of the protocols,
 | ||
| arbitration, interconnections, etc. of the SCSI interface as defined by the
 | ||
| ANSI X3T9.2 committee. 
 | ||
| 
 | ||
| The Macintosh Plus SCSI port differs from the ANSI X3T9.2 standard in two
 | ||
| ways.  First, it uses a DB-25 connector instead of the standard 50-pin
 | ||
| ribbon connector. An Apple adapter cable, however, can be used to convert
 | ||
| the DB-25 connector to the standard 50-pin connector. Second, power for
 | ||
| termination resistors is not provided at the SCSI connector nor is a
 | ||
| termination resistor provided in the Macintosh Plus SCSI circuitry. 
 | ||
| 
 | ||
| Warning:  Do not connect an RS232 device to the SCSI port. The SCSI interface
 | ||
|           is designed to use standard TTL logic levels of 0 and +5 volts;
 | ||
|           RS232 devices may impose levels of -25 and +25 volts on some lines,
 | ||
|           thereby causing damage to the logic board.
 | ||
| 
 | ||
| The NCR 5380 interrupt signal is not connected to the processor, but the
 | ||
| progress of a SCSI operation may be determined at any time by examining the
 | ||
| contents of various status registers in the NCR 5380. SCSI data transfers
 | ||
| are performed by the MC68000;  pseudo-DMA mode operations can assert the NCR
 | ||
| 5380 DMA Acknowledge (DACK) signal by reading or writing to the appropriate
 | ||
| address (see table below). Approximate transfer rates are 142K bytes per
 | ||
| second for nonblind transfers and 312K bytes per second for blind transfers.
 | ||
| (With nonblind transfers, each byte transferred is polled, or checked.) 
 | ||
| 
 | ||
| Figure 14 shows the DB-25 pinout for the SCSI connector at the back of the
 | ||
| Macintosh Plus. 
 | ||
| 
 | ||
| ***Refer to Figure 14.***
 | ||
| 
 | ||
| Figure 14-Pinout for SCSI Connector
 | ||
| 
 | ||
| The locations of the NCR 5380 control and data registers are given in the
 | ||
| following table as offsets from the constant scsiWr for write operations, or
 | ||
| scsiRd for read operations. These base addresses are not available in global
 | ||
| variables; instead of using absolute addresses, you should use the routines
 | ||
| provided by the SCSI Manager. 
 | ||
| 
 | ||
| Read and write operations must be made in bytes. Read operations must be to
 | ||
| even addresses and write operations must be to odd addresses; otherwise an
 | ||
| undefined operation will result. 
 | ||
| 
 | ||
| The address of each register is computed as follows:
 | ||
| 
 | ||
|   $580drn
 | ||
| 
 | ||
|   where r represents the register number (from 0 through 7),
 | ||
|   n determines whether it a read or write operation
 | ||
|   (0 for reads, or 1 for writes), and
 | ||
|   d determines whether the DACK signal to the NCR 5380 is asserted.
 | ||
|   (0 for not asserted, 1 is for asserted)
 | ||
| 
 | ||
| Here's an example of the address expressed in binary:
 | ||
| 
 | ||
|   0101 1000 0000 00d0 0rrr 000n
 | ||
| 
 | ||
| Note:  Asserting the DACK signal applies only to write operations to
 | ||
|        the output data register and read operations from the input
 | ||
|        data register.
 | ||
| 
 | ||
|   Symbolic            Memory
 | ||
|   Location            Location   NCR 5380 Internal Register
 | ||
| 
 | ||
|   scsiWr+sODR+dackWr  $580201    Output Data Register with DACK
 | ||
|   scsiRd+sIDR+dackRd  $580260    Current SCSI Data with DACK
 | ||
|   scsiWr+sODR         $580001    Output Data Register
 | ||
|   scsiWr+sICR         $580011    Initiator Command Register
 | ||
|   scsiWr+sMR          $580021    Mode Register
 | ||
|   scsiWr+sTCR         $580031    Target Command Register
 | ||
|   scsiWr+sSER         $580041    Select Enable Register
 | ||
|   scsiWr+sDMAtx       $580051    Start DMA Send
 | ||
|   scsiWr+sTDMArx      $580061    Start DMA Target Receive
 | ||
|   scsiWr+sIDMArx      $580071    Start DMA Initiator Receive
 | ||
|   scsiRd+sCDR         $580000    Current SCSI Data
 | ||
|   scsiRd+sICR         $580010    Initiator Command Register
 | ||
|   scsiRd+sMR          $580020    Mode Registor
 | ||
|   scsiRd+sTCR         $580030    Target Command Register
 | ||
|   scsiRd+sCSR         $580040    Current SCSI Bus Status
 | ||
|   scsiRd+sBSR         $580050    Bus and Status Register
 | ||
|   scsiRd+sIDR         $580060    Input Data Register
 | ||
|   scsiRd+sRESET       $580070    Reset Parity/Interrupt
 | ||
| 
 | ||
| Note:  For more information on the registers and control structure of
 | ||
|        the SCSI, consult the technical specifications for the NCR 5380 chip.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY The VIA
 | ||
| + C  THE VIA                                                 MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| The Synertek SY6522 Versatile Interface Adapter (VIA) controls the keyboard,
 | ||
| internal real-time clock, parts of the disk, sound, and mouse interfaces,
 | ||
| and various internal Macintosh signals. Its base address is available as the
 | ||
| constant vBase and is also stored in a global variable named VIA. The VIA is
 | ||
| on the upper byte of the data bus, so use even-addressed byte accesses only. 
 | ||
| 
 | ||
| There are two parallel data registers within the VIA, called A and B, each
 | ||
| with a data direction register. There are also several event timers, a
 | ||
| clocked shift register, and an interrupt flag register with an interrupt
 | ||
| enable register. 
 | ||
| 
 | ||
| Normally you won't have to touch the direction registers, since the
 | ||
| Operating System sets them up for you at system startup. A 1 bit in a data
 | ||
| direction register means the corresponding bit of the respective data
 | ||
| register will be used for output, while a 0 bit means it will be used for
 | ||
| input. 
 | ||
| 
 | ||
| Note:  For more information on the registers and control structure of the
 | ||
|        VIA, consult the technical specifications for the SY6522 chip.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  VIA Register A
 | ||
| 
 | ||
| VIA data register A is at vBase+vBufA. The corresponding data direction
 | ||
| register is at vBase+vDirA. 
 | ||
| 
 | ||
|   Bit(s)    Name             Description
 | ||
| 
 | ||
|     7       vSCCWReq         SCC wait/request
 | ||
|     6       vPage2           Alternate screen buffer
 | ||
|     5       vHeadSel         Disk SEL line
 | ||
|     4       vOverlay         ROM low-memory overlay
 | ||
|     3       vSndPg2          Alternate sound buffer
 | ||
|     0-2     vSound (mask)    Sound volume
 | ||
| 
 | ||
| The vSCCWReq bit can signal that the SCC has received a character (used to
 | ||
| maintain serial communications during disk accesses, when the CPU's
 | ||
| interrupts from the SCC are disabled). The vPage2 bit controls which screen
 | ||
| buffer is being displayed, and the vHeadSel bit is the SEL control line used
 | ||
| by the disk interface. The vOverlay bit (used only during system startup)
 | ||
| can be used to place another image of ROM at the bottom of memory, where RAM
 | ||
| usually is (RAM moves to $600000). The sound buffer is selected by the
 | ||
| vSndPg2 bit. Finally, the vSound bits control the sound volume. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  VIA Register B
 | ||
| 
 | ||
| VIA data register B is at vBase+vBufB. The corresponding data direction
 | ||
| register is at vBase+vDirB. 
 | ||
| 
 | ||
|   Bit    Name       Description
 | ||
| 
 | ||
|    7     vSndEnb    Sound enable/disable
 | ||
|    6     vH4        Horizontal blanking
 | ||
|    5     vY2        Mouse Y2
 | ||
|    4     vX2        Mouse X2
 | ||
|    3     vSW        Mouse switch
 | ||
|    2     rTCEnb     Real-time clock serial enable
 | ||
|    1     rTCClk     Real-time clock data-clock line
 | ||
|    0     rTCData    Real-time clock serial data
 | ||
| 
 | ||
| The vSndEnb bit turns the sound generator on or off, and the vH4 bit is set
 | ||
| when the video beam is in its horizontal blanking period. The vY2 and vX2
 | ||
| bits read the quadrature signals from the Y (vertical) and X (horizontal)
 | ||
| directions, respectively, of the mouse's motion lines. The vSW bit reads the
 | ||
| mouse switch. The rTCEnb, rTCClk, and rTCData bits control and read the
 | ||
| real-time clock. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  The VIA Peripheral Control Register
 | ||
| 
 | ||
| The VIA's peripheral control register, at vBase+vPCR, allows you to set some
 | ||
| very low-level parameters (such as positive-edge or negative-edge
 | ||
| triggering) dealing with the keyboard data and clock interrupts, the
 | ||
| one-second real-time clock interrupt line, and the vertical blanking
 | ||
| interrupt. 
 | ||
| 
 | ||
|   Bit(s)    Description
 | ||
| 
 | ||
|    5-7      Keyboard data interrupt control
 | ||
|    4        Keyboard clock interrupt control
 | ||
|    1-3      One-second interrupt control
 | ||
|    0        Vertical blanking interrupt control
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  The VIA Timers
 | ||
| 
 | ||
| The timers controlled by the VIA are called timer 1 and timer 2. Timer 1 is
 | ||
| used to time various events having to do with the Macintosh sound generator.
 | ||
| Timer 2 is used by the Disk Driver to time disk I/O events. If either timer
 | ||
| isn't being used by the Operating System, you're free to use it for your own
 | ||
| purposes.  When a timer counts down to 0, an interrupt will be generated if
 | ||
| the proper interrupt enable has been set. See the Device Manager chapter for
 | ||
| information about writing your own interrupt handlers. 
 | ||
| 
 | ||
| To start one of the timers, store the appropriate values in the high- and
 | ||
| low-order bytes of the timer counter (or the timer 1 latches, for multiple
 | ||
| use of the value).  The counters and latches are at the following locations: 
 | ||
| 
 | ||
|   Location       Contents
 | ||
| 
 | ||
|   vBase+vT1C     Timer 1 counter (low-order byte)
 | ||
|   vBase+vT1CH    Timer 1 counter (high-order byte)
 | ||
|   vBase+vT1L     Timer 1 latch (low-order byte)
 | ||
|   vBase+vT1LH    Timer 1 latch (high-order byte)
 | ||
|   vBase+vT2C     Timer 2 counter (low-order byte)
 | ||
|   vBase+vT2CH    Timer 2 counter (high-order byte)
 | ||
| 
 | ||
| Note:  When setting a timer, it's not enough to simply store a full word
 | ||
|        to the high-order address, because the high- and low-order bytes of
 | ||
|        the counters are not adjacent. You must explicitly do two stores,
 | ||
|        one for the high-order byte and one for the low-order byte.
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  VIA Interrupts
 | ||
| 
 | ||
| The VIA (through its IRQ line) can cause a level-1 processor interrupt
 | ||
| whenever one of the following occurs:  Timer 1 or timer 2 times out; the
 | ||
| keyboard is clocking a bit in through its serial port; the shift register
 | ||
| for the keyboard serial interface has finished shifting in or out; the
 | ||
| vertical blanking interval is beginning; or the one-second clock has ticked.
 | ||
| For more information on how to use these interrupts, see the Device Manager
 | ||
| chapter. 
 | ||
| 
 | ||
| The interrupt flag register at vBase+vIFR contains flag bits that are set
 | ||
| whenever the interrupt corresponding to that bit has occurred. The Operating
 | ||
| System uses these flags to determine which device has caused an interrupt.
 | ||
| Bit 7 of the interrupt flag register is not really a flag:  It remains set
 | ||
| (and the IRQ line to the processor is held low) as long as any enabled VIA
 | ||
| interrupt is occurring. 
 | ||
| 
 | ||
|   Bit    Interrupting device
 | ||
| 
 | ||
|    7     IRQ (all enabled VIA interrupts)
 | ||
|    6     Timer 1
 | ||
|    5     Timer 2
 | ||
|    4     Keyboard clock
 | ||
|    3     Keyboard data bit
 | ||
|    2     Keyboard data ready
 | ||
|    1     Vertical blanking interrupt
 | ||
|    0     One-second interrupt
 | ||
| 
 | ||
| The interrupt enable register, at vBase+vIER, lets you enable or disable any
 | ||
| of these interrupts. If an interrupt is disabled, its bit in the interrupt
 | ||
| flag register will continue to be set whenever that interrupt occurs, but it
 | ||
| won't affect the IRQ flag, nor will it interrupt the processor. 
 | ||
| 
 | ||
| The bits in the interrupt enable register are arranged just like those in
 | ||
| the interrupt flag register, except for bit 7. When you write to the
 | ||
| interrupt enable register, bit 7 is "enable/disable":  If bit 7 is a 1, each
 | ||
| 1 in bits 0-6 enables the corresponding interrupt; if bit 7 is a 0, each 1
 | ||
| in bits 0-6 disables that interrupt. In either case, 0's in bits 0-6 do not
 | ||
| change the status of those interrupts. Bit 7 is always read as a 1. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
|  Other VIA Registers
 | ||
| 
 | ||
| The shift register, at vBase+vSR, contains the eight bits of data that have
 | ||
| been shifted in or that will be shifted out over the keyboard data line. 
 | ||
| 
 | ||
| The auxiliary control register, at vBase+vACR, is described in the SY6522
 | ||
| documentation.  It controls various parameters having to do with the timers
 | ||
| and the shift register. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY System.Startup
 | ||
| + C  SYSTEM STARTUP                                          MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| When power is first supplied to the Macintosh, a carefully orchestrated
 | ||
| sequence of events takes place. 
 | ||
| 
 | ||
| First, the processor is held in a wait state while a series of circuits gets
 | ||
| the system ready for operation. The VIA and IWM are initialized, and the
 | ||
| mapping of ROM and RAM are altered temporarily by setting the overlay bit in
 | ||
| VIA data register A.  This places the ROM starting at the normal ROM
 | ||
| location $400000, and a duplicate image of the same ROM starting at address
 | ||
| 0 (where RAM normally is), while RAM is placed starting at $600000. Under
 | ||
| this mapping, the Macintosh software executes out of the normal ROM
 | ||
| locations above $400000, but the MC68000 can obtain some critical low-memory
 | ||
| vectors from the ROM image it finds at address 0. 
 | ||
| 
 | ||
| Next, a memory test and several other system tests take place. After the
 | ||
| system is fully tested and initialized, the software clears the VIA's
 | ||
| overlay bit, mapping the system RAM back where it belongs, starting at
 | ||
| address 0. Then the disk startup process begins. 
 | ||
| 
 | ||
| First the internal disk is checked:  If there's a disk inserted, the system
 | ||
| attempts to read it. If no disk is in the internal drive and there's an
 | ||
| external drive with an inserted disk, the system will try to read that one.
 | ||
| Otherwise, the question-mark disk icon is displayed until a disk is
 | ||
| inserted. If the disk startup fails for some reason, the "sad Macintosh"
 | ||
| icon is displayed and the Macintosh goes into an endless loop until it's
 | ||
| turned off again. 
 | ||
| 
 | ||
| Once a readable disk has been inserted, the first two sectors (containing
 | ||
| the system startup blocks) are read in and the normal disk load begins. 
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| 
 | ||
| + KY Summary of the Macintosh Hardware
 | ||
| + C  SUMMARY OF THE MACINTOSH HARDWARE                       MacintoshHardware
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| Warning:  This information applies only to the Macintosh 128K, 512K,
 | ||
|           not to the Macintosh XL.
 | ||
| 
 | ||
| Constants
 | ||
| 
 | ||
| ; VIA base addresses
 | ||
| 
 | ||
| vBase     .EQU    $EFE1FE    ;main base for VIA chip (in variable VIA)
 | ||
| aVBufB    .EQU    vBase      ;register B base
 | ||
| aVBufA    .EQU    $EFFFFE    ;register A base
 | ||
| aVBufM    .EQU    aVBufB     ;register containing mouse signals
 | ||
| aVIFR     .EQU    $EFFBFE    ;interrupt flag register
 | ||
| aVIER     .EQU    $EFFDFE    ;interrupt enable register
 | ||
| 
 | ||
| ; Offsets from vBase
 | ||
| 
 | ||
| vBufB     .EQU    512*0      ;register B (zero offset)
 | ||
| vDirB     .EQU    512*2      ;register B direction register
 | ||
| vDirA     .EQU    512*3      ;register A direction register
 | ||
| vT1C      .EQU    512*4      ;timer 1 counter (low-order byte)
 | ||
| vT1CH     .EQU    512*5      ;timer 1 counter (high-order byte)
 | ||
| vT1L      .EQU    512*6      ;timer 1 latch (low-order byte)
 | ||
| vT1LH     .EQU    512*7      ;timer 1 latch (high-order byte)
 | ||
| vT2C      .EQU    512*8      ;timer 2 counter (low-order byte)
 | ||
| vT2CH     .EQU    512*9      ;timer 2 counter (high-order byte)
 | ||
| vSR       .EQU    512*10     ;shift register (keyboard)
 | ||
| vACR      .EQU    512*11     ;auxiliary control register
 | ||
| vPCR      .EQU    512*12     ;peripheral control register
 | ||
| vIFR      .EQU    512*13     ;interrupt flag register
 | ||
| vIER      .EQU    512*14     ;interrupt enable register
 | ||
| vBufA     .EQU    512*15     ;register A
 | ||
| 
 | ||
| ; VIA register A constants
 | ||
| 
 | ||
| vAOut     .EQU    $7F        ;direction register A:  1 bits = outputs
 | ||
| vAInit    .EQU    $7B        ;initial value for vBufA (medium volume)
 | ||
| vSound    .EQU    7          ;sound volume bits
 | ||
| 
 | ||
| ; VIA register A bit numbers
 | ||
| 
 | ||
| vSndPg2   .EQU    3          ;0 = alternate sound buffer
 | ||
| vOverlay  .EQU    4          ;1 = ROM overlay (system startup only)
 | ||
| vHeadSel  .EQU    5          ;disk SEL control line
 | ||
| vPage2    .EQU    6          ;0 = alternate screen buffer
 | ||
| vSCCWReq  .EQU    7          ;SCC wait/request line
 | ||
| 
 | ||
| ; VIA register B constants
 | ||
| 
 | ||
| vBOut     .EQU    $87        ;direction register B:  1 bits = outputs
 | ||
| vBInit    .EQU    $07        ;initial value for vBufB
 | ||
| 
 | ||
| ; VIA register B bit numbers
 | ||
| 
 | ||
| rTCData   .EQU    0          ;real-time clock serial data line
 | ||
| rTCClk    .EQU    1          ;real-time clock data-clock line
 | ||
| rTCEnb    .EQU    2          ;real-time clock serial enable
 | ||
| vSW       .EQU    3          ;0 = mouse button is down
 | ||
| vX2       .EQU    4          ;mouse X quadrature level
 | ||
| vY2       .EQU    5          ;mouse Y quadrature level
 | ||
| vH4       .EQU    6          ;1 = horizontal blanking
 | ||
| vSndEnb   .EQU    7          ;0 = sound enabled, 1 = disabled
 | ||
| 
 | ||
| ; SCC base addresses
 | ||
| 
 | ||
| sccRBase  .EQU    $9FFFF8    ;SCC base read address (in variable SCCRd)
 | ||
| sccWBase  .EQU    $BFFFF9    ;SCC base write address (in variable SCCWr)
 | ||
| 
 | ||
| ; Offsets from SCC base addresses
 | ||
| 
 | ||
| aData     .EQU    6          ;channel A data in or out
 | ||
| aCtl      .EQU    2          ;channel A control
 | ||
| bData     .EQU    4          ;channel B data in or out
 | ||
| bCtl      .EQU    0          ;channel B control
 | ||
| 
 | ||
| ; Bit numbers for control register RR0
 | ||
| 
 | ||
| rxBF      .EQU    0          ;1 = SCC receive buffer full
 | ||
| txBE      .EQU    2          ;1 = SCC send buffer empty
 | ||
| 
 | ||
| ; IWM base address
 | ||
| 
 | ||
| dBase     .EQU    $DFE1FF    ;IWM base address (in variable IWM)
 | ||
| 
 | ||
| ; Offsets from dBase
 | ||
| 
 | ||
| ph0L      .EQU    512*0      ;CA0 off (0)
 | ||
| ph0H      .EQU    512*1      ;CA0 on (1)
 | ||
| ph1L      .EQU    512*2      ;CA1 off (0)
 | ||
| ph1H      .EQU    512*3      ;CA1 on (1)
 | ||
| ph2L      .EQU    512*4      ;CA2 off (0)
 | ||
| ph2H      .EQU    512*5      ;CA2 on (1)
 | ||
| ph3L      .EQU    512*6      ;LSTRB off (low)
 | ||
| ph3H      .EQU    512*7      ;LSTRB on (high)
 | ||
| mtrOff    .EQU    512*8      ;disk enable off
 | ||
| mtrOn     .EQU    512*9      ;disk enable on
 | ||
| intDrive  .EQU    512*10     ;select internal drive
 | ||
| extDrive  .EQU    512*11     ;select external drive
 | ||
| q6L       .EQU    512*12     ;Q6 off
 | ||
| q6H       .EQU    512*13     ;Q6 on
 | ||
| q7L       .EQU    512*14     ;Q7 off
 | ||
| q7H       .EQU    512*15     ;Q7 on
 | ||
| 
 | ||
| ; Screen and sound addresses for 512K Macintosh (will also work
 | ||
| ; for 128K, since addresses wrap)
 | ||
| 
 | ||
| screenLow   .EQU    $7A700    ;top left corner of main screen buffer
 | ||
| soundLow    .EQU    $7FD00    ;main sound buffer (in variable SoundBase)
 | ||
| pwmBuffer   .EQU    $7FD01    ;main disk speed buffer
 | ||
| ovlyRAM     .EQU    $600000   ;RAM start address when overlay is set
 | ||
| ovlyScreen  .EQU    $67A700   ;screen start with overlay set
 | ||
| romStart    .EQU    $400000   ;ROM start address (in variable ROMBase)
 | ||
| 
 | ||
| Constants (Macintosh Plus Only)
 | ||
| 
 | ||
| ; SCSI base addresses
 | ||
| 
 | ||
| scsiRd    .EQU    $580000    ;base address for read operations
 | ||
| scsiWr    .EQU    $580001    ;base address for write operations
 | ||
| 
 | ||
| ; SCSI offsets for DACK
 | ||
| 
 | ||
| dackRd    .EQU    $200       ;for use with sOCR and sIDR
 | ||
| dackWr    .EQU    $200       ;for use with sOCR and sIDR
 | ||
| 
 | ||
| ; SCSI offsets to NCR 5380 register
 | ||
| 
 | ||
| sCDR      .EQU    $00        ;Current SCSI Read Data (read)
 | ||
| sOCR      .EQU    $00        ;Output Data Register (write)
 | ||
| sICR      .EQU    $10        ;Initiator Command Register (read/write)
 | ||
| sMR       .EQU    $20        ;Mode Register (read/write)
 | ||
| sTCR      .EQU    $30        ;Target Command Register (read/write)
 | ||
| sCSR      .EQU    $40        ;Current SCSI Bus Status (read)
 | ||
| sSER      .EQU    $40        ;Select Enable Register (write)
 | ||
| sBSR      .EQU    $50        ;Bus & Status Register (read)
 | ||
| sDMAtx    .EQU    $50        ;DMA Transmit Start (write)
 | ||
| sIDR      .EQU    $60        ;Data input register (read)
 | ||
| sTDMArx   .EQU    $60        ;Start Target DMA receive (write)
 | ||
| sRESET    .EQU    $70        ;Reset Parity/Interrupt (read)
 | ||
| sIDMArx   .EQU    $70        ;Start Initiator DMA receive (write)
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| Variables
 | ||
| 
 | ||
| ROMBase      Base address of ROM
 | ||
| SoundBase    Address of main sound buffer
 | ||
| SCCRd        SCC read base address
 | ||
| SCCWr        SCC write base address
 | ||
| IWM          IWM base address
 | ||
| VIA          VIA base address
 | ||
| 
 | ||
| _______________________________________________________________________________
 | ||
| 
 | ||
| Exception Vectors
 | ||
| 
 | ||
| Location    Purpose
 | ||
| $00         Reset:  initial stack pointer (not a vector)
 | ||
| $04         Reset:  initial vector
 | ||
| $08         Bus error
 | ||
| $0C         Address error
 | ||
| $10         Illegal instruction
 | ||
| $14         Divide by zero
 | ||
| $18         CHK instruction
 | ||
| $1C         TRAPV instruction
 | ||
| $20         Privilege violation
 | ||
| $24         Trace interrupt
 | ||
| $28         Line 1010 emulator
 | ||
| $2C         Line 1111 emulator
 | ||
| $30-$3B     Unassigned (reserved)
 | ||
| $3C         Uninitialized interrupt
 | ||
| $40-$5F     Unassigned (reserved)
 | ||
| $60         Spurious interrupt
 | ||
| $64         VIA interrupt
 | ||
| $68         SCC interrupt
 | ||
| $6C         VIA+SCC vector (temporary)
 | ||
| $70         Interrupt switch
 | ||
| $74         Interrupt switch + VIA
 | ||
| $78         Interrupt switch + SCC
 | ||
| $7C         Interrupt switch + VIA + SCC
 | ||
| $80-$BF     TRAP instructions
 | ||
| $C0-$FF     Unassigned (reserved)
 | ||
| 
 | ||
| Further Reference:
 | ||
| _______________________________________________________________________________
 | ||
| Device Manager
 | ||
| SCSI Manager
 | ||
| Vertical Retrace Manager
 | ||
| "Macintosh Family Hardware Reference"
 | ||
| "Designing Cards and Drivers for the Macintosh II and Macintosh SE"
 | ||
| </pre>
 | ||
| 
 | ||
| <!-- $Id$ -->
 | ||
| 					</td>
 | ||
| 					<td class="borderright"></td>
 | ||
| 				</tr>
 | ||
| 				<tr class="white">
 | ||
| 					<td><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/curve_leftbottom.gif" alt=""></td>
 | ||
| 					<td class="borderbottom"></td>
 | ||
| 					<td><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/curve_rightbottom.gif" alt=""></td>
 | ||
| 				</tr>
 | ||
| 			</tbody></table>
 | ||
| 		</td>
 | ||
| 	</tr>
 | ||
| 	<tr><td colspan="2" height="39">
 | ||
| 		<table class="gray" width="100%" cellspacing="0" cellpadding="0" border="0">
 | ||
| 			<tbody><tr>
 | ||
| 				<td width="96"><a href="http://validator.w3.org/check?uri=referer"><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/valid-html401.png" alt="Valid HTML 4.01 Transitional" width="88" height="31"></a></td>
 | ||
| 				<td width="96"><a href="http://jigsaw.w3.org/css-validator/check/referer"><img style="border:0;width:88px;height:31px" src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/vcss.gif" alt="Valid CSS!"></a></td>
 | ||
| 				<td width="120"><img src="Linux_m68k%20for%20Macintosh%20-%20Mac%20Plus%20hardware_files/sflogo.png" alt="sourceforge.net" width="120" height="30" border="0"></td>
 | ||
| 				<td align="right">Copyright <20> 2000-2020 Linux/m68k for Macintosh Project.</td>
 | ||
| 		</tr></tbody></table>
 | ||
| 	</td></tr>
 | ||
| </tbody></table>
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| </body></html> |