Skip to content

Commit 1351351

Browse files
committed
LDA et XBA
1 parent 4b5ce7c commit 1351351

File tree

5 files changed

+133
-74
lines changed

5 files changed

+133
-74
lines changed

SnesEmulator/SnesEmulator.Hardware/Instructions/Instruction.cs

+105
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,111 @@ protected int AbsoluteIndexedLong(int arg1)
341341
return arg1 + X;
342342
}
343343

344+
/// <summary>
345+
/// Obtient un argument à partir de la mémoire avec le mode par défaut.
346+
/// </summary>
347+
/// <remarks>Avoir un mode "BlockMove" fera une exception, ce mode est spécial</remarks>
348+
/// <param name="mode"></param>
349+
/// <param name="param"></param>
350+
/// <returns></returns>
351+
public int ResolveArgument(int param)
352+
{
353+
return ResolveArgument(addrMode, param);
354+
}
355+
356+
/// <summary>
357+
/// Obtient un argument à partir de la mémoire en fonction du mode sélectionné.
358+
/// </summary>
359+
/// <remarks>Avoir un mode "BlockMove" fera une exception, ce mode est spécial</remarks>
360+
/// <param name="mode"></param>
361+
/// <param name="param"></param>
362+
/// <returns></returns>
363+
public int ResolveArgument(AddressingModes mode, int param)
364+
{
365+
switch (mode)
366+
{
367+
case AddressingModes.DirectIndexedIndirect:
368+
{
369+
int address = DirectIndexedIndirect(param);
370+
return ReadAddressedValue(address);
371+
}
372+
case AddressingModes.StackRelative:
373+
{
374+
// Cet adressage n'existe pas en mode émulation
375+
int address = StackRelative(param);
376+
return ReadAddressedValue(address);
377+
}
378+
case AddressingModes.Direct:
379+
{
380+
int address = Direct(param);
381+
return ReadAddressedValue(address);
382+
}
383+
case AddressingModes.DirectIndirectLong:
384+
{
385+
int address = DirectIndirectLong(param);
386+
return ReadAddressedValue(address);
387+
}
388+
case AddressingModes.ImmediateMemoryFlag:
389+
case AddressingModes.ImmediateIndexFlag:
390+
case AddressingModes.Immediate8Bit:
391+
{
392+
return param;
393+
}
394+
case AddressingModes.Absolute:
395+
{
396+
int address = Absolute(param);
397+
return ReadAddressedValue(address);
398+
}
399+
case AddressingModes.AbsoluteLong:
400+
{
401+
int address = AbsoluteLong(param);
402+
return ReadAddressedValue(address);
403+
}
404+
case AddressingModes.DirectIndirectIndexed:
405+
{
406+
int address = DirectIndirectIndexed(param);
407+
return ReadAddressedValue(address);
408+
}
409+
case AddressingModes.DirectIndirect:
410+
{
411+
int address = DirectIndirect(param);
412+
return ReadAddressedValue(address);
413+
}
414+
case AddressingModes.StackRelativeIndirectIndexed:
415+
{
416+
int address = StackRelativeIndirectIndexed(param);
417+
return ReadAddressedValue(address);
418+
}
419+
case AddressingModes.DirectIndexedX:
420+
{
421+
int address = DirectIndexedX(param);
422+
return ReadAddressedValue(address);
423+
}
424+
case AddressingModes.DirectIndirectIndexedLong:
425+
{
426+
int address = DirectIndirectIndexedLong(param);
427+
return ReadAddressedValue(address);
428+
}
429+
case AddressingModes.AbsoluteIndexedX:
430+
{
431+
int address = AbsoluteIndexedX(param);
432+
return ReadAddressedValue(address);
433+
}
434+
case AddressingModes.AbsoluteIndexedY:
435+
{
436+
int address = AbsoluteIndexedY(param);
437+
return ReadAddressedValue(address);
438+
}
439+
case AddressingModes.AbsoluteIndexedLong:
440+
{
441+
int address = AbsoluteIndexedLong(param);
442+
return ReadAddressedValue(address);
443+
}
444+
default:
445+
{ throw new NotSupportedException(mode.ToString()); }
446+
}
447+
}
448+
344449
#endregion
345450
}
346451
}

SnesEmulator/SnesEmulator.Hardware/Instructions/InstructionsSets/DummyInstructions.cs SnesEmulator/SnesEmulator.Hardware/Instructions/InstructionsSets/InstructionWDM.cs

-24
Original file line numberDiff line numberDiff line change
@@ -42,28 +42,4 @@ public override void DecodeArguments(Memory.MemoryBin bin, ref InstructionDecode
4242
instructionReference.param1 = DecodeInt1Argument(bin, ref offset);
4343
}
4444
}
45-
46-
public class InstructionNOP : Instruction
47-
{
48-
public InstructionNOP(CPU cpu)
49-
: base(cpu, OpCodes.NOP, AddressingModes.Implied)
50-
{
51-
52-
}
53-
54-
public override bool HaveArgs
55-
{
56-
get { return false; }
57-
}
58-
59-
public override void Run(int arg1, int arg2)
60-
{
61-
62-
}
63-
64-
public override void DecodeArguments(Memory.MemoryBin bin, ref InstructionDecodeContext context, ref int offset, ref InstructionReference instructionReference)
65-
{
66-
/* No Args */
67-
}
68-
}
6945
}

SnesEmulator/SnesEmulator.Hardware/Instructions/InstructionsSets/InstructionXBA.cs

-31
This file was deleted.

SnesEmulator/SnesEmulator.Hardware/InstructionsDecodeTable.cs

+27-17
Original file line numberDiff line numberDiff line change
@@ -295,25 +295,30 @@ private void LoadKnownInstructions()
295295
RegisterKnownInstruction(0xFC, GenericInst(Hardware.OpCodes.JSR, Hardware.AddressingModes.Absolute, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I2));
296296

297297
// LDA
298-
RegisterKnownInstruction(0xA1, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndexedIndirect, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
299-
RegisterKnownInstruction(0xA3, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.StackRelative, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
300-
RegisterKnownInstruction(0xA5, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.Direct, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
301-
RegisterKnownInstruction(0xA7, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectLong, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
302-
RegisterKnownInstruction(0xA9, GenericInstCustom(OpCodes.LDA, AddressingModes.ImmediateMemoryFlag, (sender, p1, p2) => { CPU_LoadInto(ref CPU.ACC, p1); },
298+
Action<Instruction, int, int> operation_LDA = (Instruction sender, int p1, int p2) =>
299+
{
300+
CPU_LoadInto(ref cpu.ACC, sender.ResolveArgument(p1));
301+
};
302+
303+
RegisterKnownInstruction(0xA1, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndexedIndirect, operation_LDA, ArgumentType.I1));
304+
RegisterKnownInstruction(0xA3, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.StackRelative, operation_LDA, ArgumentType.I1));
305+
RegisterKnownInstruction(0xA5, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.Direct, operation_LDA, ArgumentType.I1));
306+
RegisterKnownInstruction(0xA7, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectLong, operation_LDA, ArgumentType.I1));
307+
RegisterKnownInstruction(0xA9, GenericInstCustom(OpCodes.LDA, AddressingModes.ImmediateMemoryFlag, operation_LDA,
303308
(GenericInstruction.DecodeArgumentsFunctionDelegate)delegate(GenericInstruction sender, Memory.MemoryBin bin, ref InstructionDecodeContext context, ref int offset, ref int p1, ref int p2)
304309
{
305310
p1 = sender.DecodeI1I2ArgumentForMFlag(bin, ref offset, ref context);
306311
}));
307-
RegisterKnownInstruction(0xAD, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.Absolute, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I2));
308-
RegisterKnownInstruction(0xAF, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteLong, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I3));
309-
RegisterKnownInstruction(0xB1, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectIndexed, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
310-
RegisterKnownInstruction(0xB2, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirect, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
311-
RegisterKnownInstruction(0xB3, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.StackRelativeIndirectIndexed, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
312-
RegisterKnownInstruction(0xB5, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndexedX, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
313-
RegisterKnownInstruction(0xB7, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectIndexedLong, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
314-
RegisterKnownInstruction(0xB9, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedY, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I2));
315-
RegisterKnownInstruction(0xBD, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedX, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I2));
316-
RegisterKnownInstruction(0xBF, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedLong, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I3));
312+
RegisterKnownInstruction(0xAD, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.Absolute, operation_LDA, ArgumentType.I2));
313+
RegisterKnownInstruction(0xAF, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteLong, operation_LDA, ArgumentType.I3));
314+
RegisterKnownInstruction(0xB1, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectIndexed, operation_LDA, ArgumentType.I1));
315+
RegisterKnownInstruction(0xB2, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirect, operation_LDA, ArgumentType.I1));
316+
RegisterKnownInstruction(0xB3, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.StackRelativeIndirectIndexed, operation_LDA, ArgumentType.I1));
317+
RegisterKnownInstruction(0xB5, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndexedX, operation_LDA, ArgumentType.I1));
318+
RegisterKnownInstruction(0xB7, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.DirectIndirectIndexedLong, operation_LDA, ArgumentType.I1));
319+
RegisterKnownInstruction(0xB9, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedY, operation_LDA, ArgumentType.I2));
320+
RegisterKnownInstruction(0xBD, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedX, operation_LDA, ArgumentType.I2));
321+
RegisterKnownInstruction(0xBF, GenericInst(Hardware.OpCodes.LDA, Hardware.AddressingModes.AbsoluteIndexedLong, operation_LDA, ArgumentType.I3));
317322

