;--------------------------------------------------------------------- ; Free3D version 0.5 ; ; last update: 20/02/2011 ; written by: Marat Zakiyanov aka Mario79, aka Mario ; changes: PNG textures 128x128 ; using libraries cnv_png.obj and archiver.obj ; using dinamically allocation of memory ; ;--------------------------------------------------------------------- ; ; 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 128*128*4 ;64*64*4 ; ICON_SIZE_X equ 128 ;64 ICON_SIZE_Y equ 128 ;64 Floors_Height equ 32000 ;ceil = sinus+TEX_SIZE ;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 0x400000 ;--------------------------------------------------------------------- use32 org 0x0 db 'MENUET01' ; 8 byte id dd 0x01 ; header version dd START ; start of code dd IM_END ; size of image dd I_END ; 0x100000 ; memory for app dd stacktop ; 0x100000 ; esp dd 0x0 dd path ;--------------------------------------------------------------------- include '..\..\..\macros.inc' ;include 'macros.inc' include '../../../develop/libraries/box_lib/load_lib.mac' ;include 'load_lib.mac' @use_library ;COLOR_ORDER equ OTHER ;include 'gif_lite.inc' ;--------------------------------------------------------------------- START: ; start of execution mcall 68,11 load_libraries l_libs_start,end_l_libs test eax,eax jnz finish ; unpack deflate mov eax,[unpack_DeflateUnpack2] mov [deflate_unpack],eax call load_icons call convert_icons 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 ;-------------------------------------- align 4 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. mcall 37,1 ; check mouseposition 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 ******* align 4 check_refresh: ; mov eax,23 ; wait for system event with 10 ms timeout ; mov ebx,1 ; thats max 100 FPS mcall 11 ; ask no wait for full speed 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 ;--------------------------------------------------------------------- align 4 red2: ; redraw call draw_window call draw_stuff jmp gamestart ;--------------------------------------------------------------------- align 4 key2: ; key mcall 2 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 ;--------------------------------------------------------------------- align 4 s_up: ; walk forward (key or mouse) mov eax,[vpx] mov ebx,[vpy] mov ecx,[vheading] mov edi,[sinus+ecx*4] mov edx,[vheading] 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 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 ;--------------------------------------------------------------------- align 4 s_down: ; walk backward mov eax,[vpx] mov ebx,[vpy] mov ecx,[vheading] mov edi,[sinus+ecx*4] mov edx,[vheading] 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 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 ;--------------------------------------------------------------------- align 4 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 ;--------------------------------------------------------------------- align 4 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 ;--------------------------------------------------------------------- align 4 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 ;--------------------------------------------------------------------- align 4 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 ;--------------------------------------------------------------------- align 4 button2: ; button mcall 17 cmp ah,1 ; button id=1 ? jne gamestart ;-------------------------------------- finish: mcall -1 ; close this program ;--------------------------------------------------------------------- ; ********************************************* ; ******* WINDOW DEFINITIONS AND DRAW ******** ; ********************************************* align 4 draw_window: mcall 12,1 xor eax,eax xor esi,esi mcall ,<50,649>,<50,506>,0x74ffffff,,title mcall 12,2 ret ;--------------------------------------------------------------------- ; ********************************************* ; ******* COMPUTE 3D-VIEW ******** ; ********************************************* align 4 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 ;-------------------------------------- align 4 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 ; pointer to stepx lea ecx,[sinus+edx*4] mov esi,[ecx] sar esi,4 ; accuracy mov [vstepx],esi ; store stepx 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 align 4 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,Floors_Height ;32000 ; 3600 ; determine Floors Height based on distance xor edx,edx mov ebx,edi div ebx shl edx,1 cmp ebx,edx jae @f inc eax @@: 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,9 ;8 - for 64x64 mov esi,[xfrac] sal esi,3 ;2 - for 64x64 ; in fact its floor, just using the wall texture :) ; lea edi,[wall+edi+esi] add edi,[wall1] add edi,esi mov edx,[edi] mov [remesi],esi ;**** calculate pixel adress:**** mov esi,[ytemp] add esi,240 imul esi,1920 mov eax,[vx1] lea eax,[eax+eax*2] lea esi,[screen_buffer+eax+esi] cmp esi,screen_buffer+1920*480 jg foff0 cmp esi,screen_buffer 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 ; cmp esi,screen_buffer+1920*480 ; ja foff0 ; cmp esi,screen_buffer ; jb foff0 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 ;-------------------------------------- align 4 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 shl edx,5 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,screen_buffer+1920*240 mov ebx,eax ;screen_buffer+1920*240 ;-------------------------------------- align 4 copyfloor: sub eax,1920 add ebx,1920 mov ecx,[vx1] lea ecx,[ecx+ecx*2] lea edx,[ecx+ebx] add ecx,eax mov esi,[edx] mov [ecx],esi cmp eax,screen_buffer 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,ICON_SIZE_Y sub esi,1 cmp esi,502 ; dont calc offscreen-pixels jg speedup xor edx,edx mov eax,edi mov ebx,[vdd] ; add ebx,ebx shl ebx,1 div ebx shl edx,1 cmp ebx,edx jae @f inc eax @@: and eax,ICON_SIZE_Y-1 mov [ytemp],eax ; get y of texture for wall mov eax,[xfrac] add eax,[yfrac] and eax,ICON_SIZE_X-1 mov [xtemp],eax ; get x of texture for wall ; now prepare to plot that wall-pixel... mov [remedi],edi mov edi,[ytemp] sal edi,9 ;8 - for 64x64 mov edx,[xtemp] sal edx,3 ;2 - for 64x64 add edi,edx mov eax,[vk] ; determine which texture should be used and eax,255 cmp eax,1 jne checkmore1 add edi,[wall0] ;ceil jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore1: cmp eax,2 jne checkmore2 add edi,[wall1] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore2: cmp eax,3 jne checkmore3 add edi,[wall2] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore3: cmp eax,4 jne checkmore4 add edi,[wall3] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore4: cmp eax,5 jne checkmore5 add edi,[wall4] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore5: cmp eax,6 jne checkmore6 add edi,[wall5] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore6: cmp eax,7 jne checkmore7 add edi,[wall6] jmp foundtex ;--------------------------------------------------------------------- align 4 checkmore7: cmp eax,8 jne checkmore8 add edi,[wall7] jmp foundtex ;--------------------------------------------------------------------- align 4 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 lea eax,[esi-22] imul eax,1920 mov ebx,[vx1] lea ebx,[ebx+ebx*2] lea eax,[eax+screen_buffer+ebx] cmp eax,screen_buffer+1920*480 ja dont_draw cmp eax,screen_buffer 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 !!!!!**** xor edx,edx mcall 7,screen_buffer,<640,480> ret ;--------------------------------------------------------------------- align 4 blur: pusha mov eax,screen_buffer+360*1920 ;-------------------------------------- align 4 copyfloor2: add eax,1920 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,screen_buffer+478*1920 jb copyfloor2 popa ret ;--------------------------------------------------------------------- ; ******* Darken by Distance ******* align 4 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 ;-------------------------------------- align 4 isdarkside: ; reduce rgb sub [red],eax cmp [red], dword 0 jg notblack10b mov [red],dword 0 ;-------------------------------------- align 4 notblack10b: sub [green],eax cmp [green],dword 0 jg notblack20b mov [green],dword 0 ;-------------------------------------- align 4 notblack20b: mov edx,[blue] sub [blue],eax cmp [blue],dword 0 jg notblack30b mov [blue],dword 0 ;-------------------------------------- align 4 notblack30b: shl dword [red],16 ; reassemble rgb shl dword [green],8 mov edx,[red] or edx,[green] or edx,[blue] mov eax,edx ;-------------------------------------- align 4 nodark: ret ;--------------------------------------------------------------------- load_icons: mov ebx,icons_file_name mov esi,path mov edi,file_name call copy_file_path mov [fileinfo.subfunction],dword 5 mov [fileinfo.size],dword 0 mov [fileinfo.return],dword file_info mcall 70,fileinfo test eax,eax jnz .error mov [fileinfo.subfunction],dword 0 mov ecx,[file_info+32] mov [fileinfo.size],ecx mov [img_size],ecx mcall 68,12 test eax,eax jz finish ;memory_get_error mov [fileinfo.return],eax mov [image_file],eax mcall 70,fileinfo test eax,eax jnz .error ret .error: ; mov [N_error],2 ; mov [error_type],eax jmp finish ;--------------------------------------------------------------------- copy_file_path: xor eax,eax cld @@: lodsb stosb test eax,eax jnz @b mov esi,edi dec esi std @@: lodsb cmp al,'/' jnz @b mov edi,esi add edi,2 mov esi,ebx cld @@: lodsb stosb test eax,eax jnz @b ret ;--------------------------------------------------------------------- convert_icons: xor eax,eax mov [return_code],eax mov eax,image_file call [cnv_png_import.Start] mov ecx,[image_file] mcall 68,13, test eax,eax jz finish ;memory_free_error cmp [return_code],dword 0 ; je @f ; mov [N_error],6 ; jmp button.exit ;@@: jne finish mcall 68,20,ICON_SIZE_X*ICON_SIZE_Y*4*8+44,[raw_pointer] mov [raw_pointer],eax mov ebx,[raw_pointer] ; set RAW area for icon mov eax,[ebx+28] add eax,ebx mov edi,eax mov esi,eax add esi,ICON_SIZE_X*ICON_SIZE_Y*8*3-1 add edi,ICON_SIZE_X*ICON_SIZE_Y*8*4-4 ; add eax,TEX_SIZE mov [wall0],eax add eax,TEX_SIZE mov [wall1],eax add eax,TEX_SIZE mov [wall2],eax add eax,TEX_SIZE mov [wall3],eax add eax,TEX_SIZE mov [wall4],eax add eax,TEX_SIZE mov [wall5],eax add eax,TEX_SIZE mov [wall6],eax add eax,TEX_SIZE mov [wall7],eax add eax,TEX_SIZE ; conversion 24b to 32 b mov ecx,ICON_SIZE_X*ICON_SIZE_Y*8 std @@: xor eax,eax lodsb rol eax,8 lodsb rol eax,8 lodsb ; ror eax,16 stosd dec ecx jnz @b cld 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 ;--------------------------------------------------------------------- align 4 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 'Free3D v0.5 - fisheye raycasting engine etc.',0 sindegree dd 0.0 sininc dd 0.0017453292519943295769236907684886 sindiv dd 6553.5 ;textures: ;file 'texture.gif' ;--------------------------------------------------------------------- align 4 fileinfo: .subfunction dd 5 .Offset dd 0 .Offset_1 dd 0 .size dd 0 .return dd file_info db 0 .name: dd file_name ;--------------------------------------------------------------------- icons_file_name db 'texture_24b.png',0 ;--------------------------------------------------------------------- plugins_directory db 0 system_dir_Boxlib db '/sys/lib/box_lib.obj',0 system_dir_CnvPNG db '/sys/lib/cnv_png.obj',0 system_dir_Sort db '/sys/lib/sort.obj',0 system_dir_UNPACK db '/sys/lib/archiver.obj',0 ihead_f_i: ihead_f_l db 'System error',0 er_message_found_lib1 db 'cnv_png.obj - Not found!',0 er_message_import1 db 'cnv_png.obj - Wrong import!',0 err_message_found_lib2 db 'archiver.obj - Not found!',0 err_message_import2 db 'archiver.obj - Wrong import!',0 align 4 l_libs_start: library01 l_libs system_dir_CnvPNG+9,path,file_name,system_dir_CnvPNG,\ er_message_found_lib1,ihead_f_l,cnv_png_import,er_message_import1,ihead_f_i,plugins_directory library02 l_libs system_dir_UNPACK+9,path,file_name,system_dir_UNPACK,\ err_message_found_lib2,ihead_f_l,UNPACK_import,err_message_import2,ihead_f_i,plugins_directory end_l_libs: ;--------------------------------------------------------------------- align 4 cnv_png_import: .Start dd aCP_Start .Version dd aCP_Version .Check dd aCP_Check .Assoc dd aCP_Assoc dd 0 dd 0 aCP_Start db 'START',0 aCP_Version db 'version',0 aCP_Check db 'Check_Header',0 aCP_Assoc db 'Associations',0 ;--------------------------------------------------------------------- align 4 UNPACK_import: ;unpack_Version dd aUnpack_Version ;unpack_PluginLoad dd aUnpack_PluginLoad ;unpack_OpenFilePlugin dd aUnpack_OpenFilePlugin ;unpack_ClosePlugin dd aUnpack_ClosePlugin ;unpack_ReadFolder dd aUnpack_ReadFolder ;unpack_SetFolder dd aUnpack_SetFolder ;unpack_GetFiles dd aUnpack_GetFiles ;unpack_GetOpenPluginInfo dd aUnpack_GetOpenPluginInfo ;unpack_Getattr dd aUnpack_Getattr ;unpack_Open dd aUnpack_Open ;unpack_Read dd aUnpack_Read ;unpack_Setpos dd aUnpack_Setpos ;unpack_Close dd aUnpack_Close ;unpack_DeflateUnpack dd aUnpack_DeflateUnpack unpack_DeflateUnpack2 dd aUnpack_DeflateUnpack2 dd 0 dd 0 ;aUnpack_Version db 'version',0 ;aUnpack_PluginLoad db 'plugin_load',0 ;aUnpack_OpenFilePlugin db 'OpenFilePlugin',0 ;aUnpack_ClosePlugin db 'ClosePlugin',0 ;aUnpack_ReadFolder db 'ReadFolder',0 ;aUnpack_SetFolder db 'SetFolder',0 ;aUnpack_GetFiles db 'GetFiles',0 ;aUnpack_GetOpenPluginInfo db 'GetOpenPluginInfo',0 ;aUnpack_Getattr db 'getattr',0 ;aUnpack_Open db 'open',0 ;aUnpack_Read db 'read',0 ;aUnpack_Setpos db 'setpos',0 ;aUnpack_Close db 'close',0 ;aUnpack_DeflateUnpack db 'deflate_unpack',0 aUnpack_DeflateUnpack2 db 'deflate_unpack2',0 ;--------------------------------------------------------------------- IM_END: ;--------------------------------------------------------------------- ; not change this section!!! ; start section ;--------------------------------------------------------------------- align 4 image_file rd 1 raw_pointer rd 1 return_code rd 1 img_size rd 1 deflate_unpack rd 1 raw_pointer_2 rd 1 ;+20 ;--------------------------------------------------------------------- ; end section ;--------------------------------------------------------------------- align 4 ;--------------------------------------------------------------------- wall0 rd 1 wall1 rd 1 wall2 rd 1 wall3 rd 1 wall4 rd 1 wall5 rd 1 wall6 rd 1 wall7 rd 1 ;screen_buffer rd 1 ;--------------------------------------------------------------------- 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 align 4 sinus rd 360*10 eosinus: ; rd 16*1024*4 ;--------------------------------------------------------------------- align 4 rb 1024 stacktop: ;--------------------------------------------------------------------- path: rb 4096 ;--------------------------------------------------------------------- file_name: rb 4096 ;--------------------------------------------------------------------- file_info: rb 40 ;--------------------------------------------------------------------- screen_buffer: rb 640*480*3 *3/2 ;--------------------------------------------------------------------- I_END: ;---------------------------------------------------------------------