O2Hawk: system management work

This commit is contained in:
alyosha-tas 2019-11-18 22:17:29 -05:00
parent 8b2150dbd3
commit 2fbf3c3b19
13 changed files with 174 additions and 58 deletions

View File

@ -224,7 +224,7 @@ namespace BizHawk.Client.Common
/// ///
public static SystemInfo ChannelF { get; } = new SystemInfo("Channel F", CoreSystem.ChannelF, 2); public static SystemInfo ChannelF { get; } = new SystemInfo("Channel F", CoreSystem.ChannelF, 2);
/// <summary> /// <summary>
/// Gets the <see cref="SystemInfo"/> instance for ChannelF /// Gets the <see cref="SystemInfo"/> instance for Odyssey2
/// </summary> /// </summary>
/// ///
public static SystemInfo O2 { get; } = new SystemInfo("Odyssey2", CoreSystem.Odyssey2, 2); public static SystemInfo O2 { get; } = new SystemInfo("Odyssey2", CoreSystem.Odyssey2, 2);

View File

@ -31,7 +31,7 @@ namespace BizHawk.Client.EmuHawk
return new PadSchema return new PadSchema
{ {
IsConsole = false, IsConsole = false,
DefaultSize = new Size(200, 100), DefaultSize = new Size(100, 100),
Buttons = new[] Buttons = new[]
{ {
new PadSchema.ButtonSchema new PadSchema.ButtonSchema
@ -64,31 +64,10 @@ namespace BizHawk.Client.EmuHawk
}, },
new PadSchema.ButtonSchema new PadSchema.ButtonSchema
{ {
Name = $"P{controller} Button 1", Name = $"P{controller} F",
DisplayName = "1", DisplayName = "F",
Location = new Point(74, 34), Location = new Point(74, 34),
Type = PadSchema.PadInputType.Boolean Type = PadSchema.PadInputType.Boolean
},
new PadSchema.ButtonSchema
{
Name = $"P{controller} Button 2",
DisplayName = "2",
Location = new Point(98, 34),
Type = PadSchema.PadInputType.Boolean
},
new PadSchema.ButtonSchema
{
Name = $"P{controller} Button 3",
DisplayName = "3",
Location = new Point(122, 34),
Type = PadSchema.PadInputType.Boolean
},
new PadSchema.ButtonSchema
{
Name = $"P{controller} Button 4",
DisplayName = "4",
Location = new Point(146, 34),
Type = PadSchema.PadInputType.Boolean
} }
} }
}; };

View File

@ -183,8 +183,8 @@ namespace BizHawk.Emulation.Common.Components.I8048
case 0x9D: OP_EXP_A(AND8, P5); break; // AND P5,A case 0x9D: OP_EXP_A(AND8, P5); break; // AND P5,A
case 0x9E: OP_EXP_A(AND8, P6); break; // AND P6,A case 0x9E: OP_EXP_A(AND8, P6); break; // AND P6,A
case 0x9F: OP_EXP_A(AND8, P7); break; // AND P7,A case 0x9F: OP_EXP_A(AND8, P7); break; // AND P7,A
case 0xA0: OP_A_R(MOVT_RAM, R0); break; // MOV @R0,A case 0xA0: OP_IR(MOVT_RAM, R0); break; // MOV @R0,A
case 0xA1: OP_A_R(MOVT_RAM, R1); break; // MOV @R1,A case 0xA1: OP_IR(MOVT_RAM, R1); break; // MOV @R1,A
case 0xA2: ILLEGAL(); break; // ILLEGAL case 0xA2: ILLEGAL(); break; // ILLEGAL
case 0xA3: MOV_A_A(); break; // MOV A,@A case 0xA3: MOV_A_A(); break; // MOV A,@A
case 0xA4: JP_2k(5); break; // JP 2K 5 case 0xA4: JP_2k(5); break; // JP 2K 5

View File

