Зачем кому-то побитовое И 8-битное значение с 16-битной маской в ​​C? - PullRequest
1 голос
/ 11 января 2020

Я пытаюсь скопировать код процессора NES / MOS6502 Javidx9 в C# в качестве учебного c упражнения, и у меня возникают проблемы с пониманием логики c, стоящей за реализацией режима адресации нулевой страницы. В частности, я смотрю на этот код :

// Address Mode: Zero Page
// To save program bytes, zero page addressing allows you to absolutely address
// a location in first 0xFF bytes of address range. Clearly this only requires
// one byte instead of the usual two.
uint8_t olc6502::ZP0()
{
    addr_abs = read(pc);    
    pc++;
    addr_abs &= 0x00FF;
    return 0;
}

Я пытаюсь понять, почему addr_abs &= 0x00FF;, uint16_t addr_abs 16 бит, но uint8_t read(uint16_t a); возвращает 8 бит значение в любом случае, так что старшие 8 бит (MOS6502 с прямым порядком байтов) будут по умолчанию равны 00? Я что-то упускаю из-за того, как работает C компилятор / x86 ISA?

1 Ответ

2 голосов
/ 10 февраля 2020

Вы правы addr_abs &= 0x00ff не требуется.

uint16_t x = n, где n - это 8-разрядное число без знака (как в данном случае). x очистил бы его верхние 8 бит. Как сказал @tadman, возможно, ранее использовался другой метод для сохранения значения в addr_abs, который не очищал старшие 8 бит.

...