Kategorie: Uncategorized

Small testrig for old DRAM 64kx4 Chips

I bought some old DRAM Chips from Ebay for the repair of an Amiga, so i looked for a way to test those chips to know if they are in working order before putting them in the board. There are some chip testers available on the market but i thought i could build one myself and maybe use it for testing other kinds of chips later by expanding on the code.

So here is my first try on a chip tester for TMS4464 / NEC 41464 and other compatible chips, those are 64k x 4 Bit organised, DIL18 case. I had some Teensy 3.2 and a 24 pin ZIF Socket in my storage, so i did a quick layout and etched a pcb. The schematic is quite simple, each connection of the ZIF Socket is connected to some header pins and the GPIOs of a Teensy 3.2 (since the Teensy is 5V tolerant), additionally i added 3 pins with GND, 5V and 3,3V to supply power to the chip with some jumper wires. Since i wanted it as versatile as possible you have to use the jumpers, but be carefull, the Ram chips have GND and VCC exchanged compared to 74xx TTL Chips. I recommend reading the datasheet of a chip before connecting it. Sadly i had no easy accessible GPIOs left to make the powersupply for the chip switchable in software, so i always have to power down the teensy to change chips, nobody is perfect. ­čÖé

The first firmware can test the Databus, Adressbus and the complete Memory for errors.

And yes, that is a 7404 in the picture, i tried my pcb on a cheap chip first before trying on out of production drams.

Have fun! Please leave a comment if you build one yourself, have suggestions or improvements on the source.

ADF-Drive 0.622 Bugfixes

New Version available, only bugfixes.

ADF Drive 0.622 Firmware

ADF-Drive Firmware with USB MTP Filesystem and Image support
This firmware has the same functionality as the ADF-Copy Firmware 0.9xx plus the new USB Drive features

Size: 105 kb
Version: v0.622

Severe bugs fixed:

  • Delete did not work due to disk caching – fixed
  • Bug in adflib, adfRemoveEntry() did not free fileHeaderBlock – fixed

Cosmetic changes:

  • ADF-Drive now reports 100% battery status to Windows

ADF-Copy 0.91

Neue Version im Downloadbereich: 0.91

Bugfixes:

  • Division by Zero Error wenn der erste Track gleich einen Schreibfehler produziert /fixed
  • Schreibschutz wird abgefragt, es bestand nie eine Gefahr f├╝r die Diskette da der Schreibschutz auch per Hardware im Laufwerk implementiert ist
  • Ein Fehler trat nach Neustart des Teensy mit Schreibzugriffen auf wenn nie zuvor ein Lesezugriff geschah. /fixed

Nur eine handvoll Bits

Ich hab mich in den letzten Tagen damit besch├Ąftigt den Schreibmodus zum laufen zu bringen… mit einigen H├╝rden.

Da auf der Magnetscheibe einer Floppy die Daten ja im MFM Format gespeichert sind muss man die Daten die da rauf sollen vorher in MFM codieren.
Zur Decodierung hab ich einige Beispiele im Netz gefunden, das war nicht so schwierig, aber f├╝r die Encodierung findet sich sehr wenig. Irgendwann bin ich dann auf eine MFM Codierungroutine des Win Fellows Amiga Emulators gesto├čen, hab diese dann auch ausprobiert und es kam nur Gr├╝tze bei raus ­čÖü

Nachdem ich mich dann doch durch mehrere Kapitel im Buch „Amiga Disk Drives:┬áinside & Out“ von┬áGrote Gelfland Abraham erschienen bei Abacus/Data Becker 1988 gek├Ąmpft habe (wer schon mal ein Hardware Buch von Data Becker in der Hand hatte wei├č das die schwierig zu lesen waren, und dazu kam noch das hier in Englisch war) hab ich festgestellt das die Routine nicht vollst├Ąndig MFM codierung implementiert hatte, sondern nur soweit das der Amiga Emulator das als MFM gefressen hat, es waren also die Clock Bits nicht korrekt berechnet. Auch bei der Checksummenberechnung stimmte auch irgendwas nicht.
Hab also das meiste ├╝ber Bord geworfen und selbst geschrieben. Nach vielen Versuchen lief dann die Codierung eines Sektors.

