Multibyte constant: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (Tepples moved page Multibyte constant for ca65 to Multibyte constant: Allow ports to multiple assemblers)
(Corrected formatting)
Line 57: Line 57:


== Unofficial MagicKit ==
== Unofficial MagicKit ==
<pre>
; Implementation of multibyte constants for Unofficial-MagicKit.
; Implementation of multibyte constants for Unofficial-MagicKit.
; By zzo38, Creative Commons Zero
; By zzo38, Creative Commons Zero
Line 81: Line 82:
; Example:
; Example:
; mbyt 09F91102 9D74E35B D84156C5 635688C0
; mbyt 09F91102 9D74E35B D84156C5 635688C0
</pre>


== 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 01:19, 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