Использует ли 6502 8-битные регистры со знаком или без знака (JAVA)?

Я пишу эмулятор для 6502, и в основном, есть некоторые инструкции, где есть смещение, сохраненное в одном из регистров (в основном X и Y), и мне интересно, так как инструкции ветвления используют 8-битные целые числа со знаком, выполните регистры сохраняют свои значения как 8-битные со знаком? Это значит:

switch(opcode) { 
    //Bunch of opcodes
    case 0xD5: 
    //Read the memory area with final address being address + x offset
    int rempResult = a - readMemory(address + x); 
    //Comparing some things, setting/disabling flags
    //Incrementing program counter and cycles/ticks
    break; 
    //More opcodes
}

Скажем в этой ситуации, что x = 0xEE. В обычном двоичном коде это будет означать, что x = 238. Однако в 6502 инструкция перехода использует знаковое смещение для перехода к адресам памяти, поэтому мне интересно, интерпретируется ли 238 как -18 в этом случае, или это просто обычное 8-битное значение без знака?

2 ответа

Решение

Различается.

Они не имеют явной подписи или без знака для арифметических, логических операций, операций сдвига или загрузки и сохранения.

Все условные ветви (и безусловные на более поздних потомках 6502) принимают аргумент как подписанный; иначе петли были бы крайне неловкими.

zero, x адресация достигается путем выполнения 8-битного сложения x к адресу нулевой страницы, игнорирования переноса и чтения с нулевой страницы. Так, например,

LDX #-126    ; which is +130 if unsigned
LDA 23, x

Считал бы с адреса 23+130 = 153. Но если бы это было 223+130, тогда конечное чтение было бы из (223 + 130) MOD 256 = 97.

absolute, x/y неподписан и нести работает правильно (но стоит дополнительный цикл)

(zero, x) очень похоже на прямую версию в том, что смещение подписано, но результат всегда находится на нулевой странице. Тогда реальный адрес читается оттуда.

(zero), y без подписи с рабочими и калькуляторами.

"Знак" - это просто значение старшего значащего (бита 7) в 8-битном байте.

6502 поддерживает подписанные значения следующими способами:

  • N немного в .P - но на самом деле он просто сообщает вам, была ли последняя инструкция включена или выключена, бит 7 ячейки памяти или регистра. Это было распространено в использовании BPL/BMI делать что-то на основе бита 7 в ячейке памяти для использования в качестве флага или "логического" типа.
  • V немного .P который переворачивается "когда результат добавления двух положительных чисел переполняется и заканчивается отрицательным, а когда результат добавления двух отрицательных чисел переполняется и заканчивается положительным"
  • И, конечно, подчинение знакового бита только для инструкций относительного перехода, например BEQ со значением с установленным битом 7 переместится в более низкую ячейку памяти, а не в более высокую.

Кроме того, означает ли этот бит что-то полностью зависит от вас и вашей программы. Что действительно делает числа со знаком или без знака, так это то, как вы отображаете числа.

Приведенная выше статья посвящена тому, что такое дополнение и дополнение двух, и как оно заставляет математику работать, а 6502 не нужно слишком заботиться о знаке.

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