Моделирование регистров микрокомпьютера в памяти?
В качестве небольшого побочного проекта я создавал более старый эмулятор процессора микрокомпьютера, в основном основанный на архитектуре 8080-х годов. Его 8-битные регистры общего назначения могут ( согласно википедии) использоваться "как три пары 16-битных регистров", а также в обычном 8-битном режиме. И вот моя проблема.
Моя первая попытка смоделировать это была байты и шорты с индивидуальными именами, которые работали нормально, пока я не перечитал страницу со спецификациями и не обнаружил, что 16-битные регистры на самом деле не их собственные К сожалению.
Сейчас я пытаюсь создать массив байтов с одним местоположением для каждого 8-битного регистра и двумя местоположениями, зарезервированными для указателей стека / инструкций. Это работает очень хорошо и хорошо для 8-битных регистров, и это намного меньше хлопот, но на самом деле я не знаю, как преобразовать два байта в короткий в памяти. Это вообще возможно? Если нет, есть ли у вас какие-либо предложения о том, как еще это сделать?
1 ответ
Решается путем приведения адреса первого байта в 16-битном регистре к пустому указателю и обратно к короткому. Не очень безопасный для типов, но эй, это работает. Видимо я просто гуглил не те вещи.
Вы можете сделать struct
из двух uint8_t
s, который также доступен как uint16_t
делая это:
union Register
{
uint16_t word;
struct
{
uint8_t lo, hi;
} byte;
};
Таким образом, если у вас есть значение в области Register r
, тогда r.word
будет обращаться к содержимому как к единственному 16-битному значению, и r.byte.lo
а также r.byte.hi
будет обращаться к первому и второму 8-битному байту. (Первыйlo
потому что Intel 8080 - это архитектура с прямым порядком байтов.)