00001 #include "p18cxxx.inc"
00002 ;--- Példaprogram az előjel nélküli 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 RST CODE
00008 goto start
00009 ;--- Példa: p = 0x2EF0 (12016), d = 0x8D (141)
00010 ; A helyes eredmény: p/d hányadosa = 0x55 (85), a maradék = 0x1F (31)
00011 PGM CODE
00012 start: movlw 0xf0
00013 movwf p
00014 movlw 0x2e
00015 movwf p+1
00016 movlw 0x8d
00017 movwf d
00018 call div16_8
00019 nop
00020 goto $-2
00021
00022 ;--- div16_8: 16 bites szám osztása 8 bitessel ------
00023 ; Belépéskor p az osztandó, d az osztó
00024 ; Kilépéskor p alsó bájtja a hányados, a felső bájt pedig a maradék
00025 ; Az esetleges osztási túlcsordulást kilépéskor a C=1 feltétel jelzi
00026 div16_8: movf d,W ;túlcsordulás vizsgálat
00027 subwf p+1,W ;pH >= d?
00028 bc kilep ;ha C=1, akkor osztási túlcsordulás hiba!
00029 movlw 8
00030 movwf k ;a ciklusszámláló 8 legyen
00031 ciklus: movf d,W ;osztó elővétele
00032 bcf STATUS,C
00033 rlcf p
00034 rlcf p+1 ;balraforgatja az osztandót
00035 bc kivonas ;ha C=1, pd > d, tehát kivonás következhet
00036 subwf p+1 ;a parciális osztandó előállítása kivonással
00037 bc bit_egy ;ha C=1, pd>=d, a hányados következő bitjébe 1-et írunk!
00038 addwf p+1 ;ha C=0, akkor vissza kell csinálni a kivonást és át kell
00039 bra szamlal ;ugrani a hányados következő bitjének 1-be állításását!
00040 kivonas: subwf p+1 ;a parciális osztandó előállítása kivonással
00041 bit_egy: bsf p,0 ;a hányados soron következő bitjét '1'-be állítjuk
00042 szamlal: decfsz k ;a ciklusok visszaszámlálása
00043 bra ciklus ;újabb iteráció, ha k <> 0
00044 bcf STATUS,C ;nincs túlcsordulás, Carry törlése
00045 kilep: return
00046 END