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:
parent
8c1bfa5a05
commit
47a7654c00
@ -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));
|
||||
|
@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user