repo2/firmware_legacy/atx_eclaire.c
864 | markw | #include "atx_eclaire.h"
|
|
#include "atx.h"
|
|||
#include "regs.h"
|
|||
struct SimpleFile * gAtxFile;
|
|||
u16 last_angle_returned; // extern so we can display it on the screen
|
|||
extern unsigned char atari_sector_buffer[256];
|
|||
void longbyteswap(u32 * x);
|
|||
void byteswap(u16 * x);
|
|||
void byteSwapAtxFileHeader(struct atxFileHeader * header)
|
|||
{
|
|||
// only swap the used entries
|
|||
byteswap(&header->version);
|
|||
byteswap(&header->minVersion);
|
|||
longbyteswap(&header->startData);
|
|||
}
|
|||
void byteSwapAtxTrackHeader(struct atxTrackHeader * header)
|
|||
{
|
|||
// only swap the used entries
|
|||
longbyteswap(&header->size); // used
|
|||
byteswap(&header->sectorCount); // used
|
|||
longbyteswap(&header->headerSize); // used
|
|||
}
|
|||
void byteSwapAtxSectorListHeader(struct atxSectorListHeader * header)
|
|||
{
|
|||
longbyteswap(&header->next);
|
|||
}
|
|||
void byteSwapAtxSectorHeader(struct atxSectorHeader * header)
|
|||
{
|
|||
byteswap(&header->timev);
|
|||
longbyteswap(&header->data);
|
|||
}
|
|||
void byteSwapAtxTrackChunk(struct atxTrackChunk *header)
|
|||
{
|
|||
byteswap(&header->data);
|
|||
longbyteswap(&header->size);
|
|||
}
|
|||
void waitForAngularPosition(u16 pos)
|
|||
{
|
|||
int where = getCurrentHeadPosition();
|
|||
int diff = pos-where;
|
|||
if (diff < 0)
|
|||
{
|
|||
diff = 26042+diff;
|
|||
}
|
|||
*zpu_pause = diff<<3;
|
|||
/* // if the position is less than the current timer, we need to wait for a rollover
|
|||
// to occur
|
|||
if (pos < TCNT1 / 2) {
|
|||
TIFR1 |= _BV(OCF1A);
|
|||
while (!(TIFR1 & _BV(OCF1A)));
|
|||
}
|
|||
// wait for the timer to reach the target position
|
|||
while (TCNT1 / 2 < pos);*/
|
|||
}
|
|||
u16 getCurrentHeadPosition() {
|
|||
// TCNT1 is a variable driven by an Atmel timer that ticks every 4 microseconds. A full
|
|||
// rotation of the disk is represented in an ATX file by an angular positional value
|
|||
// between 1-26042 (or 8 microseconds based on 288 rpms). So, TCNT1 / 2 always gives the
|
|||
// current angular position of the drive head on the track any given time assuming the
|
|||
// disk is spinning continously.
|
|||
//return TCNT1 / 2;
|
|||
int res = *zpu_timer2;
|
|||
res = (res >> 3)+1;
|
|||
return res;
|
|||
}
|
|||
int faccess_offset(int type, int offset, int bytes)
|
|||
{
|
|||
int read = 0;
|
|||
*zpu_timer2_threshold = 208335;
|
|||
file_seek(gAtxFile,offset);
|
|||
file_read(gAtxFile,&atari_sector_buffer[0],bytes,&read);
|
|||
return bytes==read;
|
|||
}
|
|||
int rand()
|
|||
{
|
|||
return *zpu_rand;
|
|||
}
|
|||
extern void byteswap(WORD * inw);
|
|||
void longbyteswap(u32 * inl)
|
|||
{
|
|||
#ifndef LITTLE_ENDIAN
|
|||
unsigned char * in = (unsigned char *)inl;
|
|||
unsigned char temp0 = in[0];
|
|||
unsigned char temp1 = in[1];
|
|||
in[0] = in[3];
|
|||
in[1] = in[2];
|
|||
in[2] = temp1;
|
|||
in[3] = temp0;
|
|||
#endif
|
|||
}
|