@ -83,6 +83,10 @@ namespace BizHawk.Emulation.Common.Components.I8048
public const ushort PUSH = 73; public const ushort PUSH = 73;
public const ushort PULL = 74; public const ushort PULL = 74;
public const ushort PULL_PC = 75; public const ushort PULL_PC = 75;
public const ushort EEA = 76;
public const ushort DEA = 77;
public const ushort RD_P = 78;
public const ushort WR_P = 79;
public I8048() public I8048()
{ {
@ -343,7 +347,7 @@ namespace BizHawk.Emulation.Common.Components.I8048
Regs[cur_instr[instr_pntr++]] = Regs[A]; Regs[cur_instr[instr_pntr++]] = Regs[A];
break; break;
case MOVT_RAM: case MOVT_RAM:
Regs[Regs[cur_instr[instr_pntr++]]] = Regs[A];
break; break;
case ST_CNT: case ST_CNT:
counter_en = true; counter_en = true;
@ -407,6 +411,18 @@ namespace BizHawk.Emulation.Common.Components.I8048
Regs[A] = (ushort)(Regs[A] >> 4); Regs[A] = (ushort)(Regs[A] >> 4);
Regs[A] |= (ushort)((reg_d_ad << 4) & 0xF0); Regs[A] |= (ushort)((reg_d_ad << 4) & 0xF0);
break; break;
case EEA:
EA = true;
break;
case DEA:
EA = false;
break;
case RD_P:
EA = false;
break;
case WR_P:
WritePort(cur_instr[instr_pntr++], (byte)Regs[cur_instr[instr_pntr++]]);
break;
} }
if (++irq_pntr == IRQS) if (++irq_pntr == IRQS)
@ -551,6 +567,7 @@ namespace BizHawk.Emulation.Common.Components.I8048
ser.Sync(nameof(IRQS), ref IRQS); ser.Sync(nameof(IRQS), ref IRQS);
ser.Sync(nameof(irq_pntr), ref irq_pntr); ser.Sync(nameof(irq_pntr), ref irq_pntr);
ser.Sync(nameof(EA), ref EA);
ser.Sync(nameof(TF), ref TF); ser.Sync(nameof(TF), ref TF);
ser.Sync(nameof(timer_en), ref timer_en); ser.Sync(nameof(timer_en), ref timer_en);
ser.Sync(nameof(counter_en), ref counter_en); ser.Sync(nameof(counter_en), ref counter_en);

View File

@ -227,13 +227,13 @@ namespace BizHawk.Emulation.Common.Components.I8048
{ {
PopulateCURINSTR(IDLE, PopulateCURINSTR(IDLE,
IDLE, IDLE,
EEA,
WR_P, 0, (ushort)(reg + RB),
DEA,
IDLE, IDLE,
IDLE, IDLE,
IDLE, IDLE,
IDLE, WR_P, 0, A);
IDLE,
IDLE,
IDLE);
IRQS = 9; IRQS = 9;
} }

View File

@ -7,6 +7,9 @@ namespace BizHawk.Emulation.Common.Components.I8048
// registers // registers
public ushort[] Regs = new ushort[78]; public ushort[] Regs = new ushort[78];
// EA gets set to true on external memory address latch
public bool EA;
// The 8048 has 2 flags that can be used for conditionals // The 8048 has 2 flags that can be used for conditionals
// F0 is on the PSW, F1 is seperate // F0 is on the PSW, F1 is seperate
public bool F1; public bool F1;

View File

