Skip to content

Instantly share code, notes, and snippets.

@nelhage
Created August 6, 2014 01:15
Show Gist options
  • Save nelhage/467a884be32cf069e8c2 to your computer and use it in GitHub Desktop.
Save nelhage/467a884be32cf069e8c2 to your computer and use it in GitHub Desktop.
dnl 8051.m4 -- m4 macro set for 8051 assembly programming
dnl 6.115 Final Project, Spring 2008 Nelson Elhage
dnl
dnl Contains a set of macros to simplify 8051 assembly programming
dnl slightly. Doesn't fundamentally change the process, but
dnl simplifies a few of the more repetitive tasks, particularly
dnl generating label names
changequote([,])dnl [] make better quoting characters
changecom([//])dnl
define([_gensym], [0])dnl
dnl gensym returns a new label of the form labelNN each time it
dnl is expanded
define([gensym], [[label]_gensym[]define([_gensym],incr(_gensym))])dnl
dnl 16-bit additiona and subtraction in place across two registers
define([ADD16],
[mov A, $1
add A, $3
mov $1, A
mov A, $2
addc A, $4
mov $2, A
])dnl
define([SUBB16],
[mov A, $1
subb A, $3
mov $1, A
mov A, $2
subb A, $4
mov $2, A
])dnl
dnl
dnl Allocating scratchpad RAM
dnl
define([_lastvar], [128])dnl
define([RESERVE],[dnl
define([_lastvar],eval(_lastvar - $2))dnl
$1 equ _lastvar[]dnl
])dnl
define([DEFVAR],[RESERVE($1, 1)])dnl
dnl
dnl Macros for looping and conditionals
dnl Use `gensym' to generate labels
dnl
define([DJNZ],[pushdef([_l],gensym)dnl
_l:
$2
djnz $1, _l
popdef([_l])dnl
])dnl
define([IFC],[pushdef([_l],gensym)dnl
jnc _l
$1
_l:
popdef([_l])dnl
])dnl
define([IFNC],[pushdef([_l],gensym)dnl
jc _l
$1
_l:
popdef([_l])dnl
])dnl
define([IFZ],[pushdef([_l],gensym)dnl
jnz _l
$1
_l:
popdef([_l])dnl
])dnl
dnl
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment