2020-02-17 04:38:38 +00:00
|
|
|
//
|
|
|
|
// disk.c
|
|
|
|
// A2Mac
|
|
|
|
//
|
|
|
|
// Created by Tamas Rudnai on 2/15/20.
|
|
|
|
// Copyright © 2020 GameAlloy. All rights reserved.
|
|
|
|
//
|
|
|
|
|
|
|
|
#include "disk.h"
|
|
|
|
#include "6502.h"
|
|
|
|
#include "common.h"
|
|
|
|
#include "woz.h"
|
|
|
|
|
|
|
|
|
|
|
|
disk_t disk = {
|
2020-02-17 07:09:29 +00:00
|
|
|
{ 0, 0, 0 }, // phase
|
|
|
|
0, // clk_since_last_read
|
2020-02-17 04:38:38 +00:00
|
|
|
};
|
|
|
|
|
2020-02-17 07:09:29 +00:00
|
|
|
const unsigned long long clk_6502_per_frm_diskAccelerator = 100 * M / fps; // disk acceleration bumps up CPU clock to 100 MHz
|
|
|
|
const unsigned long long clk_diskAcceleratorTimeout = 200000ULL;
|
2020-02-17 04:38:38 +00:00
|
|
|
|
|
|
|
|
|
|
|
// motor position from the magnet state
|
|
|
|
// -1 means invalid, not supported
|
|
|
|
const int magnet_to_Poistion[16] = {
|
|
|
|
// 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
|
|
|
|
-1, 0, 2, 1, 4, -1, 3, -1, 6, 7, -1, -1, 5, -1, -1, -1
|
|
|
|
};
|
|
|
|
|
|
|
|
const int position_to_direction[8][8] = {
|
|
|
|
// N NE E SE S SW W NW
|
|
|
|
// 0 1 2 3 4 5 6 7
|
|
|
|
{ 0, 1, 2, 3, 0, -3, -2, -1 }, // 0 N
|
|
|
|
{ -1, 0, 1, 2, 3, 0, -3, -2 }, // 1 NE
|
|
|
|
{ -2, -1, 0, 1, 2, 3, 0, -3 }, // 2 E
|
|
|
|
{ -3, -2, -1, 0, 1, 2, 3, 0 }, // 3 SE
|
|
|
|
{ 0, -3, -2, -1, 0, 1, 2, 3 }, // 4 S
|
|
|
|
{ 3, 0, -3, -2, -1, 0, 1, 2 }, // 5 SW
|
|
|
|
{ 2, 3, 0, -3, -2, -1, 0, 1 }, // 6 W
|
|
|
|
{ 1, 2, 3, 0, -3, -2, -1, 0 }, // 7 NW
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
void disk_phase() {
|
|
|
|
|
|
|
|
int position = magnet_to_Poistion[disk.phase.magnet];
|
|
|
|
if ( position >= 0 ) {
|
|
|
|
int lastPosition = disk.phase.count & 7;
|
|
|
|
int direction = position_to_direction[lastPosition][position];
|
|
|
|
|
|
|
|
disk.phase.count += direction;
|
|
|
|
if( disk.phase.count < minDiskPhaseNum ) {
|
|
|
|
disk.phase.count = minDiskPhaseNum;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
if( disk.phase.count > maxDiskPhaseNum ) {
|
|
|
|
disk.phase.count = maxDiskPhaseNum;
|
|
|
|
}
|
|
|
|
|
|
|
|
// printf(", p:%d d:%d l:%d: ph:%u trk:%u)", position, direction, lastPosition, phase.count, woz_tmap.phase[phase.count]);
|
|
|
|
|
2020-02-17 07:09:29 +00:00
|
|
|
disk.clk_since_last_read = m6502.clktime;
|
|
|
|
clk_6502_per_frm = clk_6502_per_frm_diskAccelerator;
|
|
|
|
|
2020-02-17 04:38:38 +00:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
// invalid magnet config
|
|
|
|
}
|
|
|
|
|
|
|
|
printf("\n");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
uint8_t disk_read() {
|
|
|
|
dbgPrintf("io_DISK_READ (S%u)\n", 6);
|
2020-02-17 07:09:29 +00:00
|
|
|
disk.clk_since_last_read = m6502.clktime;
|
|
|
|
clk_6502_per_frm = clk_6502_per_frm_diskAccelerator;
|
2020-02-17 04:38:38 +00:00
|
|
|
return woz_read();
|
|
|
|
}
|
|
|
|
|