我一直在写一个chip8模拟器 - http://en.wikipedia.org/wiki/CHIP-8
我已经测试了所有操作码以及图形计算,现在我正在努力处理用户输入。我有以下方法监视用户输入并根据需要更改寄存器(当使用芯片8时,用户输入改变相应的存储器寄存器 - E.G.命中'0'将V0寄存器设置为0。
我的问题是我有以下代码获取和计算每个操作码及其操作包含在while循环中。虽然这是运行我的应用程序无法检测用户输入。因此,ROMS启动并保持锁定等待寄存器更改或用户输入。它一直陷入无限循环,我试图实现全局布尔运算,并且在启动while循环后没有检测到它。我假设它超出了循环的范围,但是根据我所读到的,键盘事件会触发一个几乎任何地方都可以看到的中断,任何想法?
这是计算和解析操作码的原因
private void button1_Click(object sender, EventArgs e)
{
// This will become the run function
do{
for (int i = 0; i < 2; i++)
{
opc[i] = mem[mc]; // fetching the instruction from the memory array
mc++;
}
cibox.Clear(); // Just clearing Debugging text boxes in the UI
pcbox.Clear();
pc++;
pcbox.Text += pc;
cibox.Text += opc[0].ToString("X2") + "-" + opc[1].ToString("X2");
calculations(opc); // Parses the Opcode and does the corresponding operation
}while(run);
}
此方法控制用户输入......
protected override void OnKeyDown(KeyEventArgs keyEvent) // Listens for Keyboard events! Read More: http://www.geekpedia.com/tutorial53_Getting-input-from-keyboard.html
{
keyPress = true;
//Gets the key code found at keyEvent...
MessageBox.Show("KeyCode: " + keyEvent.KeyCode.ToString());
String register = keyEvent.KeyCode.ToString();
if (register == "Escape")
{
Application.Exit();
run = false;
}
try
{
registerVal = int.Parse(register, System.Globalization.NumberStyles.HexNumber); // Second Nibble! --> Int Format
}
catch (System.ArgumentNullException e)
{
return;
}
catch (System.ArgumentException)
{
return;
}
catch (System.FormatException)
{
return;
}
catch (System.OverflowException)
{
return;
}
if (registerVal >= 208)
{
registerVal = registerVal - 208;
}
if (registerVal <= 15)
{
mem[registerVal] = (byte)registerVal;
}
display(); // Alters UI to display state of registers, etc
}
所以我现在尝试了Game Loop Idea,但我找不到一种方法来在C#中创建一个能够返回按键的方法。也许我在这里遗漏了一些东西,但我似乎无法弄明白!
我还尝试了另一种涉及在单独的线程中运行CPU计算的方法,这会导致轻微的延迟问题。
我真的很想看到C#中一个方法的例子,它返回一个我可以在While循环中调用的按键的值!
答案 0 :(得分:4)
我建议你像游戏循环一样设置你的模拟器循环。您有一个全局循环触发模拟器中每个模块的更新。在循环中,您可以调用输入(或通用“事件”)处理器,然后调用操作码/硬件仿真,然后调用屏幕更新。
这是一些伪代码。
while (True):
processInput()
updateCPU()
outputGraphics()
我不知道密钥输入在C#中是如何工作的,如果它是异步事件触发器(即“OnKeyDown”方法在循环外调用),你可以设置“OnKeyDown”来发送密钥事件到中间事件管理器,然后在“processInput()”中实际解析事件并使用它们来更新模拟CPU等上的寄存器。