2Fermer4
NeoHomeBrewLe 03/06/2016 à 16:21
Hi HPMAN,

thank you a lot for the code - the compiler warnings are gone and now the program can save three blocks of demo data. sun
The save and load process has effect on all three save blocks of the card and there is no need to fill each block individually.
I have tested the program on my 2-slot MV2F board with the original SNK memory card, the NeoSaveMasta card and with a few 3rd party SRAM cards without any problems.
Already existing data saves from other games have fortunately not been corrupted with my save.

Here is a video of the current version:



And here is the code:

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <task.h>
#include <input.h>
#include <DATlib.h>
#include <math.h>
#include <video.h>
#include <string.h>
#include "externs.h"
#include "fixData.h"

typedef struct bkp_ram_info{
	WORD debug_dips;
	BYTE stuff[254]; 	// 256 bytes backup block
} bkp_ram_info;
bkp_ram_info bkp_data;

BYTE p1,p2,ps;

typedef struct save_format{
	char title[20];		// 1st block game title, stage number
	BYTE data[44];		// 1st block 44 bytes data
	BYTE data2[64];		// 2nd block 64 bytes data
	BYTE data3[64];		// 3rd block 64 bytes data
}save_format;

save_format SAVE_FILE;

typedef struct load_format{
	char title[20];
	BYTE data[44];
	BYTE data2[64];
	BYTE data3[64];
}load_format;

load_format LOAD_FILE;

// memory card loop ///////////////////////////////////////////

