- { dynamic_array_area[dynamic_array_area_size + 4*i] = (VAL.value >> 24) & 0xFF;
- dynamic_array_area[dynamic_array_area_size + 4*i+1] = (VAL.value >> 16) & 0xFF;
- dynamic_array_area[dynamic_array_area_size + 4*i+2] = (VAL.value >> 8) & 0xFF;
- dynamic_array_area[dynamic_array_area_size + 4*i+3] = (VAL.value) & 0xFF;
- if (VAL.marker != 0)
- backpatch_zmachine(VAL.marker, ARRAY_ZA,
- dynamic_array_area_size - 4*MAX_GLOBAL_VARIABLES + 4*i);
+ {
+ int32 addr = area_size + 4*i;
+ area[addr] = (VAL.value >> 24) & 0xFF;
+ area[addr+1] = (VAL.value >> 16) & 0xFF;
+ area[addr+2] = (VAL.value >> 8) & 0xFF;
+ area[addr+3] = (VAL.value) & 0xFF;
+ if (VAL.marker != 0) {
+ if (!is_static) {
+ backpatch_zmachine(VAL.marker, DYNAMIC_ARRAY_ZA,
+ addr - 4*MAX_GLOBAL_VARIABLES);
+ }
+ else {
+ /* We can't use backpatch_zmachine() because that only applies to RAM. Instead we add an entry to staticarray_backpatch_table.
+ A backpatch entry is five bytes: *_MV followed by the array offset (in static array area). */
+ write_byte_to_memory_block(&staticarray_backpatch_table,
+ staticarray_backpatch_size++,
+ VAL.marker);
+ write_byte_to_memory_block(&staticarray_backpatch_table,
+ staticarray_backpatch_size++, ((addr >> 24) & 0xFF));
+ write_byte_to_memory_block(&staticarray_backpatch_table,
+ staticarray_backpatch_size++, ((addr >> 16) & 0xFF));
+ write_byte_to_memory_block(&staticarray_backpatch_table,
+ staticarray_backpatch_size++, ((addr >> 8) & 0xFF));
+ write_byte_to_memory_block(&staticarray_backpatch_table,
+ staticarray_backpatch_size++, (addr & 0xFF));
+ }
+ }