Update README.
[pyrit.git] / pyrit.asm
index 603d8da..5b100c4 100644 (file)
--- a/pyrit.asm
+++ b/pyrit.asm
 ; In memory it looks like {Z X Y}, which saves a displacement byte.
 ; (u'v) is the dot product: ux*vx + uy*vy + uz*vz.
 
-org 100h ; assume al=0 bx=0 sp=di=-2 si=0100h bp=09??h
+        org 0x7c00
+        xor ax,ax
+        xor bx,bx
+        mov cx,0ffh
+        mov di,-2
+;        mov ss,dx
+        mov sp,di
+        mov si,100h
+        mov bp,091ch
+
+; assume al=0 bx=0 sp=di=-2 si=0100h bp=09??h
 
 ;Set video mode and earth+sky palette
   dec di       ; u16[100h] = -20401, u16[10Ch] = -30515
@@ -37,6 +47,23 @@ P:shr cl,1     ; B@cl = 0..8..31,31..0
 Q:mov ax,1010h
   jnz P        ;bx=0 cx=0
 
+        ; Constants expected at a fixed address below.
+        mov ax,0b04fh
+        mov word[100h],ax
+        mov ax,04f13h
+        mov word[102h],ax
+        mov ax,0e9d0h
+        mov word[104h],ax
+        mov ax,010cdh
+        mov word[106h],ax
+        mov ax,0be0fh
+        mov word[108h],ax
+        mov ax,030cbh
+        mov word[10ah],ax
+        mov ax,088cdh
+        mov word[10ch],ax
+        mov ax,089e9h
+        mov word[10eh],ax
 
 ;Each frame: Generate normals to p0..p11=[bp+200h,300h,...].
 M:mov ax,0x4731 ; highest 9 bits: float32 exponent 1/256 (for T)
@@ -76,7 +103,6 @@ Z:fld st1            ;|y x y z                     ;|x sy x cy z
   fmulp st4          ;|s y x cy z                  ;|s x sy cx cy z
   fmulp              ;|sy x cy z                   ;|sx sy cx cy z
   add al,0x7F ; loop 2x
-BIG equ $-1    ;=28799 (anything higher and you'll get overflow glitches)
   jo Z
   faddp st3          ;|sy cx cy+sx z
   fsubp              ;|new.z=cx-sy .x=cy+sx .y=z
@@ -88,7 +114,7 @@ S:fstp dword[bp+si] ;[bp+100]=.z [bp+104]=.x [bp+108]=.y
 
   popa
   loop G
-C:popa ;=16993, background color multiplier
+  popa
 
 ; the visible pixels are A0000..AF9FF, I want X=0 Y=0 in the center
 ;Each pixel: cx=T dx:bx=YX:XX(init=9fca:0) di=adr(init=-4)
@@ -102,8 +128,7 @@ X2:
   mov di,-4 ;di = address of pushed ax
 
 ;Compute ray direction.
-  fild word[byte BIG+si-100h]  ; store 28799 as a double, read as two floats
-C2 equ $-2 ;=20036, foreground color multiplier
+  fild word[BIG] ; store 28799 as a double, read as two floats
   fst qword[bx]     ; t_front@float[bx] = 0, t_back@float[bx+4] = 6.879
   fild word[di+4-9]
   fild word[di+4-8]  ;|y=Y x=X z=BIG
@@ -209,7 +234,7 @@ Y:fld dword[bx+di]   ;|(rd'pf) rd.y .x .z  ; reads pf->dot_rd
 B:
 ; Subtle highlight on the pyrite.
   fld st0
-  fimul word[byte C+si-100h]  ; 16993 (background) or 20036 (pyrit)
+  fimul word[C]  ; 16993 (background) or 20036 (pyrit)
   fistp dword[di]     ;|y x z
   sar dword[di],22    ; if y>=-0.5 { chessboard } else { sky }
   js E             ; the sky is just y (= y^2 after gamma)
@@ -242,3 +267,10 @@ B:
   mov [di],ah     ; pushed al = tex*y
 
 E:ret
+
+BIG     dw 28799
+C       dw 16993
+C2      dw 20036
+
+        times 510-($-$$) db 0
+        db 0x55,0xaa