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