; ; Fisheye Raycasting Engine Etc. FREE3D for MENUETOS by Dieter Marfurt ; Version 0.4 (requires some texture-files to compile (see Data Section)) ; dietermarfurt@angelfire.com - www.melog.ch/mos_pub/ ; Don't hit me - I'm an ASM-Newbie... since years :) ; ; Compile with FASM for Menuet (requires .INC files - see DATA Section) ; ; Willow - greatly srinked code size by using GIF texture and FPU to calculate sine table ; ; !!!! Don't use GIF_LITE.INC in your apps - it's modified for FREE3D !!!! ; ; Heavyiron - new 0-function of drawing window from kolibri (do not work correctly with menuet) TEX_SIZE equ 64*64*4 ceil = sinus+16*1024 wall = ceil+TEX_SIZE*1 wall2 = ceil+TEX_SIZE*2 wall3 = ceil+TEX_SIZE*3 wall4 = ceil+TEX_SIZE*4 wall5 = ceil+TEX_SIZE*5 wall6 = ceil+TEX_SIZE*6 wall7 = ceil+TEX_SIZE*7 APP_MEM equ 0x200000 use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd I_END ; size of image dd APP_MEM;0x100000 ; memory for app dd APP_MEM;0x100000 ; esp dd 0x0 , 0x0 ; I_Param , I_Icon include 'lang.inc' include '..\..\..\macros.inc' COLOR_ORDER equ OTHER include 'gif_lite.inc' START: ; start of execution mov esi,textures mov edi,ceil-8 call ReadGIF mov esi,sinus mov ecx,360*10 fninit fld [sindegree] .sinlp: fst st1 fsin fmul [sindiv] fistp dword[esi] add esi,4 fadd [sininc] loop .sinlp call draw_window ; at first, draw the window call draw_stuff gamestart: ; ******* MOUSE CHECK ******* ; mov eax,37 ; check mouse (use mouse over window to navigate) ; mov ebx,2 ; check mousebuttons ; mcall ; cmp eax,0 ; only use mouse when button down ; je noneed ; deactivated cause of disappear-bug etc. mov eax,37 mov ebx,1 ; check mouseposition mcall mov ebx,eax shr eax,16 and eax,0x0000FFFF ; mousex and ebx,0x0000FFFF ; mousey cmp eax,5 ; mouse out of window ? jb check_refresh ; it will prevent an app-crash cmp ebx,22 jb check_refresh cmp eax, 640 jg check_refresh cmp ebx,501 jg check_refresh cmp eax,315 ; navigating? jb m_left cmp eax,325 ; jg m_right continue: cmp ebx,220 ; jb s_up cmp ebx,260 ; jg s_down ; ******* END OF MOUSE CHECK ******* check_refresh: ; mov eax,23 ; wait for system event with 10 ms timeout ; mov ebx,1 ; thats max 100 FPS mov eax,11 ; ask no wait for full speed mcall cmp eax,1 ; window redraw request ? je red2 cmp eax,2 ; key in buffer ? je key2 cmp eax,3 ; button in buffer ? je button2 mov edi,[mouseya] ; check flag if a refresh has to be done cmp edi,1 jne gamestart mov [mouseya],dword 0 call draw_stuff jmp gamestart ; END OF MAINLOOP red2: ; redraw call draw_window call draw_stuff jmp gamestart key2: ; key mov eax,2 mcall cmp al,1 je gamestart ; keybuffer empty cmp ah,27 ; esc=End App je finish cmp ah,178 ; up je s_up cmp ah,177 ; down je s_down cmp ah,176 ; left je s_left cmp ah,179 ; right je s_right jmp gamestart ; was any other key s_up: ; walk forward (key or mouse) mov eax,[vpx] mov ebx,[vpy] mov ecx,[vheading] mov edi,[sinus+ecx*4] mov edx,[vheading] ; imul edx,4 ; add edx,sinus ; add edx,3600 lea edx, [sinus+3600+edx*4] cmp edx,eosinus ;cosinus taken from (sinus plus 900) mod 3600 jb ok200 sub edx,14400 ok200: mov esi,[edx] ; sal esi,1 ; edit walking speed here ; sal edi,1 add eax,edi ; newPx add ebx,esi ; newPy mov edi,eax ; newPx / ffff mov esi,ebx ; newPy / ffff sar edi,16 sar esi,16 mov ecx,esi sal ecx,5 ; equal *32 ; add ecx,edi ; add ecx,grid lea ecx, [grid+ecx+edi] cmp [ecx],byte 0 ; collision check jne cannotwalk0 mov [vpx],eax mov [vpy],ebx mov [mouseya],dword 1 ; set refresh flag cannotwalk0: jmp check_refresh s_down: ; walk backward mov eax,[vpx] mov ebx,[vpy] mov ecx,[vheading] mov edi,[sinus+ecx*4] mov edx,[vheading] ; imul edx,4 ; add edx,sinus ; add edx,3600 lea edx, [sinus+3600+edx*4] cmp edx,eosinus ;cosinus taken from (sinus plus 900) mod 3600 jb ok201 sub edx,14400 ok201: mov esi,[edx] ; sal esi,1 ; edit walking speed here ; sal edi,1 sub eax,edi ; newPx sub ebx,esi ; newPy mov edi,eax ; newPx / ffff mov esi,ebx ; newPy / ffff sar edi,16 sar esi,16 mov ecx,esi sal ecx,5 ; add ecx,edi ; add ecx,grid lea ecx, [grid+ecx+edi] cmp [ecx],byte 0 jne cannotwalk1 mov [vpx],eax mov [vpy],ebx mov [mouseya],dword 1 cannotwalk1: jmp check_refresh s_left: ; turn left (key) mov edi,[vheading] ; heading add edi,50 cmp edi,3600 jb ok_heading0 sub edi,3600 ok_heading0: mov [vheading],edi mov [mouseya],dword 1 jmp check_refresh s_right: ; turn right mov edi,[vheading] sub edi,50 cmp edi,-1 jg ok_heading1 add edi,3600 ok_heading1: mov [vheading],edi mov [mouseya],dword 1 jmp check_refresh m_left: ; turn left (mouse) mov edi,[vheading] ; heading mov ecx,315 sub ecx,eax sar ecx,2 add edi,ecx cmp edi,3600 jb ok_heading2 sub edi,3600 ok_heading2: mov [vheading],edi mov [mouseya],dword 1 jmp continue ; allow both: walk and rotate m_right: ; turn right mov edi,[vheading] sub eax,325 sar eax,2 sub edi,eax cmp edi,-1 jg ok_heading3 add edi,3600 ok_heading3: mov [vheading],edi mov [mouseya],dword 1 jmp continue button2: ; button mov eax,17 ; get id mcall cmp ah,1 ; button id=1 ? jne gamestart ; eo GAME mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm finish: mov eax,-1 ; close this program mcall ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* draw_window: mcall 12,1 mcall 48, 4 ;get skin width lea ecx, [50*65536+484+eax] ;[y start] *65536 + [y size] + [skin_height] mcall 0,<50,649>,,0x74ffffff,,title ;draw window mcall 12,2 ret ; ********************************************* ; ******* COMPUTE 3D-VIEW ******** ; ********************************************* draw_stuff: mov [step1],dword 1 ;mov [step64],dword 64 mov esi,[vheading] add esi,320 mov [va],esi mov eax,[vheading] sub eax,320 mov [vacompare],eax ;------------------------------------ CAST 640 PIXEL COLUMNS --------------- ; FOR A=320+heading to -319+heading step -1 (a is stored in [va]) ;--------------------------------------------------------------------------- ; mov edx,5 mov [vx1],dword 0 ;5 ;edx ; init x1 ... pixelcolumn for_a: mov edx,[vx1] mov [vx1b],edx sub [vx1b],dword 320 mov edx,[va] ; a2 cmp edx,-1 ; a2 is a mod 3600 jg ok1 add edx,3600 ok1: cmp edx,3600 jb ok2 sub edx,3600 ok2: ; get stepx and stepy ; mov ecx,edx ; imul ecx,4 ; add ecx,sinus ; pointer to stepx lea ecx, [sinus+edx*4] mov esi,[ecx] sar esi,4 ; accuracy mov [vstepx],esi ; store stepx ; mov esi,edx ; imul esi,4 ; add esi,sinus ; pointer to stepy ; add esi,3600 lea esi, [sinus+3600+edx*4] cmp esi,eosinus ;cosinus taken from ((sinus plus 900) mod 3600) jb ok202 sub esi,14400 ok202: mov ecx,[esi] sar ecx,4 mov [vstepy],ecx ; store stepy mov eax,[vpx] ; get Camera Position mov ebx,[vpy] mov [vxx],eax ; init caster position mov [vyy],ebx mov edi,0 ; init L (number of raycsting-steps) mov [step1],dword 1 ; init Caster stepwidth for L ; raycast a pixel column................................. raycast: add edi,[step1] ; count caster steps ;jmp nodouble ; use this to prevent blinking/wobbling textures: much slower! cmp edi,32 je double cmp edi,512 je double cmp edi,1024 je double jmp nodouble double: mov edx,[step1] sal edx,1 mov [step1],edx mov edx,[vstepx] sal edx,1 mov [vstepx],edx mov edx,[vstepy] sal edx,1 mov [vstepy],edx nodouble: mov eax,32000 ; 3600 ; determine Floors Height based on distance mov edx,0 mov ebx,edi div ebx mov esi,eax mov [vdd],esi mov edx,260 sub edx,esi mov [vh],edx cmp edx,22 jb no_nu_pixel cmp edx,259 jg no_nu_pixel ; draw only new pixels cmp edx,[h_old] je no_nu_pixel mov eax,[vxx] ; calc floor pixel mov ebx,[vyy] and eax,0x0000FFFF and ebx,0x0000FFFF shr eax,10 shr ebx,10 ; pixel coords inside Texture x,y 64*64 mov [xfrac],eax mov [yfrac],ebx ; plot floor pixel !!!! mov [vl],edi ; save L mov [ytemp],esi ; remember L bzw. H mov edi,[yfrac] ; get pixel color of this floor pixel sal edi,8 mov esi,[xfrac] sal esi,2 ; add edi,esi ; add edi,wall ; in fact its floor, just using the wall texture :) lea edi, [wall+edi+esi] mov edx,[edi] mov [remesi],esi ;**** calculate pixel adress:**** mov esi,[ytemp] add esi,240 imul esi,1920 ; add esi,[vx1] ; add esi,[vx1] ; add esi,[vx1] ; add esi,0x80000 mov eax, [vx1] lea eax, [eax+eax*2] lea esi, [0x80000+eax+esi] cmp esi,0x80000+1920*480 jg foff0 cmp esi,0x80000 jb foff0 ; now we have the adress of the floor-pixel color in edi ; and the adress of the pixel in the image in esi mov edx,[edi] ;******************** custom distance DARKEN Floor mov eax,[vdd] ; jmp nodark0 ; use this to deactivate darkening floor (a bit faster) cmp eax,80 jg nodark0 ; split rgb mov [blue],edx and [blue],dword 255 shr edx,8 mov [green],edx and [green],dword 255 shr edx,8 mov [red],edx and [red],dword 255 mov eax,81 ; darkness parameter sub eax,[vdd] sal eax,1 ; reduce rgb sub [red],eax cmp [red], dword 0 jg notblack10 mov [red],dword 0 notblack10: sub [green],eax cmp [green],dword 0 jg notblack20 mov [green],dword 0 notblack20: mov edx,[blue] sub [blue],eax cmp [blue],dword 0 jg notblack30 mov [blue],dword 0 notblack30: shl dword [red],16 ; reassemble rgb shl dword [green],8 mov edx,[red] or edx,[green] or edx,[blue] nodark0: ; eo custom darken floor mov eax,edx mov [esi],eax ; actually draw the floor pixel ; paint "forgotten" pixels mov edx,[lasty] sub edx,1920 cmp esi,edx je foff0 mov [esi+1920],eax sub edx,1920 cmp esi,edx je foff0 mov [edx+1920],eax sub edx,1920 cmp esi,edx je foff0 mov [edx+1920],eax foff0: mov [lasty],esi ;**** end of draw floor pixel **** mov esi,[remesi] mov edi,[vl] ; restore L no_nu_pixel: mov esi,[vh] mov [h_old],esi mov eax,[vxx] mov ebx,[vyy] add eax,[vstepx] ; casting... add ebx,[vstepy] mov [vxx],eax mov [vyy],ebx sar eax,16 sar ebx,16 mov [vpxi],eax ; casters position in Map Grid mov [vpyi],ebx mov edx,ebx ; imul edx,32 shl edx,5 ; add edx,grid ; add edx,eax lea edx, [grid+edx+eax] cmp [edx],byte 0 ; raycaster reached a wall? (0=no) jne getout cmp edi,10000 ; limit view range jb raycast ;................................................ getout: mov eax,[edx] ; store Grid Wall Value for Texture Selection mov [vk],eax call blur ; deactivate this (blurs the near floor) : a bit faster ; simply copy floor to ceil pixel column here ;jmp nocopy ; use this for test purposes pusha mov eax,0x80000+1920*240 mov ebx,0x80000+1920*240 copyfloor: sub eax,1920 add ebx,1920 ; mov ecx,0 ; add ecx,[vx1] ; add ecx,[vx1] ; add ecx,[vx1] mov ecx, [vx1] lea ecx, [ecx+ecx*2] ; mov edx,ecx ; add ecx,eax ; add edx,ebx lea edx, [ecx+ebx] add ecx,eax mov esi,[edx] mov [ecx],esi cmp eax,0x80000 jg copyfloor popa ; *** end of copy floor to ceil ;nocopy: ;__________________________________________________________________________ ; draw this pixelrows wall mov [vl],edi mov edi,260 sub edi,[vdd] cmp edi,0 jg ok3 xor edi,edi ok3: mov [vbottom],edi ; end wall ceil (or window top) mov esi,262 add esi,[vdd] ; start wall floor xor edi,edi ; somethin is wrong with xfrac,so recalc... mov eax,[vxx] and eax,0x0000FFFF shr eax,10 mov [xfrac],eax mov eax,[vyy] and eax,0x0000FFFF shr eax,10 mov [yfrac],eax pixelrow: ; find each pixels color: add edi,64 sub esi,1 cmp esi, 502 ; dont calc offscreen-pixels jg speedup xor edx,edx mov eax, edi mov ebx,[vdd] ; add ebx,[vdd] add ebx, ebx div ebx and eax,63 mov [ytemp],eax ; get y of texture for wall mov eax,[xfrac] add eax,[yfrac] and eax,63 mov [xtemp],eax ; get x of texture for wall ; now prepare to plot that wall-pixel... mov [remedi],edi mov edi,[ytemp] sal edi,8 mov edx,[xtemp] sal edx,2 add edi,edx mov eax,[vk] ; determine which texture should be used and eax,255 cmp eax,1 jne checkmore1 add edi,ceil jmp foundtex checkmore1: cmp eax,2 jne checkmore2 add edi,wall jmp foundtex checkmore2: cmp eax,3 jne checkmore3 add edi,wall2 jmp foundtex checkmore3: cmp eax,4 jne checkmore4 add edi,wall3 jmp foundtex checkmore4: cmp eax,5 jne checkmore5 add edi,wall4 jmp foundtex checkmore5: cmp eax,6 jne checkmore6 add edi,wall5 jmp foundtex checkmore6: cmp eax,7 jne checkmore7 add edi,wall6 jmp foundtex checkmore7: cmp eax,8 jne checkmore8 add edi,wall7 jmp foundtex checkmore8: foundtex: mov edx,[edi] ; get pixel color inside texture ; ***pseudoshade south-west jmp east ; activate this for southwest pseudoshade : a bit slower + blink-bug mov edi,[yfrac] mov [pseudo],dword 0 ; store flag for custom distance darkening cmp edi,[xfrac] jge east and edx,0x00FEFEFE shr edx,1 mov [pseudo],dword 1 east: call dark_distance ; deactivate wall distance darkening: a bit faster ; ******* DRAW WALL PIXEL ******* mov eax,esi ; sub eax,22 lea eax, [esi-22] imul eax,1920 ; add eax,[vx1] ; add eax,[vx1] ; add eax,[vx1] ; add eax,0x80000 mov ebx, [vx1] lea ebx, [ebx+ebx*2] lea eax, [eax+0x80000+ebx] cmp eax,0x80000+1920*480 jg dont_draw cmp eax,0x80000 jb dont_draw mov [eax],edx ; actually set the pixel in the image ; *** eo draw wall pixel dont_draw: mov edi,[remedi] speedup: cmp esi,[vbottom] ; end of this column? jg pixelrow mov edi,[vl] ; restoring mov eax,[vx1] ; inc X1 add eax,1 mov [vx1],eax ;*** NEXT A *** mov esi,[va] sub esi,1 mov [va],esi cmp esi,[vacompare] jg for_a ;*** EO NEXT A *** ;--------------------------------------------------------------------------- ; **** put image !!!!!**** ; *********************** mov eax,7 mov ebx,0x80000 mov ecx,640*65536+480 xor edx,edx mcall ret blur: pusha mov eax,0x080000+360*1920 copyfloor2: add eax,1920 ; mov ebx,eax ; add ebx,[vx1] ; add ebx,[vx1] ; add ebx,[vx1] mov ebx,[vx1] lea ebx, [ebx+ebx*2] add ebx, eax mov ecx,[ebx-15] and ecx,0x00FEFEFE shr ecx,1 mov edx,[ebx-12] and edx,0x00FEFEFE shr edx,1 add edx,ecx and edx,0x00FEFEFE shr edx,1 mov ecx,[ebx-9] and ecx,0x00FEFEFE shr ecx,1 add edx,ecx and edx,0x00FEFEFE shr edx,1 mov ecx,[ebx-6] and ecx,0x00FEFEFE shr ecx,1 add edx,ecx and edx,0x00FEFEFE shr edx,1 mov ecx,[ebx-3] and ecx,0x00FEFEFE shr ecx,1 add edx,ecx and edx,0x00FEFEFE shr edx,1 mov ecx,[ebx] and ecx,0x00FEFEFE shr ecx,1 add edx,ecx mov [ebx],edx cmp eax,0x80000+478*1920 jb copyfloor2 popa ret ; ******* Darken by Distance ******* dark_distance: ; color must be in edx, wall height in [vdd] mov eax,[vdd] cmp eax,50 jg nodark ; split rgb mov [blue],edx and [blue],dword 255 shr edx,8 mov [green],edx and [green],dword 255 shr edx,8 mov [red],edx and [red],dword 255 mov eax,51 ; darkness parameter sub eax,[vdd] cmp [pseudo],dword 1 je isdarkside sal eax,2 isdarkside: ; reduce rgb sub [red],eax cmp [red], dword 0 jg notblack10b mov [red],dword 0 notblack10b: sub [green],eax cmp [green],dword 0 jg notblack20b mov [green],dword 0 notblack20b: mov edx,[blue] sub [blue],eax cmp [blue],dword 0 jg notblack30b mov [blue],dword 0 notblack30b: shl dword [red],16 ; reassemble rgb shl dword [green],8 mov edx,[red] or edx,[green] or edx,[blue] mov eax,edx nodark: ret ; DATA AREA ;ceil=ceil ;wall=wall floor ;2 corner stone ;3 leaf mosaic ;4 closed window ;5 greek mosaic ;6 old street stones ;7 maya wall grid: ; 32*32 Blocks, Map: 0 = Air, 1 to 8 = Wall db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8 db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,8,8 db 5,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8 db 1,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,1,0,0,0,0,3,3,3,3,0,0,0,0,0,0,8 db 5,0,1,2,3,4,5,6,7,8,2,1,3,3,3,0,5,0,2,1,2,3,0,0,0,0,0,0,0,0,0,8 db 1,0,0,0,0,0,0,0,0,0,2,3,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8 db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,5,0,0,0,0,3,3,0,3,3,0,0,0,0,0,8 db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,5,2,1,2,0,3,0,0,0,3,0,0,0,0,0,8 db 5,0,0,0,1,0,0,0,0,0,0,1,0,3,3,3,5,0,0,0,0,3,0,0,0,3,0,0,0,0,0,8 db 1,0,0,0,1,0,0,5,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,3,0,0,0,0,0,8 db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,5,0,0,0,0,3,0,0,0,0,0,0,0,0,0,8 db 1,4,4,4,4,4,4,4,4,4,4,3,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,8,8 db 2,2,2,2,2,2,8,8,8,8,8,8,8,8,8,0,0,0,6,6,0,7,7,7,7,7,7,7,7,7,8,8 db 1,0,0,0,1,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1 db 5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,2,2,2,2,0,0,0,0,3,3,3,3,3,1 db 1,0,0,0,1,0,0,1,0,0,0,0,0,0,0,0,6,0,0,0,0,2,0,0,0,0,3,0,0,0,0,1 db 5,0,2,3,2,3,2,3,2,3,2,1,0,0,0,0,6,0,2,2,0,2,0,0,0,0,3,0,5,5,0,1 db 1,0,0,0,0,0,0,4,0,0,0,3,0,0,0,0,6,0,0,2,0,2,0,2,0,0,3,0,0,0,0,1 db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,2,2,2,0,2,0,0,3,3,3,3,0,1 db 1,1,0,1,1,1,1,4,1,0,1,3,7,7,7,0,6,0,0,0,0,0,0,2,0,0,0,0,0,3,0,1 db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,0,0,2,2,2,0,0,0,0,0,3,0,1 db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,0,0,0,0,2,0,0,0,0,0,0,0,0,0,1 db 5,0,0,0,0,0,0,5,0,0,0,1,0,0,0,0,6,0,5,1,0,2,0,0,4,4,0,4,4,0,0,1 db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,6,0,0,5,0,2,0,0,0,4,0,4,0,0,0,1 db 1,0,0,0,0,0,0,4,0,0,0,3,0,3,3,3,6,0,0,1,0,1,0,0,4,4,0,4,4,0,0,1 db 5,0,0,0,1,0,0,4,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,4,0,0,0,4,4,0,1 db 1,1,0,1,1,1,1,4,1,0,1,3,0,0,0,0,6,0,0,1,0,1,0,4,0,0,0,0,0,4,0,1 db 5,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,6,0,0,5,0,1,0,4,0,0,0,0,0,4,0,1 db 1,0,0,0,1,0,0,5,0,0,0,3,0,0,0,0,6,1,5,1,0,1,0,4,4,0,0,0,4,4,0,1 db 5,0,0,0,0,0,0,5,0,0,0,0,0,0,1,1,0,0,0,0,0,1,0,0,4,4,4,4,4,0,0,1 db 1,4,1,4,1,4,1,4,1,4,1,3,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,1 db 2,1,2,1,2,1,2,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 vpx: dd 0x0001FFFF ; initial player position * 0xFFFF vpy: dd 0x0001FFFF title db 'FISHEYE RAYCASTING ENGINE ETC. FREE3D',0 sindegree dd 0.0 sininc dd 0.0017453292519943295769236907684886 sindiv dd 6553.5 textures: file 'texture.gif' align 4 col1: dd ?;- ; misc raycaster vars: vxx: dd ?;- vyy: dd ?;- vl: dd ?;- vstepx: dd ?;- vstepy: dd ?;- vxxint: dd ?;- vyyint: dd ?;- vk: dd ?;- va: dd ?;- va2: dd ?;- vdd: dd ?;- vx1: dd ?;- vx1b: dd ?;- vh: dd ?;- vdt: dd ?;- vheading: ; initial heading: 0 to 3599 dd ?;- vacompare: dd ?;- vpxi: dd ?;- vpyi: dd ?;- wtolong: dw ?,?;-,?;- xtemp: dd ?;- ytemp: dd ?;- xfrac: dd ?;- yfrac: dd ?;- h_old: dd ?;- vbottom: dd ?;- mouseya: dd ?;- remeax: dd ?;- remebx: dd ?;- remecx: dd ?;- remedx: dd ?;- remedi: dd ?;- remesi: dd ?;- red: dd ?;- green: dd ?;- blue: dd ?;- pseudo: dd ?;- step1: dd ?;- step64: dd ?;- lasty: dd ?;- I_END: IncludeUGlobals sinus rd 360*10 eosinus: