• Please review our updated Terms and Rules here

Tektronix 4907 Floppy Drive

Only kidding Monty ! As you rightly say shipping these things across the pond is not fun or cost-effective.

w.r.t. ROM imaging : don´t know how easy it is to read the Patch FPLA : if easy than that is of course the way to go.
There is at least one other smallish PROM in the floppy data write logic. That one might be soldered in.

Anyhow I still need to finish that other little 4052 project of mine....

Jos
 
Tektronix 4907 patched ROMs for version 1.2

Tektronix 4907 patched ROMs for version 1.2

Jos,

Here is a photo of my collection of three working Tektronix 4907's and working Option 30 with dual-drives:

attachment.php


Here is a photo of the 4907 ROM board with the latest firmware - version 1.2 as noted on an Intel 2716 EPROM label, and a paper label on the rear panel of that 4907.
The FPLA is labeled -14 and the patch PROM is labeled -096008:

attachment.php


I modified an Arduino program I found on the web and have recovered all thirteen 2KB ROMs as patched by the FPLA in U541 with the patch PROM in U631!

Here is the link to the program I modified:
Reading a Parallel ROM with an Arduino

The program uses an Arduino MEGA board - I used my Arduino MEGA ADK board that I had just installed in my new Star Wars BB-8 drive controller :)

I connected the Arduino to the entire 4907 ROM board using the ROM board header pins that connected to the 6800 on the controller mainboard with the ribbon cable in the photo.

Since the ROM board was being powered by a separate 5V 1A power supply - I had to remove all the ROMs but the one being captured, and left the FPLA and Patch PROM on the board to keep the board voltage above 4.9V.

The ROM board does not use READ or WRITE signals from the mainboard, but there is a separate ROM decoder pin BNKROM that is used to select the Bank ROM that contains disk drive interface firmware according to the service manual.

The 4907 ROM board includes a 74LS154 address decoder and an Intersil IM5200 FPLA that is factory programmed to decode addresses that need to be patched by a Patch PROM either a 74S471 or larger 82S2708.

I used the Arduino to supply the full 16-bit ROM address to the ROM board in addition to the BNKROM select signal and read the patched data bytes for all thirteen 2KB ROMs!

I have posted all the patched firmware files and my Arduino capture program on my github repository for Tektronix 4050 programs in the 4907 floppy drive folder in a ROMs folder:

github.com/mmcgraw74/Tektronix-4051-4052-4054-Program-Files/4907-Floppy-Drive/ROMs
 
4907 ROM update:

During my effort 2 days ago to capture all the 4907 ROMs with patches, I thought the ROM board I was using from the EBAY 4907 was broken.

I then took my bare ROM board from an auction last fall (the ROM board and controller were both very dirty) - removed the ROMs, FPLA and PROM, thoroughly cleaned it with isopropyl alcohol, scrubbed it with a toothbrush, blew the alcohol off the board and from under sockets and ICs.

