Created
December 1, 2016 05:52
-
-
Save moonblade/7afa84f6f72477e16907c231d1158e36 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
; 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