#include "p18cxxx.inc"
;--- Példaprogram az előjel nélküli 32/8 bites számok osztására
         udata_acs          
p         res     4            ; ez a 32 bites osztandó
d         res     1            ; ez a 8 bites osztó
r         res     1            ; ez a 8 bites maradék és a kiegésztítő bájt
k         res     1            ; ciklusszámláló

RST      CODE      
          goto    start
;--- Példa: p = 0x1138E390 (288 940 944), d = 0x7D (125)
; A helyes eredmény: p/d hányadosa = 0x234567 (2 311 527), a maradék = 0x45 (69)
PGM      CODE
start:    movlw   0x90
          movwf   p
          movlw   0xe3
          movwf   p+1
          movlw   0x38
          movwf   p+2
          movlw   0x11
          movwf   p+3
          movlw   0x7d
          movwf   d
          call    div32_8
          nop
          goto    $-2

;--- div32_8: 32 bites szám osztása 8 bitessel ------
;    A kód Daniel R. Madill, Quanser Consulting Inc.
;    FXD3232U (32 bites előjel nélküli számok osztása) eljárásának
;    egyszerűsített változata. (forrás: MCC18 Library source)
;  
;    Belépéskor p az osztandó, d az osztó
;    Kilépéskor p a hányados, r pedig a maradék 
div32_8:
;----- R = 0  
		clrf	r		;maradék nullázása
;----- K = 32
    	movlw 0x20
		movwf k			;ciklusváltozó beállítása
;----- CARRY törlése
		bcf STATUS, C
ciklus:
;----- p <<= 1       A CARRY bit mindig nulla ezen a ponton
		rlcf 	p
		rlcf 	p+1
		rlcf 	p+2
		rlcf 	p+3

;----- R = (R << 1) | (P >> 32)
		rlcf	r
;----- if (R >= D)
		bc		nagyobb	;ha C=1, akkor R > D 
		movf	d,W
		subwf	r,W
		bnc 	kisebb	;ha C=0, akkor R < D
;----- R -= D
nagyobb:
		movf	d,W
		subwf	r		; R -= D
;----- p++
; Mivel előzőleg p-t balra léptettük, az inkrementálás csak a legalsó bitet 
; állítja 0-ból 1-be. A CARRY bit pedig nulla lesz.
	    incf 	p		;a hányados soron következő bitjét 1-be állítjuk
kisebb:
		decfsz	k		;ciklusváltozó csökkentése
		bra 	ciklus
kilep:	return
		END