Initial commit
This commit is contained in:
commit
4ce5af75c2
|
@ -0,0 +1,129 @@
|
||||||
|
CC0 1.0 Universal
|
||||||
|
|
||||||
|
Statement of Purpose
|
||||||
|
|
||||||
|
The laws of most jurisdictions throughout the world automatically
|
||||||
|
confer exclusive Copyright and Related Rights (defined below) upon the
|
||||||
|
creator and subsequent owner(s) (each and all, an "owner") of an
|
||||||
|
original work of authorship and/or a database (each, a "Work").
|
||||||
|
|
||||||
|
Certain owners wish to permanently relinquish those rights to a Work
|
||||||
|
for the purpose of contributing to a commons of creative, cultural and
|
||||||
|
scientific works ("Commons") that the public can reliably and without
|
||||||
|
fear of later claims of infringement build upon, modify, incorporate
|
||||||
|
in other works, reuse and redistribute as freely as possible in any
|
||||||
|
form whatsoever and for any purposes, including without limitation
|
||||||
|
commercial purposes. These owners may contribute to the Commons to
|
||||||
|
promote the ideal of a free culture and the further production of
|
||||||
|
creative, cultural and scientific works, or to gain reputation or
|
||||||
|
greater distribution for their Work in part through the use and
|
||||||
|
efforts of others.
|
||||||
|
|
||||||
|
For these and/or other purposes and motivations, and without any
|
||||||
|
expectation of additional consideration or compensation, the person
|
||||||
|
associating CC0 with a Work (the "Affirmer"), to the extent that he or
|
||||||
|
she is an owner of Copyright and Related Rights in the Work,
|
||||||
|
voluntarily elects to apply CC0 to the Work and publicly distribute
|
||||||
|
the Work under its terms, with knowledge of his or her Copyright and
|
||||||
|
Related Rights in the Work and the meaning and intended legal effect
|
||||||
|
of CC0 on those rights.
|
||||||
|
|
||||||
|
1. Copyright and Related Rights. A Work made available under CC0 may
|
||||||
|
be protected by copyright and related or neighboring rights
|
||||||
|
("Copyright and Related Rights"). Copyright and Related Rights
|
||||||
|
include, but are not limited to, the following:
|
||||||
|
|
||||||
|
i. the right to reproduce, adapt, distribute, perform, display,
|
||||||
|
communicate, and translate a Work;
|
||||||
|
|
||||||
|
ii. moral rights retained by the original author(s) and/or
|
||||||
|
performer(s);
|
||||||
|
|
||||||
|
iii. publicity and privacy rights pertaining to a person's image or
|
||||||
|
likeness depicted in a Work;
|
||||||
|
|
||||||
|
iv. rights protecting against unfair competition in regards to a Work,
|
||||||
|
subject to the limitations in paragraph 4(a), below;
|
||||||
|
|
||||||
|
v. rights protecting the extraction, dissemination, use and reuse of
|
||||||
|
data in a Work;
|
||||||
|
|
||||||
|
vi. database rights (such as those arising under Directive 96/9/EC of
|
||||||
|
the European Parliament and of the Council of 11 March 1996 on the
|
||||||
|
legal protection of databases, and under any national
|
||||||
|
implementation thereof, including any amended or successor version
|
||||||
|
of such directive); and
|
||||||
|
|
||||||
|
vii. other similar, equivalent or corresponding rights throughout the
|
||||||
|
world based on applicable law or treaty, and any national
|
||||||
|
implementations thereof.
|
||||||
|
|
||||||
|
2. Waiver. To the greatest extent permitted by, but not in
|
||||||
|
contravention of, applicable law, Affirmer hereby overtly, fully,
|
||||||
|
permanently, irrevocably and unconditionally waives, abandons, and
|
||||||
|
surrenders all of Affirmer's Copyright and Related Rights and
|
||||||
|
associated claims and causes of action, whether now known or unknown
|
||||||
|
(including existing as well as future claims and causes of action), in
|
||||||
|
the Work (i) in all territories worldwide, (ii) for the maximum
|
||||||
|
duration provided by applicable law or treaty (including future time
|
||||||
|
extensions), (iii) in any current or future medium and for any number
|
||||||
|
of copies, and (iv) for any purpose whatsoever, including without
|
||||||
|
limitation commercial, advertising or promotional purposes (the
|
||||||
|
"Waiver"). Affirmer makes the Waiver for the benefit of each member of
|
||||||
|
the public at large and to the detriment of Affirmer's heirs and
|
||||||
|
successors, fully intending that such Waiver shall not be subject to
|
||||||
|
revocation, rescission, cancellation, termination, or any other legal
|
||||||
|
or equitable action to disrupt the quiet enjoyment of the Work by the
|
||||||
|
public as contemplated by Affirmer's express Statement of Purpose.
|
||||||
|
|
||||||
|
3. Public License Fallback. Should any part of the Waiver for any
|
||||||
|
reason be judged legally invalid or ineffective under applicable law,
|
||||||
|
then the Waiver shall be preserved to the maximum extent permitted
|
||||||
|
taking into account Affirmer's express Statement of Purpose. In
|
||||||
|
addition, to the extent the Waiver is so judged Affirmer hereby grants
|
||||||
|
to each affected person a royalty-free, non transferable, non
|
||||||
|
sublicensable, non exclusive, irrevocable and unconditional license to
|
||||||
|
exercise Affirmer's Copyright and Related Rights in the Work (i) in
|
||||||
|
all territories worldwide, (ii) for the maximum duration provided by
|
||||||
|
applicable law or treaty (including future time extensions), (iii) in
|
||||||
|
any current or future medium and for any number of copies, and (iv)
|
||||||
|
for any purpose whatsoever, including without limitation commercial,
|
||||||
|
advertising or promotional purposes (the "License"). The License shall
|
||||||
|
be deemed effective as of the date CC0 was applied by Affirmer to the
|
||||||
|
Work. Should any part of the License for any reason be judged legally
|
||||||
|
invalid or ineffective under applicable law, such partial invalidity
|
||||||
|
or ineffectiveness shall not invalidate the remainder of the License,
|
||||||
|
and in such case Affirmer hereby affirms that he or she will not (i)
|
||||||
|
exercise any of his or her remaining Copyright and Related Rights in
|
||||||
|
the Work or (ii) assert any associated claims and causes of action
|
||||||
|
with respect to the Work, in either case contrary to Affirmer's
|
||||||
|
express Statement of Purpose.
|
||||||
|
|
||||||
|
4. Limitations and Disclaimers.
|
||||||
|
|
||||||
|
a. No trademark or patent rights held by Affirmer are waived,
|
||||||
|
abandoned, surrendered, licensed or otherwise affected by this
|
||||||
|
document.
|
||||||
|
|
||||||
|
b. Affirmer offers the Work as-is and makes no representations or
|
||||||
|
warranties of any kind concerning the Work, express, implied,
|
||||||
|
statutory or otherwise, including without limitation warranties
|
||||||
|
of title, merchantability, fitness for a particular purpose, non
|
||||||
|
infringement, or the absence of latent or other defects,
|
||||||
|
accuracy, or the present or absence of errors, whether or not
|
||||||
|
discoverable, all to the greatest extent permissible under
|
||||||
|
applicable law.
|
||||||
|
|
||||||
|
c. Affirmer disclaims responsibility for clearing rights of other
|
||||||
|
persons that may apply to the Work or any use thereof, including
|
||||||
|
without limitation any person's Copyright and Related Rights in
|
||||||
|
the Work. Further, Affirmer disclaims responsibility for
|
||||||
|
obtaining any necessary consents, permissions or other rights
|
||||||
|
required for any use of the Work.
|
||||||
|
|
||||||
|
d. Affirmer understands and acknowledges that Creative Commons is
|
||||||
|
not a party to this document and has no duty or obligation with
|
||||||
|
respect to this CC0 or use of the Work.
|
||||||
|
|
||||||
|
For more information, please see
|
||||||
|
<http://creativecommons.org/publicdomain/zero/1.0/>
|
|
@ -0,0 +1,64 @@
|
||||||
|
# Macintosh SE Hardware
|
||||||
|
|
||||||
|
This is my effort to assemble all the pertinent hardware design
|
||||||
|
information on the Macintosh SE into a single coherent information
|
||||||
|
repository. The goal is to be able to have sufficiently detailed
|
||||||
|
information to, in theory, reproduce an identical (or nearly so)
|
||||||
|
physical, functional copy of the Macintosh SE.
|
||||||
|
|
||||||
|
However, my primary interest in having this information available is
|
||||||
|
to have detailed information for studying the Macintosh SE hardware,
|
||||||
|
and for maintaining existing Macintosh SE computers.
|
||||||
|
|
||||||
|
Conventional Macintosh emulator software prioritizes access to
|
||||||
|
application software without regard to the mechanical and electrical
|
||||||
|
design of the actual machine itself. My hope is that this repository
|
||||||
|
of information will enable the same kind of virtual access to the
|
||||||
|
hardware as we have to the vintage Macintosh software through the use
|
||||||
|
of conventional Macintosh emulators.
|
||||||
|
|
||||||
|
## What is currently available?
|
||||||
|
|
||||||
|
Currently, this repository only contains a vector graphics hand
|
||||||
|
trace-over of page 1 of the Macintosh SE Main Logic Board (MLB)
|
||||||
|
schematics. Typed text is used for all legible text. Since pages 2
|
||||||
|
and 3 of the MLB schematics are missing and nowhere to be found on the
|
||||||
|
Internet, they will have to be redrawn from the reverse engineered
|
||||||
|
printed circuit board layout.
|
||||||
|
|
||||||
|
Follow this link to [jump to the redrawn
|
||||||
|
schematic](old_artifacts/schems/retrace_se_mlb_p1.pdf).
|
||||||
|
|
||||||
|
There are lots of other independent projects with good pieces of
|
||||||
|
information out and about on the Macintosh SE. For the time being,
|
||||||
|
these are linked from documentation in the repository. In the event
|
||||||
|
the project has a potentially insecure future or lacks a durable
|
||||||
|
storage location, the pertinent information is copied into this
|
||||||
|
repository.
|
||||||
|
|
||||||
|
## See also
|
||||||
|
|
||||||
|
Check out the GitHub repository repository with redrawn schematics for
|
||||||
|
the Macintosh SE/30:
|
||||||
|
|
||||||
|
https://github.com/mishimasensei/macse30mlb
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
Since a primary goal of this project is to assemble historic
|
||||||
|
information into a coherent repository, as much as possible, new
|
||||||
|
developments are released into the public domain. After all, as is
|
||||||
|
well understood in the vintage computing community, all patents and
|
||||||
|
copyrights are destined to eventually expire with the passing of
|
||||||
|
enough time, at which point the covered works cede into the public
|
||||||
|
domain.
|
||||||
|
|
||||||
|
Therefore, if you don't have an interest in exercising any exclusive
|
||||||
|
rights covered under copyright, you might as well simply declare your
|
||||||
|
works to enter the public domain early, rather than using a permissive
|
||||||
|
license or a copyleft license. For example, the CERN Open Hardware
|
||||||
|
Licence.
|
||||||
|
|
||||||
|
In the event that your jurisdiction does not have the concept of the
|
||||||
|
public domain, the Creative Commons Public Domain Dedication License
|
||||||
|
(CC0) is used as a fallback permissive license.
|
|
@ -0,0 +1,7 @@
|
||||||
|
# Recap project links and info
|
||||||
|
|
||||||
|
Here is a list of links to various Macintosh SE recapping projects.
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
https://recapamac.com.au/macintosh-se/
|
|
@ -0,0 +1,28 @@
|
||||||
|
# Macintosh SE Internal CRT Replacement
|
||||||
|
|
||||||
|
Got a Macintosh SE with a non-functional CRT? No worries, there is
|
||||||
|
actually an easy workaround to get video on your Macintosh SE!
|
||||||
|
|
||||||
|
The CRT is controlled by 3 digital output signals:
|
||||||
|
|
||||||
|
* `VIDOUT`
|
||||||
|
* `*HSYNC`
|
||||||
|
* `*VSYNC`
|
||||||
|
|
||||||
|
These are all 5 V logic signals. Therefore, they can be packed up
|
||||||
|
into a DB-9 connector for TTL or ECL video. Commercially available
|
||||||
|
flat panel displays are avaiable with adapter electronics that can
|
||||||
|
accept TTL or ECL video, since it apparently became very popular in
|
||||||
|
specialized industrial equipment. Once you've got your monitor and
|
||||||
|
connectors all set up, you should be good to go.
|
||||||
|
|
||||||
|
* Visited 2020-08-06:
|
||||||
|
https://allpinouts.org/pinouts/connectors/computer_video/ecl-video/
|
||||||
|
* Visited 2020-08-06:
|
||||||
|
https://allpinouts.org/pinouts/connectors/computer_video/monochrome-ttl/
|
||||||
|
|
||||||
|
It might be relevant that ECL stands for "Emitter Coupled Logic" in
|
||||||
|
other contexts, here is a source for reference.
|
||||||
|
|
||||||
|
* Visited 2020-08-06:
|
||||||
|
https://technobyte.org/logic-families-ttl-cmos-ecl-bicmos-difference/
|
|
@ -0,0 +1,4 @@
|
||||||
|
# firmware
|
||||||
|
|
||||||
|
This directory contains firmware images required for the various ROM
|
||||||
|
chips in the hardware design.
|
|
@ -0,0 +1,4 @@
|
||||||
|
# adb
|
||||||
|
|
||||||
|
This directory contains the firmware for the ADB (Apple Desktop Bus)
|
||||||
|
chip, which is actually an Apple-branded PIC16CR54 microcontroller.
|
|
@ -0,0 +1,9 @@
|
||||||
|
# rom
|
||||||
|
|
||||||
|
This directory can contain ROM dumps of the Macintosh SE's main system
|
||||||
|
firmware boot ROM that is directly accessible to the CPU. However,
|
||||||
|
due to their uncertain copyright status, they are currently not
|
||||||
|
included in the repository.
|
||||||
|
|
||||||
|
Additionally, links to other projects to provide a modern replacement
|
||||||
|
ROM for the Macintosh SE are also provided here.
|
|
@ -0,0 +1,206 @@
|
||||||
|
#include <avr/wdt.h>
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
#include <EEPROM.h>
|
||||||
|
|
||||||
|
/****************************************
|
||||||
|
* *
|
||||||
|
* A drop-in replacement for the custom *
|
||||||
|
* RTC chip in early Apple Macintosh *
|
||||||
|
* computers, using an ATtiny85. *
|
||||||
|
* Uses an external 32.768kHz crystal *
|
||||||
|
* on pins 2 and 3 as a clock source. *
|
||||||
|
* __ __ *
|
||||||
|
* 1SEC -|1 \/ 8|- VCC *
|
||||||
|
* XTAL2 -|2 7|- RTC.CLK *
|
||||||
|
* XTAL1 -|3 6|- RTC.DATA *
|
||||||
|
* GND -|4____5|- !RTC *
|
||||||
|
* *
|
||||||
|
****************************************/
|
||||||
|
|
||||||
|
const int ONE_SEC_PIN = 1; // A 1Hz square wave on PB5
|
||||||
|
const int RTC_ENABLE_PIN = 5; // Active low chip enable on PB0
|
||||||
|
const int SERIAL_DATA_PIN = 6; // Bi-directional serial data line on PB1
|
||||||
|
const int SERIAL_CLOCK_PIN = 7; // Serial clock input on PB2
|
||||||
|
|
||||||
|
const int PRAM_SIZE = 256; // Mac Plus used the xPRAM chip with 256 bytes, time is a separate 4 additional bytes
|
||||||
|
//const int PRAM_SIZE = 20; // Models earlier than the Plus had 20 bytes of PRAM
|
||||||
|
|
||||||
|
volatile byte serialBitNum = 0;
|
||||||
|
volatile byte address = 0;
|
||||||
|
volatile byte serialData = 0;
|
||||||
|
|
||||||
|
|
||||||
|
enum SerialStateType { SERIAL_DISABLED, RECEIVING_COMMAND, SENDING_DATA, RECEIVING_DATA };
|
||||||
|
volatile SerialStateType serialState = SERIAL_DISABLED;
|
||||||
|
|
||||||
|
volatile unsigned long seconds = 0;
|
||||||
|
volatile byte pram[PRAM_SIZE] = {}; // 256 Bytes of PRAM, the first four of which count the number of seconds since 1/1/1904
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The following is potential locations of various bits of PRAM data, none of this is in any way certain:
|
||||||
|
* Sound volume is in pram[0x08]
|
||||||
|
* Alert sound is in param[0x7c - 0x7d]
|
||||||
|
* Machine location and timezone is in pram[0xE4 - 0xEF]
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* An interrupt to both increment the seconds counter and generate the square wave
|
||||||
|
*/
|
||||||
|
void halfSecondInterrupt() {
|
||||||
|
PINB = 1<<PINB0; // Flip the one-second pin
|
||||||
|
if(!(PINB & (1<<PINB0))) { // If the one-second pin is low
|
||||||
|
seconds++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The actual serial communication can be done in the main loop, this way the clock still gets incremented
|
||||||
|
*/
|
||||||
|
void handleRTCEnableInterrupt() {
|
||||||
|
serialBitNum = 0;
|
||||||
|
address = 0;
|
||||||
|
serialData = 0;
|
||||||
|
if(!(PINB&(1<<RTC_ENABLE_PIN))){ // Simulates a falling interrupt
|
||||||
|
serialState = RECEIVING_COMMAND;
|
||||||
|
// enableRTC = true;
|
||||||
|
} else { // Simulates a rising interrupt
|
||||||
|
clearState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void clearState() {
|
||||||
|
DDRB &= ~(1<<DDB1); // Return the pin to input mode
|
||||||
|
PORTB |= (1<<PORTB1); // Set pullup resistor
|
||||||
|
serialState = SERIAL_DISABLED;
|
||||||
|
serialBitNum = 0;
|
||||||
|
address = 0;
|
||||||
|
serialData = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The ATtiny has EEPROM, lets use it to store the contents of PRAM in case of power failure,
|
||||||
|
* this is an improvement over the original, still a good idea to keep the chip powered by a
|
||||||
|
* battery or supercapacitor so that the clock continues to advance.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void savePRAM() {
|
||||||
|
noInterrupts(); // Don't update the seconds counter while we're saving it to ROM, probably unnecessary
|
||||||
|
for(int i = 0; i < 4; i++) {
|
||||||
|
EEPROM.update(i,(seconds>>(8*i))&0xff);
|
||||||
|
}
|
||||||
|
interrupts(); // Go ahead and interrupt us while we save the rest
|
||||||
|
for(int i = 0; i < PRAM_SIZE; i++) {
|
||||||
|
EEPROM.update(i+4,pram[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void goToSleep() {
|
||||||
|
bitClear(MCUCR,SM0); // The two SM bits must be set to 00 to enter idle mode
|
||||||
|
bitClear(MCUCR,SM1); // Sleeping in other modes will disable the timer
|
||||||
|
bitSet(MCUCR,SE);
|
||||||
|
__asm__("sleep" "\n\t");
|
||||||
|
bitClear(MCUCR,SE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup() {
|
||||||
|
noInterrupts(); // Disable interrupts while we set things up
|
||||||
|
|
||||||
|
pinMode(ONE_SEC_PIN, OUTPUT); // The 1Hz square wave (used, I think, for interrupts elsewhere in the system)
|
||||||
|
pinMode(RTC_ENABLE_PIN, INPUT_PULLUP); // The processor pulls this pin low when it wants access
|
||||||
|
pinMode(SERIAL_CLOCK_PIN, INPUT_PULLUP); // The serial clock is driven by the processor
|
||||||
|
pinMode(SERIAL_DATA_PIN, INPUT_PULLUP); // We'll need to switch this to output when sending data
|
||||||
|
|
||||||
|
wdt_disable(); // Disable watchdog
|
||||||
|
bitSet(ACSR,ACD); // Disable Analog Comparator, don't need it, saves power
|
||||||
|
bitSet(PRR,PRTIM1); // Disable Timer 1, only using Timer 0, Timer 1 uses around ten times as much current
|
||||||
|
bitSet(PRR,PRUSI); // Disable Universal Serial Interface, using Apple's RTC serial interface on pins 6 and 7
|
||||||
|
bitSet(PRR,PRADC); // Disable Analog/Digital Converter
|
||||||
|
|
||||||
|
bitSet(GIMSK,PCIE); // Pin Change Interrupt Enable
|
||||||
|
bitSet(PCMSK,PCINT0); // turn on RTC enable interrupt
|
||||||
|
|
||||||
|
// for(int i = 0; i < 4; i++) {
|
||||||
|
// seconds += ((unsigned long)EEPROM.read(i))<<(8*i);
|
||||||
|
// }
|
||||||
|
// for(int i = 0; i < PRAM_SIZE; i--) { // Preload PRAM with saved values
|
||||||
|
// pram[i] = EEPROM.read(i+4);
|
||||||
|
// }
|
||||||
|
|
||||||
|
//set up timer
|
||||||
|
bitSet(GTCCR,TSM); // Turns off timers while we set it up
|
||||||
|
bitSet(TIMSK,TOIE0); // Set Timer/Counter0 Overflow Interrupt Enable
|
||||||
|
TCCR0B = 0b111; // Set prescaler, 32,768Hz/64 = 512Hz, fills up the 8-bit counter (256) once every half second
|
||||||
|
TCNT0 = 0; // Clear the counter
|
||||||
|
bitClear(GTCCR,TSM); // Turns timers back on
|
||||||
|
|
||||||
|
interrupts(); //We're done setting up, enable those interrupts again
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
if(digitalRead(RTC_ENABLE_PIN)) {
|
||||||
|
clearState();
|
||||||
|
goToSleep();
|
||||||
|
} else if(digitalRead(SERIAL_CLOCK_PIN)) {
|
||||||
|
switch(serialState) {
|
||||||
|
|
||||||
|
case RECEIVING_COMMAND:
|
||||||
|
bitWrite(address,7-serialBitNum,digitalRead(SERIAL_DATA_PIN));
|
||||||
|
serialBitNum++;
|
||||||
|
if(serialBitNum > 7) {
|
||||||
|
boolean writeRequest = address&(1<<7); // the MSB determines if it's a write request or not
|
||||||
|
address &= ~(1<<7); // Discard the first bit, it's not part of the address
|
||||||
|
serialBitNum = 0;
|
||||||
|
if(writeRequest) {
|
||||||
|
serialState = RECEIVING_DATA;
|
||||||
|
serialBitNum = 0;
|
||||||
|
} else {
|
||||||
|
if (address < 4) {
|
||||||
|
serialData = (seconds>>(8*address))&0xff;
|
||||||
|
} if(!(address&0b0110000)) { // Apparently this address range is off-limits for reading
|
||||||
|
serialData = pram[address];
|
||||||
|
}
|
||||||
|
serialState = SENDING_DATA;
|
||||||
|
serialBitNum = 0;
|
||||||
|
pinMode(SERIAL_DATA_PIN, OUTPUT); // Set the pin to output mode
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RECEIVING_DATA:
|
||||||
|
bitWrite(serialData,7-serialBitNum,digitalRead(SERIAL_DATA_PIN));
|
||||||
|
serialBitNum++;
|
||||||
|
if(serialBitNum > 7) {
|
||||||
|
if(address < 4) {
|
||||||
|
noInterrupts(); // Don't update the seconds counter while we're updating it, bad stuff could happen
|
||||||
|
seconds = (seconds & ~(((long)0xff)<<address)) | (((long)serialData)<<address);
|
||||||
|
interrupts();
|
||||||
|
} else {
|
||||||
|
pram[address] = serialData;
|
||||||
|
}
|
||||||
|
// savePRAM();
|
||||||
|
clearState();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case SENDING_DATA:
|
||||||
|
digitalWrite(SERIAL_DATA_PIN,bitRead(serialData,7-serialBitNum));
|
||||||
|
serialBitNum++;
|
||||||
|
if(serialBitNum > 7) {
|
||||||
|
clearState();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Actually attach the interrupt functions
|
||||||
|
*/
|
||||||
|
ISR(PCINT0_vect) {
|
||||||
|
handleRTCEnableInterrupt();
|
||||||
|
}
|
||||||
|
|
||||||
|
ISR(TIMER0_OVF) {
|
||||||
|
halfSecondInterrupt();
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
# RTC
|
||||||
|
|
||||||
|
This directory contains a work-in-progress firmware for implementing a
|
||||||
|
drop-in replacement for the RTC on ATTiny85 microcontroller. I've
|
||||||
|
made a few modification to this particular copy, but it still needs
|
||||||
|
more work to be fully functional.
|
||||||
|
|
||||||
|
Source, Visited 2020-08-05:
|
||||||
|
|
||||||
|
* https://www.reddit.com/r/VintageApple/comments/91e5cf/couldnt_find_a_replacement_for_the_rtcpram_chip/e2xqq60/
|
||||||
|
* https://pastebin.com/baPZ4nN4
|
|
@ -0,0 +1,4 @@
|
||||||
|
# 3d_prints
|
||||||
|
|
||||||
|
This directory contains 3D printable parts like the external enclosure
|
||||||
|
case, etc.
|
|
@ -0,0 +1,4 @@
|
||||||
|
# hardware
|
||||||
|
|
||||||
|
This directory contains design files, schematics, and related
|
||||||
|
documentation for hardware components.
|
|
@ -0,0 +1,6 @@
|
||||||
|
# fpga
|
||||||
|
|
||||||
|
This directory contains hardware description language (Verilog/VHDL)
|
||||||
|
source files for the Field Programmable Gate Arrays (FPGAs) that
|
||||||
|
implement the functions of the custom Application Specific Integrated
|
||||||
|
Circuits (ASICs) found in the original hardware.
|
|
@ -0,0 +1,37 @@
|
||||||
|
# "BBU" Apple Custom Silicon
|
||||||
|
|
||||||
|
The "BBU", as it is called on the Macintosh SE's printed circuit board
|
||||||
|
silkscreen, is a relatively complex Apple custom silicon chip,
|
||||||
|
compared to the other custom chips on the Macintosh SE's Main Logic
|
||||||
|
Board (MLB). Despite its intimidating look as a chip with a huge
|
||||||
|
number of pins, its purpose can be summarized as follows.
|
||||||
|
|
||||||
|
* Provide a single address bus interface to ROM, RAM, and I/O devices,
|
||||||
|
including simple digital I/O pins.
|
||||||
|
|
||||||
|
* Scan the CRT by driving the primary digital control signals
|
||||||
|
(`*VSYNC`, `*HSYNC`, `VIDOUT`).
|
||||||
|
|
||||||
|
There might be additional processing functions it may provide as a
|
||||||
|
convenience between the CPU and the various other hardware chips, but
|
||||||
|
chances are these processing functions are relatively simple.
|
||||||
|
|
||||||
|
Most of the I/O pins that are connected to the BBU are single-bit
|
||||||
|
digital I/O signals that are relatively easy to understand. Reverse
|
||||||
|
engineering the Macintosh SE's firmware may be required to determine
|
||||||
|
how these pins are mapped into the CPU's address space, but once that
|
||||||
|
determination is made, providing a replica interface to most of the
|
||||||
|
connected hardware should be super-easy.
|
||||||
|
|
||||||
|
The following I/O chips are connected to the BBU:
|
||||||
|
|
||||||
|
* VIA interrupt controller
|
||||||
|
|
||||||
|
* IWM/SWIM floppy disk controller
|
||||||
|
|
||||||
|
* SCSI Controller
|
||||||
|
|
||||||
|
* Serial Communications Controller (SCC)
|
||||||
|
|
||||||
|
Other chips that are connected to the BBU are mainly interfaced via
|
||||||
|
only simple, single-pin interfaces.
|
|
@ -0,0 +1,85 @@
|
||||||
|
BBU Pin,Signal Name,Description,Device Connection,Device Pin
|
||||||
|
1,GND,,,
|
||||||
|
2,RD7,,,
|
||||||
|
3,RD8,,,
|
||||||
|
4,RD9,,,
|
||||||
|
5,RD10,,,
|
||||||
|
6,RD11,,,
|
||||||
|
7,RD12,,,
|
||||||
|
8,RD13,,,
|
||||||
|
9,RD14,,,
|
||||||
|
10,RD15,,,
|
||||||
|
11,EXTPDS,,,
|
||||||
|
12,EN245,Select Data Buffer,74LS245,
|
||||||
|
13,VCC,,,
|
||||||
|
14,/WR,,,
|
||||||
|
15,/CAS-SIMM3,,SIMM3,2
|
||||||
|
16,/CAS-SIMM1,,SIMM1,2
|
||||||
|
17,/EOP,,53C80,
|
||||||
|
18,/CAS-SIMM4,,SIMM4,2
|
||||||
|
19,/CAS-SIMM2,,SIMM2,2
|
||||||
|
20,/RAS,,,
|
||||||
|
21,GND,,,
|
||||||
|
22,VCC,,,
|
||||||
|
23,A23,,,
|
||||||
|
24,A22,,,
|
||||||
|
25,A21,,,
|
||||||
|
26,A20,,,
|
||||||
|
27,A19,,,
|
||||||
|
28,A17,,,
|
||||||
|
29,A9,,,
|
||||||
|
30,/IPL1,,68000,
|
||||||
|
31,/IPL0,,68000,
|
||||||
|
32,IRQ,,65C22/6523,
|
||||||
|
33,/LDS,,68000,
|
||||||
|
34,/BERR,,68000,
|
||||||
|
35,/UDS,,,
|
||||||
|
36,/VPA,,68000,
|
||||||
|
37,CK,,68000,
|
||||||
|
38,/DTACK,,68000,
|
||||||
|
39,SELROM,Select ROM,ROM,"20 on ROM HI, LO"
|
||||||
|
40,"RTxCB, PCLK, ADB CLK",All the things,"85C30, ADB, GLU","20 & 28 on 85C30, 16 on ADB, 9 on GLU"
|
||||||
|
41,/AS,,,
|
||||||
|
42,VCC,,,
|
||||||
|
43,GND,,,
|
||||||
|
44,FCLK,,"SWIM, GLU","24 on SWIM, 19 on GLU"
|
||||||
|
45,SELSCC,Select SCC,85C30,32 on /CE
|
||||||
|
46,/RD,,85C30,
|
||||||
|
47,R/W,,,
|
||||||
|
48,SELSWIM,Select SWIM,SWIM,7 on /DEV
|
||||||
|
49,EXTFLP,PWM,External Floppy,10 on PWM
|
||||||
|
50,PB7,,65C22/6523,
|
||||||
|
51,SELSND,Select Sound,SND,
|
||||||
|
52,EXTPDS,,,
|
||||||
|
53,PA6,,65C22/6523,
|
||||||
|
54,/LDS,,,
|
||||||
|
55,DRQ,,53C80,22 on DRQ
|
||||||
|
56,/DACK,,53C80,26 on /DACK
|
||||||
|
57,SELSCSI,Select SCSI,53C80,21 on /CS
|
||||||
|
58,SELVIA,Select VIA,65C22/6523,24 on RS0
|
||||||
|
59,/RST,,,
|
||||||
|
60,HSYNC,Horizontal Sync,J12,Pin 10 on J12
|
||||||
|
61,VSYNC,Veritcal Sync,"J12, 65C22/6523","Pin 11 on J12, 40 on DB7"
|
||||||
|
62,VIDOUT,Composite Video Out,"J12, 65C22/6523","Pin 9 on J12, 28 on PC3"
|
||||||
|
63,GND,,,
|
||||||
|
64,VCC,,,
|
||||||
|
65,RA9,,,
|
||||||
|
66,RA7,,,
|
||||||
|
67,RA8,,,
|
||||||
|
68,RA6,,,
|
||||||
|
69,RD0,,,
|
||||||
|
70,RA5,,,
|
||||||
|
71,RA4,,,
|
||||||
|
72,RD1,,,
|
||||||
|
73,RA3,,,
|
||||||
|
74,RD2,,,
|
||||||
|
75,RD3,,,
|
||||||
|
76,RA2,,,
|
||||||
|
77,RD4,,,
|
||||||
|
78,RA1,,,
|
||||||
|
79,RA0,,,
|
||||||
|
80,RD5,,,
|
||||||
|
81,/PMCYC,,74F257,/OE
|
||||||
|
82,EN257,Select Address Buffer,74F257,
|
||||||
|
83,RD6,,,
|
||||||
|
84,VCC,,,
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
# GLU
|
||||||
|
|
||||||
|
The GLU chip is a Programmable Array Logic (PAL) chip used to
|
||||||
|
facilitate I/O logic and the like. In particular, it is a PAL16L8.
|
||||||
|
The equation list and fusemap that can be used to program a modern
|
||||||
|
ATF16V8 chip is contained here.
|
|
@ -0,0 +1,14 @@
|
||||||
|
# RTC Apple Custom Silicon
|
||||||
|
|
||||||
|
The RTC (Real-Time Clock) chip within the Macintosh SE is an Apple
|
||||||
|
custom silicon chip that implements the real-time clock and
|
||||||
|
battery-backed PRAM (Parameter RAM). Fortunately, its simplicity has
|
||||||
|
yielded a fairly complete replacement chip design that is based around
|
||||||
|
the pin-compatible ATTiny85 chip running appropriate firmware. See
|
||||||
|
the `firmware` directory for details.
|
||||||
|
|
||||||
|
Nevertheless, if we do get a microscopic chip scan of the original
|
||||||
|
silicon, this directory would contain corresponding design files to
|
||||||
|
replicate the original design as-is. Since the chip design is so
|
||||||
|
simple, this might be easily doable with conventional DSLR macro
|
||||||
|
photography after the packaging is opened up.
|
|
@ -0,0 +1,3 @@
|
||||||
|
# pcb
|
||||||
|
|
||||||
|
This directory contains Printed Circuit Board (PCB) designs.
|
|
@ -0,0 +1,13 @@
|
||||||
|
# mlb
|
||||||
|
|
||||||
|
This directory contains the schematics and circuit board design for
|
||||||
|
the Macintosh SE Main Logic Board (MLB).
|
||||||
|
|
||||||
|
PDF schematics, Gerber files, and other generated files are found in
|
||||||
|
the [output](output) directory.
|
||||||
|
|
||||||
|
Check out this forum thread on the 68kMLA where development on reverse
|
||||||
|
engineering and replicating the Macintosh SE's MLB is happening.
|
||||||
|
|
||||||
|
https://68kmla.org/forums/index.php?app=forums&module=forums&controller=topic&id=60059
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
# Generated Artifacts
|
||||||
|
|
||||||
|
This directory contains files/data that have been generated from
|
||||||
|
source files within.
|
|
@ -0,0 +1,12 @@
|
||||||
|
# old_artifacts
|
||||||
|
|
||||||
|
This directory contains pertinent information that came from the
|
||||||
|
original manufactured and distributed artifacts.
|
||||||
|
|
||||||
|
* [schems](schems): Scans and vector retraces of photocopied
|
||||||
|
schematics distributed to anyone who requested them.
|
||||||
|
|
||||||
|
* [mlb_stock_photos](mlb_stock_photos): Photographs of the
|
||||||
|
mass-production manufactured Macintosh SE main logic board, as is
|
||||||
|
typically photographed for the sake of Internet forum communications
|
||||||
|
and sales, as opposed to reproduction-oriented photos.
|
|
@ -0,0 +1,2 @@
|
||||||
|
recapamac_se_mlb.jpg
|
||||||
|
wikipedia_se_mlb.jpg
|
|
@ -0,0 +1,11 @@
|
||||||
|
These are links to helpful photos of the of the Macintosh SE Main
|
||||||
|
Logic Board (MLB).
|
||||||
|
|
||||||
|
PLEASE NOTE: The MLB in the photo from `recapamac.com` is hacked.
|
||||||
|
|
||||||
|
Source URLs of accompanying web pages and photos:
|
||||||
|
|
||||||
|
* Visited 2020-08-05: https://en.wikipedia.org/wiki/Macintosh_SE
|
||||||
|
* Visited 2020-08-05: https://upload.wikimedia.org/wikipedia/commons/6/65/Apple_Macintosh_SE_Main_PCB.jpg
|
||||||
|
* Visited 2020-08-05: https://recapamac.com.au/macintosh-se/
|
||||||
|
* Visited 2020-08-05: https://recapamac.com.au/wp-content/uploads/2019/08/mac_se_logic.jpg
|
|
@ -0,0 +1,8 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Use a shell script to download the photos so that we do not add
|
||||||
|
# bloat to the repository size that we don't strictly need. GitHub
|
||||||
|
# has bandwidth limits, so let's try to keep away from those as much
|
||||||
|
# as possible.
|
||||||
|
|
||||||
|
curl -L https://upload.wikimedia.org/wikipedia/commons/6/65/Apple_Macintosh_SE_Main_PCB.jpg -o wikipedia_se_mlb.jpg
|
||||||
|
curl -L https://recapamac.com.au/wp-content/uploads/2019/08/mac_se_logic.jpg -o recapamac_se_mlb.jpg
|
|
@ -0,0 +1,3 @@
|
||||||
|
se_mlb_p1.gif
|
||||||
|
se_mlb_p1_tmp.png
|
||||||
|
se_mlb_p1_proc.png
|
|
@ -0,0 +1,17 @@
|
||||||
|
all: retrace_se_mlb_p1.pdf
|
||||||
|
|
||||||
|
se_mlb_p1.gif:
|
||||||
|
./get_scans.sh
|
||||||
|
|
||||||
|
se_mlb_p1_proc.png: se_mlb_p1.gif
|
||||||
|
./resize-mlb-scan.sh
|
||||||
|
|
||||||
|
retrace_se_mlb_p1.pdf: retrace_se_mlb_p1.svg se_mlb_p1_proc.png
|
||||||
|
inkscape --export-pdf=$@ $<
|
||||||
|
|
||||||
|
mostlyclean:
|
||||||
|
rm -f se_mlb_p1_tmp.png
|
||||||
|
rm -f se_mlb_p1_proc.png
|
||||||
|
|
||||||
|
clean: mostlyclean
|
||||||
|
rm -f se_mlb_p1.gif
|
|
@ -0,0 +1,51 @@
|
||||||
|
These are links to the official Apple Macintosh SE schematics.
|
||||||
|
|
||||||
|
Source website: https://museo.freaknet.org/gallery/apple/stuff/mac/andreas.kann/schemat.html
|
||||||
|
|
||||||
|
Unfortunately, there are no BOMARC schematics available for the
|
||||||
|
Macintosh SE.
|
||||||
|
|
||||||
|
The Internet Archive also has a copy of purportedly the same Macintosh
|
||||||
|
SE schematics scan.
|
||||||
|
|
||||||
|
https://archive.org/details/Macintosh68kSchematics
|
||||||
|
|
||||||
|
----------
|
||||||
|
|
||||||
|
Due to the illegiblity of the original Main Logic Board (MLB) page 1
|
||||||
|
scan, this repository also contains a retrace of the schematic,
|
||||||
|
striving to be as faithful as possible to the original. The retrace
|
||||||
|
was done by hand and careful eyeing in Inkscape, after doing some
|
||||||
|
simple image processing on the input scan. A script that uses the
|
||||||
|
ImageMagick `convert` command is included to reproduce the processing
|
||||||
|
steps.
|
||||||
|
|
||||||
|
Notes related to the accuracy of the retrace.
|
||||||
|
|
||||||
|
* The pinouts of all integrated circuit components have been verified
|
||||||
|
with second sources.
|
||||||
|
|
||||||
|
* The pinouts of the PDS slot and RAM SIMMs have **not** yet been
|
||||||
|
verified with second sources.
|
||||||
|
|
||||||
|
* The resistor values have been checked to be consistent with the
|
||||||
|
reference designators, but **not all reference designators** have
|
||||||
|
been verified to be consistent with the placement on the printed
|
||||||
|
circuit board.
|
||||||
|
|
||||||
|
* The schematic info blocks in the upper and lower left corners have
|
||||||
|
been cross-checked with scans of other official Apple schematics to
|
||||||
|
attempt to make them as faithful as possible to the original
|
||||||
|
contents.
|
||||||
|
|
||||||
|
Notes on the source SVG file:
|
||||||
|
|
||||||
|
* The processed scan is linked as a hidden and locked image object.
|
||||||
|
To view both the retrace and the original scan together, find the
|
||||||
|
image object (possibly in the XML hierarchy) and make it visible.
|
||||||
|
The image object is locked to make it easier to draw on top of.
|
||||||
|
|
||||||
|
* The specific `sans-serif` font I used on my system is DejaVu Sans.
|
||||||
|
So long as your system `sans-serif` font has similar metrics,
|
||||||
|
everything should work just fine, otherwise you can replace the font
|
||||||
|
family name with DejaVu Sans.
|
|
@ -0,0 +1,7 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Use a shell script to download the scans so that we do not add bloat
|
||||||
|
# to the repository size that we don't strictly need. GitHub has
|
||||||
|
# bandwidth limits, so let's try to keep away from those as much as
|
||||||
|
# possible.
|
||||||
|
|
||||||
|
curl -L -o 'se_mlb_p1.gif' https://museo.freaknet.org/gallery/apple/stuff/mac/andreas.kann/SE_P1.GIF
|
|
@ -0,0 +1,43 @@
|
||||||
|
#! /bin/sh
|
||||||
|
# Given the input illegible scan of the Macintosh SE Main Logic Board
|
||||||
|
# Page 1 schematic, apply some image processing magic on it to make it
|
||||||
|
# somewhat more legible.
|
||||||
|
|
||||||
|
# Here's how our image processing operations work.
|
||||||
|
#
|
||||||
|
# 1. The original scanned image is monochrome. Gradation is expressed
|
||||||
|
# linearly through the means of error-diffusion half-toning.
|
||||||
|
#
|
||||||
|
# 2. To convert to grayscale, we simply convert to 8-bit grayscale and
|
||||||
|
# then resize to 80%, using a cubic resize image filtering
|
||||||
|
# algorithm. The resulting 8-bit intensity values will be
|
||||||
|
# expressed in a linear sample space. We then resize by 250% to
|
||||||
|
# get a grayscale image, linear intensity samples, that is twice
|
||||||
|
# the spatial resolution of the original.
|
||||||
|
#
|
||||||
|
# The second resizing step is mainly to ease looking at zoomed in
|
||||||
|
# copies of the image, which you must do almost all the time due to
|
||||||
|
# the illegibility of the original.
|
||||||
|
#
|
||||||
|
# 3. If the image is displayed directly on sRGB displays, it will
|
||||||
|
# appear artificially dark because it is currently using linear
|
||||||
|
# intensity samples, but an sRGB display uses a curve
|
||||||
|
# (approximately gamma = 2.2) to map the image samples to linear
|
||||||
|
# light intensities. Just leave it this way because the source
|
||||||
|
# image is already pretty light to begin with. The artificial
|
||||||
|
# darkening makes the image easier to read.
|
||||||
|
#
|
||||||
|
# To get a gamma-correct image, we would need to apply a `gamma =
|
||||||
|
# 0.45` curve to the image. Or, in other words, "gamma-correct" by
|
||||||
|
# a factor of `1/0.45 = 2.2`. Alternatively, we could use the more
|
||||||
|
# precise sRGB colorspace conversion function.
|
||||||
|
|
||||||
|
set -e # Exit on errors.
|
||||||
|
|
||||||
|
# N.B. We use two conversion command lines because I think otherwise
|
||||||
|
# ImageMagick just replaces the previous resize command with the new
|
||||||
|
# resize command and would only end up resizing the image once.
|
||||||
|
|
||||||
|
convert -depth 8 -resize 80% -filter cubic se_mlb_p1.gif se_mlb_p1_tmp.png
|
||||||
|
convert -resize 250% -filter cubic se_mlb_p1_tmp.png se_mlb_p1_proc.png
|
||||||
|
rm se_mlb_p1_tmp.png
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
After Width: | Height: | Size: 1.1 MiB |
Loading…
Reference in New Issue