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() Machine::Machine()
{ {
setup6502(); setup6502();
_interruptStatus = 0x02;
} }
Machine::~Machine() Machine::~Machine()
@ -45,19 +46,40 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
switch(address&0xf) switch(address&0xf)
{ {
case 0x0: case 0x0:
if(isReadOperation(operation))
{
*value = _interruptStatus;
_interruptStatus &= ~0x02;
}
else
{
_interruptControl = *value;
}
printf("Interrupt status or control\n"); printf("Interrupt status or control\n");
break; break;
case 0x1: case 0x1:
break; break;
case 0x2: case 0x2:
_screenStartAddress = (_screenStartAddress & 0xff00) | ((*value) & 0xe0);
printf("Screen start address low, now %04x\n", _screenStartAddress);
break;
case 0x3: 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; break;
case 0x4: case 0x4:
printf("Cassette\n"); printf("Cassette\n");
break; break;
case 0x5: 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; break;
case 0x6: case 0x6:
printf("Counter\n"); printf("Counter\n");
@ -78,7 +100,21 @@ unsigned int Machine::perform_bus_operation(CPU6502::BusOperation operation, uin
} }
else 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; uint8_t *target = nullptr;
switch(slot) switch(slot)
{ {
case ROMTypeBASIC: target = basic; break; case ROMSlotBASIC: target = basic; break;
case ROMTypeOS: target = os; break; case ROMSlotOS: target = os; break;
default: return;
} }
memcpy(target, data, std::min((size_t)16384, length)); memcpy(target, data, std::min((size_t)16384, length));

View File

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