Example #1
0
        }/* 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 */
Example #2
0
        }/* 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 */
Example #3
0
        }/* 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 */