Second Reality - source code

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
	add	ax,OFFSET @@vdfg_fcode
	mov	bx,cs:vdfg_color2
	sub	bx,dx ;one extra
	jmp	ax

	add	bx,dx			;2 bytes
	mov	cs:vdfg_buf[zzz],bh	;5 bytes
	mov ax,bx			;2 bytes, 1 clock (filler)

(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).