Найти тему
Roman Hz

Программирование на dendy, статус флаги CPU

Статус флаги в дебагере FCEUX
Статус флаги в дебагере FCEUX

Статус флаги это 1 байтный (8 бит) системный регистр, который сделан для того что бы во время выполнения программы можно было понять, наступило то или иное событие/статус и что сделать если это установлено. В основном статусы используются для ветвления программы. Рассмотрим список флагов:

  • N - negative - показывает что число отрицательное содержит 7-й бит числа, которое в случае знакового числа отвечает за знак
  • V - overflow - По сути устанавливается если результат математического вычисления превысил 255 или наоборот меньше 0
  • U - всегда равен 1 по этому не используется
  • B - break - устанавливается при вызове PHP, BRK тоже не используется по факту в программе
  • D - decimal - флаг показывает что был включен режим десятичного вычисления, такими командами как SED(включен), CLD(выключен)
  • I - interupt disable - флаг показывающий что отключены прерывания устанавливается командой SEI
  • Z - zero - нулевой флаг, он показывает что в результате выполнения предыдущей команды 0. На этот флаг завязаны команды ветвления BEQ и BNE, первая срабатывает если флаг Z установлен.
  • С - cary - флаг переноса устанавливается при выполнение команды ADC, при SBC, при CMP устанавливается если сравниваемое значение "больше или равно" аккумулятору.

Приведу несколько примеров использования флагов в программе:

LDA tmp
BEQ itsTmpZero
BNE itsTmpNoZero
itsTmpZero:
JSR tmpZero
itsTmpNoZero:
JSR tmpNoZero

В этом примере если переменная равна 0 то программа запустит выполнения подпрограммы tmpZero, так как будет установлен флаг Z(Zero) и сработает инструкция BEQ (Branch if Eque) - перейти если результат операции равен нулю.

Кроме флага Z, интересен еще флаг  Carry - флаг переноса, дело в том что он устанавливается при операции сравнения CMP (compare) - при этом если значение больше или равно то флаг будет установлен. Пример кода:

LDA tmp
CMP #$02
BCS greatOrEq ; срабатывает если значение tmp больше либо равно 2
BCC less ; если меньше

В качестве заключения: