No worries if folks are too busy or not interested, but here's where I'm leaving this. I can make beautiful simulations (fast) on RGB LED matrices or (slow) on Adafruit LCD's. With the Gameduino 3, without causing "processor exceptions" with too many points before a buffer swap, my proven approach yields a black screen unless I plot a fixed color ("intensity").
It's probably something stupid on my part.
The basic idea (which works fine at good frame rates on other displays) is to have the Teensy 3.6 scan the intensity array continuously and, if it finds any pixels with intensity > 0, decrement them. The cool way is to convert to float, multiply by a decay factor such as 0.95, and back to uint8_t or byte. However, *any* operations on the intensity array in the Gameduino 3 version seems to lead to a black screen and I don't get it.

Oh well. Other stuff coming soon - easy, fast oscilloscope with Teensy and Gameduino 3.
Thanks and Happy Holidays!
Greg
#include <EEPROM.h>
#include <SPI.h>
#include <GD2.h>
//Gameduino 3 + Teensy 3.6 Test Code
//G. Kovacs, 7/25/18, 7/27/18, 12/17/18
//Note: discovered on 7/27/18 that 2023 is the MAXIMUM number of points that can be drawn without causing a "Coprocessor Exception" error. Buffer size?
//X = 480, Y = 272 pixels
//12/17/18 Try to port proven fade algorithm .
#define arraysize 128
int xpin = A5, ypin = A4;
byte intensity[arraysize] [arraysize];
int samplePeriod = 30; //Sample period for interrupts in microseconds
int x, y, xcount, ycount;
// Create IntervalTimer object to sample the x and y inputs...
IntervalTimer sampleTimer;
void setup()
//Clear intensity array just in case...
{
for (ycount = 0; ycount<=arraysize; ycount++)
{
for (xcount=0; xcount<=arraysize; xcount++)
{
intensity[xcount][ycount]=0;
}
}
GD.begin(~GD_STORAGE);
analogReadResolution(7); //Adjust so that max binary value is equal to arraysize-1, i.e., 7 bits for 128-element intensity array.
sampleTimer.begin (sample, samplePeriod); //Period of sampling is second parameter, in microseconds. Empirically looks like 15 - 20 us is minimum. This code 30 us.
}
void sample() //Drives the "virtual electron beam" that writes intensity values on interrupt into the intensity array.
{
x=analogRead(xpin);
y=analogRead(ypin);
intensity[x][y] = 255;
}
void loop()
{
// delay(10);
GD.ClearColorRGB(0x1030FF);
GD.Clear();
GD.cmd_text(240, 141, 31, OPT_CENTER, "XY Display Debug");
GD.Begin(POINTS);
for (ycount = 0; ycount<=arraysize; ycount++)
{
for (xcount=0; xcount<=arraysize; xcount++)
{
if (intensity[xcount][ycount]>0)
{
GD.ColorRGB(intensity[xcount][ycount]*0x1000); //This does work, but as soon as any operation is done on the intensity array, it does not!
GD.Vertex2ii(xcount, ycount);
intensity[xcount][ycount]=intensity[xcount][ycount]; // This useless operation (likely ignored by the compiler) works.

// Proven approach is to convert to float, multiply, and convert back.
// intensity[xcount][ycount]=int(intensity[xcount][ycount]*.95); //Does not work with Gameduino 3
// intensity[xcount][ycount]=intensity[xcount][ycount]>>1; // This does not work either.
// It does not work for even tiny array sizes like 32 elements, so it is not buffer overflow, and few points get written anyway.
}
}
// GD.swap();
}
GD.swap();
}