2

我已经开始学习 DCPU-16 的汇编来为 0x10c 做准备,但是在我正在运行的教程结束时,我发现程序没有响应键盘输入。一步一步地进入,我发现代码被卡在循环设置中,让 cpu 等待键盘输入。

这里的违规行:

IFE [0x9000 + I],0 ; if keyboard buffer is empty
SET PC,loop

可能是因为代码是针对旧版本的 DCPU 的吗?如果是这样,它现在将如何运作?

第一篇关于 Stack Overflow 的帖子,如果我有任何失礼,请见谅,谢谢大家。完整代码:

SET A,0
SET B,0
SET C, 0xF000
SET I, 0
:loop
IFE [0x9000 + I],0 ; if keyboard buffer is empty
SET PC,loop
IFE [0x9000 + I],8
SET PC, backspace
IFE [0x9000 + I],10
SET PC, enter
SET B, [0x9000 + I]
BOR B,C
SET [0x8000+A], B
SET [0x9000 + I], 0
ADD A, 1
ADD I, 1
IFE I, 16
SET I, 0
SET PC,loop
:backspace
SUB A, 1
SET [0x8000+A],0
SET [0x9000 + I], 0
ADD I, 1
IFE I, 16
SET I, 0
SET PC,loop
:enter
AND A, 0xFFE0
ADD A, 0x0020
SET [0x9000 + I], 0
ADD I, 1
IFE I, 16
SET I, 0
SET PC,loop
4

2 回答 2

5

在最新的规范中,键盘是基于中断的,而不是使用地址 0x9000 的内存映射。因此,如果您使用的是最新的模拟器,您的代码将无法工作。

http://dcpu.com/highnerd/rc_1/keyboard.txt

于 2012-05-16T14:05:32.760 回答
0

即使使用旧规范,我相信缓冲区起始索引存储在 $9010 中,因此您不应该将 I 设置为 0,而是应该这样做:

SET I, [0x9010]
于 2012-06-11T11:04:59.050 回答