我想知道是否有更好的方法来写这个:
void readtcp_c(unsigned char c) { volatile char *a; volatile int *p; volatile int *q; a = (char *)APPLE_REG_A; // a = memory mapped address for REG A *a = c + 128; // store c + 128 in REG A p = (int *)APPLE_SUB; // p = address of 6502 sub *p = TCP_WRITE; // store TCP entry point in address p p = (int *)SOFTCARD; // p = address of softcard address q = (int *)*p; // q = softcard address *q = 0; // write 0 to softcard address }
IANS,我必须读/写特定的地址。 'a'只是对存储器映射寄存器的写入(6502)。接下来的两行是相似的,除了我正在编写6502入口点的地址以供稍后使用。最后3行是我必须将0写入存储在SOFTCARD中的地址。写入此地址会触发对上述入口点的调用。
这是我认为可以缩短的最后3行。也许不是。如果其他对可以写成单行,那也很棒。代码工作和编译(sdcc)没有错误或警告。
感谢。
更新:我想我可以替换:
p = (int *)SOFTCARD; // p = address of softcard address q = (int *)*p; // q = softcard address *q = 0; // write 0 to softcard address
使用:
p = (int *)*(int *)SOFTCARD; *p = 0;
它在没有警告的情况下编译并运行。但它可读吗?再次感谢。
答案 0 :(得分:1)
这应该这样做。在添加volatile
(以及一对括号)
void readtcp_c(unsigned char c)
{
*((volatile char *)APPLE_REG_A) = c + 128;
*((volatile int *)APPLE_SUB) = TCP_WRITE;
*((volatile int *)*((volatile int *)SOFTCARD)) = 0;
}
编译器完全能够从您的第一个版本生成良好的代码。我更喜欢你的分步代码。
答案 1 :(得分:0)
您应该能够将所有作业重写为
*(char *)APPLE_REG_A = c + 128;
*(int *)APPLE_SUB = TCP_WRITE;
**(int **)SOFTCARD = 0;