}/* mem_undiff */ /* * restore_undo * * This function does the dirty work for z_restore_undo. * */ internal static int restore_undo() { if (main.option_undo_slots == 0) /* undo feature unavailable */ { return(-1); } if (undo_mem.Count == 0) { return(0); } /* undo possible */ undo_struct undo = undo_mem[undo_mem.Count - 1]; System.Array.Copy(prev_zmp, ZMData, main.h_dynamic_size); SET_PC(undo.pc); main.sp = undo.sp; main.fp = undo.frame_offset; main.frame_count = undo.frame_count; mem_undiff(undo.undo_data, undo.diff_size, prev_zmp); // System.Array.Copy(undo.stack, 0, main.stack, undo.sp, undo.stack.Length); Frotz.Other.ArrayCopy.Copy(undo.stack, 0, main.stack, undo.sp, undo.stack.Length); undo_mem.Remove(undo); restart_header(); return(2); }/* restore_undo */
}/* z_save */ /* * save_undo * * This function does the dirty work for z_save_undo. * */ internal static int save_undo() { long diff_size; int stack_size; undo_struct p; if (main.option_undo_slots == 0) /* undo feature unavailable */ { return(-1); } /* save undo possible */ if (undo_count == main.option_undo_slots) { free_undo(1); } p = new undo_struct(); diff_size = mem_diff(ZMData, prev_zmp, main.h_dynamic_size, undo_diff); stack_size = main.stack.Length; GET_PC(out p.pc); p.frame_count = main.frame_count; p.diff_size = diff_size; p.stack_size = (zword)stack_size; p.frame_offset = (zword)main.fp; // p->frame_offset = fp - stack; // p.undo_data = undo_diff; p.undo_data = new zbyte[diff_size]; // System.Array.Copy(undo_diff, p.undo_data, diff_size); Frotz.Other.ArrayCopy.Copy(undo_diff, 0, p.undo_data, 0, diff_size); p.stack = new zword[main.stack.Length - main.sp]; // System.Array.Copy(main.stack, main.sp, p.stack, 0, main.stack.Length - main.sp); Frotz.Other.ArrayCopy.Copy(main.stack, main.sp, p.stack, 0, main.stack.Length - main.sp); p.sp = main.sp; undo_mem.Add(p); return(1); }/* save_undo */
}/* z_save */ /* * save_undo * * This function does the dirty work for z_save_undo. * */ internal static int save_undo() { long diff_size; int stack_size; undo_struct p; if (main.option_undo_slots == 0) /* undo feature unavailable */ return -1; /* save undo possible */ if (undo_count == main.option_undo_slots) free_undo(1); p = new undo_struct(); diff_size = mem_diff(ZMData, prev_zmp, main.h_dynamic_size, undo_diff); stack_size = main.stack.Length; GET_PC(out p.pc); p.frame_count = main.frame_count; p.diff_size = diff_size; p.stack_size = (zword)stack_size; p.frame_offset = (zword)main.fp; // p->frame_offset = fp - stack; // p.undo_data = undo_diff; p.undo_data = new zbyte[diff_size]; // System.Array.Copy(undo_diff, p.undo_data, diff_size); Frotz.Other.ArrayCopy.Copy(undo_diff, 0, p.undo_data, 0, diff_size); p.stack = new zword[main.stack.Length - main.sp]; // System.Array.Copy(main.stack, main.sp, p.stack, 0, main.stack.Length - main.sp); Frotz.Other.ArrayCopy.Copy(main.stack, main.sp, p.stack, 0, main.stack.Length - main.sp); p.sp = main.sp; undo_mem.Add(p); return 1; }/* save_undo */