Для проекта TVCAS необходимо сравнивать время активной подписки со временем из ECM-пакета. UNIX-время представлено в виде числа LONG размером 4 байта. Т.к. контроллер 8-битный, работа ведётся с одним байтом. Тривиальная задача, но долго ломал голову как сравнить 4 байта через один. Сначала пошёл, как мне показалось по лёгкому пути — была идея сравнивать биты этих чисел, начиная со старших разрядов. Но такой путь в итоге оказался велосипедистым. В итоге решил действовать стандартным способом, как и для CHAR-овских переменных — использовать разность чисел с последующей проверкой битов признаков (Z, C в регистре STATUS).
let macro xaddr, xdata movlw xdata movwf xaddr endm org 0 ; call compare ; end ; ; ???????? A больше либо равно B ??????? compare clrf h'0050' ; регистр ответа. 01 -> да 10 -> нет let h'0040', 0x12 ; A let h'0041', 0x2C ; A let h'0042', 0xF4 ; A let h'0043', 0x35 ; A let h'0044', 0x12 ; B let h'0045', 0x4C ; B let h'0046', 0xB5 ; B let h'0047', 0x2A ; B movf h'0044', W subwf h'0040', W ; A-B btfsc STATUS, C ; C=0 при отрицательном goto compare_2 compare_no let h'0050', 0x10 ; нет return compare_2 btfss STATUS, Z goto compare_yes movf h'0045', W subwf h'0041', W ; A-B btfsc STATUS, C ; C=0 при отрицательном goto compare_3 goto compare_no compare_3 btfss STATUS, Z goto compare_yes movf h'0046', W subwf h'0042', W ; A-B btfsc STATUS, C ; C=0 при отрицательном goto compare_4 goto compare_no compare_4 btfss STATUS, Z goto compare_yes movf h'0047', W subwf h'0043', W ; A-B btfsc STATUS, C ; C=0 при отрицательном goto compare_yes goto compare_no compare_yes let h'0050', 0x01 ; да return