Multibyte constant: Difference between revisions
From NESdev Wiki
Jump to navigationJump to search
(0xBEE52 is hex. 0xACTION52 is not unless it equals 0xFECE5.) |
(.set was undocumented in old ca65; thefox told me about it in #nesdev) |
||
Line 28: | Line 28: | ||
.endif | .endif | ||
.byte highdig * $10 + lowdig | .byte highdig * $10 + lowdig | ||
;.out .sprintf(".byte %02x", highdig * $10 + lowdig) | |||
; | |||
.endmacro | .endmacro | ||
.macro mbyt inbytes | .macro mbyt inbytes | ||
.local | ; 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 | .endmacro | ||
; use it like this: | ; use it like this: | ||
; mbyt " | ; mbyt "09F91102 9D74E35B D84156C5 635688C0" | ||
</source> | </source> | ||
== External links == | == External links == | ||
* [http://nedbatchelder.com/text/hexwords.html Ned Batchelder: Hex words] has test cases | * [http://nedbatchelder.com/text/hexwords.html Ned Batchelder: Hex words] has test cases |
Revision as of 01:06, 17 November 2013
This macro allows including long hexadecimal constants on one line, like an arbitrary extension of the .dbyt (2 byte big endian constant). <source>
- 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"
</source>
External links
- Ned Batchelder: Hex words has test cases