Skip to content

Instantly share code, notes, and snippets.

@moonblade
Created December 1, 2016 05:52
Show Gist options
  • Save moonblade/7afa84f6f72477e16907c231d1158e36 to your computer and use it in GitHub Desktop.
Save moonblade/7afa84f6f72477e16907c231d1158e36 to your computer and use it in GitHub Desktop.
; Read the two 16bit numbers
; x=r3r2
; y=r1r0
movx a,@dptr
mov r3,a
inc dptr
movx a,@dptr
mov r2,a
inc dptr
movx a,@dptr
mov r1,a
inc dptr
movx a,@dptr
mov r0,a
inc dptr
; x*x
mov 30h,r3
mov 31h,r2
mov 32h,r3
mov 33h,r2
call mul
;x*x in 38 to 3b
mov 38h,40h
mov 39h,41h
mov 3ah,42h
mov 3bh,43h
;y*y
mov 30h,r1
mov 31h,r0
mov 32h,r1
mov 33h,r0
call mul
; add x*x + y*y, ie 38-3b 40-43
; answer will be more than 32 bit, so answer is in 38 to 3c
mov a,43h
add a,3bh
mov 3ch,a
mov a,42h
addc a,3ah
mov 3bh,a
mov a,41h
addc a,39h
mov 3ah,a
mov a,40h
addc a,38h
mov 39h,a
; final carry
mov 38h,#0
jnc skip5
mov 38h,#1
skip5:
; find x*y
mov 30h,r3
mov 31h,r2
mov 32h,r1
mov 33h,r0
call mul
; (x*x + y*y) - x*y
; 38-3c - 40-43
clr c
mov a,3ch
subb a,43h
mov 3ch,a
mov a,3bh
subb a,42h
mov 3bh,a
mov a,3ah
subb a,41h
mov 3ah,a
mov a,39h
subb a,40h
mov 39h,a
mov a,38h
subb a,#00
mov 38h,a
; Print result
mov dpl,#10h
mov a,38h
movx @dptr,a
inc dptr
mov a,39h
movx @dptr,a
inc dptr
mov a,3ah
movx @dptr,a
inc dptr
mov a,3bh
movx @dptr,a
inc dptr
mov a,3ch
movx @dptr,a
inc dptr
; End
e:sjmp e
mul:
; multiplies bits in 30h-31h with 32h-33h
; stores result in 40h to 43h
; Clear result
mov 40h,#0
mov 41h,#0
mov 42h,#0
mov 43h,#0
;multiply last bits
mov a,31h
mov b,33h
mul ab
; Store them in last two place
mov 43h,a
mov 42h,b
;multiply first and last
mov a,30h
mov b,33h
mul ab
; Add with earlier high byte
add a,42h
jnc skip3
inc b
skip3:
; Save
mov 42h,a
mov 41h,b
;multiply last and first
mov a,31h
mov b,32h
mul ab
; Add with earlier high and low byte, save three byte result
add a,42h
jnc skip6
inc b
skip6:
; Save
mov 42h,a
mov a,b
add a,41h
mov 41h,a
jnc skip2
mov 40h,#1
skip2:
;mul first two
mov a,30h
mov b,32h
mul ab
; Add with previous byte and carry
add a,41h
jnc skip1
inc b
skip1:
mov 41h,a
mov a,b
add a,40h
mov 40h,a
; Result in 40 to 43
ret
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment