Содержание
Если тебе недостаточно материала в этой статье, поищи в интернете более подробную информацию.
Абсолютно любая информация в игре, будь то код, данные, графика, текст, музыка и прочее, хранится в памяти в шестнадцатеричной системе счисления, то есть в байтах.
Поэтому в ромхакинге ты постоянно будешь иметь дело с байтами, а в некоторых случаях и с битами (двоичная система счисления).
Для перевода чисел из одной системы счисления в другую (и не только для этого) воспользуйся стандартным калькулятором Windows, пример работы с которым есть в списке программ на главной странице.
В таблице показано как десятичные числа выглядят в двух других системах счисления.
DEC | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | ... | 255 |
HEX | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F | 20 | ... | FF |
BIN | 0 | 1 | 10 | 11 | 100 | 101 | 110 | 111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 | 10000 | 10001 | 10010 | 10011 | 10100 | 10101 | 10110 | 10111 | 11000 | 11001 | 11010 | 11011 | 11100 | 11101 | 11110 | 11111 | 100000 | ... | 11111111 |
А эта таблица поможет тебе лучше запомнить числа в этих системах без использования калькулятора.
DEC | HEX | BIN |
0 | 00 | 0000 0000 |
1 | 01 | 0000 0001 |
2 | 02 | 0000 0010 |
4 | 04 | 0000 0100 |
8 | 08 | 0000 1000 |
16 | 10 | 0001 0000 |
32 | 20 | 0010 0000 |
64 | 40 | 0100 0000 |
128 | 80 | 1000 0000 |
Для получения подробного описания по системе счисления выбери соответствующую опцию.
DEC | HEX | BIN | Знаковые байты | Обозначение чисел в статьях |
Чтобы познакомиться с двумя новыми системами счисления HEX и BIN, предлагаю для начала вспомнить механику нашей повседневной десятичной системы счисления.
Десятичная система счисления (decimal). Как следует из названия системы, за основу взято число 10. В ней мы располагаем десятью знаками-цифрами - от 0 до 9.
Когда разряд единиц доходит до 9, для следующего числа вводится старший разряд - десятки, а разряд единиц обнуляется.
Когда счет доходит до 99, для следующего числа вводится новый старший разряд - сотни, а разряд десятков и единиц обнуляется.
Правило ввода старшего разряда числа после достижения лимита применимо к любой другой системе счисления.
Шестнадцатеричная система счисления (hexadecimal). Шестнадцатеричное число называется "байт", а разряд байта называется "ниббл" (полубайт).
В этой системе счисления за основу взято число 16. Поскольку существует всего 10 цифр от 0 до 9, дополнительно используются первые 6 латинских букв.
Когда счет достигает F, вводится старший разряд (десятки).
Когда счет достигает FF, вводится новый старший разряд (сотни).
Несмотря на то, что байт #$00 является числом 0, в ромхакинге он имеет очень важное значение. Например, если у игрока закончились жизни, то есть количество жизней = #$00, наступит Game Over. А также отсчет чего-либо очень часто начинается с #$00.
Двоичная система счисления (binary). Двоичное число называется "бит". Знание битов необходимо при изучении работы некоторых инструкций, в частности битовых операций и битовых сдвигов.
За основу взято число 2, и используются лишь 2 цифры - 0 и 1.
Вводим разряд десятков.
Вводим разряд сотен.
Биты нумеруются с нулевого по седьмой, справа налево.
№ | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
BIN | 10000000 | 01000000 | 00100000 | 00010000 | 00001000 | 00000100 | 00000010 | 00000001 |
В действительности любая компьютерная информация состоит из битов, которую просто удобно отображать при помощи байтов, а не обычными десятичными числами. Байт получается из комбинаций битов, которые имеют состояние 0 или 1, и всего таких комбинаций 256.
Некоторые байты нужно рассматривать не как байты, а как набор битов. В частности это применимо к управлению в игре, где за 1 кнопку отвечает 1 бит. А из 8-ми кнопок, которые будут нажаты/не нажаты, получается 1 байт.
Байты могут быть знаковые (signed) и беззнаковые (unsigned). За знаковость числа, то есть за наличие знака "+" или "-" при переводе в DEC, отвечает старший бит этого байта. В NES все данные 8-битные, поэтому за знаковость числа отвечает бит7.
Беззнаковый байт, который хранит число от 0 до 255. Эти числа получаются при обычном переводе из HEX в DEC байтов #$00-#$FF.
В языке программирования C# тип данных "byte" - беззнаковый.
Знаковый байт, который хранит число от -128 до 127. Положительными байтами считаются от #$00 до #$7F (от 0 до 127), а отрицательными от #$80 до #$FF (от -128 до -1).
В языке программирования C# тип данных "sbyte" - знаковый.
Знаковые байты в NES по сути ничем не отличаются от беззнаковых и выглядят одинаково. Все зависит от того, с какой точки зрения их рассматривать.
Со знаковыми байтами ты столкнешься при изучении флага N (Negative) и инструкций условного перехода с этим флагом.
Десятичные числа будут записаны без каких-либо обозначений, например число 29.
Байты будут записаны двумя символами (даже если разряд десятков = 0) с использованием префикса "#$", например #$1D (число 29 в DEC).
Если потребуется записать 16-битные числа, они будут записаны четырьмя символами, например #$0123.
Биты будут записаны из восьми символов (даже если старшие разряды числа = 0) с использованием префикса "#%", например #%00011101 (число 29 в DEC).
Номер бита будет обозначаться как бит0, бит1, бит2 и так далее.
Эти 3 префикса применяются в некоторых отладчиках и ассемблерах.
Префикс "#" означает что эти цифры являются неким числом, по умолчанию десятичным.
Префикс "$" значит что это число в системе HEX. Этот префикс используется для указания адресов, но без префикса #. Например, #$1D это число 1D, а $1D это адрес 1D.
Префикс "%" значит что это число в системе BIN.
В языках программирования с C-подобным синтаксисом, а также в некоторых мануалах по ромхакингу, HEX-числа могут быть записаны с префиксом 0x, причем такое число может являться как байтом, так и адресом.
В некоторых документах DEC-числа обозначаются с постфиксом "d" (29d), HEX с постфиксом "h" (1Dh), а BIN с постфиксом "b" (00011101b).