Как работает инструкция ветвления на 6502 с относительным смещением 0x00 (цикл выборки / выполнения)? - PullRequest
1 голос
/ 11 января 2020

Редактировать: я не использую никаких отладчиков, так как я не собираюсь устанавливать какое-либо программное обеспечение, но рекомендации приветствуются

Предположим, мы наткнулись на инструкцию BPL $ 0x00

Базовый адрес (P C): значение 0x400: BPL $ 00

Интуитивно можно предположить, что программа будет висеть по адресу 0x400.

Однако, я более склонен говорить, что сначала он получит код операции в 0x400, приращение P C, декодирование того, что ему нужно для чтения операнда, выбор операнда, приращение P C.

, которое оставляет нас по адресу 0x402. К тому времени процессор будет декодировать инструкцию и код операции и выполнять перед извлечением следующего кода операции.

Итак, что же тогда произойдет? программа разветвляется на адрес 0x400, или она разветвляется на адрес 0x402, как я предсказывал?

Ответы [ 2 ]

5 голосов
/ 11 января 2020

Как уже отмечалось, смещение добавляется к адресу, следующему за инструкцией, поэтому смещение 00 заставляет инструкцию ветвления ничего не добавлять, если ветвь истинно. Имейте в виду, однако, что ветвь NULL влияет на выполнение кода, хотя и незначительную, связанную с синхронизацией, поскольку для выполнения взятой ветви требуется три цикла, а для пропущенной ветви требуется только два.

LDA #45
BPL +00 ; branch taken, execution time 3 clock cycles
LDA #FE 
BPL +00 ; branch skipped, execution time 2 clock cycles

Вся эта информация приведена в Руководстве по программированию 6500, http://6502.org/documents/books/mcs6500_family_programming_manual.pdf, стр. 40-45.

3 голосов
/ 11 января 2020

Инструкция ветвления (если true) добавляет данный аргумент к P C. В вашей программе команда переходит к 0x402, как вы и предсказывали.

С помощью простого симулятора, как на странице http://skilldrick.github.io/easy6502/, вы можете проверить поведение:

  LDA #$F1
label:
  BPL label
  LDA #$01
  BPL label2
label2:
  BRK

Разборка в результате:

Address  Hexdump   Dissassembly
-------------------------------
$0600    a9 f1     LDA #$f1
$0602    10 fe     BPL $0602
$0604    a9 01     LDA #$01
$0606    10 00     BPL $0608
$0608    00        BRK 

Итак, как вы видите, шестнадцатеричный код 0x10 (BPL) с аргументом 0x00 просто переходит к следующей инструкции (здесь для адресации по адресу 0608).

...