/*
 * roms.cpp Rutinas que gestionan las memorias ROMS
 * 'Ultima modificaci'on: 12-02-2002
 *
 * Antonio G'omez Muriana (correo@senco.net)
 * Miguel Montero G'amez
 */

#include <fstream.h>
#include <stdlib.h>
#include "sdlc++/defs.h"
#include "roms.h"

ROM_1K::ROM_1K() {
    ifstream arch("data.dat", ios::nocreate | ios::binary);
    if (!arch)
    {
		cerr << "No puedo encontrar data.dat";
		abort();
    }
    arch.read(data, 1024);
    arch.close();
}

void ROM_1K::run(WIRE &READ, WIRE d[8], WIRE addr[10]) 
{
	if (READ == VCC) {
		long2WIRE(data[WIRE2long(addr, 10)], d, 8);
	}
}



ROM_PANEL::ROM_PANEL() {
    ifstream arch("char.txt", ios::nocreate);
    int k;
    char i, tmp;
	
    if (!arch)
    {
		cerr << "No puedo encontrar char.txt";
		abort();
    }
	
    // Inicializa la ROM a GND
	for (int j=0; j<256; j++) {
		for(k=0; k<48; k++)
			data[j][k] = GND;
	}
	
	// Escribe los caracteres leidos
	while (!arch.eof()) {
		arch >> ws >> i;
		for (k=0; k<48; k++) {
			arch >> tmp;
			data[i][k] = (tmp == '1' ? VCC : GND);
		}
	}
	arch.close();
}

void ROM_PANEL::run( WIRE d[48], WIRE addr[8]) 
{
	long ad = WIRE2long(addr, 8);
	
	for (int k=0; k<48; k++)
		d[k] = data[ad][k];
}