0

これを書くためのより良い方法があるかどうか疑問に思っています:

void readtcp_c(unsigned char c)
{{
    揮発性文字*a;
    volatile int * p;
    volatile int * q;

    a =(char *)APPLE_REG_A; // a =REGAのメモリマップドアドレス
    * a = c + 128; // c+128をREGAに保存します

    p =(int *)APPLE_SUB; // p=6502サブのアドレス
    * p = TCP_WRITE; //TCPエントリポイントをアドレスpに格納します

    p =(int *)SOFTCARD; //p=ソフトカードアドレスのアドレス
    q =(int *)* p; //q=ソフトカードアドレス
    * q = 0; //ソフトカードアドレスに0を書き込みます
}

IANS、特定のアドレスに対して読み取り/書き込みを行う必要があります。「a」は単にメモリマップドレジスタ(6502)への書き込みです。次の2行は、後で使用する6502エントリポイントのアドレスを書き込んでいることを除いて、同様です。最後の3行は、SOFTCARDに格納されているアドレスに0を書き込む必要がある場所です。このアドレスに書き込むと、前述のエントリポイントへの呼び出しがトリガーされます。

短くできると思うのは最後の3行です。おそらくそうではありません。他のペアを1行で書くことができれば、それも素晴らしいことです。コードは機能し、エラーや警告なしにコンパイル(sdcc)します。

ありがとう。

更新:私は置き換えることができると思います:

    p =(int *)SOFTCARD; //p=ソフトカードアドレスのアドレス
    q =(int *)* p; //q=ソフトカードアドレス
    * q = 0; //ソフトカードアドレスに0を書き込みます

と:

    p =(int *)*(int *)SOFTCARD;
    * 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 に答える