   // Animate conveyors: 
   byte conveyor_offset = (7 & state.t) ^ (state.conveyordir ? 0 : 7);
   uint32_t level_chars = TILES_MEM + 15 * 64 * state.level;
-  GD.wr_n(level_chars + 4 * 64, state.conveyor0 + conveyor_offset, 8);
-  GD.wr_n(level_chars + 4 * 64 + 3 * 8, state.conveyor1 + (7 ^ conveyor_offset), 8);
+  GD.cmd_memwrite(level_chars + 4 * 64, 8);
+  GD.copyram(state.conveyor0 + conveyor_offset, 8);
+  GD.cmd_memwrite(level_chars + 4 * 64 + 3 * 8, 8);
+  GD.copyram(state.conveyor1 + (7 ^ conveyor_offset), 8);
 
   // Willy movement
   // See http://www.seasip.demon.co.uk/Jsw/manic.mac

    load_level();
    state.alive = 1;
    while (state.alive) {
uint32_t t0 = GD.rd32(REG_FRAMES);
      draw_all();
      move_all();
uint32_t t1 = GD.rd32(REG_FRAMES);
      printf("Took %d frames\n", (t1 - t0) & 0xff);
    }
  }
  game_over();

    // sprintf(debug, "jumping=%d index=%d (%d,%d)", state.jumping, index, state.wx, state.wy);
  }
  uint32_t feet_addr = atxy(state.wx >> 3, (state.wy + 16) >> 3);
  byte elems[2];
  GD.rd_n(elems, feet_addr, 2);
  byte elem = ((1 <= elems[0]) && (elems[0] <= 31)) ? elems[0] : elems[1];

  byte dx = 0xff;
  byte first_jump = (con & CONTROL_JUMP) && state.lastdx == 0xff;
