MASM/Subtraction
Jump to navigation
Jump to search
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
fre 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
fre 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
fre offset
alc ptr-size
set tmp
adr arg2
drf vpt
fre tmp
set ipt
cmt noop (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
cmt call arg1 if offset doesn't equal 0, in
cmt which case offset equals 12
fre offset
alc ptr-size
set tmp
adr arg1
drf vpt
fre tmp
set ipt
addition-and-subtraction.masm
add
negative
return-arg-or-arg1
return-arg-xor-arg1-plus-carry
if-else
tmp
carry
arg-cpy
arg1-cpy
old-old-ipt
arg1-cpy-for-subtract
lab return-arg-or-arg1
alc one
set tmp
get arg-cpy
nnd vpt
alc one
get arg1-cpy
nnd vpt
nnd tmp
fre tmp
set ret
fre arg-cpy
fre arg1-cpy
alc ptr-size
set tmp
adr old-ipt
get nine
drf vpt
fre tmp
set ipt
lab return-arg-xor-arg1-plus-carry
cmt tmp = arg-cpy or arg1-cpy
alc one
set tmp
get arg-cpy
nnd vpt
alc one
get arg1-cpy
nnd vpt
nnd tmp
fre tmp
set tmp
cmt arg = (arg-cpy nand arg1-cpy) and tmp
cmt = (arg-cpy nand arg1-cpy) and (arg-cpy or arg1-cpy)
cmt = arg-cpy xor arg1-cpy
alc one
get arg-cpy
nnd arg1-cpy
nnd tmp
fre tmp
nnd vpt
set arg
cmt tmp = (arg-cpy and arg1-cpy) << 1
alc one
get arg-cpy
nnd arg1-cpy
nnd vpt
rot one
rot one
rot one
rot one
rot one
rot one
rot one
set tmp
cmt arg1 = tmp and (not one) = (arg-cpy and arg1-cpy) * 2
alc one
get one
nnd vpt
nnd tmp
nnd vpt
fre tmp
set arg1
fre arg-cpy
fre arg1-cpy
cmt call add
alc ptr-size
set tmp
adr add
drf vpt
fre tmp
set ipt
lab add
cmt copies args to new variables
alc one
get arg
fre arg
set arg-cpy
alc one
get arg1
fre arg1
set arg1-cpy
cmt arg = arg-cpy and arg1-cpy
alc one
get arg-cpy
nnd arg1-cpy
nnd vpt
set arg
cmt arg1 = return-arg-xor-arg1-plus-carry
alc ptr-size
set tmp
adr return-arg-xor-arg1-plus-carry
drf vpt
fre tmp
set arg1
cmt arg2 = return-arg-or-arg1
alc ptr-size
set tmp
adr return-arg-or-arg1
drf vpt
fre tmp
set arg2
cmt goto if-else. old-ipt doesn't need to be
cmt initialized, because this function will be
cmt left by ipt anyways
alc ptr-size
set tmp
adr if-else
drf vpt
fre tmp
set ipt
cmt -x = ~x + 1
lab negative
cmt arg = ~arg
alc one
get arg
fre arg
nnd vpt
set arg
cmt arg1 = 1
alc one
get one
set arg1
cmt call add. old-ipt isn't initialized because
cmt this function is finished anyways
alc ptr-size
set tmp
adr add
drf vpt
fre tmp
set ipt
lab subtract
cmt swap arg and arg1 so arg1 is made negative instead of arg
cmt arg1 will be changed by negative because it calls add,
cmt so it's instead copied. even arg1-cpy is, however, changed
cmt by add, so we need a third buffer to store arg1 in
alc one
get arg
fre arg
set tmp
alc one
get arg1
set arg
alc one
get tmp
fre tmp
set arg1-cpy-for-subtract
cmt old-old-ipt = old-ipt
alc ptr-size
set tmp
adr old-ipt
drf vpt
fre tmp
set old-old-ipt
cmt init old-ipt
alc ptr-size
set tmp
adr ipt
drf vpt
fre tmp
set old-ipt
cmt call negative
alc ptr-size
set tmp
adr negative
drf vpt
fre tmp
set ipt
alc one
get ret
fre ret
set arg
alc one
get arg1-cpy-for-subtract
fre arg1-cpy-for-subtract
set arg1
cmt old-ipt = old-old-ipt so add makes ipt jump back
cmt to where it was before calling subtract
alc ptr-size
set tmp
adr old-old-ipt
drf vpt
fre tmp
set old-ipt
cmt call add
alc ptr-size
set tmp
adr add
drf vpt
fre tmp
set ipt
main.masm
add
subtract
loop
tmp
_48
two
new-out
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 48 = 0b00110000
alc one
get one
rot one
rot one
rot one
nnd vpt
set tmp
alc one
get one
rot one
rot one
rot one
rot one
nnd vpt
nnd tmp
fre tmp
set _48
cmt 48 will be subtracted from in[1] to convert it
cmt to an integer (48 is the ascii value of '0')
alc ptr-size
set tmp
adr in
get one
drf vpt
fre tmp
set tmp
alc one
get tmp
set arg
alc one
get _48
set arg1
cmt init old-ipt
alc ptr-size
set tmp
adr ipt
drf vpt
fre tmp
set old-ipt
cmt call subtract
alc ptr-size
set tmp
adr subtract
drf vpt
fre tmp
set ipt
fre _48
cmt arg1 = input[1] as number
alc one
get ret
fre ret
set arg1
cmt arg = input[0] as char (copied because arg1 will be freed by add)
alc one
get in
set arg
cmt init old-ipt
alc ptr-size
set tmp
adr ipt
drf vpt
fre tmp
set old-ipt
cmt call add
alc ptr-size
set tmp
adr subtract
drf vpt
fre tmp
set ipt
cmt init two
alc one
get one
rot one
rot one
rot one
rot one
rot one
rot one
rot one
set two
cmt new-out[0] = ret
alc two
set new-out
get ret
fre ret
cmt new-out[1] = 0
alc ptr-size
set tmp
adr new-out
get one
drf vpt
fre tmp
get out
cmt out = new-out
alc ptr-size
set tmp
adr new-out
drf vpt
fre tmp
set out
cmt goto loop
alc ptr-size
set tmp
adr loop
drf vpt
set ipt