I then moved my Arduino jumper wires to this board - and it had the same issue (some sockets didn't work) as the working ROM board.

I then checked all my connections again and found I had left off the A14 address pin.

I added that jumper wire and captured the data for each ROM from the Arduino serial monitor HEX output, cut and pasted that into an online HEX to binary file converter: https://tomeko.net/online_tools/hex_to_file.php?lang=en.

It was a laborious process because my original Arduino program had the ROM number as a variable, so I had to change the program and recompile for each ROM address.

Tonight, before I took the Arduino setup apart - I decided to check out the first ROM board - and realized that moving the jumpers was very time consuming - so I put a header in the ROM board ribbon cable and moved the Arduino jumpers from the ROM board to the header - and rechecked all the connections again.

Then I decided to work on automating the program to input the ROM number from the serial monitor, and also automate the logic to select the BANK ROM when the address was 6000, etc.

I got the program working - and then proceeded to check it on the ROM board I had been using - and when I checked the BANK ROM I got a different result than I did two days ago.

I then swapped the ROM board I had been using for the known good ROM board from the EBAY 4907 - and got a match on that board. Possibly I got the files mixed up and used the unpatched ROM file.

Anyway, I've updated the patched 6000 ROM file and put my latest Arduino program to read the patched ROMs on my github site.

Anyone with a 4907 with original ROMs, or patched ROMs that don't include the 2716 EPROM with the v1.2 label - should be able to program the entire set of patched ROMs with 2716 EPROMs. Then remove the FPLA and PROM from the board.
 
Was trying to disassemble the complete 4907 firmware, but ran into a problem : The patch rom data is missing...

that is because the patch rom lives at 8000, not at 6000 which is the bank rom. I now have 3 calls into the 8000 range( $80D4, $80E2 and $80EF), with unknown code behind them....
But it seems the w140.com site has updated roms. I'll try to work out if these yield a complete firmware.
 
Hmm,

I thought that I captured the image of each EPROM with it and the Patch ROMs installed on the 4907 memory board, so we wouldn't need the patch rom images.
 
Hmm,

I thought that I captured the image of each EPROM with it and the Patch ROMs installed on the 4907 memory board, so we wouldn't need the patch rom images.

The patches do indeed overrule the code inside the non-patched ROM's. But there is a catch : there is nothing to stop these patches from regularly accessing code in the $8000 range, since the patch ROM is also a normal part of the memory map.
So if a patch needs more codememory than the old-to-be patched code, then the patch consists of a JMP or JSR into the $8000 area. So without an image of the PATCH rom itself the code is incomplete.

But no problem : the 4907 PROMS i found at https://w140.com/tekwiki are an earlier release, probably version 1.0. These have no patch ROMS, and if disassembled form a complete codeset.
So for the time being I am set, if I ever get to reconstruct the 4907 controller I might pester you for a dump of that patch rom !
As it is, at 26K code size, there is more than enough to keep me busy for some time yet ! (..and I still need to finish the docu for that reconstructed Auxilliary memory file system...)
 
Jos,

I pulled out the Tektronix 4907 ROM board 74S471 patch PROM and adapted my Arduino 4907 ROM Dump program to dump the contents.

Does this data make any sense?

Code:
Reading 74S471 PROM ...

00 4011861b86084a267e80ef00c656d748 @.....J&~....V.H
10 ee0286ff00000000a60a81ff261f30ee ............&.0.
20 30160101007e80e2a97e80d400000000 0....~...~......
30 e006201ae00627163401b62003854027 ......'.4.....@'
40 00000000000000000000000000000000 ................
50 00000000000000000000000000000000 ................
60 00000000000000000000000000000000 ................
70 00000000000000000000000000000000 ................
80 00000000000000000000000000000000 ................
90 00000000000000000000000000000000 ................
A0 00000000000000000000000000000000 ................
B0 00000000000000000000000000000000 ................
C0 000000000000000000000000000000df ................
D0 83de853996878502260139968b84207e ...9....&.9....~
E0 fd75a7039781a6049782ee0520e139ce .u............9.
F0 2324ff2004ff20068608b720ff7eae93 #$...........~..

Here is my Arduino Mega2560 program to read the 74S471 PROM. I also added the print statements for address on each line. Green text are comments.

Code:
[COLOR="#008000"]/*
74S471 Reader from ROM Reader program found at http://danceswithferrets.org/geekblog/wp-content/uploads/2014/02/RomReader.txt

ROM Reader. Quick Arduino program to read a parallel-accessed ROM and dump it to the serial
port in hex.

Oddbloke. 16th Feb 2014.

Modified by Monty McGraw 1 March 2021 for 256 address 74S471 PROM in Tektronix 4907 8-inch Floppy Drive Controller ROM board
 */
 
// How I've wired the digital pins on my Arduino to the address and data pins on
// the ROM.[/COLOR]
static const int kPin_A0  = 53;
static const int kPin_A1  = 51;
static const int kPin_A2  = 49;
static const int kPin_A3  = 47;
static const int kPin_A4  = 45;
static const int kPin_A5  = 43;
static const int kPin_A6  = 41;
static const int kPin_A7  = 39;
[COLOR="#008000"]/*
static const int kPin_A8  = 46;
static const int kPin_A9  = 48;
static const int kPin_A10 = 52;
static const int kPin_A11 = 50;
static const int kPin_A12 = 37;
static const int kPin_A13 = 44;
*/[/COLOR]

static const int kPin_D0 = 28;
static const int kPin_D1 = 30;
static const int kPin_D2 = 32;
static const int kPin_D3 = 33;
static const int kPin_D4 = 31;
static const int kPin_D5 = 29;
static const int kPin_D6 = 27;
static const int kPin_D7 = 25;

const char hex[] = {'0', '1', '2', '3', '4', '5', '6', '7',
              '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

void setup()
{
 [COLOR="#008000"] // set the address lines as outputs ...[/COLOR]
  pinMode(kPin_A0, OUTPUT);     
  pinMode(kPin_A1, OUTPUT);     
  pinMode(kPin_A2, OUTPUT);     
  pinMode(kPin_A3, OUTPUT);     
  pinMode(kPin_A4, OUTPUT);     
  pinMode(kPin_A5, OUTPUT);     
  pinMode(kPin_A6, OUTPUT);     
  pinMode(kPin_A7, OUTPUT);     
[COLOR="#008000"]/*  
  pinMode(kPin_A8, OUTPUT);     
  pinMode(kPin_A9, OUTPUT);     
  pinMode(kPin_A10, OUTPUT);     
  pinMode(kPin_A11, OUTPUT);     
  pinMode(kPin_A12, OUTPUT);     
  pinMode(kPin_A13, OUTPUT);
*/ [/COLOR]
[COLOR="#008000"]  // set the data lines as inputs ...[/COLOR]
  pinMode(kPin_D0, INPUT); 
  pinMode(kPin_D1, INPUT); 
  pinMode(kPin_D2, INPUT); 
  pinMode(kPin_D3, INPUT); 
  pinMode(kPin_D4, INPUT); 
  pinMode(kPin_D5, INPUT); 
  pinMode(kPin_D6, INPUT); 
  pinMode(kPin_D7, INPUT); 
  
  Serial.begin(9600);
}

void SetAddress(int addr)
{
[COLOR="#008000"]  // update the address lines to reflect the address we want ...[/COLOR]
  digitalWrite(kPin_A0, (addr & 1)?HIGH:LOW);
  digitalWrite(kPin_A1, (addr & 2)?HIGH:LOW);
  digitalWrite(kPin_A2, (addr & 4)?HIGH:LOW);
  digitalWrite(kPin_A3, (addr & 8)?HIGH:LOW);
  digitalWrite(kPin_A4, (addr & 16)?HIGH:LOW);
  digitalWrite(kPin_A5, (addr & 32)?HIGH:LOW);
  digitalWrite(kPin_A6, (addr & 64)?HIGH:LOW);
  digitalWrite(kPin_A7, (addr & 128)?HIGH:LOW);
[COLOR="#008000"]/* 
  digitalWrite(kPin_A8, (addr & 256)?HIGH:LOW);
  digitalWrite(kPin_A9, (addr & 512)?HIGH:LOW);
  digitalWrite(kPin_A10, (addr & 1024)?HIGH:LOW);
  digitalWrite(kPin_A11, (addr & 2048)?HIGH:LOW);
  digitalWrite(kPin_A12, (addr & 4096)?HIGH:LOW);
  digitalWrite(kPin_A13, (addr & 8192)?HIGH:LOW);
*/[/COLOR]
}

byte ReadByte()
{
  // read the current eight-bit byte being output by the ROM ...
  byte b = 0;
  if (digitalRead(kPin_D0)) b |= 1;
  if (digitalRead(kPin_D1)) b |= 2;
  if (digitalRead(kPin_D2)) b |= 4;
  if (digitalRead(kPin_D3)) b |= 8;
  if (digitalRead(kPin_D4)) b |= 16;
  if (digitalRead(kPin_D5)) b |= 32;
  if (digitalRead(kPin_D6)) b |= 64;
  if (digitalRead(kPin_D7)) b |= 128;
  
  return(b);
}

void loop()
{
  byte d[16];
  int x, y,i, addr, address;
  
[COLOR="#008000"]  // The only reason I'm choosing to read in blocks of 16 bytes
  // is to keep the hex-dump code simple. You could just as easily
  // read a single byte at a time if that's all you needed.[/COLOR]
  
  Serial.println("Reading ROM ...\n");
  address = 0;
  for (i = 0; i < 256; i += 16)
  {
    addr = address + i;
    
    // read 16 bytes of data from the ROM ...
    for (x = 0; x < 16; x++)
    {
      SetAddress(addr + x); [COLOR="#008000"]// tells the ROM the byte we want ...[/COLOR]
      d[x] = ReadByte(); [COLOR="#008000"]// reads the byte back from the ROM[/COLOR]
    }
    Serial.print(address + i,HEX);
    Serial.print(" ");
    
    [COLOR="#008000"]// now we'll print each byte in hex ...[/COLOR]
    for (y = 0; y < 16; y++)
    {
      Serial.print(hex[ (d[y] & 0xF0) >> 4  ]);
      Serial.print(hex[ (d[y] & 0x0F)       ]);
    }
          
   [COLOR="#008000"] // and print an ASCII dump too ...[/COLOR]
    
    Serial.print(" ");
    for (y = 0; y < 16; y++)
    {
      char c = '.';
      if (d[y] > 32 && d[y]<127) c = d[y];
      Serial.print(c);
    }
      
    Serial.println("");
  }
  
  [COLOR="#008000"]// All done, so lockup ...[/COLOR]
  while (true) {delay(10000);}
}
 
Last edited:
Monty, that does seem to make sense, after hand-disassembly.
Although I cannot claim to understand the code yet....
 
Back
Top