Spectrum Cassette, EAR and MIC port, Issue 2 and 3
Research about it I started when I tested some games on different Spectrum emulators: I found that games Abu Simbel Profanation and Rasputin wouldn't start play from the control selection menu.
This program is intended for authors of Spectrum emulators:
10 OUT 254,BIN 11101111
20 PRINT IN 254
30 OUT 254,BIN 11111111
40 PRINT IN 254
50 GOTO 10
For correct test do not press any key while running, and of course have no EAR input.
Note: Issue 2 and Issue 3 are different versions of Spectrum's PCB,
but real difference is actually version of ULA chip. Later PCB versions
use same ULA as Issue 3, so behavior is also same.
The only correctly responding emulator which I found is zx32 by Vaggelis Kapartzianis:
in this test this emulator acts exactly like an Issue 2, and also
zx32 was the only emulator which correctly started Abu Simbel
Profanation and Rasputin. (I tested x128 v0.8, Z80
v3.05, Warajevo v1.5, UKV, JPP, ZX-JAM, WSpecem, SP2 and
VGASpec.)
By port 254, the ULA chip uses the same pin
for 3 functions: MIC output, EAR input and internal speaker
drive. That's why OUT 254
or sound generation affects bit 6 when it is read by IN
254.
In Z80.DOC by Gerton Lunter (which is the reference for most other documents) are some errors:
What is missing from Z80.DOC
is the fact that not only the input level at EAR affects bit 6 by
IN 254. Bits 3
and 4 from the previous OUT 254
also have an effect, and there is little
difference between Issue 2 and 3, and it isn't something like the
inversion of the EAR input.
The difference between Issue 2 and 3 is:
Truth table:
Out b4 Out b3 In Is2 In Is3 Is2 V Is3 V 1 1 1 1 3.79 3.7 1 0 1 1 3.66 3.56 0 1 1 0 0.73 0.66 0 0 0 0 0.39 0.34
Out b4 and Out b3 are output bits. In Is2 is value of bit 6 by IN (254), after propriety OUT by Issue 2, and Is3 is same that - by Issue 3. Is2 V and Is3 V are voltage levels on pin 28 of ULA chip after propriety OUT, without input signal on EAR. This is common pin for MIC, EAR and internal speaker.
I tested on which level on pin 28 input bit 6 changes from 0 to 1 or reverse. This is exactly 0.7 Volts by Issue 2 and same by Issue 3 , and no inverting, no hysterezis:
Iinput bit 6 is 1 if voltage on pin 28 is over 0.7 Volt, else is 0 - by both Issues.
On hardware level only difference between Issue2 and 3 is this: there are little higher voltages by Issue 2. You may see in table , by input combination: 0 1 that voltage values are near around that 0.7 V.
By faster programs situation isn't so simple, there is some delay when output bit 4 changes from 1 to 0. And games are written mostly in assembler. To illustrate it here are 2 short assembler routines:
ORG 45000
LD A,#18 ;OR #F8 e.g.
OUT (254),A
LD A,#08 ;OR #E8
OUT (254),A
TIMING LD B,7
;crucial value
DL LD IX,0
DJNZ DL
IN A,(254) ;query state
In this case IN A,(254) - output gives sometimes 255, sometimes 191. If you change 'crucial value' in line TIMING to a smaller one, then the result will be always 255, if delay is longer (B>7) then the result will be always 191. Of course this is valid only for Issue 3. The situation is something different by longer duration of high output level on port 254:
ORG 50000
HALT ;sync.
LD A,#18
OUT (254),A
HALT ;delay 20ms
LD A,#08
OUT (254),A
TIMING LD
B,107 ;crucial value
DL LD IX,0
DJNZ DL
IN A,(254)
As you may
see, after longer high level duration - delay is also much longer.
So delay varies approximately
from 180 T states (about 50
microsec.) to 2800 T states (about 800 microsec.) - depending
from the duration of high level on port 254. Explanation
for this delay are capacitors connected between pin 28 of ULA and
EAR and MIC connectors.
By changing from 0 to
1 (bit 4 by OUT) no delay.
In the ROM 'Beeper' subroutine, at address #03CF there is instruction OR 8,
which is before OUT (#FE),A
, and this routine is activated every time when you
type character in Basic; And it is the reason (with all above) why IN
254 on an Issue 2
normally gives 255, and 191 on an Issue 3.
(Written somewhere in 1999... Modified in August 2005, mostly grammar)
Situation with emulators in August 2005:
Spectaculator 6.25 - OK.Let authors correct me if I'm wrong somewhere. I tested only Windows
emulators, newer ones. (except Z80 Win, which is from 1999), and Fuse
(Linux). Will not test more alphas like V 0.1 and similar...
Result is 10:7 for no support :-(