Multibyte constant: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Removal of syntax highlighter)
(Moved zzo38's port from talk in preparation for rename and addition to Programming guide)
Line 1: Line 1:
This macro allows including long hexadecimal constants on one line, like an arbitrary extension of the .dbyt (2 byte big endian constant).
This macro allows including long hexadecimal constants on one line, like an arbitrary extension of the .dbyt (2 byte big endian constant).
== ca65 ==
<pre>
<pre>
; mbyt.s
; mbyt.s
Line 53: Line 55:
; mbyt "09F91102 9D74E35B D84156C5 635688C0"
; mbyt "09F91102 9D74E35B D84156C5 635688C0"
</pre>
</pre>
== 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 ==
== 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
* [http://pastebin.com/0xkpKgCh Alternate implementation by thefox]
* [http://pastebin.com/0xkpKgCh Alternate implementation by thefox]

Revision as of 00:53, 1 July 2015

This macro allows including long hexadecimal constants on one line, like an arbitrary extension of the .dbyt (2 byte big endian constant).

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"

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