## How does the division approximation function work?

Graphic based area of development (Graphics Processing Unit), including the Geometry Transform Engine (GTE), TIM, STR (MDEC), etc.
reset
What is PSXDEV? Posts: 1
Joined: January 22nd, 2017, 8:53 am

### How does the division approximation function work?

Greetings,

Working on a game with a software renderer to get the most accurate PS1 look. As I was doing research on how the PS1 graphics/rendering system worked, reason for the wobbly vertices etc, I came across some documentation regarding the way they did their divide. Here is the link to it: http://problemkaputt.de/psx-spx.htm#gteoverview (Check the " GTE Division Inaccuracy" section)

I will post the code here:

Code: Select all

``````  if (H < SZ3*2) then                            ;check if overflow
z = count_leading_zeroes(SZ3)                ;z=0..0Fh (for 16bit SZ3)
n = (H SHL z)                                ;n=0..7FFF8000h
d = (SZ3 SHL z)                              ;d=8000h..FFFFh
u = unr_table[(d-7FC0h) SHR 7] + 101h        ;u=200h..101h
d = ((2000080h - (d * u)) SHR 8)             ;d=10000h..0FF01h
d = ((0000080h + (d * u)) SHR 8)             ;d=20000h..10000h
n = min(1FFFFh, (((n*d) + 8000h) SHR 16))    ;n=0..1FFFFh
else n = 1FFFFh, FLAG.Bit17=1, FLAG.Bit31=1    ;n=1FFFFh plus overflow flag

``````
I'm having a hard time understanding how this works, what is this 'unr' table? why are we shifting things?
If someone could give a more detailed explanation as to how this thing is actually achieving the divide, it would be appreciated.

Many thanks
-reset

### Who is online

Users browsing this forum: No registered users and 2 guests