我认为Python足以编写基本的chip8模拟器,但看起来我错了。
我基本上在向内存读取/写入字节时遇到问题。 在程序的某个点上,我需要读取一个变量,我已经从文件读取并存储在列表中的单个字节。 这就是我从文件中读取的内容:
byte = rom.read(1)
memory.append(byte)
while byte:
byte = rom.read(1)
memory.append(byte)
rom.close()
在程序的某一点上,我需要从内存中获取一个字节,并且它将0x80移位某些数字(以提取单个位),所以我使用:
for i in range(h):
p = ord(memory[addressI + i])
for j in range(8):
if(p & (0x80 >>j)) != 0:
...
它可以正常工作一段时间,但后来我无处可出现这个错误:
(...)p = ord(memory[addressI + i])
TypeError: ord() expected string of length 1, but int found
如果我根本不使用ord功能,我会收到此错误,如预期的那样:
TypeError: unsupported operand type(s) for &: 'str' and 'int'
我想我得到了这个错误,因为在程序的某个时刻我将存储值的BCD存储在内存中。我猜它会替换以前为int存储的字节类型。
data = registers[sNum>>8]
memory[addressI] = data/100
memory[addressI + 1] = (data/10) % 10
memory[addressI + 2] = data % 10
可能的解决方案是: 1 - 将“计算”为单个字节的int正确存储在“模拟”chip8内存的列表中 2 - 使用函数或奇迹代替ord()获取数据,并将其存储为单个字节
任何帮助将不胜感激。 顺便说一句,我正在使用Windows并在Python 2.7.2和3.2.2中测试了这段代码。
答案 0 :(得分:1)
我认为将列表中的类型保持一致是最有意义的,通过将计算的整数传递给chr()
函数(与{{1 }}):
ord()
然而,这是另一种选择,即创建一个函数,无论参数是data = registers[sNum>>8]
memory[addressI] = chr(data/100)
memory[addressI + 1] = chr((data/10) % 10)
memory[addressI + 2] = chr(data % 10)
还是字节,都返回正确的函数。
int
然后将for循环中的行更改为:
ord_ = lambda c: c if isinstance(c, int) else ord(c)
所以现在如果列表中的项是整数,p = ord_(memory[addressI + i])
将保持不变,但如果它是一个字节,那么它将返回ord_(memory[addressI + i])
的结果。
编辑:由于您的阅读循环,列表中的空字符串可能存在,请尝试将其更改为以下内容:
ord()
这可以防止最后一次循环byte = rom.read(1)
while byte:
memory.append(byte)
byte = rom.read(1)
返回空字符串,然后在检查rom.read(1)
条件之前立即将其附加到memory
的情况。