From 7c24e9a9b02b04dcaf9507acb94091ea70a2c02d Mon Sep 17 00:00:00 2001 From: Xavi Del Campo Date: Fri, 31 Jan 2020 10:32:23 +0100 Subject: Imported pristine psxsdk-20190410 from official repo --- libpsx/src/memcard.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 libpsx/src/memcard.c (limited to 'libpsx/src/memcard.c') diff --git a/libpsx/src/memcard.c b/libpsx/src/memcard.c new file mode 100644 index 0000000..16debf9 --- /dev/null +++ b/libpsx/src/memcard.c @@ -0,0 +1,87 @@ +/* + * PSXSDK Memory Card Helper Functions + * + * These functions help to manage memory card loading/saving + * + * Normal file functions can be used to do this, but it will be very tedious... + */ + + + #include + #include + #include + #include + #include + #include + +static unsigned char card_cmd[140]; +static unsigned char arr[140]; + +unsigned char McReadSector(int card_slot, int sector, unsigned char *buffer) +{ + memset(&card_cmd[0], 0, 140); + + card_cmd[0] = 0x81; /*MC access*/ + card_cmd[1] = 0x52; /*Read command*/ + + /*Copy frame number to command*/ + card_cmd[4] = sector >> 8; /*Frame MSB*/ + card_cmd[5] = sector & 0xFF; /*Frame LSB*/ + + QueryPAD(card_slot, card_cmd, arr, sizeof(card_cmd)); + + /*Copy received frame data*/ + memcpy(buffer, &arr[10], 128); + + /*Return RW status*/ + return arr[139]; +} + +unsigned char McWriteSector(int card_slot, int sector, unsigned char *buffer) +{ + int i; + + memset(&card_cmd[0], 0, 140); + + card_cmd[0] = 0x81; /*MC access*/ + card_cmd[1] = 0x57; /*Write command*/ + + /*Copy frame number to command*/ + card_cmd[4] = sector >> 8; /*Frame MSB*/ + card_cmd[5] = sector & 0xFF; /*Frame LSB*/ + + memcpy(&card_cmd[6], buffer, 128); + + /* Compute checksum */ + for(i = 4, card_cmd[134] = 0; i < 134; i++) + card_cmd[134] ^= card_cmd[i]; + + QueryPAD(card_slot, card_cmd, arr, sizeof(card_cmd)); + + /*Return RW status*/ + return arr[137]; +} + +unsigned int McGetStatus(int card_slot) +{ + unsigned int status = 0; + + memset(&card_cmd[0], 0, 140); + + card_cmd[0] = 0x81; /*MC access*/ + card_cmd[1] = 0x52; /*Read command*/ + + /*Copy frame number to command*/ + card_cmd[4] = 0;//sector >> 8; /*Frame MSB*/ + card_cmd[5] = 0;//sector & 0xFF; /*Frame LSB*/ + + QueryPAD(card_slot, card_cmd, arr, sizeof(card_cmd)); + + if(arr[2] == 0x5a && arr[3] == 0x5d) + status |= MEMCARD_CONNECTED; + + if(arr[6] == 'M' && arr[7] == 'C') + status |= MEMCARD_FORMATTED; + + return status; +} -- cgit v1.2.3