Как лучше прочитать значение с адреса, который указывает на адрес - PullRequest
0 голосов
/ 26 июня 2011

Мне интересно, есть ли лучший способ написать это:

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;

Компилируется без предупреждения и запускается.Но читается ли это?Еще раз спасибо.

Ответы [ 2 ]

1 голос
/ 26 июня 2011

Это должно сделать это. Я просто заменил переменные по их определению после добавления 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 голосов
/ 26 июня 2011

Вы должны быть в состоянии переписать все назначения как

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