00001 #include "p18cxxx.inc"
00002 ;--- 16 bites előjeles számok szorzása ------
00003 ;--- p = a * b kiszámítása
00004 udata_acs
00005 a res 2 ; a: szorzandó
00006 b res 2 ; b: szorzó
00007 p res 4 ; p: szorzat
00008 RST CODE
00009 goto start
00010 ;--- Példa: p = 1450*4550 = 0x05aa*0xee3a
00011 ;--- (az eredmény = 0xff9b5484 = -6597500)
00012 PGM CODE
00013 start: movlw 0xaa
00014 movwf a ; a=0x05aa
00015 movlw 0x05
00016 movwf a+1
00017 movlw 0x3a
00018 movwf b ; b=0xee3a
00019 movlw 0xee
00020 movwf b+1
00021 call mult16s ; p = a*b
00022 nop
00023 goto $-2
00024 ;--- mult16s a szozást végző eljárás
00025 mult16s:
00026 movf b,w
00027 mulwf a ;aL*bL
00028 movff PRODL,p ;az eredmény elmentése
00029 movff PRODH,p+1 ;p0 és p1-be
00030 ;-----------------------------------------------
00031 movf b+1,w
00032 mulwf a+1 ;aH*bH
00033 movff PRODL,p+2 ;az eredmény elmentése
00034 movff PRODH,p+3 ;p2 és p3-ba
00035 ;-----------------------------------------------
00036 movf b,w
00037 mulwf a+1 ;aH*bL
00038 movf PRODL,w
00039 addwf p+1,f ;p1 = p1+Lo(aH*bL)
00040 movf PRODH,w
00041 addwfc p+2,f ;p2=p2+Hi(aH*bL)+Carry
00042 clrf WREG
00043 addwfc p+3,f ;p3=p3+Carry
00044 ;-----------------------------------------------
00045 movf b+1,w
00046 mulwf a ;aL*bH
00047 movf PRODL,w
00048 addwf p+1,f ;p1 = p1+Lo(aL*bH)
00049 movf PRODH,w
00050 addwfc p+2,f ;p2=p2+Hi(aL*bH)+Carry
00051 clrf WREG
00052 addwfc p+3,f ;p3=p3+Carry
00053 ;--- Előjevizsgálat és korrekció ----------------
00054 avizsg: btfss a+1,7 ;a szorzandó negatív?
00055 bra bvizsg ;ugrás, ha a nem negatív
00056 movf b,W
00057 subwf p+2 ;p3:p2 = p3:p2 - bH:bL
00058 movf b+1,W
00059 subwfb p+3
00060 bvizsg: btfss b+1,7 ;a szorzó negatív?
00061 bra kilep ;kilépés, ha b nem negatív
00062 movf a,W
00063 subwf p+2 ;p3:p2 = p3:p2 - aH:aL
00064 movf a+1,W
00065 subwfb p+3
00066 kilep: return
00067 END