Multibyte constant
From Nesdev wiki
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