pheesukx by b-state
; pheesukx - 250b shitro by wbcbz7 13.o5.2o17 - qbparty2017
; definitely last place intro :)
; coded in 3-4 hours tyring to make a freedir tunnel but completely failed
; so adding some cancered palette should save it :)
; breaking <10fps limit even under vmware (not counting real HW such as cel300a :D)
format binary
org 0x100
; vars
xres = 320
yres = 160
tunsize equ 40000.0f ; squared
start:
mov al, 0x13 ; ax = 0 at startup
int 0x10
mov bh, 0x80
mov ds, bx ; texture offset
mov es, bx ; and once again
mov gs, bx ; and once again
mov dx, 0x3C8
xchg cl, ch
xor ax, ax
out dx, al
inc dx
inc cx
.palloop:
mov al, cl
out dx, al
shr al, 1
out dx, al
add al, cl
shr al, 2
out dx, al
inc cx
jnz .palloop
; silly XOR pattern :)
; cx = 0 at end
.texloop:
in al, 0x40
sar al, 5
add al, cl
or al, ch
xor al, cl
stosb
loop .texloop
mov cx, 0xA190
mov es, cx ; setup video segment
push cs
pop ds
; main loop
xor bp, bp
mainloop:
xor di, di
; no wait for retrace this time
mov dx, yres
.y_loop:
mov cx, xres
.x_loop:
mov ax, dx
sub ax, yres/2
mov [tmp], ax
fild word [tmp]
fmul dword [_1fov] ; diry
fst st2 ; diry ? diry
fmul st0, st0 ; diry^2 ? diry
mov ax, cx
sub ax, xres/2
mov [tmp], ax
fild word [tmp]
fmul dword [_1fov] ; dirx diry^2 ? diry
fst st2 ; dirx diry^2 dirx diry
; normalizing
fmul st0, st0 ; dirx^2 diry^2 dirx diry
faddp st1, st0 ; dirx^2+diry^2 dirx diry
fld1 ; 1.0f dirx^2+diry^2 dirx diry
faddp st1, st0 ; dirx^2+diry^2+1.0f dirx diry
fsqrt ; sqrt(dirx^2+diry^2+1.0f)=l dirx diry
fdiv st2, st0
fdiv st1, st0
fld1
fdivrp st1, st0 ; 1/l diry/l dirx/l
; insert rotation here
fxch st1
fld st1 ; dir.y dir.x dir.y dir.z
fld st1 ; dir.x dir.y dir.x dir.y dir.z
mov [tmp], bp
fild word [tmp]
fdiv dword [sc256]
fsincos ; sin(bp) cos(bp) dir.x dir.y dir.x dir.y dir.z
fxch st1
fmul st2, st0
fmulp st5, st0 ; cos(bp) dir.x dir.y dir.x dir.y dir.z
fmul st2, st0
fmulp st3, st0 ; dir.x dir.y dir.x dir.y dir.z
faddp st2, st0 ; dir.y dir.x dir.y+dir.x dir.z
fsubp st2, st0
fxch st1
; calculate a
fld st2
fmul st0, st0
fld st2 ; dir.y dir.x dir.z dir.y dir.x
fmul st0, st0 ; dir.y^2 dir.x^2 dir.z dir.y dir.x
faddp st1, st0 ; dir.y^2+dir.x^2=a dir.z dir.y dir.x
; calculate delta
fld dword [tunsz] ; c a dir.z dir.y dir.x
;fmul dword [_2]
;fmul dword [_2]
; hahahahaha!
; as we know, common discriminant formaula suggests us to
; do multiplies by 2, 4 and other shit. but did it really needed? :)
fmul st0, st1 ; 4*a*c a dir.z dir.y dir.x
fsqrt ; sqrt(4*a*c)=delta a dir.z dir.y dir.x
; calculate t
fdivrp st1, st0
;fdiv dword [_2] ; 0.5*delta/a=t dir.z dir.y dir.x
; lerp
fmul st3, st0 ; t dir.z dir.y dir.x*t
fmul st2, st0 ; t dir.z dir.y*t dir.x*t
fmulp st1, st0 ; dir.z*t dir.y*t dir.x*t
; calculate u
fistp word [tmp] ; i.y i.x
mov bl, byte [tmp]
add bx, bp
; calculate v
fpatan
fmul dword [sc256]
fistp word [tmp]
mov bh, byte [tmp]
mov al, [gs:bx]
stosb
dec cx
jnz .x_loop
dec dx
jnz .y_loop
inc bp
; kbhit()
mov ah, 1
int 0x16
jz mainloop
; end :)
ret
vars:
;fov equ 100.0f ; field of view
; fckin fasm is unable to calculate floating point expressions >_<
_2 dd 2.0f
_1fov dd 0.01f ; 1/fov
sc256 dd 162.97f ; something like 2*256.0f/pi
tunsz dd tunsize
; unintialized data
tmp dw ?
[ back to the prod ]
