8-bit Divide: Difference between revisions

From NESdev Wiki
Jump to navigationJump to search
m (lockup > lookup)
m (spell check)
Line 7: Line 7:
;Output with YA = (1/256)*(A/Y)
;Output with YA = (1/256)*(A/Y)
Division
Division
sta Dvd ;Stores divident
sta Dvd ;Stores dividend
sty Dvs ;Stores divisor
sty Dvs ;Stores divisor
lda #$00
lda #$00
Line 17: Line 17:
cmp Dvs ;Check if fractional dividend is greater than divisor
cmp Dvs ;Check if fractional dividend is greater than divisor
bcc +
bcc +
sbc Dvs ;Substract (C is always set)
sbc Dvs ;Subtract (C is always set)
+ rol Res ;Shift result (1 if substation was done, 0 otherwise)
+ rol Res ;Shift result (1 if subtraction was done, 0 otherwise)
rol Res2
rol Res2
dey
dey

Revision as of 18:48, 9 October 2014

The following code divide two 8-bit integers (range 0...255) and outputs a 16-bit result using only real calculation, no lookup table so the size of the code is very small.

;8-bit divide
;by Bregalad
;Enter with A = Dividend, Y=Divisor
;Output with YA = (1/256)*(A/Y)
Division
	sta Dvd		;Stores dividend
	sty Dvs		;Stores divisor
	lda #$00
	sta Res		;Clear result

	ldy #$10	;The loop is for 16-bit result
-	asl Dvd
	rol A		;Shift divisor in 1 bit
	cmp Dvs		;Check if fractional dividend is greater than divisor
	bcc +
	sbc Dvs 	;Subtract (C is always set)
+	rol Res		;Shift result (1 if subtraction was done, 0 otherwise)
	rol Res2
	dey
	bne -
	lda Res
	ldy Res2
	rts