/*  Read ?x8 Burroughs terminal mask ROMs
 *
 *  Based on ALL03 14.05.2003 by Fabio Sturman fabio.sturman@tiscali.it
 *
 */

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <ctype.h>
#include <string.h>
#include "../include/all03.h"
#include "../include/all03ft.h"
#include "../include/keys.h"
#include "../include/sleep.h"
#include "../include/binmask.h"

unsigned char buf[2048];
unsigned char ascii[17];

/*
Signetics 82S191
2048x8 with three chip selects
Assume the Burroughs chip selects are programmable, so they
become address lines (11-13)
*/


/* work with socket (1-40) pins throughout */

#define PIN_A7   9
#define PIN_A6   10
#define PIN_A5   11
#define PIN_A4   12
#define PIN_A3   13
#define PIN_A2   14
#define PIN_A1   15
#define PIN_A0   16
#define PIN_D0   17
#define PIN_D1   18
#define PIN_D2   19
#define PIN_GND  20

#define PIN_D3   21
#define PIN_D4   22
#define PIN_D5   23
#define PIN_D6   24
#define PIN_D7   25
#define PIN_CE2  26
#define PIN_A10  27
#define PIN_CE1  28
#define PIN_CE0  29 /* Active High */
#define PIN_A9   30
#define PIN_A8   31
#define PIN_VCC  32

int pin_d[8]={PIN_D7, PIN_D6, PIN_D5, PIN_D4,
              PIN_D3, PIN_D2, PIN_D1, PIN_D0};

int pin_a[11]={PIN_A0, PIN_A1, PIN_A2, PIN_A3,
               PIN_A4, PIN_A5, PIN_A6, PIN_A7,
               PIN_A8, PIN_A9, PIN_A10};

void set_addr(unsigned int addr)
{
  int i;
  /* printf("\n%04X ",addr); */
  for(i=0; i<11; i++)
  {
    if ((addr & 0x01) == 0)
    {
      all03_wr_pin(pin_a[i],0);
      /* printf("0"); */
    } else {
      all03_wr_pin(pin_a[i],1);
      /* printf("1"); */
    }
    addr=addr>>1;
  }

}

/* main program */
int main(int argc, char *argv[])
{
  int i,j;
  char c;
  unsigned char b;
  char filename[13];

  int ce[3];

  FILE *fp=NULL;

  all03_init_h(); /* In common/all03.c : sets all pins off */
  disable_ctrl_c_break();

  /*
  printf("TESTING SPEED...\n");
  if(!test_timer())
  {
    printf("TIMER OK\n");
  } else {
    printf("\n\007* ALL03 Error - Timing not OK!\n");
  }
  */

  if(all03_test_base_address())
  {
    printf("\n\007* ALL03 Error - Programmer not found at base address %04x!\n",all03_get_base_address());
    printf("Press <ENTER>\n");
    wait_enter();
  }

  all03_init_h();
  printf("all03_init_h() done\n");


  printf("WRM Burroughs PROM reader build of %s %s\n", __DATE__, __TIME__);

  printf("Setting Vcc = 5V\n");

  all03_set_vcc(5.0);
  printf("GND to pin %i\n",PIN_GND);
          all03_wr_pin(PIN_GND,0);

          printf("VCC to pin %i\n",PIN_VCC);
          all03_wr_vcc_pin(PIN_VCC,1);

#if 1
  ce[0]=1; // Active high chip select
  ce[1]=0;
  ce[2]=0;
  #define FN "4220_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=1;
  ce[2]=0;
  #define FN "5221_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=0;
  ce[2]=1;
  #define FN "4254_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=1;
  ce[2]=1;
  #define FN "4262_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=0;
  ce[2]=0;
  #define FN "4226_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=1;
  ce[2]=0;
  #define FN "7824_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=0;
  ce[2]=1;
  #define FN "6228_%i%i.BIN"
#endif
#if 0
  ce[0]=1; // Active high chip select
  ce[1]=1;
  ce[2]=1;
  #define FN "7230_%i%i.BIN"
#endif

  all03_wr_pin(PIN_CE0,ce[0]);
  all03_wr_pin(PIN_CE1,ce[1]);
  all03_wr_pin(PIN_CE2,ce[2]);

  printf("CE2 CE1 %i %i\n", ce[2], ce[1]);
  sprintf(filename, FN, ce[2], ce[1]); /* This is quick and dirty code. Deal */

  ascii[16]='\0';
  for (i=0; i<2048; i++)
  {
    if ((i%16)==0) printf(" %s\n%04X ",ascii,i);
    set_addr(i);
    delay_ms(1);
    b=0;
    for (j=0; j<8; j++)
    {
      b = (b<<1) | all03_rd_pin(pin_d[j]); /* Read D7 first, shift left */
    }
    printf("%02X ",b);
    if (isprint(b))
    {
      ascii[i%16]=b;
    } else {
      ascii[i%16]='.';
    }
    buf[i]=b;
  }

  fp=fopen(filename,"wb");
  if (fp)
  {
    fwrite(buf, 1, 2048, fp);
    fclose(fp);
  } else {
    printf("fp == NULL!\n");
  }

  /* Exit */
  all03_init_h(); /* all pins off */
  enable_ctrl_c_break();
  return(0);
}
