2011-06-25 9 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)。次の2行は似ていますが、後で使用する6502エントリポイントのアドレスを書いています。最後の3行は、SOFTCARDに格納されているアドレスに0を書き込む必要がある場所です。このアドレスに書き込むと、前述のエントリポイントへの呼び出しがトリガーされます。

私はそれがもっと短くてもいいと思う最後の3行です。おそらくそうではありません。他のペアを1行として書くことができればそれも素晴らしいでしょう。コードはエラーや警告なしで動作し、コンパイル(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?ソフトカード?あなたの冗談を言ってください:-)誰かが実際にこれらのマシンを使用していますか? – paxdiablo

答えて

1

としてすべての割り当てを書き換えることができるはずです。私はちょうど

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

コンパイラはしかし、あなたの最初のバージョンから良いコードを生成する完全に可能であるvolatile(とも括弧のペア)を追加した後、その定義により、変数を置き換えます。私はあなたの段階的なコードが好きです。

+0

+1(揮発性)(他の回答と比較して) –

+0

ありがとう。完璧に動作します。 – datajerk

0

あなたはこれはそれを行う必要があります

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

最後の行をコンパイルできませんでした。入力いただきありがとうございます。 – datajerk

関連する問題