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

#include "sdlc++/defs.h"
#include "sdlc++/gates.h"
#include "sdlc++/decods.h"
#include "sdlc++/muxs.h"
#include "sdlc++/latches.h"
#include "sdlc++/flip-flops.h"
#include "roms.h"
#include "user.h"
#include "leds.h"
#include "panel.h"


/*
 * Un panel de 6x8 leds para representar un caracter. La linea WRITE
 * permite cambiar el contenido de los LEDs.
 */

PANEL_6x8::PANEL_6x8()
{
	for (int k=0; k<48; k++) o[k] = GND;
}

void PANEL_6x8::run(WIRE &WRITE, WIRE i[48])
{
	mem.run(WRITE, i, o);
	if (WRITE) leds.run(o);
}

void PANEL_FILA::run(WIRE &WRITE, WIRE i[48], WIRE a[4])
{
	de.run(WRITE, a, Ebus);
	for (int k=0; k<16; k++) p[k].run(Ebus[k], i);
}

void PANEL_PRE::run(WIRE &WRITE, WIRE i[48], WIRE a[6])
{
	de.run(WRITE, a+4, Ebus);
	for (int k=0; k<4; k++) p[k].run(Ebus[k], i, a);
}

void PANEL::run(WIRE &WRITE, WIRE data[8], WIRE addr[6])
{
	int noret, a, d;
	WIRE E;
	
	a = WIRE2long(addr, 6);
	d = WIRE2long(data, 8);
	noret = 1;
	
	if (retardoa[0] != a || retardod[0] != d) noret = 0;
	if (retardoa[1] != a || retardod[1] != d) noret = 0;
	
	E = noret ? WRITE : GND;
	
	r.run(bus,data);
	p.run(E, bus, addr);
	
	retardoa[0] = retardoa[1];
	retardoa[1] = a;
	retardod[0] = retardod[1];
	retardod[1] = d;
}