318323
// LDX
319324
RegisterKnownInstruction(0xA2, GenericInstCustom(Hardware.OpCodes.LDX, Hardware.AddressingModes.ImmediateMemoryFlag, (sender, p1, p2) => { throw new NotImplementedException(); },
@@ -349,7 +354,7 @@ private void LoadKnownInstructions()
349354
RegisterKnownInstruction(0x44, GenericInst(Hardware.OpCodes.MVP, Hardware.AddressingModes.BlockMove, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1, ArgumentType.I1));
350355

351356
// NOP
352-
RegisterKnownInstruction(0xEA, new InstructionNOP(cpu));
357+
RegisterKnownInstruction(0xEA, GenericInst(Hardware.OpCodes.NOP, AddressingModes.Implied, (sender, p1, p2) => { }));
353358

354359
// ORA
355360
RegisterKnownInstruction(0x01, GenericInst(Hardware.OpCodes.ORA, Hardware.AddressingModes.DirectIndexedIndirect, (sender, p1, p2) => { throw new NotImplementedException(); }, ArgumentType.I1));
@@ -537,7 +542,12 @@ private void LoadKnownInstructions()
537542
RegisterKnownInstruction(0x42, new InstructionWDM(cpu));
538543

539544
// XBA
540-
RegisterKnownInstruction(0xeb, new InstructionXBA(cpu));
545+
RegisterKnownInstruction(0xeb, GenericInst(Hardware.OpCodes.XBA, AddressingModes.Implied, (sender, p1, p2) =>
546+
{
547+
var b_value = cpu.B;
548+
cpu.B = cpu.ACC;
549+
CPU_LoadInto(ref cpu.ACC, b_value);
550+
}));
541551

542552
// XCE
543553
RegisterKnownInstruction(0xfb, new InstructionXCE(cpu));

SnesEmulator/SnesEmulator.Hardware/SnesEmulator.Hardware.csproj

+1-2
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,9 @@
5555
<Compile Include="Instructions\InstructionReference.cs" />
5656
<Compile Include="Instructions\InstructionsBin.cs" />
5757
<Compile Include="Instructions\InstructionsDecoder.cs" />
58-
<Compile Include="Instructions\InstructionsSets\DummyInstructions.cs" />
58+
<Compile Include="Instructions\InstructionsSets\InstructionWDM.cs" />
5959
<Compile Include="Instructions\InstructionsSets\InstructionADC.cs" />
6060
<Compile Include="Instructions\InstructionsSets\InstructionInvalid.cs" />
61-
<Compile Include="Instructions\InstructionsSets\InstructionXBA.cs" />
6261
<Compile Include="Instructions\InstructionsSets\InstructionXCE.cs" />
6362
<Compile Include="Instructions\LiveInstructionsDecoder.cs" />
6463
<Compile Include="Memory\MemoryBin.cs" />

0 commit comments

Comments
 (0)