diff --git a/util/bit_macros.h65 b/util/bit_macros.h65 new file mode 100644 index 0000000..c2acefe --- /dev/null +++ b/util/bit_macros.h65 @@ -0,0 +1,117 @@ +;;******************************************************************************** +;; @macro Use the bbs instruction by providing the bit as a mask +;; @details +;; This is useful when having a enum with bitmasks, which might change later. +;; @param mask: A byte where a single bit is set +;; @param addr: The zero page address to test +;; @param label: The label to jump to when the bit is set +;;******************************************************************************** +.macro bbs mask,addr,label + .if mask = %00000001 + bbs0 addr,label + .elseif mask = %00000010 + bbs1 addr,label + .elseif mask = %00000100 + bbs2 addr,label + .elseif mask = %00001000 + bbs3 addr,label + .elseif mask = %00010000 + bbs4 addr,label + .elseif mask = %00100000 + bbs5 addr,label + .elseif mask = %01000000 + bbs6 addr,label + .elseif mask = %10000000 + bbs7 addr,label + .else + .fatal .sprintf("bbs macro got invalid mask: %x", mask) + .endif +.endmacro + +;;******************************************************************************** +;; @macro Use the bbr instruction by providing the bit as a mask +;; @details +;; This is useful when having a enum with bitmasks, which might change later. +;; @param mask: A byte where a single bit is set +;; @param addr: The zero page address to test +;; @param label: The label to jump to when the bit is clear +;;******************************************************************************** +.macro bbr mask,addr,label + .if mask = %00000001 + bbr0 addr,label + .elseif mask = %00000010 + bbr1 addr,label + .elseif mask = %00000100 + bbr2 addr,label + .elseif mask = %00001000 + bbr3 addr,label + .elseif mask = %00010000 + bbr4 addr,label + .elseif mask = %00100000 + bbr5 addr,label + .elseif mask = %01000000 + bbr6 addr,label + .elseif mask = %10000000 + bbr7 addr,label + .else + .fatal .sprintf("bbr macro got invalid mask: 0x%x", mask) + .endif +.endmacro + +;;******************************************************************************** +;; @macro Use the smb instruction by providing the bit as a mask +;; @details +;; This is useful when having a enum with bitmasks, which might change later. +;; @param mask: A byte where a single bit is set +;; @param addr: The zero page address to update +;;******************************************************************************** +.macro smb mask,addr + .if mask = %00000001 + smb0 addr + .elseif mask = %00000010 + smb1 addr + .elseif mask = %00000100 + smb2 addr + .elseif mask = %00001000 + smb3 addr + .elseif mask = %00010000 + smb4 addr + .elseif mask = %00100000 + smb5 addr + .elseif mask = %01000000 + smb6 addr + .elseif mask = %10000000 + smb7 addr + .else + .fatal .sprintf("smb macro got invalid mask: 0x%x", mask) + .endif +.endmacro + +;;******************************************************************************** +;; @macro Use the rmb instruction by providing the bit as a mask +;; @details +;; This is useful when having a enum with bitmasks, which might change later. +;; @param mask: A byte where a single bit is set +;; @param addr: The zero page address to update +;;******************************************************************************** +.macro rmb mask,addr + .if mask = %00000001 + rmb0 addr + .elseif mask = %00000010 + rmb1 addr + .elseif mask = %00000100 + rmb2 addr + .elseif mask = %00001000 + rmb3 addr + .elseif mask = %00010000 + rmb4 addr + .elseif mask = %00100000 + rmb5 addr + .elseif mask = %01000000 + rmb6 addr + .elseif mask = %10000000 + rmb7 addr + .else + .fatal .sprintf("rmb macro got invalid mask: 0x%x", mask) + .endif +.endmacro