180. Косвенная адресация для jmp
Добавить косвенную адресацию для JMP.
Урок 180 из 356 · tests/chapter_01_cpu/test_180_indirect_addressing_for_jmp.py
Создайте одну функцию внутри emulator/cpu/addressing_modes.py:
def indirect(cpu):
...Зачем нужен этот шаг
JMP нужен этот особый режим адресации, чтобы вычислить косвенную цель перехода из 16-разрядного указателя, закодированного в `JMP ($hhhh)`.
Рекомендации студентам
Это отличается от indirect_x(cpu) и indirect_y(cpu).
Косвенный JMP использует 16-разрядный операнд в качестве указателя на любое место памяти
JMP ($0200)Пошагово
1. Fetch the 16-bit pointer operand from the instruction stream.
Example bytes: 00 02 -> pointer address $0200.
2. Read the low byte of the target from memory[pointer].
Example: memory[$0200] = $34.
3. Read the high byte of the target from memory[pointer + 1].
Example: memory[$0201] = $12.
4. Return the final target address.
Example: $1234.Важная аппаратная ошибка
У процессора 6502 есть ошибка косвенного JMP на границе страницы.
Если указатель заканчивается на $FF, старший байт читается из той же страницы, а не из следующей:
JMP ($02FF)Что читает реальный CPU
low = memory[$02FF]
high = memory[$0200]Он НЕ читает старший байт из $0300.
Полезная форма реализации
ptr = cpu.fetch_word()
low = cpu.bus.read(ptr)
high_addr = (ptr & 0xFF00) | ((ptr + 1) & 0x00FF)
high = cpu.bus.read(high_addr)
return low | (high << 8)Запустить этот урок
uv run pytest tests/chapter_01_cpu/test_180_indirect_addressing_for_jmp.py -v