Использует ли 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 не нужно слишком заботиться о знаке.