Ein Sektor mit 512 Datenbytes wird zu 1024 MFM codierten Bytes, dazu kommen noch Informationen ├╝ber die Nummer des Sektors, Track, Abstand zum Gap, zwei Checksummen und ein ungenutzter 16 Byte Bereich, am Ende sind es dann 1088 MFM Bytes. 11 Sektoren passen auch einen Track und dann kommt die Track Gap, ein Bereich einer Spur in den kein kompletter Sektor mehr passen w├╝rde, der aber gef├╝llt sein muss um alte Daten auf der Spur zu ├╝berschreiben.

In der Routine des Emulators wird die GAP nach den Sektoren geschrieben, das kam mit aber unlogisch vor da man ja nicht genau wissen kann wie lang die Spur wirklich ist, da ein Laufwerk ja auch gewissen Schwankungen unterliegt. Also schreibe ich zuerst eine etwas l├Ąngere Gap und dann die Sektoren soda├č der letzte Sektor etwas von der Gap ├╝berschreibt und ich sicher gehen kann das keine alten Daten ├╝berleben und kein Sektor einer vorherigen beschreibung auch nur teilweise ├╝berlebt. Weil ein Sektor wird zu beginn durch eine reihe von MFM Bytes (4x 0xAA gefolgt von 2x 0x4489) gekennzeichnet die durch die Kodierung von Datenbytes niemals zustanden kommen k├Ânnen, somit eindeutig sind. Und wenn sowas von einer vorherigen beschreibung der Spur ├╝berlebt w├╝rde man pl├Âtzlich 12 Sektoren finden und w├╝sste nicht welches die richtigen 11 sind, oder m├╝sste mehr Aufwand beim Lesen betreiben.

Bei einer sp├Ąteren Analyse eines Logikanalysatormitschnitts eines Schreibzugriffes an einem echten Amiga stellte ich fest das die es genauso machen, dar├╝ber haben sich nat├╝rlich die B├╝cher ausgeschwiegen, aber egal, ging ja auch mit nachdenken ­čÖé

Irgendwann lief dann auch die Schreibroutine und ich konnte ADF Images auf Disketten schreiben, Eureka! Nur gab es eine Menge unslesbare Tracks, aber je nach Image mal mehr mal weniger, und wie ich feststellte immer an den selben Stellen. Komisch gelle? Ich zweifelte erstmal meine MFM codier routine an. Hab da aber nichts finden k├Ânnen.┬áSp├Ąter stellte ich dann fest das immer beim letzten Sektor das letzte Byte fehlerhaft war… Lange rede kurzer Sinn: Denkfehler in der Schreibroutine.

void diskWrite()
{
 if (writeActive == false) return;
 digitalWriteFast(_writedata, !(dataByte >> 7));
 dataByte = dataByte << 1;
 writeBitCnt++;
 if (writeBitCnt == 8) {
 writePtr++;
 dataByte = stream[writePtr];
 writeBitCnt = 0;
 }
 if (writePtr >= writeSize) {
 writeActive = false;
 digitalWriteFast(_writedata, HIGH);
 }
}

Hier meine Schreibroutine, wird im 2┬Ás Takt aufgerufen und shiftet die Bits aus dem MFM Puffer an die Schreibleitung der Floppy. Ich habe den Fehler mal rot markiert… Ich hab den Schreibvorgang beendet bevor das letzte Byte rausgeshifted wurde… Narf! Es fehlten also┬ávon letzten Byte die 4 ungeraden Bits, das erkl├Ąrte auch warum manche Tracks in Ordnung waren und viele nicht.

richtig lautet die Zeile:
if (writePtr > writeSize) { … usw}

Anf├Ąngerfehler ­čśŤ