10 REM Set up the machine
   20 ON ERROR REPORT:PRINT" at line ";ERL:PROC_exit
   30 IF INKEY-256=&83 OR INKEY-256=&84 MODE 0:OSCLI"GSCALE16"
   40 *ESCOFF
   50 *FX4,1
   60 REM Snake path and world storage
   70 max%=384:DIM path% max%*2
   80 DIM world% 48
   90 REM Game settings
  100 maze%=1:speed%=5
  110 REM Main program loop
  120 REPEAT
  130   CLG:CLS:PRINTTAB(8,2)"Nibbles!"TAB(5,3)"Ben Ryves 2009"
  140   M%=0:REPEAT:PRINTTAB(6,6-M%)" "TAB(17,6-M%)" "TAB(6,5+M%)"*"TAB(17,5+M%)"*"TAB(8,5)"Speed: ";speed%TAB(8,6)"Maze: ";maze%
  150     K%=INKEY0:ON K%-135 PROC_menuDn,PROC_menuUp,PROC_menuToggle,PROC_menuToggle ELSE
  160   UNTILK%=13ORK%=27
  170   IF K%=27:PROC_exit
  180   *REFRESHOFF
  190   REM New game
  200   CLG:PRINTTAB(7,4)"Get ready!";:*REFRESH
  210   REM Load the maze
  220   ON maze% PROC_maze1,PROC_maze2,PROC_maze3,PROC_maze4 ELSE PROC_maze0
  230   CLG:FORY%=0TO15:FORX%=0TO23STEP8:IFworld%?(Y%*3+X%DIV8):FORZ%=0TO7:MOVE(X%+Z%)*64,Y%*64:PLOT97+((FN_world(X%+Z%,Y%)=0)AND2),63,63:NEXT
  240   NEXT:NEXT
  250   len%=4:head%=2*(len%-1):tail%=0:X%=11:Y%=8:FORI%=0TOmax%:path%?(I%*2)=X%:path%?(I%*2+1)=Y%:NEXT:PROC_world(X%,Y%,TRUE)
  260   S%=(9-speed%)*5+3:U%=1:V%=0:A%=X%:B%=Y%:gameOver%=FALSE:points%=-1:IFFN_apple
  270   REM Game loop
  280   REPEAT:IF NOTFN_apple M%=path%?tail%:N%=path%?(tail%+1):PROC_world(M%,N%,FALSE):MOVEM%*64,N%*64:PLOT99,63,63:tail%=(tail%+2)MODmax%
  290     X%=(X%+U%+24)MOD24:Y%=(Y%+V%+16)MOD16:gameOver%=FN_world(X%,Y%)
  300     head%=(head%+2)MODmax%:path%?head%=X%:path%?(head%+1)=Y%:PROC_world(X%,Y%,TRUE):MOVEX%*64,Y%*64:PLOT97,63,63
  310     *REFRESH
  320     T%=TIME+S%:oU%=U%:oV%=V%:REPEAT:K%=INKEY0:IFK%=27:gameOver%=TRUE
  330       ON K%-135 PROC_lt,PROC_rt,PROC_dn,PROC_up ELSE
  340     UNTIL TIME>=T%
  350   UNTILgameOver%
  360   REPEAT:UNTILINKEY0=-1:REPEAT:UNTILINKEY0<>-1
  370   *REFRESHON
  380   CLG:PRINTTAB(8,3)STR$points%;" points"TAB(4,5)"Play again? (Y/N)";
  390   REPEAT:K$=GET$:UNTILK$="Y"ORK$="y"ORK$="N"ORK$="n"
  400 UNTILK$="N"ORK$="n"
  410 *ESCON
  420 *FX4,0
  430 PRINT:END
  440 REM Check if we've eaten an apple, randomly replace if so
  450 DEFFN_apple:IF X%<>A%ORY%<>B% =FALSE
  460 REPEAT:A%=RND(24)-1:B%=RND(16)-1
  470 UNTILFN_world(A%,B%)=0
  480 MOVEA%*64+32,B%*64+32:PLOT145,31,0:points%=points%+1:=TRUE
  490 REM Get or set point in the world
  500 DEFPROC_world(X%,Y%,V%)P%=Y%*3+X%DIV8:X%=X%AND7:IF V% world%?P%=world%?P%OR2^X% ELSE world%?P%=world%?P%ANDNOT(2^X%)
  510 ENDPROC
  520 DEFFN_world(X%,Y%)P%=Y%*3+X%DIV8:X%=X%AND7:=world%?P%AND2^X%
  530 REM Mazes
  540 DEFPROC_maze0:FORI%=0TO47STEP4:world%!I%=0:NEXT:ENDPROC
  550 DEFPROC_maze1:PROC_maze0:FORI%=0TO23:PROC_world(I%,0,TRUE):PROC_world(I%,15,TRUE):NEXT:FORI%=0TO15:PROC_world(0,I%,TRUE):PROC_world(23,I%,TRUE):NEXT:ENDPROC
  560 DEFPROC_maze2:PROC_maze1:FORI%=5TO10:PROC_world(0,I%,FALSE):PROC_world(23,I%,FALSE):NEXT:FORI%=5TO18:PROC_world(I%,5,TRUE):PROC_world(I%,10,TRUE):NEXT:ENDPROC
  570 DEFPROC_maze3:PROC_maze2:FORI%=6TO9:PROC_world(5,I%,TRUE):PROC_world(18,I%,TRUE):NEXT:FORI%=10TO13:PROC_world(I%,5,FALSE):PROC_world(I%,10,FALSE):NEXT:ENDPROC
  580 DEFPROC_maze4:PROC_maze1
  590 FORI%=10TO13:PROC_world(I%,0,FALSE):PROC_world(I%,15,FALSE):PROC_world(I%,12,TRUE):NEXT
  600 FORI%=6TO9:PROC_world(0,I%,FALSE):PROC_world(23,I%,FALSE):PROC_world(3,I%,TRUE):NEXT
  610 FORI%=1TO3:PROC_world(9,I%,TRUE):PROC_world(14,I%,TRUE):PROC_world(9,15-I%,TRUE):PROC_world(14,15-I%,TRUE):PROC_world(I%,5,TRUE):PROC_world(I%,10,TRUE):PROC_world(23-I%,5,TRUE):PROC_world(23-I%,10,TRUE):NEXT
  620 ENDPROC
  630 REM Change direction
  640 DEFPROC_lt:IFoU%<>1 U%=-1:V%=0
  650 ENDPROC
  660 DEFPROC_rt:IFoU%<>-1 U%=1:V%=0
  670 ENDPROC
  680 DEFPROC_up:IFoV%<>-1 U%=0:V%=1
  690 ENDPROC
  700 DEFPROC_dn:IFoV%<>1 U%=0:V%=-1
  710 ENDPROC
  720 REM Menus
  730 DEFPROC_menuToggle:M%=1-M%:ENDPROC
  740 DEFPROC_menuUp:IF M% maze%=(maze%+1)MOD5 ELSE speed%=(speed%+1)MOD10
  750 ENDPROC
  760 DEFPROC_menuDn:IF M% maze%=(maze%+4)MOD5 ELSE speed%=(speed%+9)MOD10
  770 ENDPROC
  780 REM Exit
  790 DEFPROC_exit
  800 PRINT
  810 *REFRESHON
  820 *ESCON
  830 *FX4,0
  840 END