Multibyte constant: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
(Moved zzo38's port from talk in preparation for rename and addition to Programming guide)
m (Tepples moved page Multibyte constant for ca65 to Multibyte constant: Allow ports to multiple assemblers)

Revision as of 00:54, 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