void memory_card()
{
	short i;

	volMEMWORD(0x401ffe)=0x3456; // BG color
	LSPCmode=0x900;

	initGfx();
	clearFixLayer();
	clearSprites(1, 381);

	palJobPut( 1, hypernoid_font_Palettes.palCount, hypernoid_font_Palettes.data); // fix layer palette

	SCClose();

	// fill save area with demo data

	strcpy(SAVE_FILE.title, "DEMO-GAME-STAGE-01--");	// 1st block - 20 bytes char array

	for(i=0; i<44; i++)
	{
		SAVE_FILE.data[i]=1; 	// 1st block - 44 bytes array
	}

	for(i=0; i<64; i++)
	{
		SAVE_FILE.data2[i]=2; // 2nd block - 64 bytes array
		SAVE_FILE.data3[i]=3; // 3th block - 64 bytes array
	}

	do{
		waitVBlank();

		p1=volMEMBYTE(P1_CURRENT);
		ps=volMEMBYTE(PS_CURRENT);

		if(p1&JOY_A)
		{
			volMEMBYTE(0x10FDC4)=0x00;   // CARD_COMMAND 0 = format card
			__asm__ ("jsr 0xC00468 \n"); // call CARD routine
			break;
		}

		if(p1&JOY_B)
		{
			volMEMDWORD(0x10FDC8)=(int)&SAVE_FILE; 	// BIOS_CARD_START must contain an adress to system RAM data
			volMEMWORD(0x10FDCC)=0x0192; 			// BIOS_CARD_SIZE must contain the size of the save (normally 64 bytes)
			volMEMWORD(0x10FDCE)=0x7777; 			// BIOS_CARD_FCB, contains Game NGH number
			volMEMWORD(0x10FDD0)=0x0000; 			// BIOS_CARD_SUB must contain the game save number (16 max per game)

			volMEMBYTE(0x10FDC4)=0x03;   			// CARD_COMMAND 3 = save data from system RAM into card RAM
			__asm__ ("jsr 0xC00468 \n"); 			// call CARD routine
			break;									// exit loop
		}

		if(p1&JOY_C)
		{
			volMEMDWORD(0x10FDC8)=(int)&LOAD_FILE; 	// BIOS_CARD_START must contain an address where the save will be loaded
			volMEMWORD(0x10FDCC)=0x0192; 			// BIOS_CARD_SIZE must contain the size of the save (normally 64 bytes)
			volMEMWORD(0x10FDCE)=0x7777; 			// BIOS_CARD_FCB, contains Game NGH number
			volMEMWORD(0x10FDD0)=0x0000; 			// BIOS_CARD_SUB must contain the game save number (16 max per game)

			volMEMBYTE(0x10FDC4)=0x02;   			// CARD_COMMAND 2 = load saved data from card RAM into system RAM
			__asm__ ("jsr 0xC00468 \n"); 			// call CARD routine
			break;									// exit loop
		}

		fixPrintf(27, 3,1,3,"VBL: %05d",	DAT_frameCounter);
		fixPrintf( 3, 3,1,3,"MEMORY CARD ACCESS");
		fixPrintf( 3, 4,1,3,"----------------------------------");

		if(volMEMWORD(0x800000)==65535)
		{
			fixPrintf( 3, 6,1,3,"CARD_INSERTED:  NO");
		}else{
			fixPrintf( 3, 6,1,3,"CARD_INSERTED: YES ");
		}

		fixPrintf( 3, 7,1,3,"CARD_COMMAND: %04d", volMEMBYTE(0x10FDC4));
		fixPrintf( 3, 8,1,3,"CARD_ANSWER : %04d", volMEMBYTE(0x10FDC6));


		fixPrintf(22, 6,1,3,"CARD_ADD: %05d", volMEMWORD(0x800000)); // 0x800000 to 0xBFFFFF memory card adress range
		fixPrintf(22, 7,1,3,"CARD_ERROR: %03d", volMEMBYTE(0xC0046E));
		fixPrintf(22, 8,1,3,"CARD_SIZE: %04d", volMEMWORD(0x10FDCC));

		fixPrintf( 3,10,1,3,"DATA SAVE AREA:");
		fixPrintf( 3,20,1,3,"DATA LOAD AREA:");

		// data save
		fixPrintf( 3,12,1,3,"%c%c%c%c%c%c%c%c%c%c", SAVE_FILE.title[0],  SAVE_FILE.title[1],  SAVE_FILE.title[2],  SAVE_FILE.title[3],  SAVE_FILE.title[4],  SAVE_FILE.title[5],  SAVE_FILE.title[6],  SAVE_FILE.title[7],  SAVE_FILE.title[8],  SAVE_FILE.title[9]);
		fixPrintf( 3,13,1,3,"%c%c%c%c%c%c%c%c%c%c", SAVE_FILE.title[10], SAVE_FILE.title[11], SAVE_FILE.title[12], SAVE_FILE.title[13], SAVE_FILE.title[14], SAVE_FILE.title[15], SAVE_FILE.title[16], SAVE_FILE.title[17], SAVE_FILE.title[18], SAVE_FILE.title[19]);
		fixPrintf( 3,14,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data[0],  SAVE_FILE.data[1],  SAVE_FILE.data[2],  SAVE_FILE.data[3],  SAVE_FILE.data[4],  SAVE_FILE.data[5],  SAVE_FILE.data[6],  SAVE_FILE.data[7],  SAVE_FILE.data[8],  SAVE_FILE.data[9]);
		fixPrintf( 3,15,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data[10], SAVE_FILE.data[11], SAVE_FILE.data[12], SAVE_FILE.data[13], SAVE_FILE.data[14], SAVE_FILE.data[15], SAVE_FILE.data[16], SAVE_FILE.data[17], SAVE_FILE.data[18], SAVE_FILE.data[19]);
		fixPrintf( 3,16,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data[20], SAVE_FILE.data[21], SAVE_FILE.data[22], SAVE_FILE.data[23], SAVE_FILE.data[24], SAVE_FILE.data[25], SAVE_FILE.data[26], SAVE_FILE.data[27], SAVE_FILE.data[28], SAVE_FILE.data[29]);
		fixPrintf( 3,17,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data[30], SAVE_FILE.data[31], SAVE_FILE.data[32], SAVE_FILE.data[33], SAVE_FILE.data[34], SAVE_FILE.data[35], SAVE_FILE.data[36], SAVE_FILE.data[37], SAVE_FILE.data[38], SAVE_FILE.data[39]);
		fixPrintf( 3,18,1,3,"%d%d%d%d",             SAVE_FILE.data[40], SAVE_FILE.data[41], SAVE_FILE.data[42], SAVE_FILE.data[43]);

		fixPrintf(15,12,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[0],  SAVE_FILE.data2[1],  SAVE_FILE.data2[2],  SAVE_FILE.data2[3],  SAVE_FILE.data2[4],  SAVE_FILE.data2[5],  SAVE_FILE.data2[6],  SAVE_FILE.data2[7],  SAVE_FILE.data2[8],  SAVE_FILE.data2[9]);
		fixPrintf(15,13,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[10], SAVE_FILE.data2[11], SAVE_FILE.data2[12], SAVE_FILE.data2[13], SAVE_FILE.data2[14], SAVE_FILE.data2[15], SAVE_FILE.data2[16], SAVE_FILE.data2[17], SAVE_FILE.data2[18], SAVE_FILE.data2[19]);
		fixPrintf(15,14,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[20], SAVE_FILE.data2[21], SAVE_FILE.data2[22], SAVE_FILE.data2[23], SAVE_FILE.data2[24], SAVE_FILE.data2[25], SAVE_FILE.data2[26], SAVE_FILE.data2[27], SAVE_FILE.data2[28], SAVE_FILE.data2[29]);
		fixPrintf(15,15,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[30], SAVE_FILE.data2[31], SAVE_FILE.data2[32], SAVE_FILE.data2[33], SAVE_FILE.data2[34], SAVE_FILE.data2[35], SAVE_FILE.data2[36], SAVE_FILE.data2[37], SAVE_FILE.data2[38], SAVE_FILE.data2[39]);
		fixPrintf(15,16,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[40], SAVE_FILE.data2[41], SAVE_FILE.data2[42], SAVE_FILE.data2[43], SAVE_FILE.data2[44], SAVE_FILE.data2[45], SAVE_FILE.data2[46], SAVE_FILE.data2[47], SAVE_FILE.data2[48], SAVE_FILE.data2[49]);
		fixPrintf(15,17,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data2[50], SAVE_FILE.data2[51], SAVE_FILE.data2[52], SAVE_FILE.data2[53], SAVE_FILE.data2[54], SAVE_FILE.data2[55], SAVE_FILE.data2[56], SAVE_FILE.data2[57], SAVE_FILE.data2[58], SAVE_FILE.data2[59]);
		fixPrintf(15,18,1,3,"%d%d%d%d",             SAVE_FILE.data2[60], SAVE_FILE.data2[61], SAVE_FILE.data2[62], SAVE_FILE.data2[63]);

		fixPrintf(27,12,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[0],  SAVE_FILE.data3[1],  SAVE_FILE.data3[2],  SAVE_FILE.data3[3],  SAVE_FILE.data3[4],  SAVE_FILE.data3[5],  SAVE_FILE.data3[6],  SAVE_FILE.data3[7],  SAVE_FILE.data3[8],  SAVE_FILE.data3[9]);
		fixPrintf(27,13,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[10], SAVE_FILE.data3[11], SAVE_FILE.data3[12], SAVE_FILE.data3[13], SAVE_FILE.data3[14], SAVE_FILE.data3[15], SAVE_FILE.data3[16], SAVE_FILE.data3[17], SAVE_FILE.data3[18], SAVE_FILE.data3[19]);
		fixPrintf(27,14,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[20], SAVE_FILE.data3[21], SAVE_FILE.data3[22], SAVE_FILE.data3[23], SAVE_FILE.data3[24], SAVE_FILE.data3[25], SAVE_FILE.data3[26], SAVE_FILE.data3[27], SAVE_FILE.data3[28], SAVE_FILE.data3[29]);
		fixPrintf(27,15,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[30], SAVE_FILE.data3[31], SAVE_FILE.data3[32], SAVE_FILE.data3[33], SAVE_FILE.data3[34], SAVE_FILE.data3[35], SAVE_FILE.data3[36], SAVE_FILE.data3[37], SAVE_FILE.data3[38], SAVE_FILE.data3[39]);
		fixPrintf(27,16,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[40], SAVE_FILE.data3[41], SAVE_FILE.data3[42], SAVE_FILE.data3[43], SAVE_FILE.data3[44], SAVE_FILE.data3[45], SAVE_FILE.data3[46], SAVE_FILE.data3[47], SAVE_FILE.data3[48], SAVE_FILE.data3[49]);
		fixPrintf(27,17,1,3,"%d%d%d%d%d%d%d%d%d%d", SAVE_FILE.data3[50], SAVE_FILE.data3[51], SAVE_FILE.data3[52], SAVE_FILE.data3[53], SAVE_FILE.data3[54], SAVE_FILE.data3[55], SAVE_FILE.data3[56], SAVE_FILE.data3[57], SAVE_FILE.data3[58], SAVE_FILE.data3[59]);
		fixPrintf(27,18,1,3,"%d%d%d%d",             SAVE_FILE.data3[60], SAVE_FILE.data3[61], SAVE_FILE.data3[62], SAVE_FILE.data3[63]);

		// data load
		fixPrintf( 3,22,1,3,"%c%c%c%c%c%c%c%c%c%c", LOAD_FILE.title[0],  LOAD_FILE.title[1],  LOAD_FILE.title[2],  LOAD_FILE.title[3],  LOAD_FILE.title[4],  LOAD_FILE.title[5],  LOAD_FILE.title[6],  LOAD_FILE.title[7],  LOAD_FILE.title[8],  LOAD_FILE.title[9]);
		fixPrintf( 3,23,1,3,"%c%c%c%c%c%c%c%c%c%c", LOAD_FILE.title[10], LOAD_FILE.title[11], LOAD_FILE.title[12], LOAD_FILE.title[13], LOAD_FILE.title[14], LOAD_FILE.title[15], LOAD_FILE.title[16], LOAD_FILE.title[17], LOAD_FILE.title[18], LOAD_FILE.title[19]);
		fixPrintf( 3,24,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data[0],  LOAD_FILE.data[1],  LOAD_FILE.data[2],  LOAD_FILE.data[3],  LOAD_FILE.data[4],  LOAD_FILE.data[5],  LOAD_FILE.data[6],  LOAD_FILE.data[7],  LOAD_FILE.data[8], LOAD_FILE.data[9]);
		fixPrintf( 3,25,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data[10], LOAD_FILE.data[11], LOAD_FILE.data[12], LOAD_FILE.data[13], LOAD_FILE.data[14], LOAD_FILE.data[15], LOAD_FILE.data[16], LOAD_FILE.data[17], LOAD_FILE.data[18], LOAD_FILE.data[19]);
		fixPrintf( 3,26,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data[20], LOAD_FILE.data[21], LOAD_FILE.data[22], LOAD_FILE.data[23], LOAD_FILE.data[24], LOAD_FILE.data[25], LOAD_FILE.data[26], LOAD_FILE.data[27], LOAD_FILE.data[28], LOAD_FILE.data[29]);
		fixPrintf( 3,27,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data[30], LOAD_FILE.data[31], LOAD_FILE.data[32], LOAD_FILE.data[33], LOAD_FILE.data[34], LOAD_FILE.data[35], LOAD_FILE.data[36], LOAD_FILE.data[37], LOAD_FILE.data[38], LOAD_FILE.data[39]);
		fixPrintf( 3,28,1,3,"%d%d%d%d",             LOAD_FILE.data[40], LOAD_FILE.data[41], LOAD_FILE.data[42], LOAD_FILE.data[43]);

		fixPrintf(15,22,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[0],  LOAD_FILE.data2[1],  LOAD_FILE.data2[2],  LOAD_FILE.data2[3],  LOAD_FILE.data2[4],  LOAD_FILE.data2[5],  LOAD_FILE.data2[6],  LOAD_FILE.data2[7],  LOAD_FILE.data2[8],  LOAD_FILE.data2[9]);
		fixPrintf(15,23,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[10], LOAD_FILE.data2[11], LOAD_FILE.data2[12], LOAD_FILE.data2[13], LOAD_FILE.data2[14], LOAD_FILE.data2[15], LOAD_FILE.data2[16], LOAD_FILE.data2[17], LOAD_FILE.data2[18], LOAD_FILE.data2[19]);
		fixPrintf(15,24,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[20], LOAD_FILE.data2[21], LOAD_FILE.data2[22], LOAD_FILE.data2[23], LOAD_FILE.data2[24], LOAD_FILE.data2[25], LOAD_FILE.data2[26], LOAD_FILE.data2[27], LOAD_FILE.data2[28], LOAD_FILE.data2[29]);
		fixPrintf(15,25,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[30], LOAD_FILE.data2[31], LOAD_FILE.data2[32], LOAD_FILE.data2[33], LOAD_FILE.data2[34], LOAD_FILE.data2[35], LOAD_FILE.data2[36], LOAD_FILE.data2[37], LOAD_FILE.data2[38], LOAD_FILE.data2[39]);
		fixPrintf(15,26,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[40], LOAD_FILE.data2[41], LOAD_FILE.data2[42], LOAD_FILE.data2[43], LOAD_FILE.data2[44], LOAD_FILE.data2[45], LOAD_FILE.data2[46], LOAD_FILE.data2[47], LOAD_FILE.data2[48], LOAD_FILE.data2[49]);
		fixPrintf(15,27,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data2[50], LOAD_FILE.data2[51], LOAD_FILE.data2[52], LOAD_FILE.data2[53], LOAD_FILE.data2[54], LOAD_FILE.data2[55], LOAD_FILE.data2[56], LOAD_FILE.data2[57], LOAD_FILE.data2[58], LOAD_FILE.data2[59]);
		fixPrintf(15,28,1,3,"%d%d%d%d",             LOAD_FILE.data2[60], LOAD_FILE.data2[61], LOAD_FILE.data2[62], LOAD_FILE.data2[63]);

		fixPrintf(27,22,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[0],  LOAD_FILE.data3[1],  LOAD_FILE.data3[2],  LOAD_FILE.data3[3],  LOAD_FILE.data3[4],  LOAD_FILE.data3[5],  LOAD_FILE.data3[6],  LOAD_FILE.data3[7],  LOAD_FILE.data3[8],  LOAD_FILE.data3[9]);
		fixPrintf(27,23,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[10], LOAD_FILE.data3[11], LOAD_FILE.data3[12], LOAD_FILE.data3[13], LOAD_FILE.data3[14], LOAD_FILE.data3[15], LOAD_FILE.data3[16], LOAD_FILE.data3[17], LOAD_FILE.data3[18], LOAD_FILE.data3[19]);
		fixPrintf(27,24,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[20], LOAD_FILE.data3[21], LOAD_FILE.data3[22], LOAD_FILE.data3[23], LOAD_FILE.data3[24], LOAD_FILE.data3[25], LOAD_FILE.data3[26], LOAD_FILE.data3[27], LOAD_FILE.data3[28], LOAD_FILE.data3[29]);
		fixPrintf(27,25,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[30], LOAD_FILE.data3[31], LOAD_FILE.data3[32], LOAD_FILE.data3[33], LOAD_FILE.data3[34], LOAD_FILE.data3[35], LOAD_FILE.data3[36], LOAD_FILE.data3[37], LOAD_FILE.data3[38], LOAD_FILE.data3[39]);
		fixPrintf(27,26,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[40], LOAD_FILE.data3[41], LOAD_FILE.data3[42], LOAD_FILE.data3[43], LOAD_FILE.data3[44], LOAD_FILE.data3[45], LOAD_FILE.data3[46], LOAD_FILE.data3[47], LOAD_FILE.data3[48], LOAD_FILE.data3[49]);
		fixPrintf(27,27,1,3,"%d%d%d%d%d%d%d%d%d%d", LOAD_FILE.data3[50], LOAD_FILE.data3[51], LOAD_FILE.data3[52], LOAD_FILE.data3[53], LOAD_FILE.data3[54], LOAD_FILE.data3[55], LOAD_FILE.data3[56], LOAD_FILE.data3[57], LOAD_FILE.data3[58], LOAD_FILE.data3[59]);
		fixPrintf(27,28,1,3,"%d%d%d%d",             LOAD_FILE.data3[60], LOAD_FILE.data3[61], LOAD_FILE.data3[62], LOAD_FILE.data3[63]);

		SCClose();

	}while(!(p1&JOY_D));
}

int main(void)
{
	while(1)
	{
		memory_card();
	}
}