/******************************************************/ /* AUTHOR - JAMES CHOW */ /* DATE - 2 JULY 1998 */ /* ALTERATION WITHOUT EXPRESS PERMISSION PROHIBITED */ /* email: james@chowfam.demon.co.uk */ /******************************************************/ #include #include #include #include "memcard.h" int cardFind(void); int cardFreeSlots(void); static char slotname[2][5] = {"bu00:","bu10:"}; static struct DIRENTRY dirinfo[15]; static int slot; static char filename[20]; static unsigned char *buffer = NULL; static int filefound = 0; static int freeslots = 0; unsigned short ascii2sjis(char ch) { if ((ch >= 'A')&&(ch <= 'Z')) return 0x6082 + (ch-'A')*0x0100; if ((ch >= '0')&&(ch <= '9')) return 0x4f82 + (ch-'0')*0x0100; if ((ch >= 'a')&&(ch <= 'z')) return 0x8182 + (ch-'a')*0x0100; switch (ch) { case ' ': return 0x4081; case '!': return 0x4981; case '"': return 0x6881; case '#': return 0x9481; case '$': return 0x9081; case '%': return 0x9381; case '&': return 0x9581; case '\'': return 0x6681; case '(': return 0x6981; case ')': return 0x6a81; case '*': return 0x9681; case '+': return 0x7b81; case ',': return 0x4381; case '-': return 0x7c81; case '.': return 0x4481; case '/': return 0x5e81; case ':': return 0x4681; case ';': return 0x4781; case '<': return 0x8381; case '=': return 0x8181; case '>': return 0x8481; case '?': return 0x4881; case '@': return 0x9781; case '[': return 0x6d81; case '\\': return 0x5f81; case ']': return 0x6e81; case '^': return 0x4f81; case '_': return 0x5181; case '`': return 0x4d81; case '{': return 0x6f81; case '|': return 0x6281; case '}': return 0x7081; case '~': return 0x6081; case 0: return 0; default: return 0x4081; //space } } void cardInfoInit(char fname[20],int slots,GsIMAGE icons, int numicons,char textname[32]) { int i; unsigned short sjisname[32]; if (buffer != NULL) free(buffer); buffer = (unsigned char*)malloc(slots*8192); for (i=0;i<32;i++) sjisname[i] = ascii2sjis(textname[i]); strcpy(filename,fname); memset(buffer,0,512); buffer[0] = 'S'; buffer[1] = 'C'; buffer[2] = 0x10 + numicons; buffer[3] = slots; memcpy(buffer+4,sjisname,64); memcpy(buffer+96,icons.clut,32); memcpy(buffer+128,icons.pixel,128*numicons); } int cardFind(void) { int i; for (i=0;i<15;i++) if (strcmp(dirinfo[i].name,filename) == 0) return 1; return 0; } int cardFreeSlots(void) { int i, frslots = 15; for (i=0;i<15;i++) frslots -= dirinfo[i].size/8192; return frslots; } int cardValidate(int slotnum) { struct DIRENTRY entry; int i = 0, val; slot = slotnum; val = TestCard(slot); if (val == VALIDATEok) if (firstfile(slotname[slot],&entry) != 0) do { memcpy(&dirinfo[i++],&entry,sizeof(struct DIRENTRY)); } while (nextfile(&entry) != 0); for (;i<15;i++) dirinfo[i].size = 0; filefound = cardFind(); freeslots = cardFreeSlots(); return val; } int cardFormat(void) { return format(slotname[slot]); } int cardRead(void) { static int fd; static int readsum = 0; int curread; char devname[25]; //check file presence if (!filefound) return READfileabsent; //open up if (readsum == 0) { sprintf(devname,"%s%s",slotname[slot],filename); fd = open(devname,O_RDONLY); if (fd == -1) return READerror; } //read in curread = read(fd,(char*)buffer+readsum,128); if (curread == 128) readsum += 128; else { readsum = 0; close(fd); return READerror; } //close up if (readsum == buffer[3]*8192) { readsum = 0; if (close(fd) == -1) return READerror; else return 100; } return readsum*100/buffer[3]/8192; } int cardWrite(void) { static int fd; static int writesum = 0; int curwrite; char devname[25]; //check card capacity if (freeslots < buffer[3]) return WRITEcardfull; //open up if (writesum == 0) { sprintf(devname,"%s%s",slotname[slot],filename); if (!filefound) { fd = open(devname,O_CREAT|(buffer[3]<<16)); close(fd); } fd = open(devname,O_WRONLY); if (fd == -1) return WRITEerror; } //write out curwrite = write(fd,(char*)buffer+writesum,128); if (curwrite == 128) writesum += 128; else { writesum = 0; close(fd); return WRITEerror; } //close up if (writesum == buffer[3]*8192) { writesum = 0; if (close(fd) == -1) return WRITEerror; else return 100; } return writesum*100/buffer[3]/8192; } void cardSetBuffer(unsigned char* buff) { memcpy(buffer+512,buff,buffer[3]*8192-512); } unsigned char* cardGetBuffer(void) { return (buffer+512); }