Multibyte constant
From NESdev Wiki
(Redirected from Multibyte constant for ca65)
Jump to navigationJump to search
This macro allows including long hexadecimal constants on one line, like an arbitrary extension of the .dbyt (2 byte big endian constant).
asm6
; ASM6 uses HEX, Use a Macro to convert it to use MBYT! ; Macro by Hamtaro126, under no licence. macro mbyt string hex string endm
ca65
; mbyt.s ; Multibyte constant macro for ca65 ; ; Copyright 2013 Damian Yerrick ; Copying and distribution of this file, with or without ; modification, are permitted in any medium without royalty provided ; the copyright notice and this notice are preserved in any source ; code copies. This file is offered as-is, without any warranty. ; .macro mbyt_hex2nibs highnib, lownib .local highdig, lowdig ; "dec0de" the hex nibbles .if highnib >= 'A' && highnib <= 'F' highdig = highnib - 'A' + 10 .elseif highnib >= 'a' && highnib <= 'f' highdig = highnib - 'a' + 10 .elseif highnib >= '0' && highnib <= '9' highdig = highnib - '0' .endif .if lownib >= 'A' && lownib <= 'F' lowdig = lownib - 'A' + 10 .elseif lownib >= 'a' && lownib <= 'f' lowdig = lownib - 'a' + 10 .elseif lownib >= '0' && lownib <= '9' lowdig = lownib - '0' .endif .byte highdig * $10 + lowdig ;.out .sprintf(".byte %02x", highdig * $10 + lowdig) .endmacro .macro mbyt inbytes ; thanks to thefox who recommended .set .local pos pos .set 0 .out .sprintf("%s", inbytes) .repeat .strlen(inbytes) .if pos < .strlen(inbytes) nib .set .strat(inbytes, pos) ; these characters can be used as separators .if (nib = ' ' || nib = ',' || nib = '$' || nib = '_') pos .set pos + 1 .else mbyt_hex2nibs nib, {.strat(inbytes, pos + 1)} pos .set pos + 2 .endif .endif .endrepeat .endmacro ; use it like this: ; mbyt "09F91102 9D74E35B D84156C5 635688C0"
Movax12 has a another implementation.
Unofficial MagicKit
; Implementation of multibyte constants for Unofficial-MagicKit. ; By zzo38, Creative Commons Zero macro mbyt macset 2,4,\$1>1 macgoto mbyt_\2 endm macro mbyt_0 endm macro mbyt_1 macset 2,2,1 macset 2,5,2 db $\2 mbyt_0 \>1 macset 1,1,1 mbyt_0 \>1 macset 1,1,1 macgoto mbyt endm ; Example: ; mbyt 09F91102 9D74E35B D84156C5 635688C0
External links
- Ned Batchelder: Hex words has test cases
- Alternate implementation by thefox
- Multibyte constant on GbdevWiki