CatMan wrote:panhandledan wrote: Use Scott's program, but substitute "240" for "60"
Very interesting panhandledan. I experimented with programming larger numbers than 60 into a cartridge and all attempts made the cartridge unrecognizable by the CG. What age is your CG? Mine are both 10 months and newer. I wonder if CG changed their programming somewhere alone the line to check for numbers larger than 60?
Hi CatMan. My CatGenie was ordered on 4/11/08 - 9 months ago - and delivered soon thereafter. I can't be entirely sure about the date of the cartridge I used, but it has to be fairly recent since I threw out the first bunch after they were used.
In the name of science, I just repeated the experiment. I removed my hackcartridge, catgenie beeped and complained. I uploaded the "240" program, quoted below. Put the hackcartridge back in. It seems to have accepted it just fine. I am using the program "Arduino - 0012 alpha" for Mac, with the arduino duemilanove from hacktronics.
Can you repeat your experiment?
Just some speculation here.... I'm not sure why CatGenie would bother to change their limit number. It's not like that would have inconvenienced this hacker much; I would just press the reset button every 10-14 days or so instead of every 6-8 weeks. Or I could put the whole mess on a vacation timer, allowing it to turn off and on for a brief interlude every day, causing the program to upload from the arduino to the smartchip every day. Plus maybe they want to preserve the ability to sell a "mega" cartridge at some point

If they wanted to mess with their scheme at all, I would think they'd add some encryption or something else devious. Sure, older cartridges would no longer be compatible, but this is common for companies to do.
Here's the program:
#include <Wire.h>
#define CG (B1010000)
boolean resetSuccess = false;
int isReset = 13;
int byteArray []= {01, 01, 01, 240, 240, 240, 240, 240, 240, 8, 8, 8, 33, 33, 33, 240};
void setup()
{
pinMode(isReset, OUTPUT);
digitalWrite(isReset, LOW);
Wire.begin(); // join i2c bus (address optional for master)
}
void loop()
{
if (resetSuccess)
{
delay (2000); // our work is done - pause for a while
resetSuccess = false;
} else {
resetCartridge();
resetSuccess = verifyCartridge();
digitalWrite(isReset, resetSuccess);
}
}
void resetCartridge()
{
for (int i=3; i < sizeof(byteArray)/2; i++)
{
Wire.beginTransmission(CG);
Wire.send(i);
Wire.send(byteArray[i]);
Wire.endTransmission();
delay(4);
}
}
void movePointerTo(int deviceAddr, int memoryAddr)
{
Wire.beginTransmission(deviceAddr);
Wire.send(memoryAddr);
Wire.endTransmission();
}
boolean verifyCartridge()
{
boolean success = true;
movePointerTo(CG, 3);
Wire.requestFrom(CG, 3);
while (Wire.available())
{
if (Wire.receive() == 240 && success == true)
{
// looking good so far
} else {
success = false;
}
}
return success;
}