aboutsummaryrefslogtreecommitdiff
path: root/engines/glk/frotz/processor_streams.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/glk/frotz/processor_streams.cpp')
-rw-r--r--engines/glk/frotz/processor_streams.cpp211
1 files changed, 19 insertions, 192 deletions
diff --git a/engines/glk/frotz/processor_streams.cpp b/engines/glk/frotz/processor_streams.cpp
index 091165ed7c..cbef38aaa6 100644
--- a/engines/glk/frotz/processor_streams.cpp
+++ b/engines/glk/frotz/processor_streams.cpp
@@ -545,227 +545,54 @@ void Processor::z_restart() {
}
void Processor::z_save() {
-#ifdef TODO
bool success = false;
if (zargc != 0) {
// Open auxilary file
frefid_t ref = glk_fileref_create_by_prompt(fileusage_Data | fileusage_BinaryMode,
filemode_Write, 0);
- if (ref == nullptr)
- goto finished;
+ if (ref != nullptr) {
+ // Write data
+ strid_t f = glk_stream_open_file(ref, filemode_Write);
- // Write data
- strid_t f = glk_stream_open_file(ref, filemode_Write);
+ glk_put_buffer_stream(f, (const char *)zmp + zargs[0], zargs[1]);
- glk_put_buffer_stream(f, (const char *)zmp + zargs[0], zargs[1]);
-
- glk_stream_close(f);
-
- } else {
- long pc;
- zword addr;
- zword nsp, nfp;
- int skip;
- int i;
-
- /* Open game file */
-
- if ((gfp = frotzopenprompt (FILE_SAVE)) == nullptr)
- goto finished;
-
- if (_save_quetzal) {
- success = save_quetzal (gfp, story_fp, blorb_ofs);
- } else {
- /* Write game file */
-
- fputc ((int) hi (h_release), gfp);
- fputc ((int) lo (h_release), gfp);
- fputc ((int) hi (h_checksum), gfp);
- fputc ((int) lo (h_checksum), gfp);
-
- GET_PC (pc)
-
- fputc ((int) (pc >> 16) & 0xff, gfp);
- fputc ((int) (pc >> 8) & 0xff, gfp);
- fputc ((int) (pc) & 0xff, gfp);
-
- nsp = (int) (_sp - _stack);
- nfp = (int) (_fp - _stack);
-
- fputc ((int) hi (nsp), gfp);
- fputc ((int) lo (nsp), gfp);
- fputc ((int) hi (nfp), gfp);
- fputc ((int) lo (nfp), gfp);
-
- for (i = nsp; i < STACK_SIZE; i++) {
- fputc ((int) hi (_stack[i]), gfp);
- fputc ((int) lo (_stack[i]), gfp);
- }
-
- fseek (story_fp, blorb_ofs, SEEK_SET);
-
- for (addr = 0, skip = 0; addr < h_dynamic_size; addr++)
- if (zmp[addr] != fgetc (story_fp) || skip == 255 || addr + 1 == h_dynamic_size) {
- fputc (skip, gfp);
- fputc (zmp[addr], gfp);
- skip = 0;
- } else skip++;
+ glk_stream_close(f);
+ success = true;
}
-
- /* Close game file and check for errors */
-
- if (fclose (gfp) == EOF || ferror (story_fp)) {
- print_string ("Error writing save file\n");
- goto finished;
- }
-
- /* Success */
-
- success = 1;
-
+ } else {
+ success = saveGame().getCode() == Common::kNoError;
}
-finished:
-
if (h_version <= V3)
branch (success);
else
store (success);
-#endif
}
void Processor::z_restore() {
-#ifdef TODO
- FILE *gfp;
-
- zword success = 0;
+ bool success = false;
if (zargc != 0) {
+ frefid_t ref = glk_fileref_create_by_prompt(fileusage_Data | fileusage_BinaryMode,
+ filemode_Read, 0);
+ if (ref != nullptr) {
+ // Write data
+ strid_t f = glk_stream_open_file(ref, filemode_Read);
- /* Get the file name */
-
- /* Open auxilary file */
-
- if ((gfp = frotzopenprompt(FILE_LOAD_AUX)) == nullptr)
- goto finished;
-
- /* Load auxilary file */
-
- success = fread (zmp + zargs[0], 1, zargs[1], gfp);
-
- /* Close auxilary file */
-
- fclose (gfp);
-
- } else {
-
- long pc;
- zword release;
- zword addr;
- int i;
-
- /* Open game file */
-
- if ((gfp = frotzopenprompt(FILE_RESTORE)) == nullptr)
- goto finished;
-
- if (_save_quetzal) {
- success = restore_quetzal (gfp, story_fp, blorb_ofs);
-
- } else {
- /* Load game file */
-
- release = (unsigned) fgetc (gfp) << 8;
- release |= fgetc (gfp);
-
- () fgetc (gfp);
- () fgetc (gfp);
-
- /* Check the release number */
-
- if (release == h_release) {
-
- pc = (long) fgetc (gfp) << 16;
- pc |= (unsigned) fgetc (gfp) << 8;
- pc |= fgetc (gfp);
-
- SET_PC (pc);
-
- _sp = _stack + (fgetc (gfp) << 8);
- _sp += fgetc (gfp);
- _fp = _stack + (fgetc (gfp) << 8);
- _fp += fgetc (gfp);
-
- for (i = (int) (_sp - _stack); i < STACK_SIZE; i++) {
- _stack[i] = (unsigned) fgetc (gfp) << 8;
- _stack[i] |= fgetc (gfp);
- }
-
- fseek (story_fp, blorb_ofs, SEEK_SET);
-
- for (addr = 0; addr < h_dynamic_size; addr++) {
- int skip = fgetc (gfp);
- for (i = 0; i < skip; i++)
- zmp[addr++] = fgetc (story_fp);
- zmp[addr] = fgetc (gfp);
- () fgetc (story_fp);
- }
-
- /* Check for errors */
-
- if (ferror (gfp) || ferror (story_fp) || addr != h_dynamic_size)
- success = -1;
- else
-
- /* Success */
-
- success = 2;
+ glk_get_buffer_stream(f, (char *)zmp + zargs[0], zargs[1]);
- } else print_string ("Invalid save file\n");
+ glk_stream_close(f);
+ success = true;
}
-
- if ((short) success >= 0) {
-
- /* Close game file */
-
- fclose (gfp);
-
- if ((short) success > 0) {
- zbyte old_screen_rows;
- zbyte old_screen_cols;
-
- /* In V3, reset the upper window. */
- if (h_version == V3)
- split_window (0);
-
- LOW_BYTE (H_SCREEN_ROWS, old_screen_rows);
- LOW_BYTE (H_SCREEN_COLS, old_screen_cols);
-
- /* Reload cached header fields. */
- restart_header ();
-
- /*
- * Since QUETZAL files may be saved on many different machines,
- * the screen sizes may vary a lot. Erasing the status window
- * seems to cover up most of the resulting badness.
- */
- if (h_version > V3 && h_version != V6
- && (h_screen_rows != old_screen_rows
- || h_screen_cols != old_screen_cols))
- erase_window (1);
- }
- } else
- os_fatal ("Error reading save file");
+ } else {
+ success = loadGame().getCode() == Common::kNoError;
}
-finished:
-
if (h_version <= V3)
branch (success);
else
store (success);
-#endif
}
void Processor::z_verify() {