More software that may or may not be helpful or correct - ksjp 11/16/12 PF_done_ISR: // frame++; that's it. UART_ISR: case ' ': // Pause or unpause motion on the screen Pause = !Pause; break; case 'a': // add an object if (Objects < MaxObj-1) Objects++; break; case 'h': //decrement X velocity Ship.vx--; break; case 'j': //increment Y velocity Ship.vy++ ; break; Application.c // cmds live at tail end of buffers, where rows 768--1023 would be #define buf0 0x10400000 #define buf1 0x10800000 #define cmd0 0x10700000 #define cmd1 0x10b00000 while(1) { if (frame%2) { PF_frame = buf0; // PF pulls from buffer0 WriteGPinst(cmd1,frame); // cmds to cmd1 GP_frame = buf1; // GP writes to buffer1... GP_code = cmd1; // reading cmds from cmd1 } else { PF_frame = buf1; // PF pulls from buffer1 WriteGPinst(cmd0,frame); // cmds to cmd0 GP_frame = buf0; // GP writes to buffer0... GP_code = cmd0; // reading cmds from cmd0. } old = frame; while (old == frame) ; // spin waiting for PF_done_ISR } // my objects are single lines. You can be fancier. #define MaxObj 3 typedef struct {int x0,y0,x1,y1,color;} line; line obj[MaxObj] = { {5,5,10,10,0x00FF00FF}, //short purple line {100,200,300,400,0x0000FF00}, {700,500,30,20,0x00FFFFFF} } // long white line WriteGPinst(int * dst, int fr) *dst++ = 0x0100_0000; // fill frame with black // Draw the border *dst++ = 0x02FF_0000; // red line from *dst++ = 0x0000_0000; // (0,0) to *dst++ = 0x031F_0000; // (799,0) *dst++ = 0x0200_FF00; // green line from *dst++ = 0x031F_0000; // (799,0) to *dst++ = 0x031F_0257; // (799, 599) *dst++ = ... //update the ship position if we're not paused, and draw either way if (!Pause) { Ship.x += Ship.vx; Ship.y += Ship.vy; } dst = drawShip(dst); // returns ptr to next cmd //draw "objects". Total number controlled by keyboard input to Objects for (i=0; i