Here you will find +3 hardware related material, suitable for all +3 versions.
The subjects covered are:
Although I am referring to the +3, the first three items may apply to the +2A as well.
Note: if you have (deep) knowledge in electronics, feel free to apply – or even improve – the solutions I’m offering here. If not, you may read it just for curiosity :)
The (hardware) section describing my self-build +3 is on a separate page. At present, that project is under construction and/or in a continuous process of modifying and upgrading some parts, like the CPU access timing, memory type, video board, PSU, etc. That’s a never ending project...
The first +3 release had a fatal hardware error: the 128K sound output is completely distorted.
On +3, the analog output of the AY-3-8012 sound chip was intended to be amplified by a one stage common-emitter transistor. In practice, they forgot to put a resistor to the transistor’s emitter. The result: the transistor works in pure switching mode, so the sound is converted from analog multi-level amplitude to digitized two-level amplitude, same as the old 48K sound system.
Take a look at the +3 sound diagram .
The second +3 release (the so-called +3B) had the sound circuit fixed. Also, the sound on all +2As encountered by me was ok, however, most of them were Spanish version which are supposed to be released later than their UK counterpart.
If someone wishes to fix the sound of an original +3, there is a better solution: stereo sound output, sometimes referred as “ACB Sound”. The layout comes from Amstrad CPC 464+ computers. I have done this on several +3 and the result is excellent.
With reference to my +3 sound diagram : the stereo sound output described below also makes a sound mix between 128K sound and the old 48K sound (beep). I personally prefer to have the 128K sound separated from the 48K beep. If this is also your case, simply omit the two (unnamed) 100K resistors. The 48K sound can be heard on the TV set or may be amplified separately from the cass out connector.
Assuming you own a first release +3, to build the stereo sound, you have to:
You then have to find a way to get the sound out from the inside. One of two solutions:
You can now use a stereo RCA cable (version 1) or a stereo DIN cable (version 2; pin 3=L, pin 5=R, pin 2=GND) to put the sound to any amplifier (usually the AUX input).
Important: the stereo sound output, as described above, has relatively low output level. If your amplifier has not enough sensitivity, try to connect the +3 to the MIC input of the amplifier, if available. A local amplifier may be build inside the +3, however, this is outside the scope of these technical notes.
Even if not at 1000W acoustical power, Ghouls’n’Ghosts pure sound can be now finally enjoyed !
(I personally like very much Software Creations’s sound music :)
Note: over the time, I read some comments regarding the two 33pF ceramic capacitors I have put on my stereo audio outputs, in that they were considered way too low and, therefore, completely useless; well, not quite: they are used (just) to bypass high frequency energy to ground that might be radiated by the circuit paths, in order to prevent VHF interference on external TV or other similar sensitive devices. For this same reason these should be soldered very close the connector choosed for audio output (rather than near to the AY circuit).
At the time the +3 (and +2A) came out, some games simply refused to play.
One of the reason for this was the “missing” IN #FF port (255 decimal). In fact, a true IN #FF port does not exists on neither Spectrum model.
How is that ?
(well, sort of)
I suppose you know how the vacuum tube of any (old, by now) TV works: the electron beam make left-right and up-down movements very fast, giving to the human eye the impression there is a still image.
Make border 0 or any other value different than the paper colour; you will see the Spectrum's TV display area like a “window”. Let's start with the electron beam from the top left corner of the screen. What is there ? The border - no image. Thus, at this moment, the video RAM is useless to be read, since no video-information is required. During this moment, the processor can make all (video) RAM access at full speed, no wait states. The video display mechanism does nothing, it is in a sort of “stand-by” state (it only generates H sync signals for the TV). The beam scans, scans and after 1/5 (approx.) from the top, it reaches the "window" zone; at this moment, the video RAM starts to be read by the video system display. When the beam reach the last 32 pixel of the first line (and the first pixel-line has been just displayed), the computer's video system pass again in "stand by" state until the next pixel-line. And so, line by line. When the bottom of the "window" has been reached, the video system pass definitively in "stand by" state, waiting the electron beam of the TV to reach again the top of the "window" - but this will only happens again after scanning the last 1/5 of the bottom TV screen and the other 1/5 of the top of the next TV field.
If the processor has some business with the video RAM, it comes in conflict with the video display mechanism in the "window" moments. The conflict is solved by means of WAIT states on the processor side. Because of this, a time execution loop of a program that runs in the video RAM cannot be exactly predicted, except when synchronized with the Spectrum's interrupt mode (and even so very difficult).
On older models (up to +2) the data bus between the video RAM - on one side - and the non-video upper system RAM together with the processor - on the other side - were separated by 8 × 470 ohm resistors, one for each data line. This value is low enough to be transparent when the processor makes video RAM requests (for example, when the processor writes something at address #4200) and high enough if both memory banks are at the same time - but independently - accessed - the video RAM by the display system and the upper system RAM by the processor (for example, when the video system performs an attribute display for address #5802 and at the same time the processor writes something at address #9A00 (or any address greater than #8000)).
All input ports are circuits with three-state outputs. These outputs, connected to the data bus, are normally in high impedance state; they are only enabled to low impedance when the properly I/O address match the port address. For example, the IN #FE port (the keyboard reading) is enabled only when the #FE address is decoded at the same time with the nIORQ active (logical 0) and nRD active (logical 0).
What happens if the port does not exist ? For example an IN #F1 instruction ?
On +3 (and +2A) there's no physical circuit to be enabled - the processor reads nothing. But as all 8 data lines are pulled-up to +5 V with 8 × 10 Kohm resistors, the value read will be #FF (all data in logical 1).
On the other hand, on the old (+)48, +128 and +2 Spectrums, the processor may read something ! This something is the video display system. If the processor performs an IN #75 instruction and by coincidence at the same time the video system just displays an attribute with BRIGHT 1 / PAPER 2 / INK 6, then the IN #75 instruction will read the value #56 (86 decimal) ! This occurs because the 470 ohm resistors are the smallest impedance at that time on the data bus and the processor reads in fact the video data bus. The port reading can give a pixel value, an attribute value, or nothing (#FF) if the beam of the TV screen is at that moment somewhere in the border. This is completely random.
Some games are performing this reading. The port chosen by programmers is the IN #FF (255 decimal), but can be any other IN port that does not exist physically. There is a loop that works something like this:
LOOP IN A,(#FF) ; READ THIS PORT
CP A,#FF ; CHECK IF "BORDER" OR "WINDOW"
JP Z,LOOP ; JUMP BACK IF STILL BORDER
..... ; CONTINUE THE PROGRAM
This is a way to make a relationship of the game with the Spectrum display area. It is used like a second interrupt signal. The IN port will read #FF every time when the electron beam of the TV is in border area (since in this moment the video display system is in "stand-by" state) and will be different than #FF if in the "window" area. The loop assumes there is something visible on screen and the colour is of particular value. If, for example, all pixels are #FF and all attributes are #FF (FLASH 1 / BRIGHT 1 / PAPER 7 / INK 7 - difficult to believe, but possible) then this loop remains closed; or if someone remove the 470 ohm resistors, then again, this loop remain closed for ever - you must reset the computer.
This last situation is present on the +3 (and +2A) computers. Here, the data separation between video RAM and the upper system RAM is done with transceivers (a better solution), not with 470 ohm resistors. On these computers, an IN instruction to a not-present port will always read the #FF value, since the transceivers are normally in high impedance state (they are only enabled on specific memory address request).
As a result, (very) few games have problems. I am aware of this ones:
To make any +3 compatible with all software that uses the IN #FF port, there are two solutions:
For the first solution, you will need a few HCT-TTL (best) or LS-TTL (good enough) circuits. Maybe one day I will find some time to draw the schematic diagram for this.
For the second solution, connect a 470 ohm / 0.125 W or 0.25 W resistor between pins 17 of the IC 6 and pin 17 of the IC 4. That’s all !
I guess the second solution is easier to implement, even by a beginner in electronics :)
Important: don’t forget to isolate any open connection !
In the above first example, the only reason the connection of the wire with the resistor is not isolated is for the clarity of the connection shown.
In the above second example there is no need for isolation, because the resistor terminals are kept firmly at secure distance with silicone sealant.
In either case (the true or pseudo solution), I recommend that only D7 be involved. That means, an IN #FF value could only be #FF or #7F. It assumes the IN #FF request comes during a normal screen, with the FLASH attribute reset (i.e. no FLASH). I find simply absurd the assumption one will try to play Duet with the entire screen FLASH attribute set ! (in which case, the game will hang, like in the absence of the IN #FF port).
This simplified version for the IN #FF port (the second solution) has been implemented and tested by me on a few +3s and many +2As. Not any complain so far, only happy “customers” !
Note: I read one report saying that – after installing the 470 ohm resistor as described above – the +2A computer (in that case) had become unstable. This reminds me of another case – not related to the #FF port issue, but that could have the same origin – where a +2A (Spanish version if I remember well) was barely usable when playing games (it worked well only while in +2A Basic mode). In my case the gate array timing was imperfect in relation to the rest of the hardware components batch that happened to be on that board and introduced some unwanted spikes during RAM bank switching; the solution proved to be quite easy to apply: I just put two 220pF capacitors on processor’s A14 and A15 address lines (one per each address and GND). The owner was a heavy player and never got into any problem again :) (and yes, I then applied to it the #FF patch as well – the D7 / 470 ohm resistor solution)
The +3 (as well as the +2A) has RGB video output.
Although this solution offers the best quality for video display, not all TV sets have RGB input. Even if a SCART connector is present, the RGB input on the TV side may simply be not present.
All 128K Spectrum versions (+128/+2/+2A/+3) are using the same PAL coder circuit, TEA2000 , which drives the TV modulator. On the +128 and +2 the PAL coder drives also a (composite) video output. On the +3 and +2A this (composite) video output circuit is missing.
This composite video output diagram shows the original +128/+2 composite video output circuit, which can be successfully used on any +3 (and +2A).
However, the same diagram includes a better alternative for the video output, based on the TEA2014A , a circuit commonly used in many TV sets for internal TV / external VCR switching.
Note: on this drawing, the TEA2014A may well be replaced with TEA2114 . In fact, TEA2114 has better electrical performance, but it may be also more expensive. For the purpose of this application, there is no particular reason for using it.
On the original +128/+2, the composite video output is made through pin1 of the RGB PERITEL connector. Although this solution may also be applied to +3 (and +2A), I don’t recommend it. The common standard for video connections are the BNC connectors (used mostly in professional video equipments), or RCA connectors (used mostly in consumer video equipments). This example shows the video BNC connector mounted on the rear of my original +3, while a view of the solder part of the same BNC connector can be seen in this other example .
Provisions for the B: drive has been provided from the first day the +3 was born. Except for a (minor ?) error, in that the drive’s connector pinout description from the manual is reverse numbered, there is no major problem for connecting an external 3.5” drive.
Yes, the power supply may be a problem, but I have seen a few external 3.5” drives powered from the +3’s original power supply and ... no problem so far.
That was for the B: drive. But how about a 3.5” floppy disk drive as the A: drive ?
I have done this to a few +3s, including my own original. This example shows my original +3 with a 3.5” drive in it (for the moment – year 2016 – that very old, scanned photo paper picture, is the only example I have, will try to get a more modern one soon...).
Before going to change the internal original 180K 3” drive with a 720K 3.5” drive, you should be aware of the following related problems:
|DKIT720K, a +3DOS based disk utility;
the "Duplicate" command is not yet implemented
As you might expect, the (new) 3.5” disk drive has different positions for the mounting holes in respect with the original drive. Fortunately, the modification required is quite easy to be done.
|Hexagonal nickel plated brass spacer, with M3 tapped hole and M3 threated stud|
There are four spacers needed, as seen in the picture here on the right; two of them must have 15mm in lenght, the others two 20mm in lenght.
Look at the bottom side of the 3.5” drive; there are four M3 tapped holes at standardized distance each other (94mm on the width axis, 70mm on the depth axis) . The spacers will screw up into these holes, the 15mm ones on the left side (direction: center of the +3), the 20mm ones on the right side (direction: +3 border).
|Front view of drive positioning and spacers dimensions|
The 15mm left-front spacer is fixed into a hole that was previously used by the original 3” drive. The rest three mounting holes must be given with reference to this existing one.
This example may give an idea about how a real drive is mounted.
First thing, already mentioned before: although the power supply connector is mechanically the same for both 3” and 3.5” drives, !! the +5V and +12V (the outermost pins) must be reversed before plugging into the 3.5” drive !!
Fortunately, this can be easy done, by hacking the power connector with a help of a needle and reverting the two outermost pins.
The 26 ribbon cable is a more delicate issue. The original 26-way cable mounting socket cannot be directly connected to the 3.5” drive. You must build a new cable with a 34-way cable mounting socket.
The new connector should look like in this example and the final result should result as shown in this example . An alternate crimping solution is shown in this example ; this alternate solution is usually the most reliable, but the limited space may force the first solution shown (it merely depends on the physical floppy model).
For all this to happen, you have two possibilities:
Note: take care, a new 26-way PCB connector may be hard to find; you should pay attention when handling it !
Just in case you broke the PCB connector, there is a solution to replace it: change it with a (boxed) 26-way header; the 26-way ribbon cable must then have a 26-way cable mounting socket on it. It is a bit complicated, but it works and it is not bad at all !
Table 1: 26-way to 34-way floppy disk drive connection correspondence
cable socket pins:
|4||10||n/DRIVE SELECT 0|
|6||12||n/DRIVE SELECT 1|
Modern floppy disk drives are, in general, not compatible with the +3. For a drive to work with the +3, it has to be also compatible with the old PC-XT computers.
PC-XT computers allowed 4 floppy disk drives. The XT drive connector has 4 “disk select” signals and 1 “motor on” command signal which is common for all drives. When the motor signal becomes active, the motors from all present drives are turned on, regardless of whether a particular drive will be used or not.
On the other hand, the PC-AT computers only allows 2 floppy disk drives. The AT drive connector has separate “disk select” and “motor on” command signals for each of the two drives. The “ready” signal has been replaced by “disk change” signal.
See below table 2 for XT/AT drive connector function differences. Please note that the +3 uses pins 10, 12, 16 and 34 of the drive, functionally similar to the PC-XT connector.
Table 2: PC-XT/PC-AT floppy disk drive connector function differences (only the relevant pins shown; all other pins have the same function on both)
|cable pin:||PC-XT function:||PC-AT function:|
|2||N.C. or LOW CURRENT||N.C. or DENSITY SELECT|
|6||n/DRIVE SELECT 3||N.C.|
|10||n/DRIVE SELECT 0||n/MOTOR ON DRIVE 0|
|12||n/DRIVE SELECT 1||n/DRIVE SELECT 1|
|14||n/DRIVE SELECT 2||n/DRIVE SELECT 0|
|16||n/MOTOR ON||n/MOTOR ON DRIVE 1|
For +3 floppy disk drive implementation, either internal (A:) or external (B:), you have to find an XT-only drive, or a drive that has XT<->AT switching capabilities. Most likely, there are no 3.5” XT-only drives, but chances are, you can find a (new) one that has XT<->AT switching capabilities.
The switching between the two categories is made by means of jumpers, DIP switches, or 0 ohm SMD bridges.
Below is an example of a few drives that are +3 compatible. For all drives in this example, the drive select should be DS0 for drive A: (the internal one) or DS1 for drive B: (the external one).
Chinon FZ-354 or FZ-357
has a jumper block
- jumper for motor driving, two positions, can be MD or MM
- jumper for the ready signal, two positions, can be RDY or DC
- jumper for drive select, four positions, can be DS0, or DS1, or DS2, or DS3
For +3 use, the jumpers have to be set to MM and RDY.
has DIP switches
- switch for motor driving, two positions, labelled MO or MS
- switch for the ready signal, two positions, labelled RY or DC
- switch for drive select, four positions, labelled DS0, or DS1, or DS2, or DS3
For +3 use, the switches have to be set to MO and RY.
Samsung (not sure about exact model, presumably SFD-321B)
have 0ohm SMD resistors that have to be (re)soldered
- 0ohm SMD resistor for motor driving, two positions, can be MO or MS
- 0ohm SMD resistor for the ready signal, two positions, can be RY or DC
- 0ohm SMD resistor for drive select, two positions, can be DS0 or DS1
For +3 use, the 0ohm SMD resistors have to be set to MO and RY.
If a floppy disk drive connected to a +3 has the “ready” selection left on DC, the result is that the drive will not work at all. If the floppy disk is not inserted, the computer waits forever for the floppy to say something.
Floppy disk drives that are usual in today’s PCs have no more the “ready” and “motor” jumpers, more likely not even the “disk select” jumpers, they are PC-AT locked and DS1 locked. These drives cannot be used on +3 at all.
Note: a search on the internet for Amiga or Amstrad CPC6128 drive replacement might offer a compromise solution for using modern (PC-AT) floppy disk drives, that may be applied also on +3. The solution involves forcing the nREADY signal to GND, thus fooling the system with regard to the real drive ready status; the drawback is that some +3DOS drive commands might give impredictible results in case the drive is actually not ready for an otherwise mandatory ready requirement (for example when trying to write some data on disk).