1
0
mirror of https://github.com/TomHarte/CLK.git synced 2024-11-26 23:52:26 +00:00

Added just enough that this is probably a successful boot. I guess I'm going to need to get invested in graphics next? Hmmm.

This commit is contained in:
Thomas Harte 2016-01-07 21:01:13 -05:00
parent 8c1bfa5a05
commit 47a7654c00
3 changed files with 57 additions and 10 deletions

View File

@ -15,6 +15,7 @@ using namespace Electron;
Machine::Machine()
{
setup6502();
_interruptStatus = 0x02;
}
Machine::~Machine()
@ -45,19 +46,40 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
switch(address&0xf)
{
case 0x0:
if(isReadOperation(operation))
{
*value = _interruptStatus;
_interruptStatus &= ~0x02;
}
else
{
_interruptControl = *value;
}
printf("Interrupt status or control\n");
break;
case 0x1:
break;
case 0x2:
_screenStartAddress = (_screenStartAddress & 0xff00) | ((*value) & 0xe0);
printf("Screen start address low, now %04x\n", _screenStartAddress);
break;
case 0x3:
printf("Screen start address\n");
_screenStartAddress = (_screenStartAddress & 0x00ff) | (uint16_t)(((*value) & 0x3f) << 8);
printf("Screen start address high, now %04x\n", _screenStartAddress);
break;
case 0x4:
printf("Cassette\n");
break;
case 0x5:
printf("Interrupt clear and paging\n");
if(!isReadOperation(operation))
{
uint8_t nextROM = (*value)&0xf;
if((_activeRom&0x12) != 0x8 || nextROM >= 8)
{
_activeRom = (Electron::ROMSlot)nextROM;
}
printf("Interrupt clear and paging\n");
}
break;
case 0x6:
printf("Counter\n");
@ -78,7 +100,21 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
}
else
{
if(isReadOperation(operation)) *value = basic[address - 32768];
if(isReadOperation(operation))
{
switch(_activeRom)
{
case ROMSlotBASIC:
case ROMSlotBASIC+1:
*value = basic[address - 32768];
break;
case ROMSlotKeyboard:
case ROMSlotKeyboard+1:
*value = 0;
break;
default: break;
}
}
}
}
@ -90,8 +126,9 @@ void Machine::set_rom(ROMSlot slot, size_t length, const uint8_t *data)
uint8_t *target = nullptr;
switch(slot)
{
case ROMTypeBASIC: target = basic; break;
case ROMTypeOS: target = os; break;
case ROMSlotBASIC: target = basic; break;
case ROMSlotOS: target = os; break;
default: return;
}
memcpy(target, data, std::min((size_t)16384, length));

View File

@ -16,9 +16,16 @@
namespace Electron {
enum ROMSlot: int {
ROMTypeBASIC = 12,
ROMTypeOS = 16,
enum ROMSlot: uint8_t {
ROMSlot0 = 0, ROMSlot1, ROMSlot2, ROMSlot3,
ROMSlot4, ROMSlot5, ROMSlot6, ROMSlot7,
ROMSlotKeyboard = 8, ROMSlot9,
ROMSlotBASIC = 10, ROMSlot11,
ROMSlot12, ROMSlot13, ROMSlot14, ROMSlot15,
ROMSlotOS
};
class Machine: public CPU6502::Processor<Machine> {
@ -34,6 +41,9 @@ class Machine: public CPU6502::Processor<Machine> {
private:
uint8_t os[16384], basic[16384], ram[32768];
uint8_t _interruptStatus, _interruptControl;
uint16_t _screenStartAddress;
ROMSlot _activeRom;
};
}

View File

@ -20,11 +20,11 @@
}
- (void)setOSROM:(nonnull NSData *)rom {
_electron.set_rom(Electron::ROMTypeOS, rom.length, (const uint8_t *)rom.bytes);
_electron.set_rom(Electron::ROMSlotOS, rom.length, (const uint8_t *)rom.bytes);
}
- (void)setBASICROM:(nonnull NSData *)rom {
_electron.set_rom(Electron::ROMTypeBASIC, rom.length, (const uint8_t *)rom.bytes);
_electron.set_rom(Electron::ROMSlotBASIC, rom.length, (const uint8_t *)rom.bytes);
}
@end