export function writeCustomEvent(dataView: DataView, spaceEvent: ISpaceEvent, info: IEventWriteInfo, asm: string, temp: any) {
  $$log("Writing custom event", spaceEvent, info);

  // Assemble and write
  if (info.gameVersion === 1) {
    return asm;
  }

  const customEvent = createCustomEvent(asm);
  const preppedAsm = prepAsm(asm, customEvent, spaceEvent, info);
  const bytes = assemble(preppedAsm) as ArrayBuffer;
  $$log(preppedAsm);
  copyRange(dataView, bytes, 0, 0, bytes.byteLength);
  return [info.offset!, bytes.byteLength];
}
  testAssemble: function(asm: string, parameters?: IEventParameter[], info: Partial<IEventWriteInfo> = {}) {
    // Make fake parameterValues
    const parameterValues: any = {};
    if (parameters && parameters.length) {
      parameters.forEach(parameter => {
        parameterValues[parameter.name] = 0;
      });
    }

    const customEvent = createCustomEvent(asm);
    const preppedAsm = prepAsm(asm, customEvent, { parameterValues } as ISpaceEvent, Object.assign({
      addr: 0,
    }, info) as IEventWriteInfo);
    const bytes = assemble(preppedAsm) as ArrayBuffer;
    return bytes;
  }
      }

      return true;
    }
    return false;
  },
  write(dataView: DataView, event: ISpaceEvent, info: IEventWriteInfo, temp: any) {
    let staticHelperJal = 0;
    if (info.boardIndex === 0)
      staticHelperJal = 0x80108C1C;
    else
      throw `ChainMerge3 for ${info.boardIndex} needs work`;

    const asm = prepAsm(`
      ADDIU SP, SP, -0x18
      SW    RA, 0x10(SP)
      ADDIU A0, R0, ${event.parameterValues!.prevSpace}
      ADDIU A1, R0, ${event.parameterValues!.chain || 0}
      JAL   ${$$hex(staticHelperJal)}
      ADDIU A2, R0, ${event.parameterValues!.spaceIndex || 0}
      LW    RA, 0x10(SP)
      JR    RA
      ADDIU SP, SP, 0x18
    `, ChainMerge3, event, info);
    const bytes = assemble(asm) as ArrayBuffer;
    copyRange(dataView, bytes, 0, 0, bytes.byteLength);
    return [info.offset!, bytes.byteLength];
  },
}
addEventToLibrary(ChainMerge3);
        return true;
      }
    }

    return false;
  },

  // TODO: We can do a O(1) + n/2 style improvement for this event.
  write(dataView: DataView, event: ISpaceEvent, info: IEventWriteInfo, temp: any) {
    const asm = `
      ADDIU SP, SP, -0x18
      SW    RA, 0x10(SP)
      ADDIU A0, R0, -1
      ADDIU A1, R0, ${event.parameterValues!.chain as number}
      JAL   SetNextChainAndSpace
      ADDIU A2, R0, ${event.parameterValues!.spaceIndex || 0}
      LW    RA, 0x10(SP)
      JR    RA
      ADDIU SP, SP, 0x18
    `;

    if (info.gameVersion === 1) {
      return asm;
    }
    const bytes = assemble(prepAsm(asm, ChainMerge, event, info)) as ArrayBuffer;
    copyRange(dataView, bytes, 0, 0, bytes.byteLength);
    return [info.offset!, bytes.byteLength];
  }
};
addEventToLibrary(ChainMerge);