home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ARM Club 3
/
TheARMClub_PDCD3.iso
/
programs
/
emulaton
/
trash80
/
!Trash80
/
c
/
EmuDiskTOl
< prev
next >
Wrap
Text File
|
1992-09-27
|
2KB
|
91 lines
#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);
}