@ -1,6 +1,7 @@
using System; using System;
using BizHawk.Common.BufferExtensions; using BizHawk.Common.BufferExtensions;
using BizHawk.Common.NumberExtensions;
using BizHawk.Emulation.Common; using BizHawk.Emulation.Common;
/* /*
@ -16,8 +17,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{ {
uint flags = (uint)(MemoryCallbackFlags.AccessRead); uint flags = (uint)(MemoryCallbackFlags.AccessRead);
MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus"); MemoryCallbacks.CallMemoryCallbacks(addr, 0, flags, "System Bus");
addr_access = addr;
if (addr < 0x400) if (addr < 0x400)
{ {
return _bios[addr]; return _bios[addr];
@ -32,7 +32,6 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{ {
uint flags = (uint)(MemoryCallbackFlags.AccessWrite); uint flags = (uint)(MemoryCallbackFlags.AccessWrite);
MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus"); MemoryCallbacks.CallMemoryCallbacks(addr, value, flags, "System Bus");
addr_access = addr;
if (addr < 0x400) if (addr < 0x400)
{ {
@ -56,14 +55,111 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
} }
} }
public byte ReadPort(ushort addr) public byte ReadPort(ushort port)
{ {
return 0; if (port == 0)
{
// BUS, used with external memory and ppu
if (cpu.EA)
{
return addr_latch;
}
else
{
if (RAM_en)
{
if (addr_latch < 0x80)
{
return RAM[addr_latch & 0x7F];
}
else
{
// voice module would return here
return 0;
}
}
if (ppu_en && !copy_en)
{
if ((addr_latch >= 0xA7) || (addr_latch <= 0xAA))
{
return audio.ReadReg(addr_latch);
}
return ppu.ReadReg(addr_latch);
}
// not sure what happens if this case is reached, probably whatever the last value on the bus is
return 0;
}
}
else if (port == 1)
{
// various control pins
return (byte)((lum_en ? 0x80 : 0) |
(copy_en ? 0x40 : 0) |
(0x20) |
(!RAM_en ? 0x10 : 0) |
(!ppu_en ? 0x08 : 0) |
(!kybrd_en ? 0x04 : 0) |
(cart_b1 ? 0x02 : 0) |
(cart_b0 ? 0x01 : 0));
}
else
{
// keyboard
return 0;
}
} }
public void WritePort(ushort addr, byte value) public void WritePort(ushort port, byte value)
{ {
if (port == 0)
{
// BUS, used with external memory and ppu
if (cpu.EA)
{
addr_latch = value;
}
else
{
if (RAM_en && !copy_en)
{
if (addr_latch < 0x80)
{
RAM[addr_latch] = value;
}
else
{
// voice module goes here
}
}
if (ppu_en)
{
if ((addr_latch >= 0xA7) || (addr_latch <= 0xAA))
{
audio.WriteReg(addr_latch, value);
}
else
{
ppu.WriteReg(addr_latch, value);
}
}
}
}
else if (port == 1)
{
// various control pins
lum_en = value.Bit(7);
copy_en = value.Bit(6);
RAM_en = !value.Bit(4);
ppu_en = !value.Bit(3);
kybrd_en = !value.Bit(2);
cart_b1 = value.Bit(1);
cart_b0 = value.Bit(0);
}
else
{
// keyboard
}
} }
} }
} }

View File

@ -21,6 +21,13 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
addr => RAM[addr], addr => RAM[addr],
(addr, value) => RAM[addr] = value, (addr, value) => RAM[addr] = value,
1), 1),
new MemoryDomainDelegate(
"CPU RAM",
64,
MemoryDomain.Endian.Little,
addr => (byte)cpu.Regs[addr],
(addr, value) => cpu.Regs[addr] = value,
1),
new MemoryDomainDelegate( new MemoryDomainDelegate(
"System Bus", "System Bus",
0X1000, 0X1000,
@ -36,11 +43,11 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
(addr, value) => _rom[addr] = value, (addr, value) => _rom[addr] = value,
1), 1),
new MemoryDomainDelegate( new MemoryDomainDelegate(
"VRAM", "PPU",
VRAM.Length, 256,
MemoryDomain.Endian.Little, MemoryDomain.Endian.Little,
addr => VRAM[addr], addr => ppu.ReadReg((int)addr),
(addr, value) => VRAM[addr] = value, (addr, value) => ppu.WriteReg((int)addr, value),
1) 1)
}; };

View File

@ -66,13 +66,20 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
ser.Sync(nameof(vblank_rise), ref vblank_rise); ser.Sync(nameof(vblank_rise), ref vblank_rise);
ser.Sync(nameof(input_register), ref input_register); ser.Sync(nameof(input_register), ref input_register);
ser.Sync(nameof(RAM_en), ref RAM_en);
ser.Sync(nameof(ppu_en), ref ppu_en);
ser.Sync(nameof(cart_b0), ref cart_b0);
ser.Sync(nameof(cart_b1), ref cart_b1);
ser.Sync(nameof(lum_en), ref lum_en);
ser.Sync(nameof(copy_en), ref copy_en);
ser.Sync(nameof(kybrd_en), ref kybrd_en);
// memory domains // memory domains
ser.Sync(nameof(RAM), ref RAM, false); ser.Sync(nameof(RAM), ref RAM, false);
ser.Sync(nameof(VRAM), ref VRAM, false);
ser.Sync(nameof(OAM), ref OAM, false); ser.Sync(nameof(OAM), ref OAM, false);
ser.Sync(nameof(_bios), ref _bios, false); ser.Sync(nameof(_bios), ref _bios, false);
ser.Sync(nameof(RAM_Bank), ref RAM_Bank); ser.Sync(nameof(RAM_Bank), ref RAM_Bank);
ser.Sync(nameof(addr_access), ref addr_access); ser.Sync(nameof(addr_latch), ref addr_latch);
ser.Sync(nameof(frame_buffer), ref frame_buffer, false); ser.Sync(nameof(frame_buffer), ref frame_buffer, false);
ser.Sync(nameof(_vidbuffer), ref _vidbuffer, false); ser.Sync(nameof(_vidbuffer), ref _vidbuffer, false);

View File

@ -21,10 +21,12 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
// memory domains // memory domains
public byte[] RAM = new byte[0x80]; public byte[] RAM = new byte[0x80];
public byte[] VRAM = new byte[0x4000];
public byte[] OAM = new byte[0xA0]; public byte[] OAM = new byte[0xA0];
public int RAM_Bank; public int RAM_Bank;
public byte addr_latch;
public bool ppu_en, RAM_en, kybrd_en, copy_en, lum_en, cart_b0, cart_b1;
public const bool P15 = true;
public byte[] _bios; public byte[] _bios;
public readonly byte[] _rom; public readonly byte[] _rom;
@ -35,8 +37,6 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
private int _frame = 0; private int _frame = 0;
public ushort addr_access;
public MapperBase mapper; public MapperBase mapper;
private readonly ITraceable _tracer; private readonly ITraceable _tracer;
@ -108,6 +108,16 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
SetupMemoryDomains(); SetupMemoryDomains();
HardReset(); HardReset();
for (int i = 0; i < 64; i++)
{
cpu.Regs[i] = (byte)i;
}
for (int j = 0; j < 0x80; j++)
{
RAM[j] = (byte)j;
}
} }
public DisplayType Region => DisplayType.NTSC; public DisplayType Region => DisplayType.NTSC;

View File

@ -30,6 +30,10 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
Name = Port1.Definition.Name, Name = Port1.Definition.Name,
BoolButtons = Port1.Definition.BoolButtons BoolButtons = Port1.Definition.BoolButtons
.Concat(Port2.Definition.BoolButtons) .Concat(Port2.Definition.BoolButtons)
.Concat(new[]
{
"Power"
})
.ToList() .ToList()
}; };

View File

@ -83,7 +83,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
private static readonly string[] BaseDefinition = private static readonly string[] BaseDefinition =
{ {
"Up", "Down", "Left", "Right", "Start", "Select", "B", "A", "Power" "Up", "Down", "Left", "Right", "F"
}; };
public void SyncState(Serializer ser) public void SyncState(Serializer ser)

View File

@ -72,7 +72,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{ {
ret = VDC_collision; ret = VDC_collision;
} }
else else if(addr == 0xA3)
{ {
ret = VDC_color; ret = VDC_color;
} }
@ -110,7 +110,7 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
{ {
VDC_collision = value; VDC_collision = value;
} }
else else if (addr == 0xA3)
{ {
VDC_color = value; VDC_color = value;
} }
@ -154,13 +154,6 @@ namespace BizHawk.Emulation.Cores.Consoles.O2Hawk
} }
// order sprites according to x coordinate
// note that for sprites of equal x coordinate, priority goes to first on the list
public void reorder_and_assemble_sprites()
{
}
public static readonly byte[] Internal_Graphics = { 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, // 0 0x00 public static readonly byte[] Internal_Graphics = { 0x3C, 0x66, 0x66, 0x66, 0x66, 0x66, 0x3C, // 0 0x00
0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, // 1 0x01 0x18, 0x38, 0x18, 0x18, 0x18, 0x18, 0x3C, // 1 0x01
0x3C, 0x66, 0x0C, 0x18, 0x30, 0x60, 0x7E, // 2 0x02 0x3C, 0x66, 0x0C, 0x18, 0x30, 0x60, 0x7E, // 2 0x02