0

我想知道是否有更好的方法来写这个:

无效 readtcp_c(无符号字符 c)
{
    挥发性字符 *a;
    易失性int *p;
    易失性int *q;

    a = (char *)APPLE_REG_A; // a = REG A 的内存映射地址
    *a = c + 128; // 将 c + 128 存储在 REG A

    p = (int *)APPLE_SUB; // p = 6502 sub的地址
    *p = TCP_WRITE;// 将 TCP 入口点存储在地址 p 中

    p = (int *)软卡;// p = 软卡地址的地址
    q = (int *)*p; // q = 软卡地址
    *q = 0; // 将 0 写入软卡地址
}

IANS,我必须读/写特定地址。'a' 只是对内存映射寄存器 (6502) 的写入。接下来的两行类似,只是我写的是一个 6502 入口点的地址,以备后用。最后 3 行是我必须将 0 写入存储在 SOFTCARD 中的地址的地方。写入此地址会触发对上述入口点的调用。

这是我认为可以更短的最后 3 行。也许不是。如果其他对可以写成一行,那就太好了。该代码可以正常工作并编译(sdcc),没有错误或警告。

谢谢。

更新:我想我可以替换:

    p = (int *)软卡;// p = 软卡地址的地址
    q = (int *)*p; // q = 软卡地址
    *q = 0; // 将 0 写入软卡地址

和:

    p = (int *)*(int *)软卡;
    *p = 0;

它在没有警告的情况下编译并运行。但它可读吗?再次感谢。

4

2 回答 2

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;
}

不过,编译器完全有能力从您的第一个版本生成好的代码。我更喜欢你的分步代码。

于 2011-06-25T23:30:08.827 回答
0

您应该能够将所有作业重写为

*(char *)APPLE_REG_A = c + 128;
*(int *)APPLE_SUB = TCP_WRITE;
**(int **)SOFTCARD = 0;
于 2011-06-25T23:27:54.227 回答