; инкремент 2х байтной переменной (переменная располагается в порядке lo, hi, передается lo)
; следит, чтобы результат не превышал 0xFFFF
INCW MACRO ARG
local inc_hi
local inc_lo
local done
   mov     A, ARG
   inc     A
   jnz     inc_lo
   mov     A, (ARG+1)
   inc     A
   jnz     inc_hi
   jmp     done
inc_hi:
   inc     (ARG+1)
inc_lo:
   inc     ARG
done:
ENDM



; декремент 2х байтной переменной
; следит, чтобы результат был больше 0
DECW MACRO ARG
local dec_hi
local dec_lo
local done
   mov     A, ARG
   jnz     dec_lo
   mov     A, (ARG+1)
   jnz     dec_hi
   jmp     done
dec_hi:
   dec     (ARG+1)
dec_lo:
   dec     ARG
done:
ENDM



; прибавление константы к 2х байтной переменной
ADDW MACRO ARG, CONST
local not_greater_max
   mov     A, ARG
   add     A, #LOW(CONST)
   mov     ARG, A
   mov     A, (ARG+1)
   addc    A, #HIGH(CONST)
;   jnc     not_greater_max
   ; если был заем в старшем байте, то достигнут максимум
not_greater_max:
   mov     (ARG+1), A
ENDM



; вычитание константы из 2х байтной переменной
SUBW MACRO ARG, CONST
local above_zerro
   clr     C
   mov     A, ARG
   subb    A, #LOW(CONST)
   mov     ARG, A
   mov     A, (ARG+1)
   subb    A, #HIGH(CONST)
   jnc     above_zerro
   ; если был заем в старшем байте, то вычитаемое больше величины
   mov     A, #0
   mov     ARG, #0
above_zerro:
   mov     (ARG+1), A
ENDM


; сравнивает 2х байтную переменную с константой и выполянет переход, если переменная меньше
CMPJBW MACRO ARG, CONST, LABEL
local done
local hi_no_equal
local c2
local jump
   mov     A, (ARG+1)
   cjne    A, #HIGH(CONST), hi_no_equal
   mov     A, ARG
   cjne    A, #LOW(CONST), c2
c2:
   jc      jump
   jmp     done
; Флаг переноса C сбрасывается в "0", если содержимое A больше (равно) содержимого (содержимому) используемой ячейки
; или используемого регистра, в противном случае флаг устанавливается в "1".
hi_no_equal:
   jnc      done
jump:
   jmp      LABEL
done:
ENDM



; вычисляет величину уровня по таблице
CALCLEV MACRO VAL, COUNT, X1, X2, X3, X4, X5, X6, X7, X8
local done
   mov     VAL, #0
   CMPJBW  COUNT, X1, done
   inc     VAL
   CMPJBW  COUNT, X2, done
   inc     VAL
   CMPJBW  COUNT, X3, done
   inc     VAL
   CMPJBW  COUNT, X4, done
   inc     VAL
   CMPJBW  COUNT, X5, done
   inc     VAL
   CMPJBW  COUNT, X6, done
   inc     VAL
   CMPJBW  COUNT, X7, done
   inc     VAL
   CMPJBW  COUNT, X8, done
   inc     VAL
done:
ENDM
