Далее для собственного удобства я буду оперировать мнемониками Z80, так как мнемоники 8080 я забыл и сейчас они для меня совсем непонятны.
Прошу знающих людей указать на неточности, если они есть, а также ответить на вопрос.
У Специалиста область ПЗУ начинается с адреса 0xC000. Соответственно, после включения компьютера для подготовки его к работе должна начать выполняться программа из ПЗУ, то есть с адреса 0xC000. Однако процессор Intel 8080 (КР580ВМ80А) после сброса передаёт управление на адрес 0x0000. И тем не менее код, находящийся в ПЗУ по адресу 0xC000, запускается и работает.
Начало кода в ПЗУ выглядит так:
Код:
0xC000: JP 0xC003
0xC003: LD SP, 0x7FFF
0xC006: LD A, 0x82
0xC008: LD (0xFF03), A
0xC00B: JP 0xC4444
На первый взгляд команда JP 0xC003 совсем лишняя, так как она всего лишь передаёт управление на следующую строку. Однако именно эта команда и передаёт управление на код, размещающийся в ПЗУ. Дело в том, что сразу после включения компьютера эта команда как раз и находится по адресу 0x0000. То есть как раз там, куда передаёт управление процессор сразу после его сброса.
Как же так получается? А всё дело в том, что после сброса компьютера ПЗУ помимо своего стандартного положения по адресу 0xC000 дополнительно проецируется в начальную область памяти, начиная с адреса 0x0000. Таким образом, код, зашитый в ПЗУ одновременно находится и по адресу 0xC000, и по адресу 0x0000.
За переключение расположения ПЗУ отвечает штатная микросхема программируемого параллельного интерфейса Intel 8255 (КР580ВВ55А).
В коде ПЗУ две команды, следующие за командой установки стека, отключают это дублирование ПЗУ в ОЗУ и переводят память в штатный режим:
Код:
0xC006: LD A, 0x82
0xC008: LD (0xFF03), A
Эта операция обратима. При большом желании можно затем и вручную снова включить ПЗУ в область ОЗУ, подав следующие команды:
Код:
LD A, 0x10 ; 00010000 - включен 4-й бит порта С (PC4)
LD (0xFF02), A
Остаётся вопрос, на который мне не удалось найти ответа, а принципиальная схема компьютера мне ни о чём не говорит. Какой объём памяти после включения Специалиста дублируется с 0xC000 на адрес 0x0000? Вся вторая половина адресного пространства, то есть 0xC000-0xFFFF? Только область Загрузчика - 0xC000-0xС7FF? Какой-то другой вариант?