6502 Режим непрямого доступа

У меня вопрос о языке ассемблера 6502. Я пытаюсь изучить его с помощью этого веб-сайта https://skilldrick.github.io/easy6502/.

По теме режимов адресации. Я не понимаю режим косвенной адресации. См. Пример исходного кода ниже.

LDA #$01
STA $f0
LDA #$cc
STA $f1
JMP ($00f0) ;dereferences to $cc01

Почему JMP ($00f0) разыменован на $cc01 вместо $01cc.

Моя память выглядит так

00f0: 01 cc 00 00 00 00 00 00 00 00 00 00 00 00 84

Здесь вы видите, что 00f0 начинается с 01, а затем следует cc, поэтому мне кажется более логичным, что инструкция перехода будет разыменовываться на $01cc, но почему это каким-то образом изменилось?


person DB93    schedule 06.11.2017    source источник
comment
6502 с прямым порядком байтов.   -  person Raymond Chen    schedule 07.11.2017
comment
Есть 01 тип людей. Те, кто понимает порядок байтов ...   -  person Nick Westgate    schedule 07.11.2017


Ответы (2)


6502 с прямым порядком байтов. Это означает, что для 16-битных значений, которые занимают два байта, младший байт сохраняется по младшему адресу. После двух STA у вас есть:

00f0: 01 
00f1: cc

Инструкция JMP загружает байт f0 в младший байт адреса назначения и байт f1 в старший байт адреса назначения, что означает переход к cc01.

person JeremyP    schedule 07.11.2017

Дополнительный ответ на вопрос «почему это как-то поменять местами?»: Прямой порядок байтов подчиняется направлению, в котором выполняется перенос, поэтому его дешевле реализовать. У вас есть достаточно информации, чтобы начать заниматься арифметикой, прежде чем вы получите всю информацию.

Это разбивка цикла 6502 при работе с инструкцией $aabb, X:

  1. получить инструкцию
  2. получить младший байт адреса операнда
  3. добавить младший байт адреса операнда в регистр X, получить старший байт адреса операнда
  4. читать с адреса со старшим байтом $ aa и младшим байтом $ bb + X, если был перенос, тогда отработайте $ aa + 1 для использования в мгновение ока ...
  5. если был перенос, то читать с правильного адреса

Так что, если это LDA, тогда стоимость составляет четыре цикла, если вы не пересекаете границу страницы, и пять, если вы это сделаете. А теперь представьте, что адреса хранились в формате big endian. Потом:

  1. получить инструкцию
  2. получить старший байт адреса операнда
  3. получить младший байт адреса операнда
  4. добавить X к младшему байту адреса операнда
  5. читать с адреса со старшим байтом $ aa и младшим байтом $ bb + X, если был перенос, тогда отработайте $ aa + 1 для использования в мгновение ока ...
  6. если был перенос, то читать с правильного адреса

Итак, вы увеличили стоимость на цикл. Вы не можете начать, пока у вас не будет младшего байта, а вы не получите младший байт на цикл позже.

Так что, если вы не устроите так, чтобы сначала выбирался младший байт, вы теряете время.

person Tommy    schedule 07.11.2017