Compare commits

...

10 Commits

Author SHA1 Message Date
Tashtari 453bdf0580
fix Tashtari link 2024-04-04 04:37:51 -06:00
lampmerchant 9c0dab1396 add list of PCBs/products to README 2024-02-28 06:13:02 -07:00
Tashtari 5b2d3ae689
Merge pull request #9 from cheesestraws/RM_internal
Internal
2024-02-28 05:36:43 -07:00
cheesestraws 46dc659a39 remove gerbers (they go in release) 2024-02-28 12:36:11 +00:00
cheesestraws c12417270a Internal 2024-02-28 11:45:52 +00:00
lampmerchant c5566257a7
move DCD documentation to tashnotes 2023-02-21 10:20:05 -07:00
lampmerchant a1b43fa724
note removal of MPASM from MPLAB X 2022-12-01 09:54:29 -07:00
lampmerchant 3af5df9274 20220621 2022-06-21 20:22:42 -06:00
lampmerchant c4f06e0ee2 merge 2022-06-11 13:37:41 -06:00
lampmerchant 9bbf602c8a 20220611 2022-06-11 13:36:08 -06:00
7 changed files with 10361 additions and 445 deletions

100
README.md
View File

@ -16,56 +16,41 @@ Functional, though not rigorously tested.
## Caveats
Due to the dearth of documentation on the DCD protocol (see below), the protocol only implements the commands whose formats are known, namely read, write, and device identification. Responses to other commands are faked. Fortunately, this seems to be enough for the device to function properly, including formatting.
Due to the dearth of documentation on the DCD protocol, the protocol only implements the commands whose formats are known, namely read, write, and device identification. Responses to other commands are faked. Fortunately, this seems to be enough for the device to function properly, including formatting.
The disk drive interface relies on use of the phase lines to read and write one-bit registers. Because the PIC16F1825 firmware mimics the register set in code instead of programmable logic, it has a response time that is, in the worst case, approximately one microsecond. This may interfere with the ability of faster Macs to detect it, though it is not known to do so at this point. The PIC16F1704 firmware mimics the register set in logic and responds in effect instantly.
Certain Macs may have a limitation imposed by their ROM on the number of DCDs they support.
Certain Macs may have a limitation imposed by their ROM on the number of DCDs they support. See [this link](https://github.com/lampmerchant/tashnotes/blob/main/macintosh/floppy/dcd/dcd.md) for details.
### Compatibility
## PCBs and Products
#### Hardware
| Macintosh | PIC16F1825 | PIC16F1704 |
| ---------- | ---------- | ---------- |
| 512k¶ | 4? | 4? |
| 512ke | 4 | 4 |
| Plus | 4 | 4? |
| SE | 2? | 2? |
| Classic | 2? | 2? |
| Portable | 2? | 2? |
| IIci | 2? | 2? |
| IIsi | 2? | 2? |
| LC† | 2? | 2? |
| LC II§ | 2? | 2? |
| IIx†‡ | 2? | 2? |
| IIcx‡ | 2 | 2? |
| SE/30‡ | 2? | 2? |
| Classic II | 2 | 2 |
? Suspected, but not known to have been tested
¶ Requires Hard Disk 20 patch file (often erroneously called the Hard Disk 20 INIT)
§ Requires clipping onto the !ENBL2 pin of the SWIM IC
† Requires use of the secondary internal floppy drive header
‡ Requires use of a nonstandard ROM
#### System Software
| Version | Compatible? |
| ------- | ----------- |
| 6.0.8 | Yes |
| 7.1 | Yes |
| 7.5 | No |
* TashTwenty Tiny by [demik](https://github.com/demik)
* [Files](https://github.com/lampmerchant/tashtwenty/tree/main/pcb/TashTwenty%20Tiny)
* See latest release in this repository for gerbers
* [Buy](https://ko-fi.com/s/2bfee029f5) from [CayMac Vintage](https://ko-fi.com/caymacvintage/shop)
* Buy [PCBs](https://ko-fi.com/s/01a52bed98), [case panels](https://ko-fi.com/s/50199947e3), and [programmed PICs](https://ko-fi.com/s/2b28fb5562) from [Tashtari](https://ko-fi.com/tashtari/shop)
* TashTwenty Internal by [cheesestraws](https://github.com/cheesestraws)
* [Files](https://github.com/lampmerchant/tashtwenty/tree/main/pcb/Internal)
* See latest release in this repository for gerbers
* TashTwenty Rev 3 by [Tashtari](https://github.com/lampmerchant)
* [Files](https://github.com/lampmerchant/tashtwenty/blob/main/pcb/tashtari-tashtwenty.brd)
* See latest release in this repository for gerbers
* TashTwenty Budget Version by [CayMac Vintage](https://ko-fi.com/caymacvintage/shop)
* [Buy](https://ko-fi.com/s/77f53b293e)
* TashTwenty Mega by [warmech](https://68kmla.org/bb/index.php?members/warmech.2497/)
* Pending release
* TashTwenty Vertical by [hideehoo](https://68kmla.org/bb/index.php?members/hideehoo.4611/)
* Pending release
## Technical Details
### Building Firmware
Building the firmware requires Microchip MPASM, which is included with their development environment, MPLAB. Note that you **must** use MPLAB X version 5.35 or earlier or MPLAB 8 as later versions of MPLAB X have removed MPASM.
### MMC Card Format
The MMC card must have an MBR (Master Boot Record) aka DOS-type partition table with up to four primary partitions of type 0xAF (HFS). Extended partitions are not supported.
@ -84,37 +69,4 @@ If the sector is not in this format, the partition will be ignored, in order to
### DCD (Directly Connected Disks) Protocol
#### Details Missing or Inaccurate in the [May 1985 DCD Document](http://bitsavers.trailing-edge.com/pdf/apple/disk/hd20/Directly_Connected_Disks_Specification_1.2a_May85.pdf)
* The sync byte, in either direction, is always 0xAA, 0x96 is not used.
* When Mac is transmitting a command, the sync byte is followed by two more raw IWM bytes before the 7-to-8 groups begin. DCD transmits only a sync byte and does not transmit these extra bytes.
* The first is 0x80 plus the number of 7-to-8 groups in the command being transmitted by Mac.
* The second is 0x80 plus the number of 7-to-8 groups that Mac expects to receive in response.
* The holdoff protocol is completely different than specified.
* In either direction, a holdoff is initiated by Mac transitioning from state 1 to state 0.
* If Mac is transmitting, it will finish the 7-to-8 group that it has begun transmitting. This data is valid.
* If DCD is transmitting, it must finish the 7-to-8 group that it has begun transmitting. This data will be treated by Mac as valid.
* A holdoff is ended by Mac transitioning from state 0 to state 1. There is no negotiation.
* If Mac is transmitting and WR is high at the end of the last byte transmitted before holdoff, it will transition WR from high to low right before transitioning back to state 1.
* Mac will resume transmission with an 0xAA byte, followed by the bytes in the next group after the group where the holdoff began.
* DCD must resume transmission with an 0xAA byte, followed by the bytes in the next group after the group where the holdoff began.
* The Controller Status (command 0x03) block is slightly different than specified.
* The total size of the Controller Status block is 336 bytes, not 532 bytes.
* 336 bytes of data, 6 byte header, checksum byte == 343 bytes == 49 7-to-8 groups
* The Icon field contains a 32x32 icon as a 1-bit bitmap, followed by its 32x32 mask, also as a 1-bit bitmap, for a total of 256 bytes.
* The format of the bitmaps is identical to that of ICON resources.
* The Filler field is replaced by a 16-byte Pascal string (first byte is length) that determines what appears in the "Where:" field of the Get Info dialog box.
* The checksum byte is chosen such that all data bytes in all 7-to-8 groups (not including the sync byte or the command/response length IWM bytes) sum to 0 modulo 256.
#### Details Out of Scope for DCD Documentation But Useful to Know
* The IWM transmits and receives MSB first and the MSB is always set; the chip uses this for timing.
* The IWM transmits at its "fast" speed, 47/96 MHz, or approximately 489.58 Kbps, data cell width 2.043 us.
* The IWM's output (on WR pin) is in NRZI format (inversion == 1, no inversion == 0).
* The IWM's input (on RD pin) detects only falling edges.
#### Beyond
Other details about the protocol at the signal level and the read, write, and controller status commands are accurately reported by the [May 1985 document](http://bitsavers.trailing-edge.com/pdf/apple/disk/hd20/Directly_Connected_Disks_Specification_1.2a_May85.pdf); other commands are unknown to me, but hopefully this information will be useful to anyone in the future who wishes to implement DCD.
See [this link](https://github.com/lampmerchant/tashnotes/tree/main/macintosh/floppy/dcd) for details.

View File

@ -88,12 +88,10 @@ IWMCNT0 equ 0 ; "
;M_FLAGS:
M_FAIL equ 7 ;Set when there's been a failure on the MMC interface
M_CMDLR equ 6 ;Set when R3 or R7 is expected (5 bytes), not R1
M_CMDRB equ 5 ;Set when an R1b is expected (busy signal after reply)
M_RDCMD equ 4 ;Set when state machine should do a read command
M_ONGWR equ 3 ;Set when state machine shouldn't stop tran on a write
M_BKADR equ 2 ;Set when block (rather than byte) addressing is in use
M_CDVER equ 1 ;Set when dealing with a V2.0+ card, clear for 1.0
M_RDCMD equ 6 ;Set when state machine should do a read command
M_ONGWR equ 5 ;Set when state machine shouldn't stop tran on a write
M_BKADR equ 4 ;Set when block (rather than byte) addressing is in use
M_CDVER equ 3 ;Set when dealing with a V2.0+ card, clear for 1.0
;;; Variable Storage ;;;
@ -409,7 +407,7 @@ Init
movwf OPTION_REG
banksel CLCIN0PPS ;CLCIN1=RA2=PH1, CLCIN2=RA3=PH2, CLCIN3=RC5=WR,
movlw B'00000010' ;MISO=RC1, INT=RA5=!ENBL
movlw B'00000010' ;MISO=RC1, SCK=RC0, INT=RA5=!ENBL
movwf CLCIN1PPS
movlw B'00000011'
movwf CLCIN2PPS
@ -417,6 +415,8 @@ Init
movwf CLCIN3PPS
movlw B'00010001'
movwf SSPDATPPS
movlw B'00010000'
movwf SSPCLKPPS
movlw B'00000101'
movwf INTPPS
@ -693,16 +693,13 @@ SysInit
SysIni0 bsf CS_PORT,CS_PIN ;Deassert !CS
movlw 0x51 ;Set up a read command for the card (R1-type
movwf M_CMDN ; response)
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
clrf M_ADR3 ;Point the card address to the master boot
clrf M_ADR2 ; record
clrf M_ADR1 ; "
clrf M_ADR0 ; "
bcf CS_PORT,CS_PIN ;Assert !CS
call MmcCmd ;Send the read command
movf M_CMDN,W ;Treat any error flag as a failed command
andlw B'11111110' ; "
andlw B'11111110' ;Treat any error flag as a failed command
btfss STATUS,Z ; "
bsf M_FLAGS,M_FAIL ; "
movlw 10 ;If the operation failed, give up and pass a
@ -762,16 +759,13 @@ SysIni3 bsf CS_PORT,CS_PIN ;Deassert !CS
bra SysIni4 ; "
movlw 0x51 ;Set up a read command for the card (R1-type
movwf M_CMDN ; response)
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
clrf M_ADR3 ;The rest of the address is all zeroes
clrf M_ADR2 ; "
clrf M_ADR1 ; "
call MmcConvAddr ;Convert address to bytes if necessary
bcf CS_PORT,CS_PIN ;Assert !CS
call MmcCmd ;Send the read command
movf M_CMDN,W ;Treat any error flag as a failed command
andlw B'11111110' ; "
andlw B'11111110' ;Treat any error flag as a failed command
btfss STATUS,Z ; "
bsf M_FLAGS,M_FAIL ; "
movlw 14 ;If the operation failed, give up and pass a
@ -1254,13 +1248,10 @@ CmdWrite
btfsc M_FLAGS,M_ONGWR ;If we're starting a new write even though a
bra CmdWri6 ; multiblock write is ongoing, handle it
movlw 0x59 ;Set up a multiblock write command for the card
movwf M_CMDN ; (R1-type reply)
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
movwf M_CMDN ; (R1-type response)
bcf CS_PORT,CS_PIN ;Assert !CS
call MmcCmd ;Send the command
movf M_CMDN,W ;Treat any error flag as a failed command
andlw B'11111110' ; "
andlw B'11111110' ;Treat any error flag as a failed command
btfss STATUS,Z ; "
bsf M_FLAGS,M_FAIL ; "
btfsc M_FLAGS,M_FAIL ;If there was any failure, respond with a
@ -1635,15 +1626,12 @@ MmcIni1 movlw 0xFF ; "
clrf M_ADR2 ; "
clrf M_ADR1 ; "
clrf M_ADR0 ; "
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
btfsc M_FLAGS,M_FAIL ;If this command failed, unrecognized or
retlw 1 ; missing MMC card, fail the init operation
movf M_CMDN,W ;If this command returned any response other
xorlw 0x01 ; than 0x01 ('in idle state'), unrecognized MMC
btfss STATUS,Z ; card, fail the init operation
retlw 2 ; "
xorlw 0x01 ;If this command returned any response other
btfss STATUS,Z ; than 0x01 ('in idle state'), unrecognized MMC
retlw 2 ; card, fail the init operation
bsf M_FLAGS,M_CDVER ;Assume version 2.0+ to begin with
clrf X2 ;Set retry counter to 0 (65536) for later use
clrf X3 ; "
@ -1655,16 +1643,14 @@ MmcIni1 movlw 0xFF ; "
movwf M_ADR1 ; "
movlw 0xAA ; "
movwf M_ADR0 ; "
bsf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If the command set any error flags or there
andlw B'11111110' ; was no response, switch assumptions and guess
btfsc STATUS,Z ; that we're dealing with a Version 1 card and
btfsc M_FLAGS,M_FAIL ; jump ahead to initialize it
bcf M_FLAGS,M_CDVER ; "
andlw B'11111110' ;If the command set any error flags or there
btfsc STATUS,Z ; was no response, switch assumptions and guess
btfsc M_FLAGS,M_FAIL ; that we're dealing with a Version 1 card and
bcf M_FLAGS,M_CDVER ; jump ahead to initialize it
btfss M_FLAGS,M_CDVER ; "
bra MmcIni2 ; "
call MmcExtResponse ;Command didn't error, so get the R7 response
movf M_ADR1,W ;If the command didn't error, but the lower 12
andlw B'00001111' ; bits of the R7 response are something besides
xorlw 0x01 ; 0x1AA, we're dealing with an unknown card, so
@ -1680,12 +1666,9 @@ MmcIni2 movlw 0x77 ;Send command 55 (expect R1-type response),
clrf M_ADR2 ; "
clrf M_ADR1 ; "
clrf M_ADR0 ; "
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If we got a status with any error bits set,
andlw B'11111110' ; treat as a command failure
btfss STATUS,Z ; "
andlw B'11111110' ;If we got a status with any error bits set,
btfss STATUS,Z ; treat as a command failure
bsf M_FLAGS,M_FAIL ; "
btfsc M_FLAGS,M_FAIL ;If this command fails, this is an unknown card
retlw 4 ; so return the failure to caller
@ -1697,17 +1680,14 @@ MmcIni2 movlw 0x77 ;Send command 55 (expect R1-type response),
clrf M_ADR2 ; TB)
clrf M_ADR1 ; "
clrf M_ADR0 ; "
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If we got a status with any error bits set,
andlw B'11111110' ; treat as a command failure
btfss STATUS,Z ; "
btfsc STATUS,Z ;If it returned an 0x00 status, initialization
bra MmcIni3 ; is finished
andlw B'11111110' ;If we got a status with any error bits set,
btfss STATUS,Z ; treat as a command failure
bsf M_FLAGS,M_FAIL ; "
btfsc M_FLAGS,M_FAIL ;If this command fails, this is an unknown card
retlw 5 ; so return the failure to caller
btfss M_CMDN,0 ;If it returned an 0x00 status, initialization
bra MmcIni3 ; is finished
DELAY 40 ;If it returned an 0x01 status, delay for 120
decfsz X2,F ; cycles (15 us), decrement the retry counter,
bra MmcIni2 ; and try again
@ -1720,14 +1700,12 @@ MmcIni3 movlw 0x7A ;Send command 58 (expect R3-type response) to
clrf M_ADR2 ; "
clrf M_ADR1 ; "
clrf M_ADR0 ; "
bsf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If we got a status with any error bits set,
btfss STATUS,Z ; treat as a command failure
bsf M_FLAGS,M_FAIL ; "
btfss STATUS,Z ;If we got a status with any error bits set,
bsf M_FLAGS,M_FAIL ; treat as a command failure
btfsc M_FLAGS,M_FAIL ;If this command fails, something is wrong, so
retlw 7 ; return the failure to caller
call MmcExtResponse ;Command didn't fail, so get R3 response
bsf M_FLAGS,M_BKADR ;If the card capacity status (CCS) bit of the
btfsc M_ADR3,6 ; OCR is set, we're using block addressing, so
bra MmcIni4 ; skip ahead
@ -1739,12 +1717,9 @@ MmcIni3 movlw 0x7A ;Send command 58 (expect R3-type response) to
movlw 0x02 ; "
movwf M_ADR1 ; "
clrf M_ADR0 ; "
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If this command returned any response other
btfss STATUS,Z ; than 0x00, something is wrong, fail the init
bsf M_FLAGS,M_FAIL ; operation
btfss STATUS,Z ;If this command returned any nonzero response,
bsf M_FLAGS,M_FAIL ; something is wrong, fail the init operation
btfsc M_FLAGS,M_FAIL ;If this command failed, something is wrong,
retlw 8 ; fail the init operation
MmcIni4 movlw 0x7B ;Send command 59 (expect R1-type response) to
@ -1754,12 +1729,9 @@ MmcIni4 movlw 0x7B ;Send command 59 (expect R1-type response) to
clrf M_ADR1 ; "
movlw 0x01 ; "
movwf M_ADR0 ; "
bcf M_FLAGS,M_CMDLR ; "
bcf M_FLAGS,M_CMDRB ; "
call MmcCmd ; "
movf M_CMDN,W ;If this command returned any response other
btfss STATUS,Z ; than 0x00, something is wrong, fail the init
bsf M_FLAGS,M_FAIL ; operation
btfss STATUS,Z ;If this command returned any nonzero response,
bsf M_FLAGS,M_FAIL ; something is wrong, fail the init operation
btfsc M_FLAGS,M_FAIL ;If this command failed, something is wrong,
retlw 9 ; fail the init operation
retlw 0 ;Congratulations, card is initialized!
@ -1806,12 +1778,30 @@ MmcIncAddr
return
;Send the command contained in M_CMDN and M_ADR3-0 to MMC card. Sets M_FAIL on
; fail. Trashes X0 and X1.
; fail. Trashes X0.
MmcCmd
bcf M_FLAGS,M_FAIL ;Assume no failure to start with
clrf X0 ;Start the CRC7 register out at 0
movlp high LutCrc7 ;Point PCLATH to the CRC7 lookup table
movlb 4 ;Switch to the bank with the SSP registers
movf M_CMDN,W ;If this is a CMD0, skip over the ready check
xorlw 0x40 ; as card is not in SPI mode and may not be
btfsc STATUS,Z ; driving the MISO pin
bra MmcCmd1 ; "
movlw 8 ;Make sure the MMC card is ready for a command
movwf X0 ; by clocking up to 8 bytes to get an 0xFF
MmcCmd0 movlw 0xFF ;Clock a byte out of the MMC card while keeping
movwf SSP1BUF ; MOSI high
btfss SSP1STAT,BF ; "
bra $-1 ; "
xorwf SSP1BUF,W ;If we got an 0xFF back from the MMC card, it
btfsc STATUS,Z ; is ready to accept a command
bra MmcCmd1 ; "
decfsz X0,F ;Decrement the attempt counter until we've
bra MmcCmd0 ; tried eight times; if card hasn't responded
bsf M_FLAGS,M_FAIL ; 0xFF by the eighth attempt, signal failure
movlb 0 ;Restore BSR to 0 and return
return ; "
MmcCmd1 clrf X0 ;Start the CRC7 register out at 0
movlp high LutCrc7 ;Point PCLATH to the CRC7 lookup table
movf M_CMDN,W ;Clock out all six MMC buffer bytes as command,
movwf SSP1BUF ; calculating the CRC7 along the way
xorwf X0,W ; "
@ -1856,50 +1846,59 @@ MmcCmd
;TODO for CMD12, it is necessary to clock and throw away a stuff byte?
movlw 8 ;Try to get status as many as eight times
movwf X0 ; "
MmcCmd1 movlw 0xFF ;Clock a byte out of the MMC card while keeping
movf M_CMDN,W ;If this is a CMD0, the bus may not be driven
xorlw 0x40 ; until the first clock, so we may get an all-
btfsc STATUS,Z ; ones response where the MSB reads as 0; set a
bsf X0,7 ; flag so we can respond to that
MmcCmd2 movlw 0xFF ;Clock a byte out of the MMC card while keeping
movwf SSP1BUF ; MOSI high
btfss SSP1STAT,BF ; "
bra $-1 ; "
incf SSP1BUF,W ;If we read back anything but 0xFF, skip ahead
btfss STATUS,Z ; "
bra MmcCmd2 ; "
decfsz X0,F ;Decrement the attempt counter until we've
bra MmcCmd1 ; tried eight times; if we haven't gotten a
bsf M_FLAGS,M_FAIL ; reply by the eighth attempt, signal failure
movlb 0 ; and return
xorwf SSP1BUF,W ;Set Z flag if the received byte is all ones
btfsc X0,7 ;If this is the first byte from a CMD0, ignore
andlw 0x7F ; the MSB when checking for all ones
btfss STATUS,Z ;If the byte read is not all ones, it's a
bra MmcCmd3 ; result, so skip ahead
bcf X0,7 ;Clear the special CMD0 flag if it was set
decfsz X0,F ;Decrement attempt counter; if card hasn't
bra MmcCmd2 ; responded by eighth attempt, signal failure
bsf M_FLAGS,M_FAIL ; "
MmcCmd3 xorlw 0xFF ;Complement W so it reflects the last byte read
btfsc X0,7 ;If we're returning the first byte from a CMD0,
andlw 0x7F ; we should assume that the first bit was a 0
movlb 0 ;Restore BSR to 0 and return
return ; "
MmcCmd2 decf WREG,W ;Store the byte we received as R1-type status
movwf M_CMDN ; in the buffer
btfss M_FLAGS,M_CMDLR ;If we aren't expecting a long (R3/R7-type)
bra MmcCmd3 ; reply, we're done
movlw 0xFF ;Clock first extended reply byte out of the
;Read the extended response of a command returning an R3 or R7 type response
; into M_ADR3-0.
MmcExtResponse
movlb 4 ;Switch to the bank with the SSP registers
movlw 0xFF ;Clock first extended response byte out of the
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
btfss SSP1STAT,BF ; in the buffer
bra $-1 ; "
movf SSP1BUF,W ; "
movwf M_ADR3 ; "
movlw 0xFF ;Clock second extended reply byte out of the
movlw 0xFF ;Clock second extended response byte out of the
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
btfss SSP1STAT,BF ; in the buffer
bra $-1 ; "
movf SSP1BUF,W ; "
movwf M_ADR2 ; "
movlw 0xFF ;Clock third extended reply byte out of the
movlw 0xFF ;Clock third extended response byte out of the
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
btfss SSP1STAT,BF ; in the buffer
bra $-1 ; "
movf SSP1BUF,W ; "
movwf M_ADR1 ; "
movlw 0xFF ;Clock fourth extended reply byte out of the
movlw 0xFF ;Clock fourth extended response byte out of the
movwf SSP1BUF ; MMC card while keeping MOSI high and store it
btfss SSP1STAT,BF ; in the buffer
bra $-1 ; "
movf SSP1BUF,W ; "
movwf M_ADR0 ; "
MmcCmd3 btfsc M_FLAGS,M_CMDRB ;If we're expecting an R1b reply, wait for the
call MmcWaitBusy ; card not to be busy anymore before returning
movlb 0 ;Restore BSR to 0
return
movlb 0 ;Restore BSR to 0 and return
return ; "
;Waits for the card not to be busy anymore. Sets M_FAIL on fail. Trashes X0
; and X1. Expects BSR to be 4 and does not set or reset this.
@ -2124,25 +2123,29 @@ MSSWaitCmd
movlb 0 ;Assert !CS
bcf CS_PORT,CS_PIN ; "
movlb 4 ; "
movlw 0xFF ;Clock first ready-for-command? byte out of the
movwf SSP1BUF ; card
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd1 - MSS ;Transition to the next read command state
MSSRdCmd1
incf SSP1BUF,W ;If card clocked back anything but 0xFF, it's
btfsc STATUS,Z ; not ready for a command, so clock out another
bra $+6 ; byte and try again
movlw 0xFF ; "
movwf SSP1BUF ; "
movlb 0 ; "
bcf PIR1,SSP1IF ; "
retlw MSSRdCmd1 - MSS ; "
movlw 0x51 ;Clock out the command byte for a read
movwf SSP1BUF ; "
movlw 0xE8 ;Set up the CRC register with the CRC7 of the
movwf M_CRCL ; read command byte
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd1 - MSS ;Transition to the next read command state
MSSRdCmd1
movf M_ADR3,W ;Clock out the high byte of the address
movwf SSP1BUF ; "
movlp high LutCrc7 ;Update the CRC for the command
xorwf M_CRCL,W ; "
callw ; "
movwf M_CRCL ; "
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd2 - MSS ;Transition to the next read command state
MSSRdCmd2
movf M_ADR2,W ;Clock out the next byte of the address
movf M_ADR3,W ;Clock out the high byte of the address
movwf SSP1BUF ; "
movlp high LutCrc7 ;Update the CRC for the command
xorwf M_CRCL,W ; "
@ -2152,7 +2155,7 @@ MSSRdCmd2
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd3 - MSS ;Transition to the next read command state
MSSRdCmd3
movf M_ADR1,W ;Clock out the next byte of the address
movf M_ADR2,W ;Clock out the next byte of the address
movwf SSP1BUF ; "
movlp high LutCrc7 ;Update the CRC for the command
xorwf M_CRCL,W ; "
@ -2162,7 +2165,7 @@ MSSRdCmd3
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd4 - MSS ;Transition to the next read command state
MSSRdCmd4
movf M_ADR0,W ;Clock out the low byte of the address
movf M_ADR1,W ;Clock out the next byte of the address
movwf SSP1BUF ; "
movlp high LutCrc7 ;Update the CRC for the command
xorwf M_CRCL,W ; "
@ -2172,26 +2175,36 @@ MSSRdCmd4
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd5 - MSS ;Transition to the next read command state
MSSRdCmd5
movf M_ADR0,W ;Clock out the low byte of the address
movwf SSP1BUF ; "
movlp high LutCrc7 ;Update the CRC for the command
xorwf M_CRCL,W ; "
callw ; "
movwf M_CRCL ; "
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd6 - MSS ;Transition to the next read command state
MSSRdCmd6
movf M_CRCL,W ;Clock out the CRC for the command
movwf SSP1BUF ; "
bcf M_FLAGS,M_RDCMD ;Read command complete, M_ADR* are free
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd6 - MSS ;Transition to the next read command state
MSSRdCmd6
retlw MSSRdCmd7 - MSS ;Transition to the next read command state
MSSRdCmd7
movlw 0xFF ;Clock first is-still-busy? byte out of the
movwf SSP1BUF ; card
movlb 0 ;Clear the SSP interrupt flag because it's in
bcf PIR1,SSP1IF ; use now
retlw MSSRdCmd7 - MSS ; "
MSSRdCmd7
retlw MSSRdCmd8 - MSS ; "
MSSRdCmd8
btfss SSP1BUF,7 ;If MSB is set, this isn't an R1 response byte,
bra $+6 ; so clock out another byte and try again
movlw 0xFF ; "
movwf SSP1BUF ; "
movlb 0 ; "
bcf PIR1,SSP1IF ; "
retlw MSSRdCmd7 - MSS ; "
retlw MSSRdCmd8 - MSS ; "
movf SSP1BUF,W ;If MSB is clear but an error bit is set, the
andlw B'11111110' ; command was not processed, so go back to the
btfsc STATUS,Z ; WaitCmd state after deasserting !CS

25
pcb/Internal/README.md Normal file
View File

@ -0,0 +1,25 @@
# Internal
This is cheesey's board for use of TashTwenty internally to a Plus or a 512ke (as far as I know). It interposes between the IWM and the logic board, and reroutes things so that the back floppy port on the computer still works.
Note that installing this requires the IWM on your Plus/512ke to be socketed! While building the board is easy, desoldering the IWM from the logic board can be an exercise in applied pain, especially if the solder is crunchy. Caveat haxor.
To build it, you will need:
* A 74HCT04, a 74HCT02 and a TashTwenty
* A MCP1700-3302E voltage regulator (other 3.3V regulators might do if the pinout is the same)
* An SD card socket. I used a cheap breakout I got online. Be aware that the Adafruit micro SD breakout boards have a weird pinout and won't work: the pins on this board are in the same order as they are on the surface mount sockets (and thus on the card themselves), please use one with a boring pinout.
* A handful of capacitors, resistors and LEDs.
* A socket for the IWM and some SIL header rows to
The PCB is designed to be easy to build. The component values are marked on the board, I wanted this to feel like a kit to build. Some notes:
* The SIL headers sticking down from the board go into the leftmost set of DIP holes, the socket on top for the IWM (or the IWM soldered if you're feeling really brave) goes on the right. Sorry this is unclear on the board; I couldn't work out how to make it clearer.
* Install the SIL headers before the socket or you will hate your life. Use a DIP socket to hold them in place or you will find that the board won't plug into the DIP socket.
* The LEDs and the resistors next to them (R8-11) are optional. R1-R7 are *not* optional.
* Do check again that your SD card socket pinout is correct
Notes on installation:
* You may wish to use low-profile IC sockets and low-profile SIL pins if you can: mine only just fits under the metal shielding
* Putting a self-adhesive rubber bumper under the board where it hovers over other chips might well help with keeping everything in place.

9956
pcb/Internal/Schematic.pdf Normal file

File diff suppressed because it is too large Load Diff

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

510
pcb/tashtari.brd → pcb/tashtari-tashtwenty.brd Normal file → Executable file
View File

@ -6,7 +6,7 @@
<setting alwaysvectorfont="no"/>
<setting verticaltext="up"/>
</settings>
<grid distance="0.05" unitdist="inch" unit="inch" style="dots" multiple="1" display="yes" altdistance="0.025" altunitdist="inch" altunit="inch"/>
<grid distance="0.05" unitdist="inch" unit="inch" style="dots" multiple="1" display="yes" altdistance="0.0125" altunitdist="inch" altunit="inch"/>
<layers>
<layer number="1" name="Top" color="4" fill="1" visible="yes" active="yes"/>
<layer number="16" name="Bottom" color="1" fill="1" visible="yes" active="yes"/>
@ -38,7 +38,7 @@
<layer number="42" name="bRestrict" color="1" fill="10" visible="yes" active="yes"/>
<layer number="43" name="vRestrict" color="2" fill="10" visible="yes" active="yes"/>
<layer number="44" name="Drills" color="7" fill="1" visible="no" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="no" active="yes"/>
<layer number="45" name="Holes" color="7" fill="1" visible="yes" active="yes"/>
<layer number="46" name="Milling" color="3" fill="1" visible="no" active="yes"/>
<layer number="47" name="Measures" color="7" fill="1" visible="no" active="yes"/>
<layer number="48" name="Document" color="7" fill="1" visible="yes" active="yes"/>
@ -140,12 +140,18 @@
</layers>
<board>
<plain>
<wire x1="0" y1="0" x2="26.035" y2="0" width="0" layer="20"/>
<wire x1="26.035" y1="0" x2="26.035" y2="33.02" width="0" layer="20"/>
<wire x1="26.035" y1="33.02" x2="0" y2="33.02" width="0" layer="20"/>
<wire x1="0" y1="33.02" x2="0" y2="0" width="0" layer="20"/>
<text x="9.525" y="30.48" size="1.778" layer="25" font="vector">TashTwenty</text>
<text x="20.955" y="28.575" size="1.016" layer="25" font="vector">Rev 1</text>
<text x="24.765" y="25.4" size="1.778" layer="25" font="vector" rot="R270">TashTwenty</text>
<text x="15.875" y="10.16" size="1.27" layer="25" font="vector" rot="R90">JLCJLCJLCJLC</text>
<wire x1="0" y1="2.54" x2="2.54" y2="0" width="0" layer="20"/>
<wire x1="2.54" y1="0" x2="25.4" y2="0" width="0" layer="20"/>
<wire x1="25.4" y1="0" x2="27.94" y2="2.54" width="0" layer="20"/>
<wire x1="27.94" y1="2.54" x2="27.94" y2="31.75" width="0" layer="20"/>
<wire x1="27.94" y1="31.75" x2="25.4" y2="34.29" width="0" layer="20"/>
<wire x1="25.4" y1="34.29" x2="2.54" y2="34.29" width="0" layer="20"/>
<wire x1="2.54" y1="34.29" x2="0" y2="31.75" width="0" layer="20"/>
<wire x1="0" y1="31.75" x2="0" y2="2.54" width="0" layer="20"/>
<text x="19.05" y="32.385" size="1.27" layer="25" font="vector">Rev 3</text>
<hole x="25.0825" y="30.1625" drill="2.2"/>
</plain>
<libraries>
<library name="testpad">
@ -163,79 +169,6 @@ new: Attribute TP_SIGNAL_NAME&lt;br&gt;
</package>
</packages>
</library>
<library name="SparkFun-Connectors">
<description>&lt;h3&gt;SparkFun Electronics' preferred foot prints&lt;/h3&gt;
In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.&lt;br&gt;&lt;br&gt;
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
&lt;br&gt;&lt;br&gt;
&lt;b&gt;Licensing:&lt;/b&gt; Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
&lt;br&gt;&lt;br&gt;
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="1X07">
<wire x1="14.605" y1="1.27" x2="15.875" y2="1.27" width="0.2032" layer="21"/>
<wire x1="15.875" y1="1.27" x2="16.51" y2="0.635" width="0.2032" layer="21"/>
<wire x1="16.51" y1="-0.635" x2="15.875" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="11.43" y1="0.635" x2="12.065" y2="1.27" width="0.2032" layer="21"/>
<wire x1="12.065" y1="1.27" x2="13.335" y2="1.27" width="0.2032" layer="21"/>
<wire x1="13.335" y1="1.27" x2="13.97" y2="0.635" width="0.2032" layer="21"/>
<wire x1="13.97" y1="-0.635" x2="13.335" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="13.335" y1="-1.27" x2="12.065" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="12.065" y1="-1.27" x2="11.43" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="14.605" y1="1.27" x2="13.97" y2="0.635" width="0.2032" layer="21"/>
<wire x1="13.97" y1="-0.635" x2="14.605" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="15.875" y1="-1.27" x2="14.605" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="6.985" y1="1.27" x2="8.255" y2="1.27" width="0.2032" layer="21"/>
<wire x1="8.255" y1="1.27" x2="8.89" y2="0.635" width="0.2032" layer="21"/>
<wire x1="8.89" y1="-0.635" x2="8.255" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="8.89" y1="0.635" x2="9.525" y2="1.27" width="0.2032" layer="21"/>
<wire x1="9.525" y1="1.27" x2="10.795" y2="1.27" width="0.2032" layer="21"/>
<wire x1="10.795" y1="1.27" x2="11.43" y2="0.635" width="0.2032" layer="21"/>
<wire x1="11.43" y1="-0.635" x2="10.795" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="10.795" y1="-1.27" x2="9.525" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="9.525" y1="-1.27" x2="8.89" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="3.81" y1="0.635" x2="4.445" y2="1.27" width="0.2032" layer="21"/>
<wire x1="4.445" y1="1.27" x2="5.715" y2="1.27" width="0.2032" layer="21"/>
<wire x1="5.715" y1="1.27" x2="6.35" y2="0.635" width="0.2032" layer="21"/>
<wire x1="6.35" y1="-0.635" x2="5.715" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="5.715" y1="-1.27" x2="4.445" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="4.445" y1="-1.27" x2="3.81" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="6.985" y1="1.27" x2="6.35" y2="0.635" width="0.2032" layer="21"/>
<wire x1="6.35" y1="-0.635" x2="6.985" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="8.255" y1="-1.27" x2="6.985" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="-0.635" y1="1.27" x2="0.635" y2="1.27" width="0.2032" layer="21"/>
<wire x1="0.635" y1="1.27" x2="1.27" y2="0.635" width="0.2032" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="1.27" y1="0.635" x2="1.905" y2="1.27" width="0.2032" layer="21"/>
<wire x1="1.905" y1="1.27" x2="3.175" y2="1.27" width="0.2032" layer="21"/>
<wire x1="3.175" y1="1.27" x2="3.81" y2="0.635" width="0.2032" layer="21"/>
<wire x1="3.81" y1="-0.635" x2="3.175" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="3.175" y1="-1.27" x2="1.905" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="1.905" y1="-1.27" x2="1.27" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-1.27" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="-0.635" y1="1.27" x2="-1.27" y2="0.635" width="0.2032" layer="21"/>
<wire x1="-1.27" y1="-0.635" x2="-0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="0.635" y1="-1.27" x2="-0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="16.51" y1="0.635" x2="16.51" y2="-0.635" width="0.2032" layer="21"/>
<pad name="1" x="0" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="2" x="2.54" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="3" x="5.08" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="4" x="7.62" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="5" x="10.16" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="6" x="12.7" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="7" x="15.24" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<text x="-1.3462" y="1.8288" size="1.27" layer="25" ratio="10">&gt;NAME</text>
<text x="-1.27" y="-3.175" size="1.27" layer="27">&gt;VALUE</text>
<rectangle x1="14.986" y1="-0.254" x2="15.494" y2="0.254" layer="51"/>
<rectangle x1="12.446" y1="-0.254" x2="12.954" y2="0.254" layer="51"/>
<rectangle x1="9.906" y1="-0.254" x2="10.414" y2="0.254" layer="51"/>
<rectangle x1="7.366" y1="-0.254" x2="7.874" y2="0.254" layer="51"/>
<rectangle x1="4.826" y1="-0.254" x2="5.334" y2="0.254" layer="51"/>
<rectangle x1="2.286" y1="-0.254" x2="2.794" y2="0.254" layer="51"/>
<rectangle x1="-0.254" y1="-0.254" x2="0.254" y2="0.254" layer="51"/>
</package>
</packages>
</library>
<library name="SparkFun-Capacitors">
<description>&lt;h3&gt;SparkFun Electronics' preferred foot prints&lt;/h3&gt;
In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.&lt;br&gt;&lt;br&gt;
@ -304,7 +237,88 @@ You are welcome to use this library for commercial purposes. For attribution, we
</package>
</packages>
</library>
<library name="SparkFun-Passives">
<library name="SparkFun-Connectors">
<description>&lt;h3&gt;SparkFun Electronics' preferred foot prints&lt;/h3&gt;
In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.&lt;br&gt;&lt;br&gt;
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
&lt;br&gt;&lt;br&gt;
&lt;b&gt;Licensing:&lt;/b&gt; Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/
&lt;br&gt;&lt;br&gt;
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="1X08">
<wire x1="14.605" y1="1.27" x2="15.875" y2="1.27" width="0.2032" layer="21"/>
<wire x1="15.875" y1="1.27" x2="16.51" y2="0.635" width="0.2032" layer="21"/>
<wire x1="16.51" y1="-0.635" x2="15.875" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="11.43" y1="0.635" x2="12.065" y2="1.27" width="0.2032" layer="21"/>
<wire x1="12.065" y1="1.27" x2="13.335" y2="1.27" width="0.2032" layer="21"/>
<wire x1="13.335" y1="1.27" x2="13.97" y2="0.635" width="0.2032" layer="21"/>
<wire x1="13.97" y1="-0.635" x2="13.335" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="13.335" y1="-1.27" x2="12.065" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="12.065" y1="-1.27" x2="11.43" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="14.605" y1="1.27" x2="13.97" y2="0.635" width="0.2032" layer="21"/>
<wire x1="13.97" y1="-0.635" x2="14.605" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="15.875" y1="-1.27" x2="14.605" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="6.985" y1="1.27" x2="8.255" y2="1.27" width="0.2032" layer="21"/>
<wire x1="8.255" y1="1.27" x2="8.89" y2="0.635" width="0.2032" layer="21"/>
<wire x1="8.89" y1="-0.635" x2="8.255" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="8.89" y1="0.635" x2="9.525" y2="1.27" width="0.2032" layer="21"/>
<wire x1="9.525" y1="1.27" x2="10.795" y2="1.27" width="0.2032" layer="21"/>
<wire x1="10.795" y1="1.27" x2="11.43" y2="0.635" width="0.2032" layer="21"/>
<wire x1="11.43" y1="-0.635" x2="10.795" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="10.795" y1="-1.27" x2="9.525" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="9.525" y1="-1.27" x2="8.89" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="3.81" y1="0.635" x2="4.445" y2="1.27" width="0.2032" layer="21"/>
<wire x1="4.445" y1="1.27" x2="5.715" y2="1.27" width="0.2032" layer="21"/>
<wire x1="5.715" y1="1.27" x2="6.35" y2="0.635" width="0.2032" layer="21"/>
<wire x1="6.35" y1="-0.635" x2="5.715" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="5.715" y1="-1.27" x2="4.445" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="4.445" y1="-1.27" x2="3.81" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="6.985" y1="1.27" x2="6.35" y2="0.635" width="0.2032" layer="21"/>
<wire x1="6.35" y1="-0.635" x2="6.985" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="8.255" y1="-1.27" x2="6.985" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="-0.635" y1="1.27" x2="0.635" y2="1.27" width="0.2032" layer="21"/>
<wire x1="0.635" y1="1.27" x2="1.27" y2="0.635" width="0.2032" layer="21"/>
<wire x1="1.27" y1="-0.635" x2="0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="1.27" y1="0.635" x2="1.905" y2="1.27" width="0.2032" layer="21"/>
<wire x1="1.905" y1="1.27" x2="3.175" y2="1.27" width="0.2032" layer="21"/>
<wire x1="3.175" y1="1.27" x2="3.81" y2="0.635" width="0.2032" layer="21"/>
<wire x1="3.81" y1="-0.635" x2="3.175" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="3.175" y1="-1.27" x2="1.905" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="1.905" y1="-1.27" x2="1.27" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="-1.27" y1="0.635" x2="-1.27" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="-0.635" y1="1.27" x2="-1.27" y2="0.635" width="0.2032" layer="21"/>
<wire x1="-1.27" y1="-0.635" x2="-0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="0.635" y1="-1.27" x2="-0.635" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="17.145" y1="1.27" x2="18.415" y2="1.27" width="0.2032" layer="21"/>
<wire x1="18.415" y1="1.27" x2="19.05" y2="0.635" width="0.2032" layer="21"/>
<wire x1="19.05" y1="0.635" x2="19.05" y2="-0.635" width="0.2032" layer="21"/>
<wire x1="19.05" y1="-0.635" x2="18.415" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="17.145" y1="1.27" x2="16.51" y2="0.635" width="0.2032" layer="21"/>
<wire x1="16.51" y1="-0.635" x2="17.145" y2="-1.27" width="0.2032" layer="21"/>
<wire x1="18.415" y1="-1.27" x2="17.145" y2="-1.27" width="0.2032" layer="21"/>
<pad name="1" x="0" y="0" drill="1.016" diameter="1.8796" shape="square" rot="R90"/>
<pad name="2" x="2.54" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="3" x="5.08" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="4" x="7.62" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="5" x="10.16" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="6" x="12.7" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="7" x="15.24" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<pad name="8" x="17.78" y="0" drill="1.016" diameter="1.8796" rot="R90"/>
<text x="-1.3462" y="1.8288" size="1.27" layer="25" ratio="10">&gt;NAME</text>
<text x="-1.27" y="-3.175" size="1.27" layer="27">&gt;VALUE</text>
<rectangle x1="14.986" y1="-0.254" x2="15.494" y2="0.254" layer="51"/>
<rectangle x1="12.446" y1="-0.254" x2="12.954" y2="0.254" layer="51"/>
<rectangle x1="9.906" y1="-0.254" x2="10.414" y2="0.254" layer="51"/>
<rectangle x1="7.366" y1="-0.254" x2="7.874" y2="0.254" layer="51"/>
<rectangle x1="4.826" y1="-0.254" x2="5.334" y2="0.254" layer="51"/>
<rectangle x1="2.286" y1="-0.254" x2="2.794" y2="0.254" layer="51"/>
<rectangle x1="-0.254" y1="-0.254" x2="0.254" y2="0.254" layer="51"/>
<rectangle x1="17.526" y1="-0.254" x2="18.034" y2="0.254" layer="51"/>
</package>
</packages>
</library>
<library name="SparkFun-Resistors">
<description>&lt;h3&gt;SparkFun Electronics' preferred foot prints&lt;/h3&gt;
In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.&lt;br&gt;&lt;br&gt;
We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com.
@ -313,18 +327,19 @@ We've spent an enormous amount of time creating and checking these footprints an
&lt;br&gt;&lt;br&gt;
You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage.</description>
<packages>
<package name="AXIAL-0.4">
<description>1/4W Resistor, 0.4" wide&lt;p&gt;
Yageo CFR series &lt;a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf"&gt;http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf&lt;/a&gt;</description>
<wire x1="-3.15" y1="-1.2" x2="-3.15" y2="1.2" width="0.2032" layer="21"/>
<wire x1="-3.15" y1="1.2" x2="3.15" y2="1.2" width="0.2032" layer="21"/>
<wire x1="3.15" y1="1.2" x2="3.15" y2="-1.2" width="0.2032" layer="21"/>
<wire x1="3.15" y1="-1.2" x2="-3.15" y2="-1.2" width="0.2032" layer="21"/>
<pad name="P$1" x="-5.08" y="0" drill="0.9" diameter="1.8796"/>
<pad name="P$2" x="5.08" y="0" drill="0.9" diameter="1.8796"/>
<text x="-3.175" y="1.905" size="0.8128" layer="25" font="vector" ratio="15">&gt;Name</text>
<text x="-2.286" y="-0.381" size="0.8128" layer="21" font="vector" ratio="15">&gt;Value</text>
<package name="AXIAL-0.3">
<wire x1="-2.54" y1="0.762" x2="2.54" y2="0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0.762" x2="2.54" y2="0" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0" x2="2.54" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="-0.762" x2="-2.54" y2="-0.762" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="-0.762" x2="-2.54" y2="0" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="0" x2="-2.54" y2="0.762" width="0.2032" layer="21"/>
<wire x1="2.54" y1="0" x2="2.794" y2="0" width="0.2032" layer="21"/>
<wire x1="-2.54" y1="0" x2="-2.794" y2="0" width="0.2032" layer="21"/>
<pad name="P$1" x="-3.81" y="0" drill="0.9" diameter="1.8796"/>
<pad name="P$2" x="3.81" y="0" drill="0.9" diameter="1.8796"/>
<text x="-2.54" y="1.27" size="0.4064" layer="25" font="vector">&gt;Name</text>
<text x="-2.032" y="-0.381" size="1.016" layer="21" font="vector" ratio="15">&gt;Value</text>
</package>
</packages>
</library>
@ -510,144 +525,104 @@ Please make sure your boards conform to these design rules.</description>
</pass>
</autorouter>
<elements>
<element name="E$1" library="testpad" package="TP20SQ" value="" x="2.65" y="26" smashed="yes">
<attribute name="VALUE" x="1.634" y="24.857" size="0.0254" layer="27"/>
<element name="E$3" library="testpad" package="TP20SQ" value="" x="2.76" y="29.395" smashed="yes">
<attribute name="VALUE" x="1.744" y="28.252" size="0.0254" layer="27"/>
</element>
<element name="E$2" library="testpad" package="TP20SQ" value="" x="2.65" y="28.76" smashed="yes">
<attribute name="VALUE" x="1.634" y="27.617" size="0.0254" layer="27"/>
<element name="E$4" library="testpad" package="TP20SQ" value="" x="4.14" y="29.395" smashed="yes">
<attribute name="VALUE" x="3.124" y="28.252" size="0.0254" layer="27"/>
</element>
<element name="E$3" library="testpad" package="TP20SQ" value="" x="4.03" y="28.76" smashed="yes">
<attribute name="VALUE" x="3.014" y="27.617" size="0.0254" layer="27"/>
<element name="E$8" library="testpad" package="TP20SQ" value="" x="2.76" y="21.115" smashed="yes">
<attribute name="VALUE" x="1.744" y="19.972" size="0.0254" layer="27"/>
</element>
<element name="E$4" library="testpad" package="TP20SQ" value="" x="5.41" y="28.76" smashed="yes">
<attribute name="VALUE" x="4.394" y="27.617" size="0.0254" layer="27"/>
<element name="E$9" library="testpad" package="TP20SQ" value="" x="4.14" y="21.115" smashed="yes">
<attribute name="VALUE" x="3.124" y="19.972" size="0.0254" layer="27"/>
</element>
<element name="E$5" library="testpad" package="TP20SQ" value="" x="2.65" y="23.24" smashed="yes">
<attribute name="VALUE" x="1.634" y="22.097" size="0.0254" layer="27"/>
<element name="E$10" library="testpad" package="TP20SQ" value="" x="2.76" y="26.635" smashed="yes">
<attribute name="VALUE" x="1.744" y="25.492" size="0.0254" layer="27"/>
</element>
<element name="E$6" library="testpad" package="TP20SQ" value="" x="2.65" y="20.48" smashed="yes">
<attribute name="VALUE" x="1.634" y="19.337" size="0.0254" layer="27"/>
<element name="E$11" library="testpad" package="TP20SQ" value="" x="4.14" y="26.635" smashed="yes">
<attribute name="VALUE" x="3.124" y="25.492" size="0.0254" layer="27"/>
</element>
<element name="E$7" library="testpad" package="TP20SQ" value="" x="2.65" y="14.96" smashed="yes">
<attribute name="VALUE" x="1.634" y="13.817" size="0.0254" layer="27"/>
<element name="E$12" library="testpad" package="TP20SQ" value="" x="2.76" y="23.875" smashed="yes">
<attribute name="VALUE" x="1.744" y="22.732" size="0.0254" layer="27"/>
</element>
<element name="E$8" library="testpad" package="TP20SQ" value="" x="4.03" y="20.48" smashed="yes">
<attribute name="VALUE" x="3.014" y="19.337" size="0.0254" layer="27"/>
<element name="E$13" library="testpad" package="TP20SQ" value="" x="4.14" y="23.875" smashed="yes">
<attribute name="VALUE" x="3.124" y="22.732" size="0.0254" layer="27"/>
</element>
<element name="E$9" library="testpad" package="TP20SQ" value="" x="5.41" y="20.48" smashed="yes">
<attribute name="VALUE" x="4.394" y="19.337" size="0.0254" layer="27"/>
<element name="E$14" library="testpad" package="TP20SQ" value="" x="4.14" y="15.595" smashed="yes">
<attribute name="VALUE" x="3.124" y="14.452" size="0.0254" layer="27"/>
</element>
<element name="E$10" library="testpad" package="TP20SQ" value="" x="4.03" y="26" smashed="yes">
<attribute name="VALUE" x="3.014" y="24.857" size="0.0254" layer="27"/>
<element name="E$15" library="testpad" package="TP20SQ" value="" x="2.76" y="15.595" smashed="yes">
<attribute name="VALUE" x="1.744" y="14.452" size="0.0254" layer="27"/>
</element>
<element name="E$11" library="testpad" package="TP20SQ" value="" x="5.41" y="26" smashed="yes">
<attribute name="VALUE" x="4.394" y="24.857" size="0.0254" layer="27"/>
<element name="E$18" library="testpad" package="TP20SQ" value="" x="2.76" y="28.015" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="26.872" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$12" library="testpad" package="TP20SQ" value="" x="4.03" y="23.24" smashed="yes">
<attribute name="VALUE" x="3.014" y="22.097" size="0.0254" layer="27"/>
<element name="E$19" library="testpad" package="TP20SQ" value="" x="4.14" y="28.015" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="26.872" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$13" library="testpad" package="TP20SQ" value="" x="5.41" y="23.24" smashed="yes">
<attribute name="VALUE" x="4.394" y="22.097" size="0.0254" layer="27"/>
<element name="E$21" library="testpad" package="TP20SQ" value="" x="2.76" y="25.255" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="24.112" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$14" library="testpad" package="TP20SQ" value="" x="5.41" y="14.96" smashed="yes">
<attribute name="VALUE" x="4.394" y="13.817" size="0.0254" layer="27"/>
<element name="E$22" library="testpad" package="TP20SQ" value="" x="4.14" y="25.255" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="24.112" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$15" library="testpad" package="TP20SQ" value="" x="4.03" y="14.96" smashed="yes">
<attribute name="VALUE" x="3.014" y="13.817" size="0.0254" layer="27"/>
<element name="E$24" library="testpad" package="TP20SQ" value="" x="2.76" y="22.495" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="21.352" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$16" library="testpad" package="TP20SQ" value="" x="2.65" y="10.82" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="9.677" size="0.0254" layer="28" rot="MR0"/>
<element name="E$25" library="testpad" package="TP20SQ" value="" x="4.14" y="22.495" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="21.352" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$17" library="testpad" package="TP20SQ" value="" x="2.65" y="27.38" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="26.237" size="0.0254" layer="28" rot="MR0"/>
<element name="E$27" library="testpad" package="TP20SQ" value="" x="2.76" y="19.735" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="18.592" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$18" library="testpad" package="TP20SQ" value="" x="4.03" y="27.38" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="26.237" size="0.0254" layer="28" rot="MR0"/>
<element name="E$28" library="testpad" package="TP20SQ" value="" x="4.14" y="19.735" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="18.592" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$19" library="testpad" package="TP20SQ" value="" x="5.41" y="27.38" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="26.237" size="0.0254" layer="28" rot="MR0"/>
<element name="E$31" library="testpad" package="TP20SQ" value="" x="2.76" y="5.935" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="4.792" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$20" library="testpad" package="TP20SQ" value="" x="2.65" y="24.62" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="23.477" size="0.0254" layer="28" rot="MR0"/>
<element name="E$32" library="testpad" package="TP20SQ" value="" x="4.14" y="5.935" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="4.792" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$21" library="testpad" package="TP20SQ" value="" x="4.03" y="24.62" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="23.477" size="0.0254" layer="28" rot="MR0"/>
<element name="E$33" library="testpad" package="TP20SQ" value="" x="2.76" y="8.695" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="7.552" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$22" library="testpad" package="TP20SQ" value="" x="5.41" y="24.62" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="23.477" size="0.0254" layer="28" rot="MR0"/>
<element name="E$34" library="testpad" package="TP20SQ" value="" x="4.14" y="8.695" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="7.552" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$23" library="testpad" package="TP20SQ" value="" x="2.65" y="21.86" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="20.717" size="0.0254" layer="28" rot="MR0"/>
<element name="E$35" library="testpad" package="TP20SQ" value="" x="4.14" y="11.455" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.156" y="10.312" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$24" library="testpad" package="TP20SQ" value="" x="4.03" y="21.86" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="20.717" size="0.0254" layer="28" rot="MR0"/>
<element name="E$36" library="testpad" package="TP20SQ" value="" x="2.76" y="11.455" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.776" y="10.312" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$25" library="testpad" package="TP20SQ" value="" x="5.41" y="21.86" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="20.717" size="0.0254" layer="28" rot="MR0"/>
<element name="E$39" library="SparkFun-Capacitors" package="CPOL-RADIAL-10UF-25V" value="" x="15.24" y="30.48" smashed="yes" rot="R180">
<attribute name="VALUE" x="17.145" y="34.163" size="0.8128" layer="27" rot="R180"/>
</element>
<element name="E$26" library="testpad" package="TP20SQ" value="" x="2.65" y="19.1" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="17.957" size="0.0254" layer="28" rot="MR0"/>
<element name="E$37" library="SparkFun-DigitalIC" package="DIL14" value="" x="15.24" y="15.875" smashed="yes" rot="R270">
<attribute name="VALUE" x="13.462" y="22.225" size="1.27" layer="27" ratio="10" rot="R270"/>
</element>
<element name="E$27" library="testpad" package="TP20SQ" value="" x="4.03" y="19.1" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="17.957" size="0.0254" layer="28" rot="MR0"/>
<element name="E$38" library="SparkFun-Connectors" package="1X08" value="" x="6.35" y="2.2225" smashed="yes">
<attribute name="VALUE" x="5.08" y="-0.9525" size="1.27" layer="27"/>
</element>
<element name="E$28" library="testpad" package="TP20SQ" value="" x="5.41" y="19.1" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="17.957" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$29" library="testpad" package="TP20SQ" value="" x="2.65" y="8.06" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="6.917" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$30" library="testpad" package="TP20SQ" value="" x="2.65" y="5.3" smashed="yes" rot="MR0">
<attribute name="VALUE" x="3.666" y="4.157" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$31" library="testpad" package="TP20SQ" value="" x="4.03" y="5.3" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="4.157" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$32" library="testpad" package="TP20SQ" value="" x="5.41" y="5.3" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="4.157" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$33" library="testpad" package="TP20SQ" value="" x="4.03" y="8.06" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="6.917" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$34" library="testpad" package="TP20SQ" value="" x="5.41" y="8.06" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="6.917" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$35" library="testpad" package="TP20SQ" value="" x="5.41" y="10.82" smashed="yes" rot="MR0">
<attribute name="VALUE" x="6.426" y="9.677" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$36" library="testpad" package="TP20SQ" value="" x="4.03" y="10.82" smashed="yes" rot="MR0">
<attribute name="VALUE" x="5.046" y="9.677" size="0.0254" layer="28" rot="MR0"/>
</element>
<element name="E$38" library="SparkFun-Connectors" package="1X07" value="" x="8.89" y="4.445" smashed="yes">
<attribute name="VALUE" x="7.62" y="1.27" size="1.27" layer="27"/>
</element>
<element name="E$39" library="SparkFun-Capacitors" package="CPOL-RADIAL-10UF-25V" value="" x="17.78" y="27.305" smashed="yes" rot="R180">
<attribute name="VALUE" x="19.685" y="30.988" size="0.8128" layer="27" rot="R180"/>
</element>
<element name="E$37" library="SparkFun-DigitalIC" package="DIL14" value="" x="17.78" y="14.605" smashed="yes" rot="R270">
<attribute name="VALUE" x="16.002" y="20.955" size="1.27" layer="27" ratio="10" rot="R270"/>
</element>
<element name="E$40" library="SparkFun-Passives" package="AXIAL-0.4" value="" x="13.97" y="1.5875" smashed="yes">
<attribute name="VALUE" x="11.684" y="1.2065" size="0.8128" layer="21" font="vector" ratio="15"/>
<element name="E$40" library="SparkFun-Resistors" package="AXIAL-0.3" value="" x="12.7" y="5.3975" smashed="yes">
<attribute name="VALUE" x="10.668" y="5.0165" size="1.016" layer="21" font="vector" ratio="15"/>
</element>
</elements>
<signals>
<signal name="S$1">
<contactref element="E$14" pad="TP"/>
<contactref element="E$39" pad="1"/>
<contactref element="E$38" pad="1"/>
<contactref element="E$37" pad="1"/>
<wire x1="13.97" y1="23.495" x2="15.875" y2="23.495" width="0.8128" layer="1"/>
<wire x1="15.875" y1="23.495" x2="16.51" y2="24.13" width="0.8128" layer="1"/>
<wire x1="16.51" y1="24.13" x2="16.51" y2="27.305" width="0.8128" layer="1"/>
<wire x1="13.97" y1="23.495" x2="10.795" y2="23.495" width="0.8128" layer="1"/>
<wire x1="10.795" y1="23.495" x2="8.89" y2="21.59" width="0.8128" layer="1"/>
<wire x1="8.89" y1="21.59" x2="8.89" y2="15.24" width="0.8128" layer="1"/>
<wire x1="8.89" y1="15.24" x2="8.89" y2="4.445" width="0.8128" layer="1"/>
<wire x1="5.41" y1="14.96" x2="8.61" y2="14.96" width="0.8128" layer="1"/>
<wire x1="8.61" y1="14.96" x2="8.89" y2="15.24" width="0.8128" layer="1"/>
<contactref element="E$40" pad="P$1"/>
<wire x1="8.89" y1="4.445" x2="8.89" y2="1.5875" width="0.8128" layer="1"/>
<wire x1="4.14" y1="15.595" x2="6.07" y2="15.595" width="0.8128" layer="1"/>
<wire x1="6.07" y1="15.595" x2="6.35" y2="15.875" width="0.8128" layer="1"/>
<contactref element="E$38" pad="1"/>
<wire x1="6.35" y1="2.2225" x2="6.35" y2="15.875" width="0.8128" layer="1"/>
<wire x1="6.35" y1="15.875" x2="6.35" y2="19.685" width="0.8128" layer="1"/>
<wire x1="6.35" y1="19.685" x2="11.43" y2="24.765" width="0.8128" layer="1"/>
<wire x1="13.97" y1="30.48" x2="13.97" y2="27.305" width="0.8128" layer="16"/>
<wire x1="13.97" y1="27.305" x2="11.43" y2="24.765" width="0.8128" layer="16"/>
</signal>
<signal name="S$2">
<contactref element="E$13" pad="TP"/>
@ -655,120 +630,115 @@ Please make sure your boards conform to these design rules.</description>
<contactref element="E$11" pad="TP"/>
<contactref element="E$4" pad="TP"/>
<contactref element="E$39" pad="2"/>
<contactref element="E$38" pad="7"/>
<contactref element="E$37" pad="14"/>
<wire x1="5.41" y1="20.48" x2="5.41" y2="23.24" width="1.27" layer="1"/>
<wire x1="5.41" y1="23.24" x2="5.41" y2="26" width="1.27" layer="1"/>
<wire x1="5.41" y1="26" x2="5.41" y2="28.76" width="1.27" layer="1"/>
<wire x1="5.41" y1="28.76" x2="7.17" y2="28.76" width="0.8128" layer="1"/>
<wire x1="7.17" y1="28.76" x2="7.62" y2="29.21" width="0.8128" layer="1"/>
<wire x1="7.62" y1="29.21" x2="18.415" y2="29.21" width="0.8128" layer="1"/>
<wire x1="18.415" y1="29.21" x2="19.05" y2="28.575" width="0.8128" layer="1"/>
<wire x1="19.05" y1="28.575" x2="19.05" y2="27.305" width="0.8128" layer="1"/>
<wire x1="19.05" y1="27.305" x2="20.955" y2="27.305" width="0.8128" layer="1"/>
<wire x1="20.955" y1="27.305" x2="21.59" y2="26.67" width="0.8128" layer="1"/>
<wire x1="21.59" y1="26.67" x2="21.59" y2="23.495" width="0.8128" layer="1"/>
<wire x1="21.59" y1="23.495" x2="23.495" y2="23.495" width="0.8128" layer="1"/>
<wire x1="23.495" y1="23.495" x2="24.13" y2="22.86" width="0.8128" layer="1"/>
<wire x1="24.13" y1="22.86" x2="24.13" y2="4.445" width="0.8128" layer="1"/>
<wire x1="4.14" y1="21.115" x2="4.14" y2="23.875" width="1.27" layer="1"/>
<wire x1="4.14" y1="23.875" x2="4.14" y2="26.635" width="1.27" layer="1"/>
<wire x1="4.14" y1="26.635" x2="4.14" y2="29.395" width="1.27" layer="1"/>
<contactref element="E$38" pad="3"/>
<wire x1="4.14" y1="29.395" x2="9.34" y2="29.395" width="0.8128" layer="1"/>
<wire x1="9.34" y1="29.395" x2="11.43" y2="27.305" width="0.8128" layer="1"/>
<wire x1="11.43" y1="27.305" x2="16.51" y2="27.305" width="0.8128" layer="1"/>
<wire x1="16.51" y1="27.305" x2="19.05" y2="24.765" width="0.8128" layer="1"/>
<wire x1="16.51" y1="27.305" x2="16.51" y2="30.48" width="0.8128" layer="1"/>
<wire x1="11.43" y1="2.2225" x2="11.43" y2="6.35" width="0.8128" layer="1"/>
<wire x1="11.43" y1="6.35" x2="13.97" y2="8.89" width="0.8128" layer="1"/>
<wire x1="13.97" y1="8.89" x2="13.97" y2="19.685" width="0.8128" layer="1"/>
<wire x1="13.97" y1="19.685" x2="19.05" y2="24.765" width="0.8128" layer="1"/>
</signal>
<signal name="S$3">
<contactref element="E$38" pad="2"/>
<contactref element="E$37" pad="7"/>
<wire x1="11.43" y1="4.445" x2="11.43" y2="5.715" width="0.4064" layer="16"/>
<wire x1="11.43" y1="5.715" x2="13.97" y2="8.255" width="0.4064" layer="16"/>
<contactref element="E$38" pad="7"/>
<wire x1="11.43" y1="9.525" x2="13.335" y2="7.62" width="0.4064" layer="16"/>
<wire x1="13.335" y1="7.62" x2="18.415" y2="7.62" width="0.4064" layer="16"/>
<wire x1="18.415" y1="7.62" x2="21.59" y2="4.445" width="0.4064" layer="16"/>
<wire x1="21.59" y1="4.445" x2="21.59" y2="2.2225" width="0.4064" layer="16"/>
</signal>
<signal name="S$4">
<contactref element="E$38" pad="3"/>
<contactref element="E$37" pad="8"/>
<wire x1="13.97" y1="4.445" x2="13.97" y2="5.08" width="0.4064" layer="1"/>
<wire x1="13.97" y1="5.08" x2="15.24" y2="6.35" width="0.4064" layer="1"/>
<wire x1="15.24" y1="6.35" x2="19.685" y2="6.35" width="0.4064" layer="1"/>
<wire x1="19.685" y1="6.35" x2="21.59" y2="8.255" width="0.4064" layer="1"/>
<contactref element="E$38" pad="6"/>
<wire x1="19.05" y1="2.2225" x2="19.05" y2="9.525" width="0.4064" layer="1"/>
</signal>
<signal name="S$5">
<contactref element="E$38" pad="4"/>
<contactref element="E$37" pad="10"/>
<wire x1="16.51" y1="4.445" x2="16.51" y2="10.16" width="0.4064" layer="16"/>
<wire x1="16.51" y1="10.16" x2="19.685" y2="13.335" width="0.4064" layer="16"/>
<wire x1="19.685" y1="13.335" x2="21.59" y2="13.335" width="0.4064" layer="16"/>
<contactref element="E$38" pad="4"/>
<wire x1="13.97" y1="2.2225" x2="13.97" y2="5.715" width="0.4064" layer="1"/>
<wire x1="13.97" y1="5.715" x2="15.24" y2="6.985" width="0.4064" layer="1"/>
<wire x1="15.24" y1="6.985" x2="15.24" y2="10.795" width="0.4064" layer="1"/>
<wire x1="15.24" y1="10.795" x2="19.05" y2="14.605" width="0.4064" layer="1"/>
</signal>
<signal name="S$6">
<contactref element="E$38" pad="5"/>
<contactref element="E$37" pad="9"/>
<wire x1="19.05" y1="4.445" x2="19.05" y2="10.16" width="0.4064" layer="16"/>
<wire x1="19.05" y1="10.16" x2="19.685" y2="10.795" width="0.4064" layer="16"/>
<wire x1="19.685" y1="10.795" x2="21.59" y2="10.795" width="0.4064" layer="16"/>
<contactref element="E$38" pad="5"/>
<wire x1="16.51" y1="9.525" x2="19.05" y2="12.065" width="0.4064" layer="1"/>
<contactref element="E$40" pad="P$2"/>
<wire x1="19.05" y1="4.445" x2="19.05" y2="1.5875" width="0.4064" layer="16"/>
<wire x1="16.51" y1="9.525" x2="16.51" y2="5.3975" width="0.4064" layer="1"/>
<wire x1="16.51" y1="5.3975" x2="16.51" y2="2.2225" width="0.4064" layer="1"/>
</signal>
<signal name="S$7">
<contactref element="E$32" pad="TP"/>
<contactref element="E$37" pad="5"/>
<wire x1="1.27" y1="12.7" x2="6.985" y2="12.7" width="0.4064" layer="16"/>
<wire x1="6.985" y1="12.7" x2="7.62" y2="13.335" width="0.4064" layer="16"/>
<wire x1="7.62" y1="13.335" x2="13.97" y2="13.335" width="0.4064" layer="16"/>
<wire x1="1.27" y1="12.7" x2="0.9525" y2="12.3825" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="12.3825" x2="0.9525" y2="5.715" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="5.715" x2="1.27" y2="5.3975" width="0.4064" layer="16"/>
<wire x1="1.27" y1="5.3975" x2="5.3125" y2="5.3975" width="0.4064" layer="16"/>
<wire x1="5.3125" y1="5.3975" x2="5.41" y2="5.3" width="0.4064" layer="16"/>
<wire x1="1.27" y1="13.335" x2="0.9525" y2="13.0175" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="13.0175" x2="0.9525" y2="6.35" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="6.35" x2="1.27" y2="6.0325" width="0.4064" layer="16"/>
<wire x1="1.27" y1="6.0325" x2="4.0425" y2="6.0325" width="0.4064" layer="16"/>
<wire x1="4.0425" y1="6.0325" x2="4.14" y2="5.935" width="0.4064" layer="16"/>
<wire x1="1.27" y1="13.335" x2="10.16" y2="13.335" width="0.4064" layer="16"/>
<wire x1="10.16" y1="13.335" x2="11.43" y2="14.605" width="0.4064" layer="16"/>
</signal>
<signal name="S$8">
<contactref element="E$34" pad="TP"/>
<contactref element="E$37" pad="6"/>
<wire x1="5.41" y1="8.06" x2="10.6" y2="8.06" width="0.4064" layer="16"/>
<wire x1="10.6" y1="8.06" x2="13.335" y2="10.795" width="0.4064" layer="16"/>
<wire x1="13.335" y1="10.795" x2="13.97" y2="10.795" width="0.4064" layer="16"/>
<wire x1="4.14" y1="8.695" x2="8.06" y2="8.695" width="0.4064" layer="16"/>
<wire x1="8.06" y1="8.695" x2="11.43" y2="12.065" width="0.4064" layer="16"/>
</signal>
<signal name="S$9">
<contactref element="E$35" pad="TP"/>
<contactref element="E$37" pad="2"/>
<wire x1="13.97" y1="20.955" x2="12.065" y2="20.955" width="0.4064" layer="1"/>
<wire x1="12.065" y1="20.955" x2="11.43" y2="20.32" width="0.4064" layer="1"/>
<wire x1="5.41" y1="10.82" x2="10.82" y2="10.82" width="0.4064" layer="16"/>
<wire x1="10.82" y1="10.82" x2="11.43" y2="11.43" width="0.4064" layer="16"/>
<via x="11.43" y="11.43" extent="1-16" drill="0.6"/>
<wire x1="11.43" y1="11.43" x2="11.43" y2="20.32" width="0.4064" layer="1"/>
<wire x1="4.14" y1="11.455" x2="8.28" y2="11.455" width="0.4064" layer="16"/>
<wire x1="8.28" y1="11.455" x2="8.89" y2="12.065" width="0.4064" layer="16"/>
<via x="8.89" y="12.065" extent="1-16" drill="0.6"/>
<wire x1="8.89" y1="12.065" x2="8.89" y2="19.685" width="0.4064" layer="1"/>
<wire x1="8.89" y1="19.685" x2="11.43" y2="22.225" width="0.4064" layer="1"/>
</signal>
<signal name="S$10">
<contactref element="E$28" pad="TP"/>
<contactref element="E$37" pad="3"/>
<wire x1="13.97" y1="18.415" x2="9.525" y2="18.415" width="0.4064" layer="16"/>
<wire x1="9.525" y1="18.415" x2="8.89" y2="19.05" width="0.4064" layer="16"/>
<wire x1="8.89" y1="19.05" x2="5.46" y2="19.05" width="0.4064" layer="16"/>
<wire x1="5.46" y1="19.05" x2="5.41" y2="19.1" width="0.4064" layer="16"/>
<wire x1="4.19" y1="19.685" x2="4.14" y2="19.735" width="0.4064" layer="16"/>
<wire x1="11.43" y1="19.685" x2="4.19" y2="19.685" width="0.4064" layer="16"/>
</signal>
<signal name="S$11">
<contactref element="E$25" pad="TP"/>
<contactref element="E$37" pad="4"/>
<wire x1="13.97" y1="15.875" x2="9.525" y2="15.875" width="0.4064" layer="16"/>
<wire x1="9.525" y1="15.875" x2="8.255" y2="17.145" width="0.4064" layer="16"/>
<wire x1="8.255" y1="17.145" x2="1.27" y2="17.145" width="0.4064" layer="16"/>
<wire x1="5.14" y1="21.59" x2="5.41" y2="21.86" width="0.4064" layer="16"/>
<wire x1="1.27" y1="17.145" x2="0.9525" y2="17.4625" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="17.4625" x2="0.9525" y2="21.59" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="21.59" x2="1.27" y2="21.9075" width="0.4064" layer="16"/>
<wire x1="1.27" y1="21.9075" x2="5.3625" y2="21.9075" width="0.4064" layer="16"/>
<wire x1="5.3625" y1="21.9075" x2="5.41" y2="21.86" width="0.4064" layer="16"/>
<wire x1="5.715" y1="17.78" x2="1.27" y2="17.78" width="0.4064" layer="16"/>
<wire x1="3.87" y1="22.225" x2="4.14" y2="22.495" width="0.4064" layer="16"/>
<wire x1="1.27" y1="17.78" x2="0.9525" y2="18.0975" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="18.0975" x2="0.9525" y2="22.225" width="0.4064" layer="16"/>
<wire x1="0.9525" y1="22.225" x2="1.27" y2="22.5425" width="0.4064" layer="16"/>
<wire x1="1.27" y1="22.5425" x2="4.0925" y2="22.5425" width="0.4064" layer="16"/>
<wire x1="4.0925" y1="22.5425" x2="4.14" y2="22.495" width="0.4064" layer="16"/>
<wire x1="11.43" y1="17.145" x2="6.35" y2="17.145" width="0.4064" layer="16"/>
<wire x1="6.35" y1="17.145" x2="5.715" y2="17.78" width="0.4064" layer="16"/>
</signal>
<signal name="S$12">
<contactref element="E$22" pad="TP"/>
<contactref element="E$37" pad="11"/>
<wire x1="12.065" y1="19.685" x2="17.78" y2="19.685" width="0.4064" layer="16"/>
<wire x1="17.78" y1="19.685" x2="21.59" y2="15.875" width="0.4064" layer="16"/>
<wire x1="12.065" y1="19.685" x2="6.985" y2="24.765" width="0.4064" layer="16"/>
<wire x1="6.985" y1="24.765" x2="5.555" y2="24.765" width="0.4064" layer="16"/>
<wire x1="5.555" y1="24.765" x2="5.41" y2="24.62" width="0.4064" layer="16"/>
<wire x1="19.05" y1="17.145" x2="15.24" y2="20.955" width="0.4064" layer="16"/>
<wire x1="4.14" y1="25.255" x2="5.86" y2="25.255" width="0.4064" layer="16"/>
<wire x1="15.24" y1="20.955" x2="10.16" y2="20.955" width="0.4064" layer="16"/>
<wire x1="10.16" y1="20.955" x2="5.86" y2="25.255" width="0.4064" layer="16"/>
</signal>
<signal name="S$13">
<contactref element="E$19" pad="TP"/>
<contactref element="E$37" pad="12"/>
<wire x1="12.065" y1="22.225" x2="17.78" y2="22.225" width="0.4064" layer="16"/>
<wire x1="17.78" y1="22.225" x2="21.59" y2="18.415" width="0.4064" layer="16"/>
<wire x1="12.065" y1="22.225" x2="6.985" y2="27.305" width="0.4064" layer="16"/>
<wire x1="6.985" y1="27.305" x2="5.485" y2="27.305" width="0.4064" layer="16"/>
<wire x1="5.485" y1="27.305" x2="5.41" y2="27.38" width="0.4064" layer="16"/>
<wire x1="19.05" y1="19.685" x2="15.24" y2="23.495" width="0.4064" layer="16"/>
<wire x1="4.14" y1="28.015" x2="5.64" y2="28.015" width="0.4064" layer="16"/>
<wire x1="15.24" y1="23.495" x2="10.16" y2="23.495" width="0.4064" layer="16"/>
<wire x1="10.16" y1="23.495" x2="5.64" y2="28.015" width="0.4064" layer="16"/>
</signal>
<signal name="S$14">
<contactref element="E$40" pad="P$1"/>
<contactref element="E$38" pad="2"/>
<wire x1="8.89" y1="5.3975" x2="8.89" y2="2.2225" width="0.4064" layer="1"/>
</signal>
</signals>
</board>