00001 #include "p18cxxx.inc" 00002 ;--- Példaprogram előjeles számok osztására 00003 udata_acs 00004 p res 2 ; ez a 16 bites osztandó 00005 d res 1 ; ez a 8 bites osztó 00006 k res 1 ; ciklusszámláló 00007 sign res 1 ; előjelek nyilvántartásához 00008 ; sign<0> az osztandó előjelét tárolja 00009 ; sign<1> az osztó eredeti előjelét tárolja 00010 ; sign<2> a hányados előjelét tárolja 00011 00012 RST CODE 00013 goto start 00014 ;--- Példa: p = 0x2EF0 (12016), d = 0x8D (-115) 00015 ; A hányados = 0x98 (-104), a maradék = 0x38 (56) 00016 PGM CODE 00017 start: movlw 0xf0 00018 movwf p 00019 movlw 0x2e 00020 movwf p+1 00021 movlw 0x8d 00022 movwf d 00023 call div16_8s 00024 nop 00025 goto $-2 00026 00027 ;--- div16_8s: 16 bites szám osztása 8 bitessel (mindkét szám előjeles) 00028 ; Belépéskor p az osztandó, d az osztó 00029 ; Kilépéskor p alsó bájtja a hányados, a felső bájt pedig a maradék 00030 ; Az esetleges osztási túlcsordulást kilépéskor a C=1 feltétel jelzi 00031 div16_8s: clrf sign ;jelzőbitek törlése 00032 btfss p+1,7 ;oszandó előjelének vizsgálata 00033 bra tovabb ;átlépés, ha az osztandó nemnegatív 00034 bsf sign,2 ;beállítja a hányados előjelét 00035 bsf sign,0 ;megjegyzi az osztandó előjelét 00036 comf p ;p kettes komplemensét vesszük 00037 comf p+1 ;(negáljuk a negatív osztandót) 00038 incf p 00039 movlw 0 00040 addwfc p+1 00041 tovabb: btfss d,7 ;osztó előjelének vizsgálata 00042 bra osztas ;átlépés, ha az osztó nemnegtív 00043 btg sign,2 ;ellenkezőjére állítja a hányados előjelét 00044 bsf sign,1 ;megjegyzi az osztó előjelét 00045 negf d ;negáljuk a negatív osztót 00046 ;--- Az előjel nélküli számok osztásának elvégzése -------------------- 00047 osztas: movf d,W ;túlcsordulás vizsgálat 00048 subwf p+1,W ;pH >= d? 00049 bc kilep ;ha C=1, akkor osztási túlcsordulás hiba! 00050 movlw 8 00051 movwf k ;a ciklusszámláló 8 legyen 00052 ciklus: movf d,W ;osztó elővétele 00053 bcf STATUS,C 00054 rlcf p 00055 rlcf p+1 ;balraforgatja az osztandót 00056 bc kivonas ;ha C=1, pd > d, tehát kivonás következhet 00057 subwf p+1 ;a parciális osztandó előállítása kivonással 00058 bc bit_egy ;ha C=1, pd>=d, a hányados következő bitjébe 1-et írunk! 00059 addwf p+1 ;ha C=0, akkor vissza kell csinálni a kivonást és át kell 00060 bra szamlal ;ugrani a hányados következő bitjének 1-be állításását! 00061 kivonas: subwf p+1 ;a parciális osztandó előállítása kivonással 00062 bit_egy: bsf p,0 ;a hányados soron következő bitjét '1'-be állítjuk 00063 szamlal: decfsz k ;a ciklusok visszaszámlálása 00064 bra ciklus ;újabb iteráció, ha k <> 0 00065 bcf STATUS,C ;nincs túlcsordulás, Carry törlése 00066 ;--- Előjeles osztás miatti korrekciók ------------------------------- 00067 btfsc sign,2 ;Hányados előjelének vizsgálata 00068 negf p ;ha sign<2>=1, akkor negáljuk a hányadost 00069 btfsc sign,0 ;Osztandó eredeti előjele mi volt? 00070 negf p+1 ;A maradék előjelét negáljuk, ha sign<0>=1 00071 kilep: return 00072 END