From 52b6f24794b5d1eec0322f77b888bf66786df91a Mon Sep 17 00:00:00 2001 From: Ivan Tatarinov Date: Sat, 12 Jun 2021 19:26:05 +0300 Subject: [PATCH] sdk/include: added `regs.mac` macros to operate on CPU registers --- sdk/include/regs.mac | 77 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 sdk/include/regs.mac diff --git a/sdk/include/regs.mac b/sdk/include/regs.mac new file mode 100644 index 0000000..09b1f0c --- /dev/null +++ b/sdk/include/regs.mac @@ -0,0 +1,77 @@ +; regs.mac - macros to assign values to CPU registers. +; +; SPDX-FileCopyrightText: Copyright (C) 2021 Ivan Tatarinov +; +; SPDX-License-Identifier: GPL-3.0-or-above + +; Compatible compilers: +; SJAsmPlus, + + ifndef regs_mac_included + define regs_mac_included + + ; Load (initialize) A register + macro ld_a value + if 0 = value + xor a ; 1 byte + else + ld a, value ; 2 bytes + endif +___a=value + endm + + ; Change A register + macro chg_a value + if ___a != value + if 0 = (value & $ff) + xor a ; 1 byte + elseif ((___a + 1) & $ff) = (value & $ff) + inc a ; 1 byte + elseif ((___a - 1) & $ff) = (value & $ff) + dec a ; 1 byte + elseif (((___a & $7f) << 1) + ((___a & $80) >> 7)) = (value & $ff) + rlca ; 1 byte + elseif (((___a & $fe) >> 1) + ((___a & $01) << 7)) = (value & $ff) + rrca ; 1 byte + elseif ((___a ^ $ff) & $ff) = (value & $ff) + cpl ; 1 byte + else + ld a, value & $ff ; 2 bytes + endif +___a=value + endif + endm + + ; Load (initialize) BC register + macro ld_bc value + ld bc, value +___bc=value + endm + + ; Change BC register + macro chg_bc value + if (___bc & $ffff) != (value & $ffff) + if (___bc & $ff) = (value & $ff) + if (((___bc >> 8) + 1) & $ff) = ((value >> 8) & $ff) + inc b + elseif (((___bc >> 8) - 1) & $ff) = ((value >> 8) & $ff) + dec b + else + ld b, value >> 8 + endif + elseif ((___bc >> 8) & $ff) = ((value >> 8) & $ff) + if (((___bc & $ff) + 1) & $ff) = (value & $ff) + inc c + elseif (((___bc & $ff) - 1) & $ff) = (value & $ff) + dec c + else + ld c, value & $ff + endif + else + ld bc, value + endif +___bc=value + endif + endm + + endif ; !regs_mac_included