( : ; immediate create does> allot , variable constant array if else then while repeat do loop dup swap pick drop + - * = < > & | ^ ! @ . putpixel redraw 123 "string" 'c' `javascript` ) ( controls: [mouse] ) : over `stack[sp]=stack[sp-2];++sp;` ; : lshift `--sp;stack[sp-1]<<=stack[sp];` ; : rshift `--sp;stack[sp-1]>>=stack[sp];` ; : / `--sp;stack[sp-1]/=stack[sp];` ; : sin `stack[sp-1]=Math.sin(stack[sp-1]);` ; : cos `stack[sp-1]=Math.cos(stack[sp-1]);` ; : tan `stack[sp-1]=Math.tan(stack[sp-1]);` ; : negate `stack[sp-1]=-stack[sp-1];` ; : mod `--sp;stack[sp-1]%=stack[sp];` ; : min `--sp;if(stack[sp-1]>stack[sp])stack[sp-1]=stack[sp];` ; : round `stack[sp-1]=Math.floor(stack[sp-1]);` ; 256 constant WIDTH 176 constant HEIGHT 7 constant BITS 1 BITS lshift constant STEP STEP 1 - constant MASK 4 constant SCALE create Map 0b000000000000000000000 , 0b011111111111111111110 , 0b010101010101010101010 , 0b011111111111111111110 , 0b011111100100111111110 , 0b011111101110111111110 , 0b011111111011111111110 , 0b011111101110111111110 , 0b011111100100111111110 , 0b011111111111111111110 , 0b010101010101010101010 , 0b011111111111111111110 , 0b000000000000000000000 , variable Swing variable LocX variable LocY variable Angle 360 array SinTable 360 array CosTable variable dist variable color variable x variable y variable h variable j1 variable j2 variable i0 variable j0 variable u0 variable v0 variable vx variable vy variable da variable db variable a variable b variable u variable v variable u1 variable v1 variable a1 variable b1 variable i variable j variable di variable dj variable wall : span color ! dist ! x ! HEIGHT dist @ 64 > if 64 * dist @ / round then h ! HEIGHT h @ - 1 rshift j1 ! j1 @ h @ + j2 ! j1 @ do x @ over 0 putpixel loop h @ do x @ over j1 @ + dup 1 rshift color @ min h @ 2 * min putpixel loop HEIGHT j2 @ - do x @ over j2 @ + dup 64 - 64 min putpixel loop ; : scene LocX @ dup BITS rshift i0 ! MASK & u0 ! LocY @ dup BITS rshift j0 ! MASK & v0 ! CosTable Angle @ + @ vx ! SinTable Angle @ + @ vy ! vy @ 7 rshift Swing @ * WIDTH / da ! vx @ 7 rshift Swing @ * WIDTH / db ! vx @ Swing @ vy @ 8 rshift * - a ! vy @ Swing @ vx @ 8 rshift * + b ! WIDTH do a @ 0 < if -1 u0 @ a @ negate else 1 STEP u0 @ - a @ then a1 ! u ! di ! b @ 0 < if -1 v0 @ b @ negate else 1 STEP v0 @ - b @ then b1 ! v ! dj ! u @ dup STEP - x ! b1 @ dup BITS lshift u1 ! * u ! v @ dup STEP - y ! a1 @ dup BITS lshift v1 ! * v ! i0 @ i ! j0 @ j ! 1 while v @ u @ < dup if y @ STEP + y ! u @ v @ - u ! v1 @ v ! j @ dj @ + j ! else x @ STEP + x ! v @ u @ - v ! u1 @ u ! i @ di @ + i ! then wall ! Map i @ + @ 1 j @ lshift & repeat dup wall @ if b1 y else a1 x then @ 18 lshift swap @ / i @ j @ + 3 & if 48 else 32 then span a @ da @ + a ! b @ db @ - b ! loop redraw ; : init 360 do dup 3.14 * 180.0 / sin SCALE * 65536.0 * over SinTable + ! dup 3.14 * 180.0 / cos SCALE * 65536.0 * over CosTable + ! loop 15 Angle ! STEP 1.3 * LocX ! STEP 1.3 * LocY ! 30.0 3.14 * 180.0 / tan 65536.0 * 8 rshift Swing ! ; init : "onmousemove" `stack[sp++]=event.clientX;` 360 mod Angle ! ; variable forward : "onmousedown" 1 forward ! ; : "onmouseup" 0 forward ! ; : run forward @ if LocX @ CosTable Angle @ + @ 14 rshift + dup x ! BITS rshift i ! LocY @ SinTable Angle @ + @ 14 rshift + dup y ! BITS rshift j ! Map i @ + @ 1 j @ lshift & if x @ LocX ! y @ LocY ! then then ; variable frame : fps `v="fps:";` frame @ . 0 frame ! ; : render scene frame @ 1 + frame ! ; : 0 render ; : 25 run ; : 1000 fps ;