Skip to content

Instantly share code, notes, and snippets.

@b-adams
Created October 28, 2012 22:01
Show Gist options
  • Save b-adams/3970088 to your computer and use it in GitHub Desktop.
Save b-adams/3970088 to your computer and use it in GitHub Desktop.
Multiplication function
-------------------------------------------------------------------------------
Object
Addr code Symbol Mnemon Operand Comment
-------------------------------------------------------------------------------
0000 04002B BR main
mainFram:.EQUATE 6 ;Size of main's local variables
en: .EQUATE 0 ;main local variable #2d
em: .EQUATE 2 ;main local variable #2d
prod: .EQUATE 4 ;main local vairbale #2d
0003 0A506C prompt: .ASCII "\nPlease enter two numbers to multiply: \x00"
656173
652065
6E7465
722074
776F20
6E756D
626572
732074
6F206D
756C74
69706C
793A20
00
002B 24 main: NOP0
002C 680006 SUBSP mainFram,i ;allocate #prod #em #en
002F 410003 STRO prompt,d
0032 330002 DECI em,s ;input original m
0035 330000 DECI en,s ;input original n
;Prepare argument N for mult
0038 C30000 LDA en,s
003B E3FFFA STA argN,s
;Prepare argument M for mult
003E C30002 LDA em,s
0041 E3FFFC STA argM,s
;Call mult
0044 680006 SUBSP frame,i ;allocate #return #paramM #paramN
0047 160066 CALL mult
004A 600006 ADDSP frame,i ;deallocate #paramN #paramM #return
;Save returned value
004D C3FFFE LDA retval,s
0050 E30004 STA prod,s
;Display result
0053 3B0002 DECO em,s
0056 50002A CHARO '*',i
0059 3B0000 DECO en,s
005C 50003D CHARO '=',i
005F 3B0004 DECO prod,s
0062 600006 ADDSP mainFram,i ;deallocate #en #em #prod
0065 00 STOP
;procedure mult
;callER data
frame: .EQUATE 6 ;size of mult's arguments and return
argN: .EQUATE -6 ;mult argument
argM: .EQUATE -4 ;mult argument
retval: .EQUATE -2 ;mult return
;callEE data
lframe: .EQUATE 6 ;size of mult's local variables
dec: .EQUATE 0 ;mult local variable #2d
inc: .EQUATE 2 ;mult local variable #2d
product: .EQUATE 4 ;mult local variable #2d
retAddr: .EQUATE 6 ;mult return address #2h
paramN: .EQUATE 8 ;mult formal parameter #2d
paramM: .EQUATE 10 ;mult formal parameter #2d
return: .EQUATE 12 ;mult return value #2d
;Entry point for mult
0066 24 mult: NOP0
0067 680006 SUBSP lframe,i ;allocate #product #inc #dec
;product=0
006A C00000 LDA 0,i
006D E30004 STA product,s
;inc = n
0070 C30008 LDA paramN,s
0073 E30002 STA inc,s
;dec = m
0076 C3000A LDA paramM,s
0079 E30000 STA dec,s
007C 24 loop: NOP0
007D C30000 LDA dec,s
0080 0A00AD BREQ done ;Nothing more to multiply
0083 22 RORA ;Put parity of dec into C
0084 14008E BRC odd ;if dec%2==1
0087 04008A BR even ;if dec%2==0
;In case of a 0, nothing to do
008A 24 even: NOP0
008B 04009B BR always
;In case of a 1, the product goes up by inc
008E 24 odd: NOP0
;product = product + inc
008F C30004 LDA product,s
0092 730002 ADDA inc,s
0095 E30004 STA product,s
0098 04009B BR always
009B 24 always: NOP0
;dec = dec/2
009C C30000 LDA dec,s
009F 1E ASRA
00A0 E30000 STA dec,s
;inc = 2*inc
00A3 C30002 LDA inc,s
00A6 1C ASLA
00A7 E30002 STA inc,s
00AA 04007C BR loop
00AD 24 done: NOP0
;return product
00AE C30004 LDA product,s
00B1 E3000C STA return,s
00B4 600006 ADDSP lframe,i ;deallocate #dec #inc #product
00B7 58 RET0
00B8 .END
-------------------------------------------------------------------------------
Symbol table
--------------------------------------
Symbol Value Symbol Value
--------------------------------------
always 009B argM FFFC
argN FFFA dec 0000
done 00AD em 0002
en 0000 even 008A
frame 0006 inc 0002
lframe 0006 loop 007C
main 002B mainFram 0006
mult 0066 odd 008E
paramM 000A paramN 0008
prod 0004 product 0004
prompt 0003 retAddr 0006
return 000C retval FFFE
--------------------------------------
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment