Код операции 0x08 процессора Gameboy LR35902 Значение

Может кто-нибудь объяснить, что делает код операции 0x08 на процессоре LR35902. Мнемоника LD (a16),SP.

Я запутался, потому что указатель стека представляет собой 16-битное значение, но (a16) — это адрес куда-то, способный хранить только 8 бит (я думаю!). Я мог предположить, что первые 8 бит помещаются в (a16), а следующие располагаются рядом с ними, но я хотел бы подтверждения.


person user2674487    schedule 26.03.2016    source источник


Ответы (1)


Да, этот код операции помещает значение SP по адресу (a16). Вот как это будет выглядеть:

void MemoryWrite(uint16_t addr, uint8_t value);

MemoryWrite(a16, SP & 0xFF);
MemoryWrite(a16 + 1, (SP & 0xFF00) >> 8);

Поскольку это процессор с прямым порядком байтов, вы сначала ставите младший значащий байт.

person creker    schedule 26.03.2016
comment
Спасибо, Крекер, приятно! - person user2674487; 27.03.2016
comment
MemoryWrite((a16+1)&0xFFFF, (SP&0xFF00)››8); - person Méga Lag; 27.03.2016
comment
Méga Lag, я вижу, вы вводите адрес с 0xFFFF, что, как я полагаю, должно убедиться, что он положительный, но я думаю, что это подразумевается обозначением a16. Кроме того, даже если бы я был и с 0xFFFF, не должен ли я сделать это до выполнения + 1? - person user2674487; 28.03.2016
comment
Я не думаю, что это действительно необходимо. Во-первых, не думайте, что кто-то сделает игру, которая пишет на адрес, который переполнил бы uint16_t. Кроме того, это приведет к перезаписи стека, что не похоже на то, что можно было бы сделать. Во-вторых, uint16_t в любом случае будет просто зацикливаться, это не неопределенное поведение. - person creker; 28.03.2016
comment
@creker Верно! После выполнения LD (0xFFFF), SP позиция памяти 0xFFFF будет иметь младшие значащие биты SP. Указатель памяти переворачивается, и ЦП пытается записать в ячейку памяти 0x0000. Ничего не произойдет, потому что 0x0000 доступен только для чтения. - person GabrielOshiro; 29.03.2016
comment
Спасибо за информацию, теперь я знаю, что мне не нужно было делать это в моей реализации x) - person Méga Lag; 29.03.2016
comment
@GabrielOshiro, ну, не совсем только для чтения. Это ничего не перезапишет, но может вызвать MBC. Как вы, наверное, знаете, MBC программируются путем записи в адреса только для чтения. Например, запись в 0x0000 активирует внешнее ОЗУ в MBC1 и активирует RAM/RTC в MBC3. Но эмулятор все равно не должен это проверять. Вы делаете то, что говорит вам ПЗУ. - person creker; 29.03.2016