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

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

#define BITBUSY (1<<0)
#define BITDRQ (1<<1)
#define BITNOTREADY (1<<7)
FILE *diskfile= NULL;

BOOL motorON= FALSE;
u_char track= 0;
u_char sector= 0;
u_int offset= 0;
u_char data = 0; 
u_char status= 0;

char lastdirection= (char) -1;

static BOOL posfile(FILE *d, int track, u_char sector)
{
u_int iuv= track*2560 + (sector<<8);
BOOL flag = (iuv <= 0x15e00) && (diskfile!= NULL);
if(flag)
	{
	offset= iuv;
	}
return(flag);
}
 
static void HandleCmd(u_char vx)
{
switch(vx & 0xf0)
	{
	case 0x00: /* Position head to track zero */
		track= 0;
	case 0x10: /* Seek */
		sector= 0;
		if(posfile(diskfile, data, sector))
			{
			track= data;
			status &= ~(BITBUSY | BITNOTREADY);
			}
		else	status |= (BITBUSY | BITNOTREADY);
		break;
	case 0x40: /* Step IN without track register update */
	case 0x50: /* Step IN with track register update */
	case 0x60: /* Step OUT without track register update */
	case 0x70: /* Step OUT with track register update */
		lastdirection= (vx & 0x20)!=0 ? -1 : +1;
	case 0x20: /* Step without track register update */
	case 0x30: /* Step with track register update */
		if(posfile(diskfile, (int) track + lastdirection, sector))
			{
			if((vx & 0x10)!=0) track+= lastdirection;
			status &= ~(BITBUSY | BITNOTREADY);
			}
		else	status |= (BITBUSY | BITNOTREADY);
		break;	}
}

void WrDisk(u_char lad, u_char vx)
{
switch(lad)
	{
	case 0xe0:
	case 0xe1:
		motorON= (vx == 1);
		break;
	case 0xec:
		HandleCmd(vx);
		break;
	}
}

u_char RdDisk(u_int ax)
{
switch(ax & 0xff)
	{
	case 0xed: /* Track register */
		return(track);
	case 0xee: /* Sector register */
		return(sector);
	case 0xef: /* Data register */
		;
	}
return(0);
}
