2011-06-25 59 views
0

我想知道是否有寫這更好的辦法地址讀取值:如何更好地從一個指向地址

 
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行是我必須向存儲在SOFTCARD中的地址寫入0的地方。寫入該地址會觸發對上述入口點的調用。

這是我認爲可以縮短的最後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

Apple? 6502?註冊A? Softcard?請爲了所有神聖的愛,請告訴我你在開玩笑:-)有人實際上還在使用這些機器嗎? – paxdiablo

回答

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

編譯器是完全能夠從你的第一個版本生成好的代碼,雖然的。我更喜歡你的分步代碼。

+0

+1 for'volatile'(與其他答案相比) –

+0

謝謝。完美的作品。 – datajerk

0

你應該能夠全部分配改寫爲

*(char *)APPLE_REG_A = c + 128; 
*(int *)APPLE_SUB = TCP_WRITE; 
**(int **)SOFTCARD = 0; 
+0

最後一行未能編譯。感謝您的意見。 – datajerk