From 5451101f7551973566fd57339bd14c11dff903ca Mon Sep 17 00:00:00 2001 From: franchiopin Date: Tue, 21 May 2024 21:33:41 +0100 Subject: [PATCH] save state to file in C attempt --- .vscode/settings.json | 3 ++- source/main.S | 6 ++++-- source/save_state.c | 23 ++++++++++++++--------- 3 files changed, 20 insertions(+), 12 deletions(-) diff --git a/.vscode/settings.json b/.vscode/settings.json index ea35c0b..a938144 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -2,6 +2,7 @@ "makefile.makefilePath": "", "files.associations": { "platform-nspire.h": "c", - "*.inc": "c" + "*.inc": "c", + "stdint.h": "c" } } \ No newline at end of file diff --git a/source/main.S b/source/main.S index 5a74c13..7d44a35 100644 --- a/source/main.S +++ b/source/main.S @@ -396,8 +396,10 @@ save_state: - mov r0, saved_state_cpu_status - str r1, saved_state_cpu_cpsr + ldr r0, =saved_state_cpu_status + ldr r1, =saved_state_cpu_cpsr + sub r2, r9, #s_SIZE + bl write_save_state ldr lr, saved_state_cpu_status+56 // subroutine return diff --git a/source/save_state.c b/source/save_state.c index d76b361..8eecc57 100644 --- a/source/save_state.c +++ b/source/save_state.c @@ -4,22 +4,27 @@ #include -#define s_SIZE 0x4600; +#define s_SIZE 0x4600 -void write_save_state(uint32_t saved_state_cpu_status_addr, uint32_t saved_state_cpu_cpsr); +const size_t cpu_status_size = (15 * sizeof(uint16_t)); -void write_save_state(uint32_t saved_state_cpu_status_addr, uint32_t saved_state_cpu_cpsr){ - size_t lenght = s_SIZE; +void write_save_state(uint8_t* saved_state_cpu_status_addr, uint8_t* saved_state_cpu_cpsr, void* state_ds_addr); - size_t data_size = s_SIZE + sizeof(uint32_t); - uint32_t *data = malloc(data_size); +void write_save_state(uint8_t* saved_state_cpu_status_addr, uint8_t* saved_state_cpu_cpsr, void* state_ds_addr){ + size_t data_size = cpu_status_size + sizeof(uint8_t) + s_SIZE; + uint8_t *data = malloc(data_size); + uint8_t *data_start = data; - memcpy(data, saved_state_cpu_status_addr, lenght); + memcpy(data, state_ds_addr, s_SIZE); + data += s_SIZE; - data[data_size-1] = saved_state_cpu_cpsr; + memcpy(data, saved_state_cpu_status_addr, cpu_status_size); + data += cpu_status_size; + + memcpy(data, saved_state_cpu_cpsr, 1); FILE* savefile = fopen("/documents/ndless/test.tns", "wb"); - fwrite(data, data_size, 1, savefile); + fwrite(data_start, data_size, 1, savefile); fclose(savefile); } \ No newline at end of file