/******************************************************/ /* AUTHOR - JAMES CHOW */ /* DATE - 2 JULY 1998 */ /* ALTERATION WITHOUT EXPRESS PERMISSION PROHIBITED */ /* email: james@chowfam.demon.co.uk */ /******************************************************/ #include #include "pad.h" #include "memcard.h" #define OTLEN (1) #define SCNW (320) #define SCNH (240) #define ICONSLOC 0x800e0000 GsIMAGE icons; char* filename = "BESLES-12345FILENAME"; char* textname = "a testfile"; #define FILESLOTS (1) #define ICONNUM (1) char mybuffer[8192*FILESLOTS-512]; int dataval; int state; int prevstate; #define SELECT_OPERATION (0) #define SELECT_CARD (1) #define CHECK_CARD (2) #define CARD_OK (3) #define CARD_NEW (4) #define CARD_UNINIT (5) #define CARD_ERROR (6) #define CARD_NONE (7) #define FORMAT_CARD (8) #define FORMAT_OK (9) #define FORMAT_ERROR (10) #define DO_OPERATION (11) #define OPERATION_ERROR (12) #define OPERATION_FAIL (13) #define OPERATION_OK (14) int operation; int cardnum; int complete1; int complete2; #define LOADOP (0) #define SAVEOP (1) void initGame(void) { FntLoad(960,256); FntOpen(0,0,SCNW,SCNH,0,512); padsInit(); GsGetTimInfo((u_long*)(ICONSLOC+4),&icons); cardInfoInit(filename,FILESLOTS,icons,ICONNUM,textname); state = SELECT_OPERATION; dataval = 0; } int updateGame(void) { static int prevpad = 0xffffffff; if ((padState(0) & PADstart)&&(padState(0) & PADselect)) return 1; prevstate = state; complete2 = complete1; switch (state) { case SELECT_OPERATION: if (padState(0) & PADLleft) dataval--; else if (padState(0) & PADLright) dataval++; if ((padState(0) & PADRdown)&&(!(prevpad & PADRdown))) { operation = LOADOP; state = SELECT_CARD; } else if ((padState(0) & PADRright)&&(!(prevpad & PADRright))) { operation = SAVEOP; state = SELECT_CARD; } break; case SELECT_CARD: if ((padState(0) & PADRdown)&&(!(prevpad & PADRdown))) { cardnum = 0; state = CHECK_CARD; } else if ((padState(0) & PADRright)&&(!(prevpad & PADRright))) { cardnum = 1; state = CHECK_CARD; } break; case CHECK_CARD: if (prevstate == CHECK_CARD) { switch (cardValidate(cardnum)) { case VALIDATEok: state = CARD_OK; break; case VALIDATEnew: state = CARD_NEW; break; case VALIDATEuninit: state = CARD_UNINIT; break; case VALIDATEerror: state = CARD_ERROR; break; case VALIDATEnone: state = CARD_NONE; break; } } break; case CARD_OK: complete1 = 0; state = DO_OPERATION; if (operation == SAVEOP) { memset(mybuffer,0,8192*FILESLOTS-512); memcpy(mybuffer,&dataval,sizeof(int)); cardSetBuffer((unsigned char*)mybuffer); } break; case CARD_NEW: case CARD_UNINIT: if ((padState(0) & PADRdown)&&(!(prevpad & PADRdown))) { state = FORMAT_CARD; } else if ((padState(0) & PADRright)&&(!(prevpad & PADRright))) { state = SELECT_OPERATION; } break; case FORMAT_CARD: if (prevstate == FORMAT_CARD) { switch (cardValidate(cardnum)) { case VALIDATEok: state = CARD_OK; break; case VALIDATEnew: case VALIDATEuninit: switch (cardFormat()) { case FORMATok: state = FORMAT_OK; break; case FORMATerror: state = FORMAT_ERROR; break; } break; case VALIDATEerror: state = CARD_ERROR; break; case VALIDATEnone: state = CARD_NONE; break; } } break; case FORMAT_OK: switch (operation) { case LOADOP: if ((padState(0) & PADRdown)&&(!(prevpad & PADRdown))) { state = SELECT_OPERATION; } break; case SAVEOP: CARD_OK; break; } break; case DO_OPERATION: switch (operation) { case LOADOP: complete1 = cardRead(); break; case SAVEOP: complete1 = cardWrite(); break; } switch (complete1) { case 100: state = OPERATION_OK; break; case READerror: case WRITEerror: state = OPERATION_ERROR; break; case READfileabsent: case WRITEcardfull: state = OPERATION_FAIL; break; } break; case OPERATION_OK: if (operation == LOADOP) { memcpy(mybuffer,cardGetBuffer(),8192*FILESLOTS-512); memcpy(&dataval,mybuffer,sizeof(int)); } case CARD_ERROR: case CARD_NONE: case FORMAT_ERROR: case OPERATION_ERROR: case OPERATION_FAIL: if ((padState(0) & PADRdown)&&(!(prevpad & PADRdown))) { state = SELECT_OPERATION; } break; } prevpad = padState(0); return 0; } void drawGame(GsOT *ot) { FntPrint("Data Value:%d\n\n",dataval); switch (prevstate) { case SELECT_OPERATION: FntPrint("Press CROSS to Load\n"); FntPrint("Press CIRCLE to Save\n"); break; case SELECT_CARD: FntPrint("Press CROSS for Memory Card 1\n"); FntPrint("Press CIRCLE for Memory Card 2\n"); break; case CHECK_CARD: FntPrint("Checking Card\n"); break; case CARD_OK: switch (operation) { case LOADOP: FntPrint("Preparing to Load\n"); break; case SAVEOP: FntPrint("Preparing to Save\n"); break; } break; case CARD_NEW: FntPrint("New Memory Card Detected\n"); switch (operation) { case LOADOP: FntPrint("Press CROSS to Format\n"); break; case SAVEOP: FntPrint("Press CROSS to Format and Save\n"); break; } FntPrint("Press CIRCLE to Cancel\n"); break; case CARD_UNINIT: FntPrint("Uninitialised Memory Card Detected\n"); switch (operation) { case LOADOP: FntPrint("Press CROSS to Format\n"); break; case SAVEOP: FntPrint("Press CROSS to Format and Save\n"); break; } FntPrint("Press CIRCLE to Cancel\n"); break; case CARD_ERROR: FntPrint("Error Accessing Card\n"); FntPrint("Press CROSS to Continue\n"); break; case CARD_NONE: FntPrint("No Memory Card Detected\n"); FntPrint("Press CROSS to Continue\n"); break; case FORMAT_CARD: FntPrint("Formatting Card\n"); FntPrint("Please Do Not Remove Card\n"); break; case FORMAT_OK: FntPrint("Card Formatted\n"); if (operation == LOADOP) FntPrint("Press CROSS to Continue\n"); break; case FORMAT_ERROR: FntPrint("Error Formatting Card\n"); FntPrint("Press CROSS TO Continue\n"); break; case DO_OPERATION: switch (operation) { case LOADOP: FntPrint("Loading is %d%% Complete\n",complete2); FntPrint("Please Do Not Remove Card\n"); break; case SAVEOP: FntPrint("Saving is %d%% Complete\n",complete2); FntPrint("Please Do Not Remove Card\n"); break; } break; case OPERATION_FAIL: switch (operation) { case LOADOP: FntPrint("File Not Found on Memory Card\n"); break; case SAVEOP: FntPrint("Not Enough Slots Free on Memory Card\n"); break; } FntPrint("Press CROSS to Continue\n"); break; case OPERATION_ERROR: switch (operation) { case LOADOP: FntPrint("Load Error\n"); break; case SAVEOP: FntPrint("Save Error\n"); break; } FntPrint("Press CROSS to Continue\n"); break; case OPERATION_OK: switch (operation) { case LOADOP: FntPrint("Load Completed\n"); break; case SAVEOP: FntPrint("Save Completed\n"); break; } FntPrint("Press CROSS to Continue\n"); break; } FntFlush(-1); } void main(void) { GsOT ot[2]; GsOT_TAG ottags[2][1<