Nachdem ich vor knapp 40 Jahren einen ZX81 hatte, wurde mir nun von
einem Freund eine Leerplatine diese Clones zugetragen:
https://revspace.nl/ZX81plus38_simple_to_build_ZX-81_clone
Die Platine sieht sehr schön aus und an sich habe ich gar keine Zeit,
daran herum zu basteln, aber jetzt liegt sie nun einmal da und will
bearbeitet werden.
Das Interessante am ZX81 war sein minimalistisches Design, das mit Hilfe
des Prozessors und einem relativ einfachen Custom-Logik-Chip das
Bildsignal erzeugt hat. Im Clone wird dieser Chip mit diskreten
Logikbauteilen nach gebaut.
Die Platine möchte ich Schrittweise aufbauen und die einzelnen
Komponenten nach und nach testen.
Auf dem Bild ist der Taktgenerator, die Reset-Schaltung und der
Prozessor bestückt.
Leider hab eich nicht alle passenden Bauteile, deshalb ist vorerst ein
14Mhz statt ein 13Mhz Quarz drinnen und die Kondensatoren am
Schwingquarz fehlen. Der Oszillator läuft aber trotzdem.
Die Platine zieht in dieser Konfiguration 140mA. Der Prozessor zeigt
aber an seinen Adressleitungen erst einmal keine weitere Reaktion.
von A. K. (prx)
>Der ZX80 ist dahingehend noch interessanter, weil er ohne Custom-Chip>auskommt.
Danke für Deinen Hinweis. Ich weiß Deine Kommentare üblicherweise zu
schätzen.
Das schöne an dem Clone ist, dass er ebenfalls ohne ULA auskommt.
Insofern kann man hier versuchen, die Details des Videogenerators zu
verstehen.
chris_ schrieb:> Das schöne an dem Clone ist, dass er ebenfalls ohne ULA auskommt.> Insofern kann man hier versuchen, die Details des Videogenerators zu> verstehen.
Will darauf raus, dass der ZX80 deshalb noch ein deutliches Stück
minimalistischer war. Ich hatte damals die Arbeitsweise von dessen
Videoerzeugung analysiert und fand es ziemlich clever, wie die
Eigenheiten der Z80 CPU genutzt wurden.
Du solltest mindestens dafür sorgen, dass kritische Eingänge auf
definiertem Pegel liegen. Bei Reset ist das bestückt, aber bei anderen
wie NMI, WAIT, ... sehe ich das auf den ersten Blick nicht.
>Du solltest mindestens dafür sorgen, dass kritische Eingänge auf>definiertem Pegel liegen. Bei Reset ist das bestückt, aber bei anderen>wie NMI, WAIT, ... sehe ich das auf den ersten Blick nicht.
Danke für die Hinweise. Ich habe auch schon daran gedacht, aber aus
Ungeduld die Schaltung einfach mal mit Strom versorgt und gemessen.
Was mir gerade beim Überfliegen des Wikipedia Artikels
https://de.wikipedia.org/wiki/Zilog_Z80
zum Z80 auffällt: Die Schreiben dort, dass erst der Z80A für 4MHz
ausgelegt war, wenn ich es auf meinem Foto richtig sehe, scheint der
Prozessor aber ein nicht-A-Typ zu sein.
Das Schöne an der heutigen Zeit im Vergleicht zur Zeit vor 40 Jahren
ist, dass man im Internet so viele vorbereitete Informationen findet.
Hier eine Auflistung der Signalrichtungen des Z80:
https://wiki.pcbotaku.com/wiki/Z80
Wenn ich es richtig sehe, sollten die Eingänge
nInt
nNMI
nWait
nBUSREQ
für den Addresszählertest alle auf HIGH liegen.
chris_ schrieb:> wenn ich es auf meinem Foto richtig sehe, scheint der> Prozessor aber ein nicht-A-Typ zu sein.
Stimmt irgendwie. Die bestückte Z84C0020 ist nicht NMOS und 4MHz,
sondern CMOS und 20 MHz.
chris_ schrieb:> Die Platine zieht in dieser Konfiguration 140mA
Da ausser Oszillator und CPU nichts drauf ist, was Dauerstrom
verbraucht, ist das angesichts der CMOS Version viel zu viel.
>Da ausser Oszillator und CPU nichts drauf ist, was Dauerstrom>verbraucht, ist das angesichts der CMOS Version viel zu viel.
Das ist ein guter Hinweis dem man noch einmal nachgehen sollte.
Gerade eben haben wir versucht, die Platine des Freundes zu testen.
Diese ist schon voll bestückt und braucht ähnlich viel Strom.
Wir haben einen kleinen Test gemacht und die CPU aus der oben gezeigten
Platine eingesetzt. Mit dieser CPU sank der Stromverbrauch auf 90mA.
Die Platine ist das Mainboard meines Computers, den ich damals mit Hilfe
des ZX81 entwickelt habe und auf der noch die original 1kx4Bit RAMS
meines ZX81 sitzen, da ich dort statt dessen ein 2kx8Bit RAM eingebaut
hatte.
>Mit NMOS Z80A wäre man damit in normalem Fahrwasser.
Dann muss ich den mal auf meiner Platine probieren.
Heute morgen haben wir zu zweit an der voll bestückten Platine des
Kollegen gemessen und experimentiert.
Dort blieb der Prozessor auch die ganze Zeit hängen, weil er nicht mehr
durch den NMI aufgeweckt wurde.
So wie es aussieht ist die Platine falsch geroutet. Der Eingang von U19B
( Pin4 ) muss nicht am NAND des FlipFlop U13D sondern an U13C pin8
angeschlossen werden, sonst kommen die HSYNC Pulse nicht.
Nachdem wir das geändert hatten und mittels eines Frequenzgenerators die
Systemfrequenz auf 12.8MHz statt der 13MHz des Quarz gestellt hatte,
konnte auch der Fernseher synchronisieren und wir hatten ein weises
Bild. Das ersehnte
1
K
Prompt war leider nicht sichtbar, vielleicht war es außerhalb des weißen
Bildschirms.
chris_ schrieb:> Das Interessante am ZX81 war sein minimalistisches Design, das mit Hilfe> des Prozessors und einem relativ einfachen Custom-Logik-Chip das> Bildsignal erzeugt hat. Im Clone wird dieser Chip mit diskreten> Logikbauteilen nach gebaut.
Damit ist es kein Clone, sondern ein Kompatibler. Für ein Plagiat weicht
es zu sehr vom Original ab und es steckt auch eine Menge Gehirnschmalz
des Erfinders, also eigene Leistung, drin.
Ein Clone wäre ein einfacher 1:1 Nachbau, wie in Fernost üblich.
>Damit ist es kein Clone, sondern ein Kompatibler.
Wie ich gehört habe, gab es zu jener Zeit in Südamerika ZX81 Nachbauten
mit diskreten Logik ICs, also vermutlich dem hier gezeigten recht
ähnlich.
Zum weiteren Verlauf:
Die Platine des Freundes ist schon weiter, aber der Bildschirm zieht
noch Streifen.
Das Projekt gefällt mir sehr gut, aber das ROM bereitet mir Probleme.
Sind die ZX81 ROM Daten frei verfügbar?
Falls ja, könnte mir jemand eines brennen, da ich keine Hardware dafür
habe.
>Sind die ZX81 ROM Daten frei verfügbar?>Falls ja, könnte mir jemand eines brennen, da ich keine Hardware dafür>habe.
Mein Bastlerfreund hatte mir die Platine und das fertig programmierte
EEPROM gegeben.
Die Images verschiedener Retro-Computer gibt es wohl hier:
http://www.8bit-wiki.de/index.php?id=3&filt=Sinclair/ZX81/rom-binary
Leider hat er aber kein EEPROM mehr.
Ansonsten müsste man sich vielleicht überlegen, ob man einen einfachen
EEPROM Programmer mit einem Arduino Mega baut.
Ich könnte mir vorstellen, dass hier noch mehr auf den ZX81-Zug
aufspringen wollen. Dann wäre es sinnvoll, wenn einer gleich mehrere
Platinen bei irgend einem der Chinesischen PCB-Hersteller machen lässt.
Super, danke.
Notfalls lässt sich das bestimmt per Arduino machen, da scheint es ja
viele Projekte zu geben.
Benutzt ihr ein EEPROM oder ein OTP EPROM?
Habt ihr das System denn schon richtig zum laufen bekommen?
Zum Beispiel bei digikey:
https://www.digikey.de/products/de?keywords=AT27C256R-70PU-ND
Auszug aus dem Datenblatt:
"The Atmel® AT27C256R is a low-power, high-performance, 262,144-bit,
one-time programmable, read-only memory (OTP EPROM) organized as 32K by
8 bits. It requires only
one 5V power supply in normal read mode operation. Any byte can be
accessed in less than
45ns, eliminating the need for speed reducing WAIT states on
high-performance microprocessor systems"
Das EEPROM scheint sehr leicht zu programmieren:
Man kann einfach wie in ein RAM schreiben und muss dann einen Polling
Zyklus starten.
Ich würde vermuten, wenn man einfach 10ms nach dem Schreiben einer Page
wartet, sind die Daten auch sicher geschrieben.
Zur PCB ganz oben: Stehender Quarz auf der Ecke ist eine blöde Idee.
Masseflächen an PCB Rändern nicht geschlossen. Leiterbahnen unnötig
dünn/fein. Jumper unter(?) Ram/Rom ...
Aber sonst ... :D
>Zur PCB ganz oben: Stehender Quarz auf der Ecke ist eine blöde Idee.>Masseflächen an PCB Rändern nicht geschlossen. Leiterbahnen unnötig>dünn/fein.
Das ist wahrscheinlich ein guter Hinweis, auch wenn vermutlich keiner
eine EMV-Messung mit dem Ding machen wird.
Man könnte einen issue im github-Directory schreiben:
https://github.com/mahjongg2/ZX81plus38>Jumper unter(?) Ram/Rom ...
Das ist tatsächlich schlecht. Mein Kollege hat es dadurch gelöst, dass
die Jumper unter der Platine sind, was aber Abstandsbolzen in der
Platine erforderlich macht.
Im Originalschaltplan des ZX81 haben die Widerstände in den
Datenleitungen 470Ohm. Im Nachbau sind die mit 1K angegeben. Der
kleinere Wert scheint mir sinnvoller, weil dann der Pegel über gegenüber
den 10k PullUps besser nach unten gezogen wird.
Hier der Aufbau, um die Funktion des Z80 ohne Peripherie zu testen.
Der Prozessor wird mit 1MHz Takt versorgt.
Die Eingänge /NMI, /INT, /RESET, /BUSRQ, und /WAIT sind über Widerstände
auf VCC gelegt.
Die Datenleitungen sind über 10K auf 0, sodass NOPs ausgeführt werden
sollten.
Beobachtungen:
Der Maschinenzyklus /M1 läuft mit 250kHz, was einem Befehlszyklus von 4
Takten entspricht. Die NOPs sollten also mit 250kHz ausgeführt werden.
Die Stromaufnahme beträgt für die gesammte Schaltung 117mA, was mir für
eine CMOS Z80 CPU immer noch hoch erscheint.
Die Adressleitung zeigen folgendes Verhalten:
A0:125kHz
A1:62.5kHz
...
A6: 1.953kHz
A7: seltsames Verhalten, Signalpulse sind paketartig
Mit dem Emulator kann man schon was machen, z.B. Mazogs spielen :)
Ich hab auch einen ZX81 gebaut, meinem Fernseher kann die Signal aber
nicht darstellen, es zieht so aus wie das Bild oben, aber es zappelt ein
bisschen.
Ich muss mit dem AV-Receiver probieren, der kann Composite auf HDMI
umwandeln. Einen Elgato Eye TV habe ich auch, es funktioniert in w10
nicht mehr, und in linux habe ich keinen Erfolg mit vlc gehabt...
Einen ZX81 mit VGA Ausgang hätte ich gerne, nein ohne FPGA.
Wenn den guten 38 Jahre alten NMOS Z80A aus dem obigen Bild (
https://www.mikrocontroller.net/attachment/472355/CH1_ComputerMainBoad.png
) einsetze, zeigt sich das paketartige Verhalten auch, aber die
Gesamtschaltung verbraucht nur ca. 60mA.
Die Grundfrequenz der Pakete beträgt 250kHz, also gleich wie M1.
Wahrscheinlich werden die oberen Adressleitungen ab A7 nicht statisch
gezogen wie die unteren Adressleitungen A0-A6.
Mittlerweile tendiere ich dazu, mehr Zeit in einen soliden Laboraufbau
zu stecken.
Jetzt ist die ZX81 Platine so weit bestückt, dass über die gezeigten
Widerstände der NOP-Generator statisch auf den Bus geschaltet wird.
Damit verhält sich der Prozessor dann so wie auf dem BreadBoard-Aufbau.
chris_ schrieb:> A7: seltsames Verhalten, Signalpulse sindchris_ schrieb:> Wahrscheinlich werden die oberen Adressleitungen ab A7 nicht statisch> gezogen wie die unteren Adressleitungen A0-A6.
Das liegt am Refresh-Zyklus, also völlig normal.
>Das liegt am Refresh-Zyklus, also völlig normal.
Danke für den Hinweis. Mit dem Refresh-Zyklus habe ich mich nie
beschäftigt, weil ich damals schon die statischen RAMs aus dem ZX81
hatte.
Im Moment überlege ich, einen Debugger für den ZX81 zu bauen.
Hier gibt es einen Z80-Computer, bei dem ein Atmega32 als
Debug-Interface benutzt wird:
https://hackaday.io/project/159973-z80-mbc2-a-4-ics-homebrew-z80-computer/details
Das Problem hier: es werden nur die unteren 8 Adressleitungen benutzt,
weil der Atmega32 zu wenig Pins hat.
Einfacher wäre ein ArduinoMega2560, der hätte genügend PINs.
Das Code-Prinzip des Atmega-Debuggers findet sich hier:
https://github.com/WestfW/4chipZ80/tree/master/Firmware/Z80_test1
>ICE? Nimm den: http://www.tauntek.com/Z80-In-Circuit-Emulator.htm
Wahrscheinlich wäre es eine gute Idee, eine fertigen Debugger zu nehmen.
Aber der Aufwand, diesen nach zu bauen, scheint mir ein eigenes Projekt.
Einen Arduino Mega habe ich hier rumliegen, kann als gleich damit
spielen.
Im Moment versuche ich gerade heraus zu finden, wie das Tape-Signal
erzeugt wird.
Hier gibt es das Assembler Listing des ROMS:
https://cdn.hackaday.io/files/289631239152992/ZX81_dual_2018-02-09.htm
1
...
2
; I/O locations:
3
;
4
IO_PORT_TAPE equ $FF ; write
5
IO_PORT_SCREEN equ $FF ; write
6
7
IO_PORT_KEYBOARD_RD equ $FE ; A0 low
8
IO_PORT_NMI_GEN_ON equ $FE ; A0 low
9
IO_PORT_NMI_GEN_OFF equ $FD ; A1 low
10
IO_PORT_PRINTER equ $FB ; A2 low
11
12
....
13
14
; THE 'OUT_BYTE' SUBROUTINE
15
16
; This subroutine outputs a byte a bit at a time to a domestic tape recorder.
17
18
mark_031E:
19
OUT_BYTE:
20
LD E,(HL) ; fetch byte to be saved.
21
SCF ; set carry flag - as a marker.
22
23
mark_0320:
24
EACH_BIT:
25
RL E ; C < 76543210 < C
26
RET Z ; return when the marker bit has passed
27
; right through. >>
28
29
SBC A,A ; $FF if set bit or $00 with no carry.
30
AND $05 ; $05 " " " " $00
31
ADD A,$04 ; $09 " " " " $04
32
LD C,A ; transfer timer to C. a set bit has a longer
33
; pulse than a reset bit.
34
35
mark_0329:
36
PULSES:
37
OUT (IO_PORT_TAPE),A ; pulse to cassette.
38
LD B,$23 ; set timing constant
39
40
mark_032D:
41
DELAY_2:
42
DJNZ DELAY_2 ; self-loop
43
44
CALL BREAK_1 ; test for BREAK key.
45
46
mark_0332:
47
BREAK_2:
48
JR NC,REPORT_D ; forward with break to REPORT_D
49
50
LD B,$1E ; set timing value.
51
52
mark_0336:
53
DELAY_3:
54
55
DJNZ DELAY_3 ; self-loop
56
57
DEC C ; decrement counter
58
JR NZ,PULSES ; loop back
59
60
mark_033B:
61
DELAY_4:
62
AND A ; clear carry for next bit test.
63
DJNZ DELAY_4 ; self loop (B is zero - 256)
64
65
JR EACH_BIT ; loop back
Wenn ich mir die Schaltung so ansehe, sieht es so aus, als wenn die
Datenleitungen im IO-Bereich ignoriert werden, weil sie nicht
angeschlossen sind.
Das setzen der Leitung sehe ich
1
OUT (IO_PORT_TAPE),A ; pulse to cassette.
Die Frage ist: kann man die auch aktiv zurück setzen?
chris_ schrieb:> Im Moment versuche ich gerade heraus zu finden, wie das Tape-Signal> erzeugt wird.
Mit dem ZX81 hast Du Dir nicht gerade den trivialsten Homecomputer
ausgesucht. Der bei Sinclair gepflegte Minimalismus erforderte so einige
Tricks.
Lies Dir die Artikel von Wilf Righter durch, da ist einiges gut erklärt:
http://www.user.dccnet.com/wrigter/
Einen ZX97lite habe ich mir auch mal gebaut.
> Die Frage ist: kann man die auch aktiv zurück setzen?
OUT 0FEh startet VSync und setzt CAS low. IN 0FEh auch, aber dabei liest
man auch noch die Tastatur ein. OUT 0FFh beendet VSync und setzt CAS
high.
>> Die Frage ist: kann man die auch aktiv zurück setzen?>OUT 0FEh startet VSync und setzt CAS low. IN 0FEh auch, aber dabei liest>man auch noch die Tastatur ein. OUT 0FFh beendet VSync und setzt CAS>high.
Danke für die Hinweise.
Für mich sieht der Schaltplan so aus, als wenn man "IN 0FEH" auf jeden
Fall nutzen muss, um U19D (Anschluss 11) auf 0 setzen zu können, um den
FlipFlop für VSYNC zu beeinflussen.
>Hast recht, OUT wirkt nur auf den NMI-Generator (HSync). VSync (und>Tastatur lesen) läuft über IN.
Danke für die Auflistung. Das hat sehr geholfen.
Leider hatte ich auf Grund der schlecht leserlichen Beschriftung einen
74HC08 für U13 gesteckt, sodass das FlipFlop nicht funktionieren konnte.
Das hat etwas gedauert, bis ich alles mit der Arduino Signalstimulation
durchgemessen hatte.
Jetzt funktioniert der Ausgang. Der Signalpegel scheint mir mit 200mVpp
etwas niedrig. Den 47pF Kondenstor C8 habe ich nicht eingebaut, weil ich
keinen hatte. Der kleine Wert dürfte meiner Meinung nach aber auch
keinen großen Einfluss auf die Signalqualität haben.
Anbei die über Microphon der Webcam aufgenommen, geliebten Tape-Signale
aus meinem Debugging-Aufbau.
Durch die Microphonübertragung werden die Signalformen nicht ganz so
sauber sein, wie bei direktem Line-Recording.
Ein Z80 Systemwunsch ist bei mir auch noch so ein Überbleibsel aus der
Jugend ;-) Bevor sämtliche Komponenten nur noch zu Museumspreisen
erhältlich sind, habe ich mich entschlossen den ZX81+38 zu bauen.
Die Platine habe ich jetzt erhalten und auch die meisten Bauteile habe
ich zusammen.
Aber der RCA-Verbinder ist doch verkehrt herum platziert, oder?
Ich finde nur Print-Chinch-Buchsen mit zwei Lötpins hinten und einem
vorne. Selbst das Farnell Teil aus der BOM ist so. Habe ich etwas
übersehen?
Kennt jemand einen Print Chinch der passen würde?
Der Oszillator ist aufgebaut, er läuft aber mit den angegebenen 15p
Kondensator nicht auf 13 MHz, sondern nur mit 1,4 MHz.
Ganz ohne Kondensator, oder mit 4.7p läuft er sauber mit 13 MHz.
Ich hab 10 pF für 13 MHz benutzt. Mit 20 pF waren sowas wie 30 kHz.
Ich würde sagen daß so was wie 12.8 oder 12.9 MHz besser als 13 sind,
dann läuft der Sync ein bisschen besser, mindestens wird von meinem
Ferns. erkannt. Ein Bild habe ich trotzdem noch nicht gekriegt.
Eine Cinch Buschse habe ich mit der Zange modifiziert, sonst passt es
nicht in die Löcher.
>Ein Z80 Systemwunsch ist bei mir auch noch so ein Überbleibsel aus der>Jugend ;-)
Das Problem mit der Cinch-Buchse habe ich auch, die passt vom Pining her
nicht. Ich werde sie aber vielleicht einfach irgend wie einpassen.
>Aber der RCA-Verbinder ist doch verkehrt herum platziert, oder?>Ich finde nur Print-Chinch-Buchsen mit zwei Lötpins hinten und einem>vorne. Selbst das Farnell Teil aus der BOM ist so. Habe ich etwas>übersehen?>Kennt jemand einen Print Chinch der passen würde?
Willkommen im Club ;-) Ich hätte ja nicht gedacht, dass sich hier noch
jemand findet, der das Projekt auch nachbaut.
Das Problem mit der Cinch-Buchse habe ich auch, die passt vom Pining her
nicht. Ich werde sie aber vielleicht einfach irgend wie einpassen.
Noch ein kleiner Tipp beim Zusammenbau: Ich habe bei meiner Platine erst
spät gemerkt, dass die Jumper auf der Platine vorverdrahtet sind. Man
braucht die Jumper als erst mal nicht, wenn man die eine
Standardkonfiguration hat.
Etwas mehr als eine Stunde braucht es schon :-)
Die CPU scheint zu laufen, ich kann Signale auf den Adressleitungen
messen, aber ich bekomme gar kein Bild.
Chris, könntest Du die Modifikation zwischen U13 und U19 bitte etwas
genauer beschreiben?
Pin 4 von U19B ist ja laut Schaltplan mit U13C Pin 10 und U13D Pin 11
verbunden.
Was muss ich dort auftrennen und wie verbinden?
>Ist das so richtig?
Ja, genau so. Mit dieser Änderung hatten wir die Sync-Signale bekommen,
aber noch kein sichtbares "K". Deshalb ist es wahrscheinlich gut, die
Leiterbahnen erst einmal nicht aufzutrennen, sondern die entsprechenden
Pins der ICs vom Sockel wegzubiegen und dort die Kabel anzulöten.
Die große Kunst bei dem Projekt ist vermutlich das Debugging. Deshalb
gehe ich so langsame vor und versuche, die Schaltung mit externen
Signalen zu stimulieren und so die korrekte Funktion der Einzelteile zu
testen.
Der Assemblercode des Zx81 ist ziemlich schwierig zu verstehen, aus
diesem Grund wird es auch nicht einfach werden, die richtigen Testpunkte
im Code zu identifizieren.
Moin,
ich habe den Pin 4 hochgebogen und mit einem Draht an U13 angelötet,
aber leider trotzdem keinerlei Videosignal.
Bis ich die Funktionsweise des Videogenerators so weit verstanden habe,
dass ich weiss wo ich messen muss, wird wohl noch etwas Zeit vergehen.
Beim "video combiner" habe ich bei U11A Pin 3 ein vielversprechendes
Signal, aber es kommt nicht durch. Es wird von D13 soweit runtergezogen,
dass Q8 nicht aufsteuert. Liegt das möglicherweise an den Werten der
Bauteile rund um Q8 (Beim Vorgänger ist eine 1N4148 und andere
Widerstandswerte verbaut) oder bei U11B und dessen Ansteuerung?
Dank ein defektes '74 (kacke Kinabauteile) hatte ich am Ausgang des U18B
(9) nichts außer High Pegel. Jetzt sieht man was.
So-wie-so habe ich mich zu früh gefreut, meinem Fernseher hacht einfach
nicht mit.
Ale schrieb:> Dank ein defektes '74 (kacke Kinabauteile) hatte ich am Ausgang des U18B> (9) nichts außer High Pegel. Jetzt sieht man was.> So-wie-so habe ich mich zu früh gefreut, meinem Fernseher hacht einfach> nicht mit.
Bekommst Du das Bild mit oder ohne die Modifikation am U19B Pin 4?
Ich habe mal an ein paar Stellen gemessen, jeweils mit und ohne die
Modifikation.
Vielleicht kann mir ja jemand so einen Tipp geben wo der Fehler sein
könnte, oder wo ich messen sollte.
Ausser für RCA out hänge ich nur dann beide screenshots an, wenn sie
sich unterscheiden.
Der ZX81 macht die Bildschirmausgabe in Echtzeit. Die Videodaten stehen
im RAM und der Prozessor führt sie als "Programm" aus. Da er naturgemäß
mit dem Bildschirminhalt nichts anfangen kann werden seine
Datenleitungen nach Masse kurzgeschlossen. Er führt dann 00h = NOP aus,
inkrementiert also den Adresszähler, während die Videologik den
RAM-Inhalt verwurstet.
Wenn der Prozessor Bild macht, also als Luxus-Adresszähler fungiert,
kann er nicht rechnen. Deshalb fällt beim ZX80 die Videoausgabe aus wenn
ein Programm läuft. Da das nicht wirklich praktisch war wurde dem ZX81
dann ein FAST und ein SLOW-Mode spendiert. Im FAST-Mode verhält er sich
wie ein ZX80. Im Slow-Mode wird die Programmausführung 192x pro Halbbild
angehalten um jeweils eine Videozeile rauszugeben. So kommt der
NMI-Generator ins Spiel.
Am Netz /HSYNC siehst Du den HSYNC. Periode 63,7 µs, davon 4,6 µs low.
U13C, U13D bilden ein Flipflop, darüber wird ein Freigabesignal erzeugt.
Wenn das Low ist löst jeder /HSYNC einen /NMI aus. Ist es High schaltet
das OR-Gatter auf High und der NMI bleibt aus.
Wir erinnern uns,
1
xxFDh.W Disable NMI (ZX81 only)
2
xxxxxx0x (decoding scheme, A1 only used)
3
xxFEh.W Enable NMI (ZX81 only)
4
xxxxxxx0 (decoding scheme, A0 only used)
Also muss nach dem Ansprechen der IO-Adresse FDh der NMI inaktiv sein
und nach dem Ansprechen von FEh aktiv. Wenn das umgekehrt ist, dann muss
die Modifikation rein bzw raus.
Wenn wir davon ausgehen, dass das ROM ordnungsgemäß ausgeführt wird,
dann sollte der NMI aktiv sein. U19_Pin_6_ohne.png wäre also der
richtige Zustand. Wenn Du mit dem Oszi rauszoomst solltest Du sehen,
dass 192 Pulse erzeugt werden und danach eine Weile High-Pegel ist. Das
ist die vertikale Austastlücke wo /VSYNC aktiv ist.
Soul E. schrieb:> Er führt dann 00h = NOP aus,> inkrementiert also den Adresszähler, während die Videologik den> RAM-Inhalt verwurstet.
Mit der Besonderheit, dass der Prozessor am vorzeitigen Zeilenende statt
der NOPs den dann durchkommenden HALT Befehl ausführt, der
zufälligerweise exakt das gleiche Timing hat wie eine Sequenz von NOPs.
Das echte Zeilenende gibts über die eigentlich für DRAMs gedacht
Refresh-Adresse.
Vielen Dank für die ausführliche Antwort!
Ich komme der Sache näher. Nun habe ich zumindest nicht synchronisierte
schwarze Flecken auf weißem Grund :-)
Den Grund warum es jetzt funktioniert kann ich nicht verraten, weil es
peinlich wäre zu erwähnen, dass ich Jumper 5 und 6 weggelassen hatte.
Ich hatte die Angaben auf der revspace Seite so verstanden, dass alle
Jumper eine Standardverbindung haben...
Das Bild bekomme ich in der originalen Verschaltung und mit Jumper 5
kann ich es invertieren. Die Schaltung und die CPU scheinen zu laufen,
nur die Synchronisation passt nicht.
Wenn ich ein leeres ROM einsetze bekomme ich ein komplett weißen
Bildschirm.
Allerdings zeigt mein China-Composite-HDMI Wandler in beiden Fällen an
das er ein NTSC Eingangssignal bekommt.
Dirk S. schrieb:> Das Bild bekomme ich in der originalen Verschaltung und mit Jumper 5> kann ich es invertieren. Die Schaltung und die CPU scheinen zu laufen,> nur die Synchronisation passt nicht.
Was sagt denn Dein Oszi? /HSYNC da, 15,7 kHz? /VSYNC da, 60 Hz? NMI da?
Das Flachbildschirme auf Zeddies nicht gut zu sprechen sind ist bekannt,
denen ist das Videosignal zu räudig. Am besten funktioniert immer noch
ein möglichst primitiver Röhrenfernseher. Wobei Dein Kompatibler
zumindest eine Austastung (Blanking) vor und nach dem HSync macht. Das
Original springt direkt von Sync auf Weiss.
Allerdings gefällt mir Dein Bildinhalt nicht. Ausser dem "K" unten links
sollte das Bild einfarbig sein. Wäre durchaus möglich dass die CPU in
den Wald läuft, dann ist die Synchronisation ebenfalls dahin.
Die nächste Feststellung. Im Bastelkeller hat sich die Schaltung
komplett geweigert ein Bild zu erzeugen und dann hatte ich eine Idee. Am
anderen Monitor hatte ich, als Notlösung, die Schaltung über eine
Powerbank versorgt. Und siehe da, wenn ich statt dem Labornetzteil die
Powerbank nehme, dann kommt (meistens) ein Bild.
Am U8 messe ich auch ein HSYNC, aber an U13 Pin_3 liegt kein VSYNC an.
Leider geht mein Frequenzgenerator nur bis 5 MHz, daher kann ich auch
keinen alternativen Takt einspeisen.
Ich habe die Signale etwas weiterverfolgt und Pin 20 vom Z80 ist
beständig auf high und wenn ich es richtig sehe, dann kann somit kein
VSYNC Signal generiert werden.
>Ich komme der Sache näher. Nun habe ich zumindest nicht synchronisierte>schwarze Flecken auf weißem Grund :-)
Das Bild sieht gar nicht schlecht aus. Es erinnert mich ein wenig an die
Muster meines Zx81 vor 37 Jahren, als ich versucht haben, das RAM in den
ROM Zeichensatzbereich zu legen.
Was ich in das Bild interpretiere: Deine Synchronisation funktioniert,
die Videosignale werden korrekt ausgegeben. Das gleichmäßige Muster
deutet darauf hin, dass der Zeichensatzadressbereich nicht stimmt.
Vielleicht sind irgendwelche Jumper für das ROM nicht richtig gesteckt.
Was mir gerade noch eingefallen ist: Vielleicht wäre es gut, wenn man
sich ein "Inbetriebnahme-ROM" machen würde, mit dem man nach und nach
die Peripherie testen kann. Man könnte ein Signal aus der
Line-Out-Buchse ausgeben.
Nur die Jumper 4 (NTSC/PAL), 5+6 (Bildschirm invertieren) sind "aktiv".
Alle anderen habe eine vorgegebene Verbindung die erst auf der Platine
durchtrennt werden müsste. Die sind auch alle vorhanden und damit sollte
es für 16k RAM und ein 27C256 EPROM passen.
Ich habe auch extra die ROM Daten 4x hintereinander gebrannt, damit auch
bei geänderten Adressjumpern immer das ZX81 ROM vorliegt.
Hier die Angaben von revspace:
The jumpers are:
JP1, select ROM size, default = 8K alternative = 16K
JP4, place to select 50Hz, open = 60Hz
JP5, Invert video, default = black text alternative = white text
JP6, first pixel fill, default = white, alternative = black
JP8, U5 pin 23, default = A11, alternative = A12
JP9, U5 pin 26, default = A13, alternative = +5V
JP10, U5 pin 20, default = nROMCS, alternative = A11
JP12, U3 PIN 1, default= GND (16K), alternative A14 (32K)
Obendrei kann ich kein VSYNC Signal bei U13 Pin_3 messen und das müsste
ja vorhanden sein, oder?
VSync kommt aus der Software. Wenn Du von Hand die entsprechenden
I/O-Adressen ansteuerst und das Flipflop toggelt, dann läuft die CPU
irgendwo in den Wald.
Wird denn der NMI 60x pro Sekunde für eine Weile ausgeschaltet?
Dein Z80 bekommt ja einen vernünftigen Takt? TTL-High reicht nicht, da
müssen echte 5 V anliegen.
So sieht der Takt direkt an der CPU aus.
Auffällig ist auch das ich nur nach mehrmaligen Ein- und Ausschalten das
Bild bekomme. Meistens klappt es nicht sofort...
U19 Pin_6 läuft mit 63,6 µs stabil durch.
Vielleicht von Bedeutung: Das Muster ist, soweit ich es sehe, bei jedem
Start immer etwas anders, bleibt aber im Betrieb gleich. Es läuft halt
immer durch.
Das Muster ist der RAM-Inhalt nach dem Einschalten. Wenn der NMI stetig
durchläuft macht die CPU irgendwas, aber keine Bildausgabe. D.h. Dein
ROM-Code läuft nicht.
HSync kommt aus der Hardware und scheint ja in Ordnung zu sein.Kein Bild
bekommst Du wenn nach dem Einschalten das VSync-Flipflop gesetzt ist.
D.h. jetzt müsstest Du den Logikanalyzer auf die CPU schnallen und mal
schauen was die nach dem Reset so treibt.
Wo wir in der Gegend sind.
Mir ist gerade aufgefallen, dass im Schaltplan ein 8x10k
Widerstandsnetzwerk als Pull-Up für die Datenleitung eingezeichnet ist.
In der BOM und daher auch verbaut ist aber 8x22k. Könnte das zu knapp
sein?
Ich muss mir bald einen neuen Nutzernamen zulegen.
Bei Aufbau habe ich die BOM abgehakt, ich habe nun hunderte Male auf die
Platine geschaut und nach Kurzschlüssen gesucht, aber das ich R12, R14
und R15 an den Datenleitungen nicht bestückt hatte habe ich erst jetzt
gemerkt.
Nun hat sich das Verhalten deutlich geändert. Es tut sich (fast) nichts
mehr.
Nach dem Einschalten kann ich etwas 700ms Signale auf D0 messen, aber
danach schaltet sich die CPU ab und alles ist ruhig. Der Takt liegt an,
aber die Adress- und Datenleitungen sind 0V. Ich habe CPU und ROM mal
getauscht, keine Änderung.
Leider habe ich keinen Logikanalyser. Ich habe mal D0 bis D3 auf das
Oszilloskop gelegt, anbei die erwähnte Startsequenz, nach der sich
nichts mehr tut.
Dazu ein willkürlicher Zoom in diese Sequenz. Die Signale sehen für mich
nicht gerade sauber aus. Ist das normal beim Z80?
Ich glaube alles wird gut (irgendwann).
Mit der Modifikation U10 Pin_4 direkt auf U13 Pin_8 bekomme ich ein
stabiles weißes Bild.
Als ich dann mit dem Oszilloskop an D0 gemessen habe, hatte ich nicht
nur Signale, sondern nun läuft eine einzelne "Punktzeile" durch das
Bild. Ist das vielleicht das ersehnte und nicht synchronisierte "K"
chris_ schrieb:> Das könnte es sein. Ich weiß nur nicht mehr, ob das "K" am Programmstart> oben oder unten auf dem Bildschirm steht ( Ich glaube unten ).
Das "K" ist unten links.
> Früher hatte ich auch keinen, aber mittlerweile gibt es ziemlich> günstige, die sehr hilfreich sind: https://www.ebay.de/itm//184390574978
Mit acht Kanälen? Schon Dein Z80 hat 40 Pins. Du brauchst acht
Datenleitungen, zumindest die unteren acht Adressleitungen, und die
CPU-Statussignale. Da sollten es schon 32 oder besser 80 Kanäle sein.
Und externer Takt, kein USB-Clock. Üblicherweise taktet man den LA mit
der doppelten oder vierfachen Taktrate des Zielsystems, und das Ziel
bekommt den selben Takt dann über 1-2 Flipflops runtergeteilt. So bleibt
die Abtastung synchron.
Im Anhang zu sehen sind einmal die ersten Befehle nach Reset (aus dem
ZX81 ROM), und einmal ein Videobild. Man erkennt gut, dass der NMI
teilweise dem Hsync folgt und teilweise abgeschaltet wird.
Sinclair hat die I/O-Funktionen sehr sparsam decodiert. Meist wird nur
eine einzige Adressleitung verwendet. Um die Hardware zu testen (NMI
an/aus, VSync an/aus) reichen bei gezogener CPU also relativ wenige
Drähte, oder meinetwegen auch Arduino-Pins.
Vielen Dank für die Logikplots (oder Diagramme, oder wie nennt man die
genau?).
Wäre ein LA1010 von Kingst vielleicht eine Option?
http://www.qdkingst.com/en/products/LA1010
Für AVR und Z80 sollte der doch ausreichen, oder?
Irgendwie will ich das Teil jetzt auch zum laufen bekommen.
Bin gerade dabei die Tastatur zu bauen :-)
Dirk S. schrieb:> Wäre ein LA1010 von Kingst vielleicht eine Option?> http://www.qdkingst.com/en/products/LA1010
Das ist doch auch so ein USB-Protokollanalyzer, der die Daten direkt in
den PC schaufelt? Bei 16 Kanälen schafft der 16 MHz, was grundsätzlich
reichen würde. Leider hängen diese 16 MHz aber am USB-Takt und kommen
nicht von Deinem Zielsystem. 16 Kanäle sind auch reichlich knapp für ein
8 bit-System. Da müsstest Du den Datenbus in zwei Durchgängen
analysieren, erst bit 0..3 und dann 4..7.
Ich habe sowas:
https://www.mikrocontroller.net/articles/Minila_Version_MockUp . Der hat
32 Kanäle, speichert 256k Datensätze, und das mit externem Takt bis 100
MHz. Ein HP 16700 wäre natürlich noch schöner, braucht aber ordentlich
Platz im Labor.
Natürlich ist ein LA mit 32 Kanälen eine feine Sache. Doch wir haben vor
35 Jahren die Z80 Systeme, dabei auch diverse ZX-Spektrum Nachbauten,
auch ohne LA in Betrieb genommen. Das Mittel der Wahl war ein
TTL-Prüfstift und eine einfache Single-Step-Logik [1]. Mit dieser Logik
kann mindestens die korrekte Arbeitsweise des Bussystems und der
Programmabarbeitung getestet werden. Funktioniert dieser Teil, lassen
sich die restlichen Fehler auch finden. Heutzutage machen kleine
Testroutinen auch keine großen Umstände mehr wie EPROM mit UV Löschen,
wieder Brennen und erneut testen.
[1]
http://zed80.com/Z80-RETRO/Resources/Schematics/CPU%20Single-Step%20Clock.jpg
Ich vermute das wir mit der Änderung zwischen U19 und U13 auf dem
falschen Weg sind. Damit entsteht dann zwar ein Videosignal, aber es
kommt nichts Sinnvolles von der CPU. Bis mein LA1010 ankommt muss ich
mit 4 Kanälen auskommen. Ich habe mal nHALT, Hsync, nNMI und U16 Pin 11
gemessen.
Wenn ich die Signal richtig verstehe, dann sieht man das die CPU etwa
600 ms läuft, dann kommt ein HALT aus dem die CPU mit einem NMI geweckt
wird. Nach einem Puls auf U16 Pin_11 (notwendig für VSYNC) kommt wieder
ein HALT, aber es kommt kein NMI zum wecken mehr und es ist Schluss...
Ich habe jetzt mein altes Buch "Mikrocomputer selbstgebaut und
programmiert" rausgesucht und werde mich mal in den Z80 einlesen. Das
Buch war damals alles was ich mir rund um einen Z80 leisten konnte :-)
Joe G.
>Natürlich ist ein LA mit 32 Kanälen eine feine Sache. Doch wir haben vor>35 Jahren die Z80 Systeme, dabei auch diverse ZX-Spektrum Nachbauten,>auch ohne LA in Betrieb genommen. Das Mittel der Wahl war ein>TTL-Prüfstift und eine einfache Single-Step-Logik [1]. Mit dieser Logik>kann mindestens die korrekte Arbeitsweise des Bussystems und der>Programmabarbeitung getestet werden. Funktioniert dieser Teil, lassen>sich die restlichen Fehler auch finden. Heutzutage machen kleine>Testroutinen auch keine großen Umstände mehr wie EPROM mit UV Löschen,>wieder Brennen und erneut testen.
Genau so sehe ich das auch. Das mit den Testroutinen habe ich weiter
oben schon mal vorgeschlagen. Im Moment kann ich leider noch kein EEPROM
programmieren, das kommt aber demnächst.
Gibt es rigendwo einen Z80 Online Assembler oder einen für Linux? Früher
hatte ich das von Hand übersetzt.
Ich hab einen LA mit 34 Kanäle, ein Intronix LogicProbe. Ich muss nur
einen Adaptor für den Z80 so es kann auf alle Adress/Data Pins greifen.
Wegen der Änderung des NMI Flipflops: es soll fukntionieren wie
gezeichnet. Die Änderung soll nicht nötig sein. Verstehe noch nicht
warum es nicht geht.
@Dirk: wenn ich mich richtig errinere, haben wir gedacht daß das NMI
Flipflop irgendwie falsh verdrahtet ist.
Ale schrieb:> Ich werde mit dem Jumper JP4 probieren. Melde mich gleich.> Ich hab noch 3 Platinen übrig, falls jemand noch was bauen will :).
Vielleicht kannst Du ja dem Konstrukteur eine zur Verfügung stellen.
So wie ich es auf der revspace Seite lese hat er selber den ZX81+38 noch
nicht aufgebaut.
https://revspace.nl/ZX81PLUS34_ZX81_clone
Unter Punkt 51 ist seine E-Mail-Adresse.
Gerade versuche ich mit dem ArduinoMega zu debuggen.
Es sieht stark danach aus, dass die Addressleitungen A13/A14 gegenüber
dem Original vertauscht sind.
>Allerdings ist das Problem ja erst relevant, wenn der ZX81+38 läuft :-D
Hast Du überprüft, ob die Addressleitungen von der CPU zu den Speichern
eventuell auch vertauscht ist?
chris_ schrieb:> Es sieht stark danach aus, dass die Addressleitungen A13/A14 gegenüber> dem Original vertauscht sind.
Wenn die Vertauschung nur den Erweiterungsstecker betrifft, dürfte sie
für Euer jetziges Problem nicht relevant sein.
Wenn Du Deinen Arduino anstelle der Z80-CPU anschliesst, kannst Du
zumindest die Adressdecodierung durchtesten.
* geht der /CS-Pin am RAM auf low zumindest im Bereich 0x4000 - 07FF?
Mit 32k RAM sollten 0x4000 - 0xBFFF aktiv sein.
* geht der /CS-Pin am EPROM auf Low im Bereich 0x0000 - 0x1FFF?
* wenn /M1 low ist, wird im Bereich 0xC000 - 0xFFFF RAM angesprochen,
und zwar das bei 0x4000 liegende.
Und dann I/O:
* schreiben auf 0xFD schaltet den NMI aus
* schreiben auf 0xFE schaltet den NMI ein
* lesen von 0xFE während der NMI aus ist selektiert den Tastaturport
(bei Euch U22) und schaltet VSync ein
* schreiben auf 0xFF schaltet VSync aus und setzt den Videozeilenzähler
zurück.
Das lässt sich alles statisch und ohne Logikanalyzer testen.
Drahtbrücken am CPU-Sockel reichen, mit Arduino als Signalgenerator ist
es natürlich komfortabler.
Ich habe mal MREQ, IORQ, RD und WR beim starten gemessen und mir ist
aufgefallen, dass die so früh aktiv werden, dass die Versorgungsspannung
noch nicht voll da ist. Dadurch erreichen sie anfangs nur etwa 2,5V bei
high.
Ich habe dann das alte Fenster-EPROM (das vermutlich nicht so glücklich
über so geringe Pegel ist) durch ein aktuelles OTP-EPROM (was vielleicht
etwas toleranter ist) getauscht und nun läuft das System über die 600ms
hinaus und ich bekomme einen weißen Bildschirm.
Die Adressleitungen zum RAM und ROM habe ich gemessen, die scheinen
richtig verdrahtet.
Dirk S. schrieb:> Ich habe mal MREQ, IORQ, RD und WR beim starten gemessen und mir ist> aufgefallen, dass die so früh aktiv werden, dass die Versorgungsspannung> noch nicht voll da ist. Dadurch erreichen sie anfangs nur etwa 2,5V bei> high.
Dann halte den Reset-Taster so lange fest bis die Betriebsspannung
komplett hochgelaufen ist. Alternativ, vergrößer C5 auf 10 oder 22 µF.
Clock muss sauber da sein bevor /Reset loslässt.
> Ich habe dann das alte Fenster-EPROM (das vermutlich nicht so glücklich> über so geringe Pegel ist) durch ein aktuelles OTP-EPROM (was vielleicht> etwas toleranter ist) getauscht und nun läuft das System über die 600ms> hinaus und ich bekomme einen weißen Bildschirm.
Nun, 2,5 V High-Pegel sind grundsätzlich in Ordnung für TTL. Auch für
EPROMs. CMOS erwartet grundsätzlich höhere High-Pegel, da sollten es
schon 80% der Betriebsspannung sein. Es gibt aber CMOS-Serien, wie die
hier verwendeten 74HCT, die mit TTL-Pegeln zufrieden sind, also >2,4 V
als High akzeptieren.
74HC ohne T funktioniert nicht an einem NMOS-Z80. Alles was der Z80
treibt muss 74HCT oder 74LS sein.
> Die Adressleitungen zum RAM und ROM habe ich gemessen, die scheinen> richtig verdrahtet.
Werden die Chipselect für RAM und ROM in den richtigen Adressbereichen
erzeugt? Schalten alle IO-Funktionen, also NMI-Freigabe, VSync und
H-Counter-Reset wie sie sollen?
Das mit dem Reset hatte ich mir auch gedacht und habe ihn mit einer
Drahtbrücke auf Masse gezogen, eingeschaltet und dann wieder geöffnet.
Aber dann passiert auf den Leitungen nichts.
Ich werde mir mal einen Taster anlöten und es noch einmal in Ruhe
durchtesten...
Der Z80 ist ein aktueller CMOS Chip Z84C0010PEG
Eigentlich wollte ich den ArduinoMega über Jumperkabel verbinden.
Aber die Steckleiste ist so eng, dass ich die Kabel nicht nebeneinander
einstecken konnte. Deshalb habe ich jetzt eine Adapterplatine gelötet
und die schöne Optik ist dahin ...
Man kann sich das Flachbandkabel eigentlich sparen und die
Adapterplatine direkt als Verbinder nehmen.
Das Testprogramm für die RAM und ROM CS-Leitungen sieht folgendermaßen
aus und die CS-Leitungen reagieren wie sie sollen.
Am Dekoder wäre auch noch nM1 und nRFSH angeschlossen. Die müsste man
noch mal gesondert testen.
1
voidtestMemoryCsLines()
2
{
3
set_nRFSH(HIGH);
4
set_nMREQ(HIGH);
5
set_nM1(HIGH);
6
7
setDebugBusActive();
8
setAddressbusActive();
9
10
while(1)
11
{
12
Z80_writeAddrBus(ROM_ADR);
13
set_nMREQ(LOW);
14
delay(VERZ);
15
delay(VERZ);// double delay to distinguish ROM from RAM on Oszi
16
set_nMREQ(HIGH);
17
delay(VERZ);
18
19
Z80_writeAddrBus(RAM_ADR);
20
set_nMREQ(LOW);
21
delay(VERZ);
22
set_nMREQ(HIGH);
23
delay(VERZ);
24
}
25
26
}
Heute morgen hatte ich den Sound Output Test noch mal laufen lassen,
aber er ging nicht mehr.
Grund: Man muss den NMI-FlipFlop erst definiert mit
1
Z80_out(0xFD,0);// turn NMI off
zurücksetzen, sonst ist der Zustand undefiniert und der Sound Output
funktioniert eventuell nicht.
So was könnte auch ein Unterschied zum echten Zx81 sein: Dass die ULA
den FlipFlop am Anfang auf einen definierten Zustand setzt.
Meinem Z80 gibt so um die 3,3 V für Signalen die auf "1" stehen (Es ist
angeblich eine CMOS Variante, aber frisst um die 100 mA). Und ich habe
wie im Stromlaufplan HC Bauteilen genommen. Das Könnte auch so ein
Problem sein. Mit einem NMOS Z80 ist auch nichts passiert. Ich frage
mich auch warum HC bauteile anstatt HCT, die HCT sind genau so schnell
and stromsparend.
Ich hab den Author kontaktiert und auf diese Seite aufmerksam gemacht,
und gefragt wegen NMI Flipflop und HC Bauteile. Vielleicht kriegen wir
eine Antwork und ein paar Ratschläge :)
So etwas in der Art werde ich wohl auch bauen müssen :-/
Ich kann jetzt drei Startverhalten immer reproduzieren.
Zur Kontrolle habe ich die Adressleitung A0, A1 und A2 auf dem Oszi.
1) Strom einfach an. Ich bekomme ein weißes Bild und permanente
Aktivität auf den Adressleitungen.
2) Strom an, mit Resetschalter gedrückt. Sobald ich loslasse habe ich
wieder für 600ms Aktivität auf den Adressleitungen und dann ist es
vorbei. Dazu kein Signal am RCA.
3) Ausgehend von 1 oder 2 drücke ich Reset und lasse los. Nun würde ich
erwarten das die CPU wieder startet, aber die Adressleitungen bleiben
still. Dafür bekomme ich das Weisssignal auf dem RCA.
Jetzt muss ich wohl oder übel entweder auf den Logikanalysator warten,
oder mir mit DIP-Schaltern und einer 40er IC-Fassung einen
"Signalgenerator" basteln...
chris_ schrieb:> Am Dekoder wäre auch noch nM1 und nRFSH angeschlossen. Die müsste man> noch mal gesondert testen.
Die sind wichtig wenn es dann an die Videoausgabe geht. Über /M1 = Low
wird ja das RAM mit DFILE von 0x4000 nach 0xC000 gespiegelt.
> So was könnte auch ein Unterschied zum echten Zx81 sein: Dass die ULA> den FlipFlop am Anfang auf einen definierten Zustand setzt.
Genau deshalb lautet der allererste Befehl im ZX81-ROM "OUT ($FD),A ".
Ale schrieb:> (...) Ich frage> mich auch warum HC bauteile anstatt HCT, die HCT sind genau so schnell> and stromsparend.
Statt HCT kannst Du auch HC nehmen, wenn die gerade herumliegen. Aber
nur an Stellen wo die Eingänge von HC oder HCT getrieben werden.
HC-Eingänge funktionieren nicht an NMOS-Ausgängen (Z80, EPROM ohne "C"
im Namen) und theoretisch nicht (praktisch aber oft) an TTL-Ausgängen
(74, 74LS).
HC braucht >3,3 V als High und <1,6 V als Low. LS und HCT brauchen >2,4
V als High und <0,8V als Low.
Dirk S. schrieb:> Jetzt muss ich wohl oder übel entweder auf den Logikanalysator warten,> oder mir mit DIP-Schaltern und einer 40er IC-Fassung einen> "Signalgenerator" basteln...
Oder mit dem Arduino, die Idee ist gar nicht so schlecht.
Euren ZX-Kompatiblen gibt es auch als ZX81+35 in SMD. In dieser Form
funktioniert er, im ZX-Forum haben das Ding einige Leute. Du könntest
also mal Deinen Schaltplan mit der SMD-Variante vergleichen, ob da ggf
Fehler beim Übertragen passiert sind. Leiterplatte und Schaltplan
sollten ja CAD sei Dank konsistent sein.
Ich klingel gerade alle möglichen Signale durch und da ist mir etwas
aufgefallen:
Sollte ich nicht zwischen den Data-Pins der CPU und den Data-Pins von
ROM und RAM 1k messen? Da ist gar keine Verbindung!
Soweit ich es im Schaltplan mit den ganzen Bussen lesen kann ist da aber
doch nichts ausser der 1k dazwischen?
Dirk S. schrieb:> Sollte ich nicht zwischen den Data-Pins der CPU und den Data-Pins von> ROM und RAM 1k messen? Da ist gar keine Verbindung!> Soweit ich es im Schaltplan mit den ganzen Bussen lesen kann ist da aber> doch nichts ausser der 1k dazwischen?
Das Video-Tutorial hast Du gelesen?
Der Z80 wird als Adresszähler für den Videospeicher missbraucht. Dazu
führt er quasi den Bildschirmspeicher als "Programm" aus. Weil er damit
natürlich nichts anfangen kann, wird sein Datenbus nach Masse
kurzgeschlossen. Er sieht dann 0x00, also NOP, und inkrementiert seinen
Adresszähler. Die 1k entkoppeln die Daten vom RAM (die ja für das
Videobild gebraucht werden) von eben diesem NOP an der CPU.
Also ja, Du solltest von jedem CPU-Datenpin 10k nach VDD messen und
zwischen CPU und RAM 1k.
Tutorial habe ich noch nicht gelesen, aber die 1k Verbindung ist
vorhanden.
Mir war bisher nicht bewusst, dass mein Multimeter beim Einschalten des
Piepser den Messbereich auf 600R feststellt :-D
Langsam macht mich das Teil Wahnsinnig.
Ich habe ja ein 28C256 zur Verfügung, damit sollte ich ja einfache
Testroutinen schreiben können. Eigentlich wollte ich mich mit Assembler
vertraut machen, wenn das System funktioniert, aber nun brauche ich es
wohl vorher. Im Buch von Klein sind ja einige Testroutinen für den
Selbstbau und die versuche ich jetzt anzupassen.
In der normalen Bestückung des ZX81+38 sind ja dies die
Speicherbereiche:
0x0000 - 0x3FF für das ROM
0x4000 - 0x7FF für das RAM
Hier das leicht angepasste Listing von Seite 103
ld a,(1000h) Lese ROM
ld a,0 Lade 0
ld (4000h),a 0 ins RAM
ld a,(4000h) Lade RAM
ld a,0ffh Lade FF
ld (4000h),a FF ins RAM
ld a,(4000h) Lade RAM
jp start Wiederhole
Anbei der hex-Code, stimmt der so?
Ich glaube ich freue mich :-)
Anbei vier Signale:
- gelb CLK
- hellbau CS ROM
- pink CS RAM
- dunkelblau nWR
Damit scheint die Adresslogik und die Speicheranbindung zu
funktionieren, oder übersehe ich mal wieder etwas?
Wie aufwändig wäre ein Assemblerprogramm, welches auf dieser Hardware
zum Beispiel schwarze und weiße Streifen oder ein anderes Testmuster
ausgibt?
Dann könnte man sich auf die Problemlösung beim Videogenerator
konzentrieren.
>Wie aufwändig wäre ein Assemblerprogramm, welches auf dieser Hardware>zum Beispiel schwarze und weiße Streifen oder ein anderes Testmuster>ausgibt?
Ich denke, das sollte möglich sein.
Ich habe gerade versucht, deinen Assemblercode oben hier zu compilieren
https://www.asm80.com/?nfname=test&nftype=a80#
aber irgendwie bringt er einen Fehler
"Unrecognized ASM type"
Dirk S. schrieb:> Wie aufwändig wäre ein Assemblerprogramm, welches auf dieser Hardware> zum Beispiel schwarze und weiße Streifen oder ein anderes Testmuster> ausgibt?
Sehr. Wie Du im Video-Tutorial gelesen hast wird das Videobild von der
CPU erzeugt. Diese muss also exakt das passende Programm ausführen. Die
Hardware, also Line Counter, HALT und NMI-Generator, unterstützen nur
beim Timing. Das ist ein ziemlich abgefahrenes Konzept, was Mr Sinclair
sich da ausgedacht hat, und um da richtig durchzusteigen braucht es eine
Weile.
Daher muss als erstes sichergestellt sein dass die Peripherie arbeitet.
NMI an/aus, VSync an/aus, RAM-Shadow bei /M1 low, etc. Den Ansatz, mit
einem Arduino Testvektoren zu generieren, finde ich gar nich so
verkehrt.
Ein kleines Stück bin ich weiter.
https://www.asm80.com/
Im Emulator muss man das File mit der Endung *.z80 abspeichern.
Die Syntax ist ähnlich der hier
Vor allen Dingen muss man das File erst im Browser speichern, erst dann
wird der Compilierknopf freigegeben. Will man den Debugger nutzen, muss
immer zuerst compiliert werden.
https://github.com/skx/z80-examples/blob/master/ram-increment.z80
Dieser Code compiliert, bis auf den Befehl
1
xor a,a
Doof, dass es so viele unterschiedliche Syntaxe für den Z80 zu geben
scheint.
Verschiedene Hirne denken verschieden. Einer meint, weil es
sbc a,e
gibt, müsse es auch
xor a,e
geben, Andere wenden ein, dass es sbc nur deshalb mit 2 anzugebenden
Operanden gibt, weil es auch
sbc hl,bc
gibt. Was bei xor nicht der Fall ist. Also hat xor nur einen
anzugebenden Operand.
>Was bei xor nicht der Fall ist. Also hat xor nur einen>anzugebenden Operand.
Naja, das mag ja schon sein. Es muss aber mindestens einen Assembler
geben, der das Konstruct xor a,a versteht, was auch immer daraus gemacht
wird. Oder der Code von hier hat nie compiliert:
https://github.com/skx/z80-examples/blob/master/ram-increment.z80
Wie auch immer, es wäre sehr nützlich, wenn man für den Online-Assembler
eine Befehlsreferenz finden könnte.
>Sonst nimm doch einen Offline-Assembler:
Danke für den Link.
Mittlerweile schaffe ich es, einfach Dinke im Online-Compiler zu
kompilieren.
Hier der Test für den Line-Out-Ausgang:
1
; Zx81plus38
2
; toogle the line out with maximum speed
3
4
out ($FC),a ; NMI off
5
loop:
6
in a,($FE)
7
out ($FF),a
8
jp loop
Dirk, vielleicht kannst Du das mal in Dein EEPROM brennen und laufen
lassen. Ich kann leider das EEPROM noch nicht schreiben.
>Eigentlich sollte man bei solchen Boards das EEPROM durch RAM und einen>AVR als Bootloader und Debugger ersetzen. ;-)
Witzigerweise machen das sogar einige. Ja, mit der Sinnhaftigkeit ist es
so eine Sache ...
Eigentlich interssierte mich der Zx81 vor ein paar Jahren, heute ist er
obsolet. Was ich beim Basteln am Projekt aber feststelle: Es macht
tatsächlich Spaß wie früher. Man kommt immer ein kleines Stückchen
weiter.
Ich kann dem Projekt aber vielleicht doch noch etwas mehr abgewinnen:
Dieser Z80 ist wahrscheinlich mehr als 20 mal langsamer als ein AVR mit
16MHz ( den Multiplier noch nicht mitbetrachtet ).
Die Frage ist aber: Die Hardware ist heute rasant schneller und die Zx81
Hardware kann da nicht mithalten. Was ist aber mit den veränderten
Softwaremethoden? Kann man mit dem heutigen Wissen etwas mehr machen,
als die Ideen, die man vor 40 Jahren hatte? Das wäre dann der Anspruch:
Etwas Neues auf alter Hardware, was es bis jetzt noch nicht gab.
Ahh ... jetzt kommen meine Erinnerungen wieder ...
1
; Zx81plus38
2
; toogle the line out
3
4
out ($FC),a ; NMI off
5
loop:
6
in a,($FE)
7
call delay
8
out ($FF),a
9
call delay
10
jp loop
11
12
delay:
13
ld b,$2 ; time constant for deley loop
14
delayLoop:
15
djnz delayLoop
16
ret
Das wird wahrscheinlich nicht laufen ... was machen wir mit dem
Stackpointer?
>von A. K. (prx)>Eigentlich sollte man bei solchen Boards das EEPROM durch RAM und einen>AVR als Bootloader und Debugger ersetzen. ;-)
Hier ist so ein Beispiel, bei dem genau das gemacht wird:
https://gitlab.com/8bitforce/retroshield-hw
Nächster Versuch dem Problem näher zu kommen :-)
Ich habe das ROM am Anfang um D3 FD ergänzt, damit sollte ja der NMI
Generator abgeschaltet werden. Wird er aber nicht.
chris_ warum hast Du $FC? Das original ROM beginnt doch auch mit D3 FD
Wieder zu früh gefreut :-(
Auch wenn das Muster zu dem passt, was ich bei dem einfachen
Speichertest erwartet hätte. Ich bekomme die gleichen Signale auch ohne
eingesetztes ROM und/oder RAM.
Ohne CPU ist es aber weg.
>chris_ warum hast Du $FC? Das original ROM beginnt doch auch mit D3 FD
Du hast recht, es muss FD sein. Tja, so spät Abends macht man viele
Fehler.
Hast Du den Code mal ausprobiert und das Signal am Line-Out angeschaut?
Ich habe das gerade mal getestet, aber ohne Erfolg. Gleiches Ergebnis
wie ohne ROM, oder mit meinem RAM-Test.
Den teste ich gleich nochmal, weil der Maschinencode falsch war. Ich mus
ja low-byte und dann high byte setzen.
Da ich das händisch übersetze hier mal der Maschinencode zum
gegenprüfen:
D3 FD DB FE D3 FF C3 02 00
Am Pin 1 des Cassette Output ist low.
Ich mache nichts mehr ohne meinen Logikanalysator.
Der soll morgen ankommen.
Irgendwie scheint es als würde gar nicht, oder zumindest nicht richtig
auf das ROM zugegriffen. Egal ob ich keines, ein leeres oder eines mit
einem der Testroutinen einsetze, das Verhalten ist, soweit ich es mit
dem Oszi erkennen kann immer gleich.
Nur beim ZX81 ROM sieht es anders aus. Da habe ich aber auch 4-mal das
gleiche Abbild gebrannt. Daher ist es komplett voll.
Jetzt habe ich das EEPROM mal mit Zufallszahlen gefüllt und siehe da, es
passieren andere Dinge. Ist vielleicht doch etwas an der Adresslogik
und/oder Verdrahtung faul?
Bei mir klappen mittlerweile die ersten Schritte.
Ich habe den Adressdecoder überbrückt und die nMREQ Leitung wie im Bild
direct als RAM-CS verwendet.
Mit diesem Code
1
; Zx81plus38
2
; toogle the line out
3
4
out ($FD),a ; NMI off
5
loop:
6
in a,($FE)
7
8
ld b,$ff ; time constant for deley loop
9
l1:
10
djnz l1
11
out ($FF),a
12
13
ld b,$ff ; time constant for deley loop
14
l2:
15
djnz l2
16
17
jp loop
kann ich einen Rechteckton am angeschlossenen Lautsprecher mit ~500Hz
erzeugen.
Der AtmegaDebugger hat mittlerweile ein kleines Menue. Ich kann den
Inhalt des RAMs editieren. Das geschieht, indem ich nBUSREQ auf 0 ziehe,
10ms warte und dann einfach mit dem Atmega direkt in das RAM schreibe.
Danach kann ich nBUSREQ und die anderen Leitungen freigeben und dann
direkt einen Reset auslösen, um das Programm zu starten.
Den ArduinoMega muss ich mit einem externen Netzteil versorgen, damit
der Z80 echte 5V bekommt und nicht die reduzierten 4.3V durch USB.
Auf den Spannungsregler des ArduinoMega habe ich einen kleine Kühlkörper
eines Schrittmotortreibers geklebt, da die ganze Schaltung 460mA zieht
und der Spannungsregler bei 8V Versorgung ziemlich heiß wird.
Die Tastatur ist schon fertig und wartet auf den ZX81 :-)
Die Platine ist gefräst, Layout kann ich bei Bedarf hier reinstellen.
Für die Tastenbezeichnung habe ich einen Ausdruck unter 25g/m²
Glasgewebe auf Sperrholz laminiert und anschließend gefräst. Mit
Distanzbolzen schauen die Tasten nur 1 mm oben raus und die
GfK-Beschichtung ist wiederstandsfähig.
Ziemlich schick die Cherry, aber wohl ganz ein kleines bisschen (zu)
teuer :-D
Obendrein ja absolut nicht stilecht, im Vergleich zur recht bescheidenen
original Tastatur.
Ich habe noch ein paar Änderungen gemacht und rumgespielt.
C5 hat jetzt 10 µF und so startet der Z80 auch erst wenn die Versorgung
wirklich gut ist. Damit startet das System nun immer exakt gleich (mit
der nach 600 ms ist Schluss-Sequenz). R42 und 43 habe ich mal testweise
deutlich verkleinert um saubere CS-Signale zu bekommen. Wenn ich es
richtig verstehe sind sie ja ohnehin nur dazu vorhanden, das der
Erweiterungsport CS überschreiben kann und das liegt wohl noch in weiter
Ferne.
Anbei nochmal die 600ms Sequenz, diesmal mit NMI, VSYNC, sowie RAM und
ROM CS. Die CPU scheint NMI doch zu deaktivieren, dann erfolgen
Speicherzugriffe und kurz vorm Ende gibt es tatsächlich einen VSYNC
Impuls und dann ist es vorbei...
>Die Tastatur ist schon fertig und wartet auf den ZX81 :-)
Die sieht ja sehr interessant aus. Kannst Du auch Bilder vom Innenleben
posten? Mit Glasgewebe habe ich noch nie gearbeitet und weiß leider
nicht, wo man das passende her bekommt.
Gibt es jemand, der schon mal ein passende Gehäuse gemacht hat?
Vielleicht könnte man eines mit dem 3D-Drucker erstellen und mit der
Methode etwas verfeinern:
https://hackaday.com/2020/09/23/reforming-3d-prints-with-salt-and-heat/
Der Grund, warum ich so langsam mit dem Debugger voran gehe, ist, dass
ich so die Fehler viel besser finde.
Bis jetzt ist mir zum Zx81plus38 folgendes aufgefallen:
1. Die Addressleitungen A13 und A14 am Anschlussstecker sind vertauscht
2. Die Spannungsversorgungspins beim Original Zx81 sind 5V und 9V. Beim
Zx81plus38 sind sie hinten kurzgeschlossen.
3. Der Wait Anschluss des Z80 ist hart an ein FlipFlop angeschlossen, so
dass man mit einem externen Debugger kein Single-Step machen kann.
Meiner Meinung nach sollten die Punkte alle bei einem Redesign besser
gelöst werden.
chris_ schrieb:>> Die sieht ja sehr interessant aus. Kannst Du auch Bilder vom Innenleben> posten?
Da gibt es nicht viel Innenleben. Das sind einfach 6x6mm Taster mit 10mm
Höhe.
>Da gibt es nicht viel Innenleben. Das sind einfach 6x6mm Taster mit 10mm>Höhe.
Danke für das Bild :-)
>Meine Güte mit diesen Fehlern ist die PCB Schrott. Eine Unverschämtheit>sowas anzubieten.
Nein, sie nicht. Die Platine ist ganz nett und für die erste Version so
schlecht nicht. Wenn wir den letzten Fehler gefunden haben, wird sie mit
einem Patch auch funktionieren.
Außerdem wird sie nicht angeboten, sondern man muss sie selber bei einem
PCB-Hersteller machen lassen. Man kann aber die Layoutdaten
herunterladen.
chris_ schrieb:> 3. Der Wait Anschluss des Z80 ist hart an ein FlipFlop angeschlossen, so> dass man mit einem externen Debugger kein Single-Step machen kann.
"The WAIT line is used to finely synchronize the Z80 with NMI timing
twice during each video frame with the NMI_CONT service routine at ROM
address 02A9." Im originalen ZX81 wird Wait über einen Transistor
angesteuert. Da kann man einen externen Low-Pegel drüberlegen.
Du könntest den Flipflop-Ausgang mit einem Serienwiderstand entkoppeln.
Der LA1010 ist da und ich musste ihn gleich einmal ausprobieren. Mein
RAM/ROM-Test hat irgendwie keine sinnvollen Werte ergeben, daher habe
ich ein noch einfacheres "Programm" geschrieben und auf der
vollbestückten Platine getestet.
D3 FD Out (FD),a
D3 23 Out (23),a
C3 00 00 wiederhole
Und siehe da, die CPU macht wie ihr befohlen!
Solange ich nur das ROM anspreche scheint es also zu funktionieren. Die
nächsten Tage habe ich leider kaum Zeit um weiter zu machen, auch wenn
es natürlich sehr reizt :-)
PS: 32 Kanäle wären echt super praktisch ;-D
Ich hab HCT chips bestellt für die die ich mit HC besückt habe, wenn die
kommen werde ich weiter testen. Mir ist noch was eingefallen: Wenn ich
ein Powerbank zur Versorgung nutze, nach dem ersten HALT Befehl der
Processor macht nichts weiter weil WAIT = 0. Und wenn ich ein Netzteil
als Versorgung anschliesse geht es. Aber ohne vernünftige Bauteile (HC)
wird wenig...
Dirk S. schrieb:> Jetzt habe ich das EEPROM mal mit Zufallszahlen gefüllt und siehe da, es> passieren andere Dinge. Ist vielleicht doch etwas an der Adresslogik> und/oder Verdrahtung faul?
Ich hatte ein aehnliches Problem vor 2 Jahren mit einem einfachen
Z80-Einplatinenrechner auf Lochraster mit Faedeldraht (laueft mit
modifizierten MS Basic von 1979 und UART-Ausgabe): Zwei der oberen
Addressleitungen waren vertauscht mit lustigen Effekten.
>Solange ich nur das ROM anspreche scheint es also zu funktionieren. Die>nächsten Tage habe ich leider kaum Zeit um weiter zu machen, auch wenn>es natürlich sehr reizt :-)
So geht's mir auch, es ist eher ein Wochenendprojekt.
Wenn das ROM funktioniert, könntest Du das Rechtecktonprogramm (
Beitrag "Re: ZX81 plus38 Clone" ) ins ROM flashen
und die Signale mit dem LA ansehen.
Weil ich mein EEPROM nicht programmieren kann, habe ich das RAM
verwendet, das ROM sollte aber genauso funktionieren, falls nicht die
zusätzliche Peripherie ( ich hatte ja nur ein Teil gesteckt )
irgendwelche Interrupts oder Waits verursacht.
Langsam kommen wir der Sache näher, glaube ich (mal wieder).
Das Rechteckprogramm läuft, der ROM-Test auch. Dann habe ich einen RAM
Test gemacht. Der läuft auch, solange ich Zeile 9 und 10 nicht einbaue,
wo ich zusätzlich wieder Line Out toggle.
Wenn OUT ($FD),a gesendet wird, kommt eigentlich immer noch ein NMI
Signal durch und das verursacht dann totales Chaos und die CPU hängt
sich auf. (Bisher habe ich noch nicht getestet einen Rücksprung in
0x0066 zu schreiben.)
Die Bedeutung des Timings habe ich aber geprüft. Nachdem ich einige
zusätzliche "NMI aus" eingefügt habe, erreicht die CPU den PIN toggle
Bereich erst nach dem letzten NMI und alles funktioniert (Ich sehe das
0xAA auf dem halben Adressbus und ein hochfrequentes Signal auf dem Line
Out).
Dirk S. schrieb:> PS: 32 Kanäle wären echt super praktisch ;-D
Auch da wirst Du irgendwann das Bedürfnis nach einem word recognizer
haben, um auf Adresse $4711 triggern zu können und troztdem nur vier
Kanäle für die Adressbits zu vergeuden :-)
Merk Dir schonmal den 74HCT688 vor.
Erich schrieb:> So hat das früher ausgesehen:> http://lc64.blogspot.com/2018/03/gould-k115d-watch-z80-working-live.html
Ja, mit so einer Kiste bist Du ganz vorne dabei. Auch HP 16xxx, ab und
zu werden die recht günstig angeboten. Wenn nur der Platzbedarf nicht
wäre...
Und nein, ein USB-Protokollanalyzer ist kein Ersatz für einen echten LA
mit internem Speicher und externem Takteingang. Saleae & Co sind genial
zum Debuggen von SW auf bekannt funktionierender HW und zum Analysieren
von SPI, CAN, I2C etc. Aber nicht für Anwendungen, wo die Abtastung mit
einem externen Systemtakt synchronisiert sein muss, wie bei diesen alten
TTL-Gräbern. Wer nicht synchronisieren kann, der muss ordentlich
überabtasten, und dann bist Du schnell bei >100 MHz Samplerate.
Was habe ich gemacht?
Den Pin_06 von U19 hochgebogen, damit ist der NMI Ausgang nicht mehr
verbunden. Nun gibt es ein, logischerweise unsauberes Bild. Es bleibt
aber synchron, wenn ich es als NTSC ausgebe. Meine Konverterkiste von
e... kann zum Glück beides.
Die Tastatur funktioniert auch zum Teil. Allerdings reagiert sie als
wäre immer "shift" gedrückt.
Könnte es sinnvoll sein die 74LS32 und 74HC00 gegen HCT Typen zu
tauschen?
Die müsste ich aber erst bestellen...
chris_ schrieb:>>Jumper unter(?) Ram/Rom ...> Das ist tatsächlich schlecht. Mein Kollege hat es dadurch gelöst, dass> die Jumper unter der Platine sind, was aber Abstandsbolzen in der> Platine erforderlich macht.
Forgive me for writing this in English, as you might know I'm Dutch, and
my english is much better than my german, although I can perfectly read
german, so I will write in English and use a translator to convert it to
german. see below.
By the way, I'm indeed the designer of the ZX-81+38, and was invited to
come here to help out builders of my clone.
chris_ schrieb:>>Jumper unter(?) Ram/Rom ...> Das ist tatsächlich schlecht. Mein Kollege hat es dadurch gelöst, dass> die Jumper unter der Platine sind, was aber Abstandsbolzen in der> Platine erforderlich macht.
these are not really meant to be jumpers, but wire links, with the
default link already present as copper traces, so if you use the default
configuration you don't have to place anything, if you need to change
the configuration you just scratch the default copper trace though and
use a thin wire (cut from a resistor, for example) to bridge the two
holes.
Due to corona, and me consequently being fired from my old job, I have
been in total self quarantine since the start of the COVID-19 crisis.
And have not been able to build my own copy of the ZX-81plus38 yet.
I would be grateful if someone could donate me a PCB, so I can built a
prototype.
My makerspace is also in (partial) quarantaine, it can accept just ten
persons, they have to wear a mask, and can stay just four hours.
So I took my laptop I used to design the ZX-81plus38 home, and I used it
to create the bill of materials with. It contains two errors, firstly
the RCA-jack I listed is of the wrong type, the PSG01546 it doesn't fit
the PCB, you should instead use the much simpler FC68391.
A second discrepancy is the Pullup resistor pack, the schematic says it
contains 4K7 resistors, but the BOM lists 10K resistors, either value
would work, but originally the value should be 10K, same as the previous
clone that was designed with SMT (surface mount components).
As for the question whether there are design errors in the ZX-81plus38,
I'm quite sure there should not be, but I'm not a super-human, and the
ZX-81plus38 was a complete redesign, using a new OS (Linux instead of
windows) and a new CAD system (KiCad instead of Orcad), so it has been a
manual conversion, not an automatic (copy-paste) conversion. And many
footprints were hand made.
But unless I made a mistake in the conversion, the clone SHOULD work, as
the old clone definitely DID work. If you doubt if I made a mistake in
the schematic, please compare the part you are doubting with the older
schematic of the ZX-81plus35.
now the translation for those who cannot read english:
-----------------------------------------------------
Verzeihen Sie mir, dass ich dies auf Englisch schreibe, da Sie
vielleicht wissen, dass ich Niederländisch bin und mein Englisch viel
besser ist als mein Deutsch, obwohl ich Deutsch perfekt lesen kann.
Deshalb werde ich auf Englisch schreiben und einen Übersetzer verwenden,
um es in Deutsch umzuwandeln.
Übrigens bin ich in der Tat der Designer des ZX-81 + 38 und wurde
eingeladen, hierher zu kommen, um den Bauherren meines Klons zu helfen.
chris_ schrieb im Beitrag # 6408709:
>> Jumper unter (?) Ram / Rom ...> Das ist schlecht. Mein Kollege hat es organisiert, dass> die Jumper unter der Platine sind, war aber Abstandsbolzen in der> Platine macht macht.
Dies sind eigentlich keine Jumper, sondern Drahtverbindungen, wobei die
Standardverbindung bereits als Kupferspuren vorhanden ist. Wenn Sie also
die Standardkonfiguration verwenden, müssen Sie nichts platzieren. Wenn
Sie die Konfiguration ändern müssen, kratzen Sie einfach die
Standard-Kupferspur und verwenden Sie einen dünnen Draht (z. B. von
einem Widerstand abgeschnitten), um die beiden Löcher zu überbrücken.
Aufgrund der Korona und der Tatsache, dass ich von meinem alten Job
entlassen wurde, befand ich mich seit Beginn der COVID-19-Krise in
völliger Selbstquarantäne. und mein Gesundheit hat sich verschlechtert
(aber ich habe keine Covid!).
Und konnte noch keine eigene Kopie des ZX-81plus38 erstellen.
Ich wäre dankbar, wenn mir jemand eine Leiterplatte spenden könnte,
damit ich einen Prototyp bauen kann.
Mein Makerspace befindet sich ebenfalls in (Teil-) Quarantäne, er kann
nur zehn Personen aufnehmen, sie müssen eine Maske tragen und kann nur
vier Stunden bleiben.
Also nahm ich meinen Laptop mit, mit dem ich den ZX-81plus38 entworfen
hatte, und erstellte damit die Stückliste. Es enthält zwei Fehler:
Erstens ist die von mir aufgeführte Cinch-Buchse vom falschen Typ, die
PSG01546 passt nicht auf die Platine, stattdessen sollten Sie den viel
einfacheren FC68391 verwenden.
Eine zweite Diskrepanz ist das Pullup-Widerstandspaket, das laut
Schaltplan 4K7-Widerstände enthält. In der Stückliste sind jedoch
10K-Widerstände aufgeführt. Beide Werte würden funktionieren, aber
ursprünglich sollte der Wert 10K betragen, genau wie beim vorherigen
Klon, der mit SMT (Surface Mount) entworfen wurde Komponenten).
Was die Frage betrifft, ob es Designfehler im ZX-81plus38 gibt, bin ich
mir ziemlich sicher, dass dies nicht der Fall sein sollte, aber ich bin
kein Übermensch, und der ZX-81plus38 war ein komplettes Redesign unter
Verwendung eines neuen Betriebssystems ( Linux anstelle von Windows) und
ein neues CAD-System (KiCad anstelle von Orcad). Es handelt sich also um
eine manuelle Konvertierung, nicht um eine automatische Konvertierung
(Kopieren und Einfügen). Und viele Fußabdrücke wurden von Hand gemacht.
Aber wenn ich bei der Konvertierung keinen Fehler gemacht habe, SOLLTE
der Klon funktionieren, da der alte Klon definitiv funktioniert hat.
Wenn Sie Zweifel haben, ob ich im Schaltplan einen Fehler gemacht habe,
vergleichen Sie bitte den Teil, an dem Sie zweifeln, mit dem älteren
Schaltplan des ZX-81plus35.
Hi Martin,
great to have you here!
As you can see from my previous post the ZX81+38 is mostly working.
But there is something wrong with the NMI Generator and/or the NMI
deactivation mechanism. The system only runs with U19 Pin 6 bended away
to disconnect the NMI. But then the picture can't be right...
My keyboard now works, there was a solder bridge activating the "shift"
all the time.
Hello Martin, great hat you could join. Let me know where should I send
a board, you also have my email address.
I got some LS chips, I'll try this evening.
Dirk S. schrieb:> The system only runs with U19 Pin 6 bended away> to disconnect the NMI. But then the picture can't be right...
Did you try to run basic in fast mode? Just like a Z80?
No difference between FAST and SLOW mode.
I've attached some more logic diagramms. I tried two things.
1) NMI bended away, connected to the LA and the NMI line pulled to GND.
This way the system operates, but the picture is nearly impossible to
read. There are no NMI generated at all. So it not the presence of the
NMI causing issues, it's the absence!
2) Normal configuration. As before after 600 ms the system halts.
With NMI bended away I can use the ZX81, the lowest row of the screen is
barely readable and it executes commands.
Just let me know if I should measure a specific signal and/or time. I'm
just trying, as I'm not familiar with the ZX81 yet.
Ich bekomme nun ein recht gutes Bild hin.
Dazu muss ich den Pin_6 von U19 hochbiegen und die nNMI Leitung am
Erweiterungsport über einen langen Draht und 100k auf Masse ziehen.
Wenn ich dann die Pinleiste anfasse ist das Bild fast perfekt :-D
Scheinbar koppeln da 50 Hz ein, allerdings synchronisiert das Display
nur NTSC Modus.
>Ich bekomme nun ein recht gutes Bild hin.
Gratulation zu Deinem Erfolg :-)
Jetzt wird die Suche nach der elektrischen Ursache interessant.
@alle
Ich finde, man müsste mal ein Blockschaltbild des Systems zeichnen, bei
dem die wichtigsten Signale beschrieben sind. Was meint Ihr?
Das Problem liegt beim nNMI Geberator.
Er lässt nach dem Start genau einen nHSYNC durch und danach kommen nWR
und nIORQ nicht mehr zeitgleich, dadurch gibt es kein nNMI mehr.
Und dort wo sie zeitgleich auftreten, da blocken A0/A1 das der nHSYNC
durchkommt.
Ich würde das Schema des ZX-81plus35 mit dem Schema des ZX-81plus38
vergleichen. Wenn es einen Fehler in der NMI-Behandlung gibt, muss es
einen Unterschied zwischen den beiden Schemata geben, leider habe ich zu
Hause keine Papierdiagramme zum Vergleich, und ich habe keinen Drucker.
Deshalb muss ich auf dem Bildschirm meines Computers nach dem
Unterschied suchen, aber das ist fast unmöglich. Ich könnte meinen
Laptop neben den Bildschirm meines Desktop-Computers halten, aber auf
den Fotos sehe ich, dass Dirk einen Zeitplan für Papier hat. Ich schlage
daher vor, dass Dirk auch den Schaltplan des ZX-81plus35 druckt und die
DMA-Schaltung beider Computer vergleicht.
Natürlich werde ich diesen Unterschied auch selbst suchen, aber wie
gesagt bin ich heute nich 100% geistig klar.
Aber Ich sage noch einmal, der ZX-81plus35 funktioniert zu 100%, sehe
oben, wo ich mit ein kleines program die Zeichensatz zeige.
Viel Glück.
Hello,
so far I can see there comes a 0xFF on the lower address byte instead of
the 0xFE to enable the nNMI. Now I saw that in the column counter area
the 74LS125 U6 (Pin 1 + 2) can force the A0´to high.
I checked this with the LA, but it seems to be okay.
I also compared the NMI generator and column counter with the ZX97
schematic and they are identical.
If I'm right there is no other possibility to force A0 high, beside the
CPU and the U6.
The second picture is the correct one.
Da ich ja etwas erkennen kann und einfache Befehle wir PRINT ausgeführt
werden, habe ich mal getestet ob das System, abgesehen von der Anzeige,
funktioniert.
Tut es leider nicht.
Dieser Speichertest endet mit 1/20:
10 FOR N=16640 TO 65536 STEP 256
20 POKE N,0
30 IF PEEK N<>0 THEN GOTO 50
40 NEXT N
50 PRINT "MEMORY SIZE ";(N/1024)-16;"K"
Im Emulator http://www.zx81stuff.org.uk/zx81/jtyone.html läuft er.
Und das hier, aus dem Druckerhandbuch, führt zum Absturz. Im Emulator
funktioniert es aber auch.
10 FOR J=1 to 10
20 FOR I=0 to J*12
30 PLOT 32+J*2*SIN(I/(J*6)*PI), 22+J*2*COS(I/(J*6)*PI)
40 NEST I
50 NEXT J
Ich komme nicht mehr wirklich weiter, da ich nicht mehr weiß wo ich
suchen soll :-(
Edit: Es kann sein das er beim zweiten Programm gar nicht abstürzt. Die
Synchronisation zum Bildschirm geht verloren. Das passiert aber auch bei
10 PRINT RND
20 GOTO 10
Da geht das Bild weg und kommt nach einiger Zeit mit dem richtigen
Ergebnis wieder.
Das der Bildschirm weggeht und das untere Adressbyte auf 0xFF geht ist
ja vermutlich genau richtig.
Die CPU arbeitet die ganze Zeit im FAST-Mode. Für den SLOW-Mode braucht
sie ja den nNMI und daher stoppt sie mit komplett verdrahtetem U19 wohl
auch nach 600ms. Sie wartet auf nNMI, nur warum kommt er nicht?
So, erstmal eine gute Nacht :-)
Man beachte das grüne, dünne, lange Laborkabel zwischen dem 100k an GND
und dem nNMI-Pin. Nur so und im NTSC-Mode gibt es ein Bild. Wenn ich den
kurzen grauen Draht direkt an den Widerstand löte, dann geht es nicht.
Dirk S. schrieb:> Dieser Speichertest endet mit 1/20:>> 10 FOR N=16640 TO 65536 STEP 256> 20 POKE N,0> 30 IF PEEK N<>0 THEN GOTO 50> 40 NEXT N> 50 PRINT "MEMORY SIZE ";(N/1024)-16;"K"
Fragen:
1. Wieviel RAM hast Du, bei welcher Adresse beginnt es, wo endet es?
2. In welchem Adressbereich im RAM liegt das Basic-Programm selbst?
Ich habe zwar wenig Ahnung vom ZX81 (mehr vom ZX-Spectrum), könnte mir
aber gut vorstellen, dass die POKEs das Basic-Programm selbst
kaputthauen. Oder liegt das unterhalb von 16640? Wo liegt der
Z80-Stackpointer?
> Im Emulator http://www.zx81stuff.org.uk/zx81/jtyone.html läuft er.
Vielleicht, weil der Emulator mehr RAM besitzt?
One difference is that the nWAIT signal is in the +34 not connected to
the Q output of the '74. When NMIs are disabled after the memory test,
as the traces show see above, the Flip-Flop U18A never gets set because
NMIs are disabled. If one pulls nWAIT high, I did with a 6k8 resistor,
then the code runs, I get VSYNC, I have to see it in the TV...
So, it works, kind of. The shifted lines at the top are much more
pronounced that they where with the TK-85 I had as a kid, and the
jumpers are in some arbitrary position. I wonder about the black line on
every char.
What I did: I pulled nWAIT high and disconnected it from the flip-flop.
I can try to pull the NMI low to see the difference.
Somehow not all power banks I used to supply the board seem to give 200
mA reliably.
@Martin: I'm shipping you today a board together with some chips.
Now for the next logical step: I want VGA output !
You found the root cause!!!!!
I just bended U18 Pin_05 away, without pull-up, just to try it.
And now it works with the nNMI connected, the circle drawing program
from above is currently drawing :-)
But it only works in NTSC, because the relative frequency deviation is
less for the 60 HZ then for the 50 Hz. So a PAL system most probably
won't synchronise.
But there is still an issue. The picture is still disorted. The lower
lines are very clear but line 1 to 2 are unreadable.
Something related to shifting the bits is wrong, because one white or
black line, jumper dependent, is always there at the end of the char and
the first line is always missing :/
Dirk's picture shows the same effect.
Yes a 12.75 MHz could help, I think Chris mentioned using a Function
Generator with a lower frequency for better sync.
Regarding the first lines: My TK-85 (also a ZX81 clone but without an
ULA) had the same effect, but I don't remember it being that pronounced.
Dirk S. schrieb:> But there is still an issue. The picture is still disorted. The lower> lines are very clear but line 1 to 2 are unreadable.
Same applies to the original ZX81. Use an old CRT television, not a
flatscreen with digital signal processing.
HSync and VSync are ORed together, therefore the HSync pulses during
VSync are missing. This makes it difficult for the DSP to syncronize on
the first lines after start of frame. For a redesign, XOR HSync into
VSync.
Die HSync-Pulse im VSync machen den TFTs das Leben deutlich leichter. Es
gibt von TI so schöne kleine Single-Gates. Da könnte man ein 74ACT1G86
nehmen und unter U11B verstecken. Dann sieht's keiner...
Einen der größten Böcke von Sinclair hat Mahjongg ja schon abgestellt:
dem originalen ZX81 fehlt der back porch hinter dem Sync. Keine Ahnung
wie das auf Deutsch heisst, aber nach HSync (0,0 V) kommt erstmal ein
bisschen Schwarz (0,3 V) bevor die eigentliche Zeile losgeht. Bei Farbe
sitzt hier der Color Burst. Mit diesem Schwarzpegel stellt der Fernseher
seine Verstärkung ein. Der ZX81 geht hier direkt von HSync (0,0 V) auf
Weisspegel (0,7 V), was viele AGCs ziemlich durcheinanderbringt. Da hast
Du dann ein in der Helligkeit waberndes Bild, was besser wird wenn die
oberen Zeilen mehr Schwarz enthalten. Erst die letzten Versionen der ZX
ULA hatten das Problem nicht mehr. Und der ZX81+35/38 hat es auch nicht.
BTW: Euer Problem scheint ja die nicht funktionierende WAIT-Schaltung zu
sein. Die hat aber durchaus einen Sinn, d.h. Debuggen lohnt sich:
http://www.user.dccnet.com/wrigter/index_files/ZX81WAIT.htm
Hi souleye,
Du meinst ich sollte U11B deaktivieren und dessen Signale auf so ein
Einzelgate XOR legen?
Mit ein bischen biegen, abknipsen und zusammenlöten, müsste sich ja
eigentlich ein XOR DIP so auf das U11 AND DIP löten lassen, dass ich nur
Pin 4,5 und 6 am XOR habe (und natürlich VCC+GND).
EDIT: U11 ist kein ODER, sondern ein UND. Die Signale sind also
gekoppelt.
Für die WAIT-Schaltung bastel ich mal die Schaltung von Wilf Ritger.
Ale schrieb:> Something related to shifting the bits is wrong, because one white or> black line, jumper dependent, is always there at the end of the char and> the first line is always missing :/> Dirk's picture shows the same effect.
That could be just a wrong setting of J6, which determines if the first
pixel is either black, or white, and J5 which determines if the whole
visible field is either black or white.
also, if you have not installed the logic for the cassette input logic,
the signal CAS_IN could be wrong, and this would invert the picture.
This logic is there so that if you input a cassette signal, the signal
will invert the video, so you will see the same "loading bars" as an
original ZX-81. On a real ZX-81 those bars are just a consequence of the
fact that the cassette signal simply uses the same pin as the video
output pin of the ULA. in my clone the same effect is tricked by
inverting the video when there is an audio signal, but for that to work
all of the cassette logic must be present.
As for my clone generating NTSC timings, that is because the NTSC (60
Hz) jumper is set, for 50HZ (PAL) just pull the jumper (JP4)
For the wait generator the D-flip/flop U18A was used, instead of some
transistor circuit. The ZX-81plus35 had both circuits, but the
D-Flip/Flop was not used. Both circuits should work though.
------ translation ---------------
Das könnte nur eine falsche Einstellung von J6 sein, die bestimmt, ob
die erste Pixel entweder schwarz oder weiß ist. Und J5, bestimmt, ob das
Ganze das sichtbare Feld ist entweder schwarz oder weiß ist.
Wenn Sie die Logik für die Kassetteneingangslogik nicht installiert
haben, kann das Signal CAS_IN falsch sein, und dies würde das Bild
invertieren.
Diese Logik ist vorhanden, damit bei Eingabe eines Kassettensignals das
Signal wird das Video invertieren, so dass Sie die gleichen
"Ladeleisten" wie im orginal sehen
Bei einem echten ZX-81 sind diese Balken nur eine Folge der
Tatsache, dass das Kassettensignal einfach den gleichen Pin des ULA wie
das Video verwendet. In meinem Klon wird der gleiche Effekt ausgetrickst
durch Invertieren des Videos, wenn ein Audiosignal vorhanden ist, aber
damit dies funktioniert muss Die gesamte Kassettenlogik vorhanden sein.
Dass mein Klon, NTSC-Timings generiert, liegt daran, dass der NTSC
(60Hz) Jumper ist gesetzt, für 50 Hz (PAL) ziehen Sie einfach den Jumper
(JP4).
Für den Wartegenerator wurde der D-Flip / Flop U18A verwendet anstelle
die Transistorschaltung. Der ZX-81plus35 hatte beide Schaltkreise, aber
die D-Flip / Flop wurde nicht verwendet. Beide Schaltungen sollten
jedoch funktionieren.
Genial!
Ich gebe zu, dass sich die Wartelogik mit dem Flip-Flop von der
Transistorlogik des ZX-81plus35 unterscheidet, der (alternativ) auch ein
Flip-Flop hatte, aber ich habe es nie getestet.
Aufgrund des Platzmangels auf der Leiterplatte habe ich mich für die
Flip-Flop-Lösung für den ZX-81 + 38 entschieden. Natürlich hätte ich
testen sollen, ob sie zuerst funktioniert.
Möglicherweise habe ich auch selbst einen Fehler gefunden (oder
tatsächlich zwei), da ich beim Betrachten des Datenblattes des SPC21348
(3,5-mm-Buchse) den Schluss ziehen kann, dass ich mich geirrt habe und
die Audio-Ein- und Ausgangssignale falsch sind. Pin aus. Aber ich muss
das sorgfältig herausfinden, das ist der Grund, zuerst einen Prototyp zu
bauen.
Sie haben Recht, aber SOT92-Transistoren haben einen relativ geringen
Platzbedarf, und ich habe mich bewusst dafür entschieden, SMT nicht zu
verwenden, da dies die Bauherren abschreckt. Ich werde diese Schaltung
mit PTH-Komponenten hinzufügen können. Ich werde das Unmögliche
innerhalb von 24 Stunden tun , Wunder dauern nur wenig länger ... :-)
Dirk S. schrieb:> Funktioniert mit dem WAIT Fix!
Super ! I'll build tomorrow the 2 transistor circuit, too, and the
keyboard. I have to send a new board to manufacturing, I want to use
Cherry keys in my keyboard.
Dirk, woher hast Du das kleine Display mit Video Eingang? Es scheint mir
sehr praktisch, für den Zx81 ein eigenes Display zu haben und ich hätte
auch gerne eines.
Der Link führt doch zur Bucht: https://www.ebay.de/itm/322931436964, es
kostet auch 15 Teuronen, es kommt aus Hamburg. Wahrscheinlich bei Ali
gibt es auch...
Aber mit 2x23 Pins ? nööö. 2x22 oder 2x28, 3 Stück kosten ~3 €.
Das Problem ist das man den Stecker nicht befestigen kann weil die
Schrauben, Mutter usw. fehlen von ZX81 Seite... Man Könnte ein DB-50
nutzen aber dann, muss man die Platine neu machen, würde ich so-wie-so,
ein bisschen mehr Fläche für VSup, einen anderen Stecker dafür.... ein
paar Sachen :)
Ich werde die 2 Gatterschaltung des ZX97 bauen, ich hab keine PNP
Transistoren.
Ich hab noch einen Composite->VGA Wandler gekauft, soll Heute
auftauchen...
chris_ schrieb:> Dirk, woher hast Du das kleine Display mit Video Eingang? Es scheint mir> sehr praktisch, für den Zx81 ein eigenes Display zu haben und ich hätte> auch gerne eines.
Das Display ist von Ama...
"7 Zoll IPS Touchscreen kapazitiver 1024x600 HDMI Display Game Monitor
für Raspberry Pi 4"
Dazu habe ich diesen Wandler von eb..
1080P 3 RCA CVBS Composite AV to HDMI Converter Konverter Mini Video
Adapter DE
Über Nacht ist der kleine fast fertig geworden :-)
Die Grafik hat allerdings noch diese zusätzlichen Striche.
chris_ schrieb:> Weiß jemand, wo man eine Platinenstecker für das Board des Zx81 bekommen> kann?
Ich habe immer ISA-Slots aus alten Mainboards auf die passende Breite
zugeschnitten. Die sind ja bei Sinclair seitlich offen.
Dann sollte sich das doch auch mit den verbliebenen U6C und U12C lösen
lassen. Den LS125 kann man ja auch als Inverter beschalten wie beim
Kassetteneingang.
Da braucht man dann "nur" einen Weg für die Leiterbahnen finden ;-)
If I understand correctly the wait circuit you are talking about
consists of the two gates in this picture:
http://www.user.dccnet.com/wrigter/index_files/ZX97lite_files/image004.jpg
specifically the OR gate and inverter in the top left.
By the way, a Dutch hobbyist who is also building my ZX-81plus38 was
kind enough to donate to me two PCB's, and a 13MHz crystal, so I can
also start building my own prototype.
But first I will design PCB revision 1.5 with the corrections we have
found. so far.
------
Wenn ich das richtig verstehe, besteht die Warteschaltung, von der Sie
sprechen, aus den beiden Logikgattern in diesem Bild:
http://www.user.dccnet.com/wrigter/index_files/ZX97lite_files/image004.jpg
speziell das ODER-Gatter und der logische Inverter oben links.
Übrigens war ein niederländischer Bastler, der auch meinen ZX-81plus38
baut, so freundlich, mir zwei Leiterplatten und einen 13-MHz-Kristall zu
spenden, damit ich auch mit dem Bau meines eigenen Prototyps beginnen
kann.
Aber zuerst werde ich PCB Revision 1.5 mit den bisher gefunden
Korrekturen entwerfen.
chris_ schrieb:> Weiß jemand, wo man eine Platinenstecker für das Board des Zx81 bekommen> kann?> Ich haben einen 44pol gefunden, aber durch die Lücke am Anschluss des> Zx81 braucht man wahrscheinlich eher 45pol doppelreihig.>> https://picclick.de/2x-Amphenol-225-22231-101-Kontakt-Leiste-f-Platinen-Stecker-44-polig-vergoldet-322931436964.html
Eigentlich wollte ich das "Wobble" -Problem nicht auf diese Weise lösen.
Ich wollte nur den Kantenverbinder durch einen um 90 Grad gebogenen
Stiftkopf ersetzen, dann können Sie neue Designs mit einer um 90 Grad
gebogenen Buchse ausstatten und eine Verbindung mit vergoldeten
Kontakten herstellen. Sie können ältere Geräte weiterhin an den
Edge-Anschluss anschließen.
Anstelle eines Buchsensteckers ist es besser, einen Stecker mit
vergoldeten Kontakten zu verwenden, wenn Sie diesen entfernen.
Bitte beachten Sie, dass zwischen der oberen und unteren Kontaktreihe
kein Austausch stattfindet.
>If I understand correctly the wait circuit you are talking about>consists of the two gates in this picture:>http://www.user.dccnet.com/wrigter/index_files/ZX97lite_files/image004.jpg>specifically the OR gate and inverter in the top left.
You mean this part of the circuit ( picture )?
>Aber zuerst werde ich PCB Revision 1.5 mit den bisher gefunden>Korrekturen entwerfen.
The original circuit of the Zx81 is done with transistors and the
ability to pull down the pin externally. I strongly recommend to have
the same feature because than it is possible to attach a single step
debugger ( which needs to pull down nWait ).
Another improvement to the board could be to make the distance between
J2 and J3 (Keyboard connectors) a multiple of 2.54 mm. The mounting hole
above the legend "ZX81+38" is a bit smaller than the other holes, there
is a bit of clearance around.
Das stimmt! Beide Pinreihen auf das richtige Raster zu bringen ist eine
gute Idee.
Ich habe nun erfolgreich ein Listing auf einen MP3-Player exportiert und
wieder geladen. Aber ich bekomme keine Spiele geladen :-(
Ich habe mir ein paar p-files bei zx81stuff.org heruntergeladen, in WAV
knvertiert und dann in MP3 (Mein MP3 Spieler mag kein WAV).
Ich sehe beim LOAD "" ganz saubere Signale bei U6 Pin_11 und der
Bildschirm verhält sich auch so wie bei meinem einfachen Listing, aber
am Ende des Ladevorgangs springt der ZX81 direkt zum "K" zurück, ohne
0/0.
Woran könnte das liegen?
MP3 ist wahrscheinlich nicht das beste Format für in Töne verwandelte
digitale Daten. Es ist ja eine verlustbehaftete Komprimierung, wobei das
Verfahren auf die Eigenheiten des menschlichen Ohr-Gehirn-Systems
abgestimmt ist. Da können durchaus entscheidende Informationen im
Nirvana verschwinden.
Das stimmt vermutlich :-/
Allerdings funktioniert es mit dem Listing, wenn ich es mit dem MP3
Player aufzeichne und wiedergebe.
Ich habe gerade ein p-file mit dem "Tape Converter" am PC abgespielt und
dann funktioniert es...
Aber das Problem mit der fehlenden Linie am Ende jedes Char hast du
immer noch, ich frage mich woher es kommt. Das mit dem p Dateien will
ich auch probieren, ich will endlich Mazogs spielen ! :)
Heute habe ich die Platine auch mal voll bestückt.
Für nWait habe ich die Transistor Schaltung von Wrigter (
Beitrag "Re: ZX81 plus38 Clone" ) als
Huckepackplatine auf U18 gesetzt.
Ich vermute in dem Bild ein "K", nur leider ist es ziemlich
verschwommen.
Ich habe als Diode eine 1N5819 und als Transistor einen BC547 genommen.
Könnte es daran liegen?
Mit dem ArduinoMegaDebugger kann ich jetzt per mcurses die Speicherdaten
direkt im VT100 Terminal anschauen.
So wie es aussieht, sind die Daten im RAM korrekt initialisiert.
Nachtrag: Ich habe das Widerstandnetzwerk auf den Datenleitungen RN1
nicht eingelötet, weil ich davon ausging, dass es nur für den Drucker
gebraucht wird. Ist das vielleicht ein Fehler?
chris_ schrieb:> Nachtrag: Ich habe das Widerstandnetzwerk auf den Datenleitungen RN1> nicht eingelötet, weil ich davon ausging, dass es nur für den Drucker> gebraucht wird. Ist das vielleicht ein Fehler?
Ja, ein BC547 ist für Niederfrequenzanwendungen gedacht. Deshalb
verwende ich einen 2N3905. Ein 1N5819 ist eine Diode, die 1A verarbeiten
kann. Sie ist also etwas zu groß, aber an sich ist das kein großes
Problem.
und nein, das Nichteinsetzen der Pullups-Widerstände verhindert nicht
den normalen Betrieb, nur wenn Sie versuchen, den ZX-81plus38 zu
drucken, wird möglicherweise nicht erkannt, dass kein Drucker
angeschlossen ist.
In der Tat können verlustfreie Audiokompressoren zu Fehlfunktionen des
ZX-81 führen. Es ist also besser, mit WAV-Dateien zu arbeiten. Oder mit
einem Player, der .P-Dateien in Audio konvertieren kann, gibt es mehrere
solcher Programme.
Ich habe mich bemüht, die Zuverlässigkeit beim Laden von Kassetten oder
Audio, die über einen Laptop abgespielt werden, zu verbessern. Daher
sollte das Laden von Bändern im Vergleich zu einem "echten" ZX-81 viel
einfacher sein, und mein Klon kann auch weichere Signale verarbeiten .
Die alten Kassettenrekorder erzeugten ein viel lauteres Signal, und der
ZX-81 war ziemlich unempfindlich und erforderte ein sehr lautes Signal.
Ich frage mich, ob Sie beim Laden auch schwarze "Ladesignalbalken" auf
Ihrem Bildschirm sehen. Die meisten Klone können diese Balken nicht
anzeigen, aber ich habe mir einen Trick ausgedacht, um sie anzuzeigen.
Ich frage mich, ob das funktioniert und wie naturgetreu es aussieht.
chris_ schrieb:>>If I understand correctly the wait circuit you are talking about>>consists of the two gates in this picture:>>http://www.user.dccnet.com/wrigter/index_files/ZX97lite_files/image004.jpg>>specifically the OR gate and inverter in the top left.>> You mean this part of the circuit ( picture )?>>>Aber zuerst werde ich PCB Revision 1.5 mit den bisher gefunden>>Korrekturen entwerfen.>> The original circuit of the Zx81 is done with transistors and the> ability to pull down the pin externally. I strongly recommend to have> the same feature because than it is possible to attach a single step> debugger ( which needs to pull down nWait ).
Ich möchte lieber nicht zwei Transistoren, drei Widerstände und einen
Kondensator hinzufügen, wenn dies nicht wirklich notwendig ist.
Ich habe eine andere Idee: Wenn ich einen 470-Ohm-Vorwiderstand in den
Ausgang des ODER-Gatters stecke, können Sie immer noch eine externe
Wartezeit für Ihren Debugger erzeugen. Dann werden nur zwei Widerstände
im Design hinzugefügt (einer für den Wechselrichter, und eine für das
ODER-Gatter)