Second Reality - source code
3/Aug 2013
Just a quick follow-up to my previous note. As mentioned by Michal, Future Crew guys decided to celebrate the 20th anniversary of Second Reality in the best way possible - they released a full source code. Obviously, it’s more of a tidbit than anything else, but it’s still interesting to finally see how certain effects were done. Apparently Fabian is already working on a code analysis article, but in the meantime I’ll only mention two things that caught my eye so far:
lots of auto generated code. They have small C programs generating assembly inner loops. Neat idea
loop unrolling galore. There’s a neat trick we’ve been using back in the 90s (no longer applicable with modern CPUs). In C/C++ terms it’s an extreme case of Duff’s device - instead of processing 4/8/16/xx, we unroll the whole loop. This means no need for loop counter manipulation and no need to update the data pointer. Example (Gouraud shader, AVIDFILL.ASM, line 458):
mov ax,cx
shl cx,3
sub ax,cx
;ax=-cx*7
add ax,OFFSET @@vdfg_fcode
mov bx,cs:vdfg_color2
sub bx,dx ;one extra
jmp ax
zzz=MAXCOLS
REPT MAXCOLS+1
add bx,dx ;2 bytes
mov cs:vdfg_buf[zzz],bh ;5 bytes
zzz=zzz-1
ENDM
mov ax,bx ;2 bytes, 1 clock (filler)
@@vdfg_fcode:
(REPT is a macro that’ll repeat code between REPT/ENDM specified number of times) As you can see, the only thing that’s modified in every “iteration” is the BX register, 2 instructions per loop (instead of 4+conditional jump). In order to find jump address we multiply number of pixels to fill (originally in CX) by 7 (bytes per “iteration”) then subtract it from the end address (so we go back “x” iterations).