From 619439c420ce886bd45db3da66be0e497a7d12ac Mon Sep 17 00:00:00 2001 From: "K.Ohta" Date: Fri, 7 May 2021 20:45:21 +0900 Subject: [PATCH] [VM][FMTOWNS][ICCARD] Improve logic around open/close. --- source/src/vm/fmtowns/iccard.cpp | 61 ++++++++++++++++++++-------------------- source/src/vm/fmtowns/iccard.h | 2 +- 2 files changed, 31 insertions(+), 32 deletions(-) diff --git a/source/src/vm/fmtowns/iccard.cpp b/source/src/vm/fmtowns/iccard.cpp index d88d9d1da..914fc0df2 100644 --- a/source/src/vm/fmtowns/iccard.cpp +++ b/source/src/vm/fmtowns/iccard.cpp @@ -31,19 +31,16 @@ void TOWNS_ICCARD::initialize() void TOWNS_ICCARD::release() { - if(!(is_rom) && (is_dirty) && (card_state == 0x00)) { - close_cart(); - } - if(mem != NULL) { - free(mem); - mem = NULL; - } + close_cart(); } bool TOWNS_ICCARD::open_cart(const _TCHAR *file_path) { + close_cart(); + if(file_path == NULL) return false; if(strlen(file_path) <= 0) return false; + FILEIO* fio = new FILEIO(); uint32_t file_size; @@ -66,47 +63,49 @@ bool TOWNS_ICCARD::open_cart(const _TCHAR *file_path) } else { if(mem != NULL) free(mem); mem = NULL; + card_state = 0x02; // Imcomplete. } } is_dirty = false; mem_size = 0; + fio->Fclose(); } - fio->Fclose(); delete fio; return false; // file not exists, keep data. } -bool TOWNS_ICCARD::close_cart() +void TOWNS_ICCARD::close_cart() { - if((mem == NULL) || (mem_size == 0)) return false; // Nothing to save. - if(card_state != 0x00) return false; // Not using card. - - FILEIO* fio = new FILEIO(); + bool is_mem_null = (mem == nullptr) ? true : false; + bool is_mem_empty = (mem_size == 0) ? true : false; + bool is_card_not_inserted = (card_state != 0x00) ? true : false; + bool __state = ((is_mem_null) || (is_mem_empty) || (is_card_not_inserted)) ? true : false; - card_changed = true; if((is_dirty) && !(is_rom)) { - if(fio->Fopen(filename, FILEIO_WRITE_BINARY)) { - fio->Fwrite(mem, mem_size, 1); - is_dirty = false; - free(mem); - mem = NULL; - mem_size = 0; - memset(filename, 0x00, sizeof(filename)); - fio->Fclose(); + if((strlen(filename) > 0) && !(__state)) { + FILEIO* fio = new FILEIO(); + if(fio->Fopen(filename, FILEIO_WRITE_BINARY)) { + fio->Fwrite(mem, mem_size, 1); + is_dirty = false; + fio->Fclose(); + } delete fio; - return true; } - } else { - // Discard only - is_dirty = false; + } + + if(mem != nullptr) { free(mem); mem = NULL; - mem_size = 0; - memset(filename, 0x00, sizeof(filename)); - return true; } - delete fio; - return false; + mem_size = 0; + card_state = 0x03; // Empty + card_changed = false; + is_rom = true; + is_dirty = false; + + memset(filename, 0x00, sizeof(filename)); + + return; } bool TOWNS_ICCARD::new_alloc(uint32_t new_size) diff --git a/source/src/vm/fmtowns/iccard.h b/source/src/vm/fmtowns/iccard.h index 105197f70..93636ac0b 100644 --- a/source/src/vm/fmtowns/iccard.h +++ b/source/src/vm/fmtowns/iccard.h @@ -52,7 +52,7 @@ public: virtual void __FASTCALL write_io8(uint32_t addr, uint32_t data); virtual bool open_cart(const _TCHAR *file_path); - virtual bool close_cart(); + virtual void close_cart(); virtual bool process_state(FILEIO* state_fio, bool loading); -- 2.11.0