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