#include  <stdio.h>
#include  <string.h>
#include  "bbc.h"

#include  "general.h"
#include  "Externals.h"

/* Ecran texte Apple */
#define MODE_TRS 0
#define MODE_TRS32 4


BOOL UpdWInter(u_int ad, u_char vx)
{
switch(ad & 0xff)
	{
	extern void SelK7(u_char vx), WrDisk(u_char lad, u_char vx);
	case 0xe4:
		SelK7(vx);
		return(FALSE);
	case 0xe1: /* Drive selection 1 <= vx <= 4 */

	case 0xec: /* command */
	case 0xed: /* track */
	case 0xee: /* sector */
	case 0xef: /* data */
		WrDisk(ad & 0xff, vx);
		return(TRUE);
	}
return(FALSE);
}

BOOL (*EmuWrite[SIZE_CODE>>8])(u_int ax, u_char vx);
void RafEcrAC64(void);
void RafEcrAC32(void);
void (*RafEcr3264)(void)= RafEcrAC64;

BOOL UpdScreen64(u_int ax, u_char vx);

static int offset[8] =
	{
	0x40, 0x00, 0x00, 0x00,
	-0x40, -0x60, -0x80, -0xa0
	};

BOOL UpdScreen64(u_int ad, u_char vx)
{
bbc_tab(ad & 0x3f, (ad - 0x3c00)>>6);
bbc_vdu(vx+offset[vx>>5]);
return(FALSE);
}

BOOL UpdScreen32(u_int ad,u_char vx)
{
if(!(ad & 1))
	{
	bbc_tab((ad & 0x3f)>>1,(ad - 0x3c00)>>6);
	bbc_vdu(vx+offset[vx>>5]);
	}
return(FALSE);
}

void RafEcrAC64()
{
u_int ad;
u_int p;

for(ad=0x3c00; ad< 0x4000; ad+= 0x40)
	{
	bbc_tab(0, (ad - 0x3c00)>>6);
	for(p=0; p<0x40; p++)
		{
		u_char vx= TRSCode->bytes[ad+p]; 
		bbc_vdu(vx+offset[vx>>5]);
		}
	}
}

void RafEcrAC32()
{
u_int ad;
u_int p;

for(ad=0x3c00; ad< 0x4000; ad+= 0x40)
	{
	bbc_tab(0, (ad - 0x3c00)>>6);
	for(p=0; p<0x40; p+= 2) 
		{
		u_char vx= TRSCode->bytes[ad+p]; 
		bbc_vdu(vx+offset[vx>>5]);
		}
	}
}

void SRd32vidTrue()
{
extern void French_bbc_mode(u_char mode);

French_bbc_mode(MODE_TRS32);
RafEcr3264= RafEcrAC32;
EmuWrite[0x3c] = EmuWrite[0x3d] =
	EmuWrite[0x3e] = EmuWrite[0x3f] = UpdScreen32;
(*RafEcr3264)();
}

void SRd32vidFalse()
{
extern void French_bbc_mode(u_char mode);

French_bbc_mode(MODE_TRS);
RafEcr3264= RafEcrAC64;
EmuWrite[0x3c] = EmuWrite[0x3d] =
	EmuWrite[0x3e] = EmuWrite[0x3f] = UpdScreen64;
(*RafEcr3264)();
}
