unsigned short r256table[255]; unsigned char r256index; #define xcells 59 #define ycells 39 #define xlinelen (xcells<<1) #define ylinelen (ycells<<1) #define xmax (xlinelen-1) #define ymax (ylinelen-1) unsigned char maze[ylinelen+1][xlinelen+1]; #define STACK_TOP ((unsigned short*)0x2040000) unsigned short *mazestack = STACK_TOP; void r256init() { unsigned int i,j,msb; j=42424; for(i=0;i<256;i++){ r256table[i]=(unsigned short)(j=j*0x103); } msb=0x8000; j=0; for(i=0;i<16;i++) { j=i*5+3; r256table[j]|=msb; r256table[j+1]&=~msb; msb>>=1; } } unsigned short r256() { unsigned short r; r=r256table[(r256index+103)&255]^r256table[r256index]; r256table[r256index++]=r; return r; } void DrawMaze() { int x,y; for(x=0;x<120*160;x++) ((unsigned int*)0x6000000)[x]=0x7FFF7FFF; for(y=0;y1) todo|=maze[y][x-2]; if(x1) todo|=maze[y-2][x]; if(y>14){ case 0: if(x>1) { if(maze[y][x-2]!=0) { maze[y][x-1]=0; x -= 2; Dig(x,y); } } break; case 1: if(x1) { if(maze[y-2][x]!=0) { maze[y-1][x]=0; y -= 2; Dig(x,y); } } break; case 3: if(y>15)|1; y=((r256()*ycells)>>15)|1; DigMaze(x,y); maze[((r256()*ycells)>>15)|1][xlinelen]=0; x=0; y=((r256()*ycells)>>15)|1; maze[y][0]=0; DrawMaze(); ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+1]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+2]=0x01FF; x++; maze[y][x]=2; } while(((*(volatile unsigned short*)0x4000130) & 8)!=0); while(((*(volatile unsigned short*)0x4000130) & 255)!=255) {} while(x=xlinelen) break; if(maze[y][x]==0) { ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-1]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-3]=0x01FF; maze[y][x]=2; } else { ((unsigned short *)0x6000000)[(y*240+x)*2-1]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-2]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-3]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-4]=0x7FFF; maze[y][x-2]=0; } } while(maze[y-1][x]==1 && maze[y+1][x]==1); break; case 0xD0: //Left do{ if(x<=1 || maze[y][x-1]==1) break; x-=2; if(maze[y][x]==0) { ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+1]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+3]=0x01FF; maze[y][x]=2; } else { ((unsigned short *)0x6000000)[(y*240+x)*2+1]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+2]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+3]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+4]=0x7FFF; maze[y][x+2]=0; } } while(maze[y-1][x]==1 && maze[y+1][x]==1); break; case 0xB0: //Up do{ if(y<=1 || maze[y-1][x]==1) break; y-=2; if(maze[y][x]==0) { ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+240]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+480]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2+720]=0x01FF; maze[y][x]=2; } else { ((unsigned short *)0x6000000)[(y*240+x)*2+240]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+480]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+720]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2+960]=0x7FFF; maze[y+2][x]=0; } } while(maze[y][x-1]==1 && maze[y][x+1]==1); break; case 0x70: //Down do{ if(y>=ylinelen-1 || maze[y+1][x]==1) break; y+=2; if(maze[y][x]==0) { ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-240]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-480]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-720]=0x01FF; maze[y][x]=2; } else { ((unsigned short *)0x6000000)[(y*240+x)*2-240]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-480]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-720]=0x7FFF; ((unsigned short *)0x6000000)[(y*240+x)*2-960]=0x7FFF; maze[y-2][x]=0; } } while(maze[y][x-1]==1 && maze[y][x+1]==1); break; } while(((*(volatile unsigned short*)0x4000130) & 0xF0)!=0xF0) {} } ((unsigned short *)0x6000000)[(y*240+x)*2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-1]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-2]=0x01FF; ((unsigned short *)0x6000000)[(y*240+x)*2-3]=0x01FF; while(((*(volatile unsigned short*)0x4000130) & 8)!=0) {} } }