mirror of
https://github.com/TomHarte/CLK.git
synced 2025-08-12 09:25:19 +00:00
Merge pull request #121 from TomHarte/VicColours
Permits ROM-area located PRGs that are not a power-of-two in size
This commit is contained in:
@@ -18,12 +18,12 @@ using namespace Commodore::Vic20;
|
|||||||
Machine::Machine() :
|
Machine::Machine() :
|
||||||
rom_(nullptr),
|
rom_(nullptr),
|
||||||
is_running_at_zero_cost_(false),
|
is_running_at_zero_cost_(false),
|
||||||
tape_(new Storage::Tape::BinaryTapePlayer(1022727)) {
|
tape_(new Storage::Tape::BinaryTapePlayer(1022727)),
|
||||||
// create 6522s, serial port and bus
|
user_port_via_(new UserPortVIA),
|
||||||
user_port_via_.reset(new UserPortVIA);
|
keyboard_via_(new KeyboardVIA),
|
||||||
keyboard_via_.reset(new KeyboardVIA);
|
serial_port_(new SerialPort),
|
||||||
serial_port_.reset(new SerialPort);
|
serial_bus_(new ::Commodore::Serial::Bus) {
|
||||||
serial_bus_.reset(new ::Commodore::Serial::Bus);
|
// communicate the tape to the user-port VIA
|
||||||
user_port_via_->set_tape(tape_);
|
user_port_via_->set_tape(tape_);
|
||||||
|
|
||||||
// wire up the serial bus and serial port
|
// wire up the serial bus and serial port
|
||||||
@@ -98,17 +98,6 @@ Machine::~Machine() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) {
|
unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uint16_t address, uint8_t *value) {
|
||||||
// static int logCount = 0;
|
|
||||||
// if(operation == CPU6502::BusOperation::ReadOpcode && address == 0xf957) logCount = 500;
|
|
||||||
// if(operation == CPU6502::BusOperation::ReadOpcode && logCount) {
|
|
||||||
// logCount--;
|
|
||||||
// printf("%04x\n", address);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// if(operation == CPU6502::BusOperation::Write && (address >= 0x033C && address < 0x033C + 192)) {
|
|
||||||
// printf("\n[%04x] <- %02x\n", address, *value);
|
|
||||||
// }
|
|
||||||
|
|
||||||
// run the phase-1 part of this cycle, in which the VIC accesses memory
|
// run the phase-1 part of this cycle, in which the VIC accesses memory
|
||||||
if(!is_running_at_zero_cost_) mos6560_->run_for_cycles(1);
|
if(!is_running_at_zero_cost_) mos6560_->run_for_cycles(1);
|
||||||
|
|
||||||
@@ -158,10 +147,13 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
|
|||||||
|
|
||||||
// perform a via-processor_write_memory_map_ memcpy
|
// perform a via-processor_write_memory_map_ memcpy
|
||||||
uint8_t *data_ptr = data->data.data();
|
uint8_t *data_ptr = data->data.data();
|
||||||
while(start_address != end_address) {
|
size_t data_left = data->data.size();
|
||||||
processor_write_memory_map_[start_address >> 10][start_address & 0x3ff] = *data_ptr;
|
while(data_left && start_address != end_address) {
|
||||||
|
uint8_t *page = processor_write_memory_map_[start_address >> 10];
|
||||||
|
if(page) page[start_address & 0x3ff] = *data_ptr;
|
||||||
data_ptr++;
|
data_ptr++;
|
||||||
start_address++;
|
start_address++;
|
||||||
|
data_left--;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set tape status, carry and flag
|
// set tape status, carry and flag
|
||||||
@@ -266,22 +258,6 @@ void Machine::set_rom(ROMSlot slot, size_t length, const uint8_t *data) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//void Machine::set_prg(const char *file_name, size_t length, const uint8_t *data) {
|
|
||||||
// if(length > 2) {
|
|
||||||
// _rom_address = (uint16_t)(data[0] | (data[1] << 8));
|
|
||||||
// _rom_length = (uint16_t)(length - 2);
|
|
||||||
//
|
|
||||||
// // install in the ROM area if this looks like a ROM; otherwise put on tape and throw into that mechanism
|
|
||||||
// if(_rom_address == 0xa000) {
|
|
||||||
// _rom = new uint8_t[0x2000];
|
|
||||||
// memcpy(_rom, &data[2], length - 2);
|
|
||||||
// write_to_map(processor_read_memory_map_, _rom, _rom_address, 0x2000);
|
|
||||||
// } else {
|
|
||||||
// set_tape(std::shared_ptr<Storage::Tape::Tape>(new Storage::Tape::PRG(file_name)));
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
#pragma mar - Tape
|
#pragma mar - Tape
|
||||||
|
|
||||||
void Machine::configure_as_target(const StaticAnalyser::Target &target) {
|
void Machine::configure_as_target(const StaticAnalyser::Target &target) {
|
||||||
|
@@ -18,12 +18,8 @@ PRG::PRG(const char *file_name) {
|
|||||||
struct stat file_stats;
|
struct stat file_stats;
|
||||||
stat(file_name, &file_stats);
|
stat(file_name, &file_stats);
|
||||||
|
|
||||||
// accept only files sized 1, 2, 4 or 8kb
|
// accept only files sized less than 8kb
|
||||||
if(
|
if(file_stats.st_size > 0x2000 + 2)
|
||||||
file_stats.st_size != 0x400 + 2 &&
|
|
||||||
file_stats.st_size != 0x800 + 2 &&
|
|
||||||
file_stats.st_size != 0x1000 + 2 &&
|
|
||||||
file_stats.st_size != 0x2000 + 2)
|
|
||||||
throw ErrorNotROM;
|
throw ErrorNotROM;
|
||||||
|
|
||||||
// get the loading address, and the rest of the contents
|
// get the loading address, and the rest of the contents
|
||||||
@@ -33,7 +29,9 @@ PRG::PRG(const char *file_name) {
|
|||||||
loading_address |= fgetc(file) << 8;
|
loading_address |= fgetc(file) << 8;
|
||||||
|
|
||||||
size_t data_length = (size_t)file_stats.st_size - 2;
|
size_t data_length = (size_t)file_stats.st_size - 2;
|
||||||
std::vector<uint8_t> contents(data_length);
|
size_t padded_data_length = 1;
|
||||||
|
while(padded_data_length < data_length) padded_data_length <<= 1;
|
||||||
|
std::vector<uint8_t> contents(padded_data_length);
|
||||||
fread(&contents[0], 1, (size_t)(data_length), file);
|
fread(&contents[0], 1, (size_t)(data_length), file);
|
||||||
fclose(file);
|
fclose(file);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user