#include	"compiler.h"
#include	"pccore.h"
#include	"iocore.h"
#include	"vram.h"
#include	"makescrn.h"
/* text */
void IOOUTCALL tram_atr_o(UINT port, REG8 value) {
	UINT	addr;
	addr = LOW11(port);
	if (TRAM_ATR(addr) == value) {
		return;
	}
	if ((TRAM_ATR(addr) ^ value) & (TRAMATR_Yx2 | TRAMATR_Xx2)) {
		crtc.e.remakeattr = 1;
	}
	if (value & TRAMATR_BLINK) {
		crtc.e.existblink = 1;
	}
	TRAM_ATR(addr) = value;
	crtc.e.scrnflash = 1;
	if (TRAM_ATR(addr) & TRAMATR_Xx2) {
		TRAMUPDATE(LOW11(addr + 1)) |= UPDATE_TRAM;
	}
	TRAMUPDATE(addr) |= UPDATE_TRAM;
}
void IOOUTCALL tram_ank_o(UINT port, REG8 value) {
	UINT	addr;
	addr = LOW11(port);
	if (TRAM_ANK(addr) == value) {
		return;
	}
	TRAM_ANK(addr) = value;
	crtc.e.scrnflash = 1;
	if (TRAM_ATR(addr) & TRAMATR_Xx2) {
		TRAMUPDATE(LOW11(addr + 1)) |= UPDATE_TRAM;
	}
	TRAMUPDATE(addr) |= UPDATE_TRAM;
}
void IOOUTCALL tram_knj_o(UINT port, REG8 value) {
	UINT	addr;
	addr = LOW11(port);
	if (TRAM_KNJ(addr) == value) {
		return;
	}
	TRAM_KNJ(addr) = value;
	crtc.e.scrnflash = 1;
	if (TRAM_ATR(addr) & TRAMATR_Xx2) {
		TRAMUPDATE(LOW11(addr + 1)) |= UPDATE_TRAM;
	}
	TRAMUPDATE(addr) |= UPDATE_TRAM;
}
REG8 IOINPCALL tram_atr_i(UINT port) {
	return(TRAM_ATR(LOW11(port)));
}
REG8 IOINPCALL tram_ank_i(UINT port) {
	return(TRAM_ANK(LOW11(port)));
}
REG8 IOINPCALL tram_knj_i(UINT port) {
	return(TRAM_KNJ(LOW11(port)));
}
/* grph */
void IOOUTCALL gram_o(UINT port, REG8 value) {
	UINT8	*p;
	p = crtc.e.gramacc + PORT2GRAM(port);
	if (*p == value) {
		return;
	}
	*p = value;
	TRAMUPDATE(port & crtc.e.updatemask) |= crtc.e.updatebit;
	crtc.e.scrnflash = 1;
}
REG8 IOINPCALL gram_i(UINT port) {
	return(crtc.e.gramacc[PORT2GRAM(port)]);
}
void IOOUTCALL gram2_o(UINT port, REG8 value) {
	UINT8	*p;
	p = crtc.e.gramacc + PORT2GRAM2(port);
	switch((port >> 14) & 3) {
		case 0:
			p[GRAM_B] = value;
			p[GRAM_R] = value;
			p[GRAM_G] = value;
			break;
		case 1:
			p[GRAM_R] = value;
			p[GRAM_G] = value;
			break;
		case 2:
			p[GRAM_B] = value;
			p[GRAM_G] = value;
			break;
		case 3:
			p[GRAM_B] = value;
			p[GRAM_R] = value;
			break;
	}
	TRAMUPDATE(port & crtc.e.updatemask) |= crtc.e.updatebit;
	crtc.e.scrnflash = 1;
}
/* reset */
void vramio_reset(void) {
	UINT	i;
	ZeroMemory(gram, GRAM_SIZE);
	for (i=0; i<0x800; i++) {
		TRAM_ATR(i) = 0x07;
		TRAM_ANK(i) = 0x20;
		TRAM_KNJ(i) = 0x00;
		TRAMUPDATE(i) = 0;
	}
}
RetroPC.NET-CVS <cvs@retropc.net>