Моделирование регистров микрокомпьютера в памяти?

В качестве небольшого побочного проекта я создавал более старый эмулятор процессора микрокомпьютера, в основном основанный на архитектуре 8080-х годов. Его 8-битные регистры общего назначения могут ( согласно википедии) использоваться "как три пары 16-битных регистров", а также в обычном 8-битном режиме. И вот моя проблема.

Моя первая попытка смоделировать это была байты и шорты с индивидуальными именами, которые работали нормально, пока я не перечитал страницу со спецификациями и не обнаружил, что 16-битные регистры на самом деле не их собственные К сожалению.

Сейчас я пытаюсь создать массив байтов с одним местоположением для каждого 8-битного регистра и двумя местоположениями, зарезервированными для указателей стека / инструкций. Это работает очень хорошо и хорошо для 8-битных регистров, и это намного меньше хлопот, но на самом деле я не знаю, как преобразовать два байта в короткий в памяти. Это вообще возможно? Если нет, есть ли у вас какие-либо предложения о том, как еще это сделать?

1 ответ

Решается путем приведения адреса первого байта в 16-битном регистре к пустому указателю и обратно к короткому. Не очень безопасный для типов, но эй, это работает. Видимо я просто гуглил не те вещи.

Вы можете сделать struct из двух uint8_ts, который также доступен как 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 - это архитектура с прямым порядком байтов.)

Другие вопросы по тегам