6502-OS/util/bit_macros.h65

124 lines
3.9 KiB
Plaintext
Raw Permalink Normal View History

2024-08-08 21:11:25 +02:00
;;********************************************************************************
;; @file
;; @brief Macros for bitwise operations
;; @ingroup libs
;;********************************************************************************
2024-01-07 00:40:23 +01:00
;;********************************************************************************
;; @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