/*  Read LH538700 1M x 8 Sharp ROM (2023-07-11)
 *
 *  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"

/* Global vectors */


unsigned char buf[2048];
unsigned char ascii[17];

/* work with socket (1-40) pins throughout */


#define PIN_A19   5
#define PIN_A16   6
#define PIN_A15   7
#define PIN_A12   8
#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_CE   26
#define PIN_A10  27
#define PIN_OE   28
#define PIN_A11  29
#define PIN_A9   30
#define PIN_A8   31
#define PIN_A13  32
#define PIN_A14  33
#define PIN_A17  34
#define PIN_A18  35
#define PIN_VCC  36


int pin_d[8]={PIN_D7, PIN_D6, PIN_D5, PIN_D4,
              PIN_D3, PIN_D2, PIN_D1, PIN_D0};

int pin_a[20]={PIN_A0, PIN_A1, PIN_A2, PIN_A3,
               PIN_A4, PIN_A5, PIN_A6, PIN_A7,
               PIN_A8, PIN_A9, PIN_A10, PIN_A11,
               PIN_A12, PIN_A13, PIN_A14, PIN_A15,
               PIN_A16, PIN_A17, PIN_A18, PIN_A19};

#if 0
void dump8()
{
  int i,j;
  for (i=0; i<32; i++)
  {
    printf("%03i %02X : ",i*8,i*8);
    for (j=0; j<8; j++)
    {
      printf("%02X ", buf[i*8+j]);
    }
    printf(" - ");
    for (j=0; j<8; j++)
    {
      if (isprint(buf[i*8+j]))
      {
        printf("%c", buf[i*8+j]);
      } else {
        printf(".");
      }
    }
    printf("\n");
  }
}
#endif

void set_addr(unsigned int addr)
{
  int i;
  /* printf("\n%04X ",addr); */
  for(i=0; i<20; 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;
  unsigned char b;
  unsigned int addr;

  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 LH538700 ROM reader build of %s %s\n", __DATE__, __TIME__);

  fp=fopen("LH538700.BIN","wb");
  if (!fp)
  {
    printf("fp == NULL!\n");
    exit(1);
  }

  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);

  all03_wr_pin(PIN_CE, 0);
  all03_wr_pin(PIN_OE, 0);

  ascii[16]='\0';
  for (addr=0; addr<0x100000; addr++)
  {
    if ((addr%16)==0) printf(" %s\n%06X ",ascii,addr);
    set_addr(addr);
    delay_ms(10);
    b=0;
    for (i=0; i<8; i++)
    {
      b = (b<<1) | all03_rd_pin(pin_d[i]); /* Read D7 first, shift left */
    }
    printf("%02X ",b);
    if (isprint(b))
    {
      ascii[addr%16]=b;
    } else {
      ascii[addr%16]='.';
    }
    fwrite(&b,1,1,fp);
  }
  printf(" %s\n",ascii);
  fclose(fp);

  /* Exit */
  all03_init_h(); /* all pins off */
  enable_ctrl_c_break();
  return(0);
}
