MASM/If else statement

:
==globals.masm==
 nine ptr-size
 old-ipt
 arg
 arg1
 arg2
 ret
==if-else.masm==
 tmp
 not-four
 offset
 arg-as-bool-times-eight
 
 lab if-else
 alc one
 get arg
 nnd vpt
 set tmp
 
 cmt tmp = arg except it's 0x00 if zero and 0xff otherwise
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 nnd vpt
 set tmp
 
 alc one
 get tmp
 rot one
 nnd tmp
 fre tmp
 set tmp
 
 cmt tmp (which is 0x00 or 0xff) is converted to 0x00 (arg = 0)
 cmt or 0x08 (arg = nonzero) to potentially skip commands
 alc one
 get tmp
 fre tmp
 nnd one
 nnd vpt
 rot one
 rot one
 rot one
 rot one
 rot one
 set arg-as-bool-times-eight
 
 cmt not-four = 4 nand 4
 alc one
 get one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 nnd vpt
 set not-four
 
 cmt combines arg-as-bool-times-eight and not-four to create
 cmt either 4 or 12
 alc one
 get arg-as-bool-times-eight
 fre arg-as-bool-times-eight
 nnd vpt
 nnd not-four
 set offset
 
 cmt adds offset (which is either 4 or 12) to ipt
 cmt to call either function A (if it's 4) or B
 cmt (if it's 12)
 alc ptr-size
 set tmp
 adr ipt
 get offset
 drf vpt
 fre tmp
 set ipt
 
 cmt call arg2. this will be skipped if arg
 cmt equals 0, in which case offset equals 4.
 cmt not how old-ipt isn't changed, so the label
 cmt arg2 is pointing to will move ipt back to
 cmt where it was before calling this if/else
 cmt statement
 alc ptr-size
 set tmp
 adr arg2
 drf vpt
 fre tmp
 set ipt
 
 cmt to noops (could be anything; won't be executed
 cmt anyways) so ipt doesn't jump to the wrong place
 cmt when offset is added
 set vpt
 set vpt
 
 cmt call arg1 if offset doesn't equal 0, in
 cmt which case offset equals 12
 alc ptr-size
 set tmp
 adr arg1
 drf vpt
 fre tmp
 set ipt
==main.masm==
 if-else
 print-A
 print-B
 loop
 tmp
 
 lab loop
 alc ptr-size
 set tmp
 adr loop
 drf vpt
 set ipt
 
 lab main
 cmt contruct nine (aka ptr-size)
 alc one
 get one
 rot one
 rot one
 rot one
 rot one
 rot one
 nnd vpt
 set tmp
 alc one
 get one
 nnd vpt
 nnd tmp
 fre tmp
 set nine
 
 cmt set arg to 0 (replace out with any nonzero
 cmt value like one to get a different result)
 alc one
 get out
 set arg
 
 cmt arg1 = print-A
 alc ptr-size
 set tmp
 adr print-A
 drf vpt
 fre tmp
 set arg1
 
 cmt arg2 = print-B
 alc ptr-size
 set tmp
 adr print-B
 drf vpt
 fre tmp
 set arg2
 
 cmt init old-ipt
 alc ptr-size
 set tmp
 adr ipt
 drf vpt
 fre tmp
 set old-ipt
 
 cmt call if-else. will print A if arg is
 cmt nonzero, otherwise B
 alc ptr-size
 set tmp
 adr if-else
 drf vpt
 fre tmp
 set ipt
 
 cmt goto loop
 alc ptr-size
 set tmp
 adr loop
 drf vpt
 set ipt
==printing.masm==
 tmp
 new-out
 two
 _65
 _66
 
 lab print-A
 alc one
 get one
 rot one
 rot one
 nnd vpt
 set tmp
 alc one
 get one
 nnd vpt
 nnd tmp
 fre tmp
 set _65
 
 alc one
 get one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 set two
 
 alc two
 set new-out
 get _65
 
 alc ptr-size
 set tmp
 adr new-out
 get one
 drf vpt
 fre tmp
 get out
 
 alc ptr-size
 set tmp
 adr new-out
 drf vpt
 fre tmp
 set out
 
 alc ptr-size
 set tmp
 adr old-ipt
 get nine
 drf vpt
 fre tmp
 set ipt
 
 lab print-B
 alc one
 get one
 rot one
 rot one
 nnd vpt
 set tmp
 
 alc one
 get one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 nnd vpt
 
 nnd tmp
 fre tmp
 set _66
 
 alc one
 get one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 rot one
 set two
 
 alc two
 set new-out
 get _66
 
 alc ptr-size
 set tmp
 adr new-out
 get one
 drf vpt
 fre tmp
 get out
 
 alc ptr-size
 set tmp
 adr new-out
 drf vpt
 fre tmp
 set out
 
 alc ptr-size
 set tmp
 adr old-ipt
 get nine
 drf vpt
 fre tmp
 set ipt
Category:Examples