mirror of
https://github.com/TomHarte/CLK.git
synced 2024-12-02 02:49:28 +00:00
Some minor tidying, lots more of the caveman stuff as I try to determine what I'm doing wrong.
This commit is contained in:
parent
a00f9adba3
commit
f5e4ea3351
@ -125,7 +125,8 @@ void Machine::process_input_bit(int value, unsigned int cycles_since_index_hole)
|
|||||||
if((_shift_register & 0x3ff) == 0x3ff)
|
if((_shift_register & 0x3ff) == 0x3ff)
|
||||||
{
|
{
|
||||||
_driveVIA.set_sync_detected(true);
|
_driveVIA.set_sync_detected(true);
|
||||||
_bit_window_offset = -1;
|
_bit_window_offset = -1; // i.e. this bit isn't the first within a data window, but the next might be
|
||||||
|
printf("X");
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -140,6 +141,7 @@ void Machine::process_input_bit(int value, unsigned int cycles_since_index_hole)
|
|||||||
{
|
{
|
||||||
set_overflow_line(true);
|
set_overflow_line(true);
|
||||||
}
|
}
|
||||||
|
printf("%02x.", (uint8_t)_shift_register);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
set_overflow_line(false);
|
set_overflow_line(false);
|
||||||
|
@ -31,6 +31,7 @@ unsigned int Storage::Encodings::CommodoreGCR::encoding_for_nibble(uint8_t nibbl
|
|||||||
case 0x5: return 0x0f;
|
case 0x5: return 0x0f;
|
||||||
case 0x6: return 0x16;
|
case 0x6: return 0x16;
|
||||||
case 0x7: return 0x17;
|
case 0x7: return 0x17;
|
||||||
|
|
||||||
case 0x8: return 0x09;
|
case 0x8: return 0x09;
|
||||||
case 0x9: return 0x19;
|
case 0x9: return 0x19;
|
||||||
case 0xa: return 0x1a;
|
case 0xa: return 0x1a;
|
||||||
|
@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstdlib>
|
|
||||||
#include "../PCMTrack.hpp"
|
#include "../PCMTrack.hpp"
|
||||||
#include "../../../Storage/Disk/Encodings/CommodoreGCR.hpp"
|
#include "../../../Storage/Disk/Encodings/CommodoreGCR.hpp"
|
||||||
|
|
||||||
@ -33,8 +32,15 @@ D64::D64(const char *file_name)
|
|||||||
if(!_file)
|
if(!_file)
|
||||||
throw ErrorNotD64;
|
throw ErrorNotD64;
|
||||||
|
|
||||||
// then, ostensibly, this is a valid file. Hmmm. Pick a disk ID.
|
// then, ostensibly, this is a valid file. Hmmm. Pick a disk ID as a function of the file_name,
|
||||||
_disk_id = (uint16_t)rand();
|
// being the most stable thing available
|
||||||
|
_disk_id = 0;
|
||||||
|
while(*file_name)
|
||||||
|
{
|
||||||
|
_disk_id ^= file_name[0];
|
||||||
|
_disk_id = (uint16_t)((_disk_id << 2) ^ (_disk_id >> 13));
|
||||||
|
file_name++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
D64::~D64()
|
D64::~D64()
|
||||||
@ -50,7 +56,8 @@ unsigned int D64::get_head_position_count()
|
|||||||
std::shared_ptr<Track> D64::get_track_at_position(unsigned int position)
|
std::shared_ptr<Track> D64::get_track_at_position(unsigned int position)
|
||||||
{
|
{
|
||||||
// every other track is missing
|
// every other track is missing
|
||||||
if(position&1) return std::shared_ptr<Track>();
|
if(position&1)
|
||||||
|
return std::shared_ptr<Track>();
|
||||||
|
|
||||||
// figure out where this track starts on the disk
|
// figure out where this track starts on the disk
|
||||||
int offset_to_track = 0;
|
int offset_to_track = 0;
|
||||||
@ -98,6 +105,8 @@ std::shared_ptr<Track> D64::get_track_at_position(unsigned int position)
|
|||||||
uint8_t *data = new uint8_t[track_bytes];
|
uint8_t *data = new uint8_t[track_bytes];
|
||||||
track.data.reset(data);
|
track.data.reset(data);
|
||||||
|
|
||||||
|
memset(data, 0, track_bytes);
|
||||||
|
|
||||||
for(int sector = 0; sector < sectors_by_zone[zone]; sector++)
|
for(int sector = 0; sector < sectors_by_zone[zone]; sector++)
|
||||||
{
|
{
|
||||||
uint8_t *sector_data = &data[sector * 349];
|
uint8_t *sector_data = &data[sector * 349];
|
||||||
@ -115,17 +124,10 @@ std::shared_ptr<Track> D64::get_track_at_position(unsigned int position)
|
|||||||
(uint8_t)(_disk_id & 0xff), (uint8_t)(_disk_id >> 8), 0, 0
|
(uint8_t)(_disk_id & 0xff), (uint8_t)(_disk_id >> 8), 0, 0
|
||||||
};
|
};
|
||||||
Encodings::CommodoreGCR::encode_block(§or_data[8], header_end);
|
Encodings::CommodoreGCR::encode_block(§or_data[8], header_end);
|
||||||
// only the first 2.5 bytes there are what was actually wanted; fill with repeating
|
|
||||||
// 01010 and then transition back into FF, as per:
|
|
||||||
|
|
||||||
sector_data[10] = (sector_data[10] & 0xf0) | 0x05;
|
// pad out post-header parts
|
||||||
sector_data[11] = 0x29;
|
uint8_t zeros[4] = {0, 0, 0, 0};
|
||||||
sector_data[12] = 0x4a;
|
Encodings::CommodoreGCR::encode_block(§or_data[13], zeros);
|
||||||
sector_data[13] = 0x52;
|
|
||||||
sector_data[14] = 0x94;
|
|
||||||
sector_data[15] = 0xa5;
|
|
||||||
sector_data[16] = 0x29;
|
|
||||||
sector_data[17] = 0x4a;
|
|
||||||
sector_data[18] = 0x52;
|
sector_data[18] = 0x52;
|
||||||
sector_data[19] = 0x94;
|
sector_data[19] = 0x94;
|
||||||
sector_data[20] = 0xaf;
|
sector_data[20] = 0xaf;
|
||||||
|
Loading…
Reference in New Issue
Block a user