auto SPC7110::alu_multiply() -> void {
  add_clocks(30);

  if(r482e & 1) {
    //signed 16-bit x 16-bit multiplication
    int16 r0 = (int16)(r4824 | r4825 << 8);
    int16 r1 = (int16)(r4820 | r4821 << 8);

    int result = r0 * r1;
    r4828 = result;
    r4829 = result >> 8;
    r482a = result >> 16;
    r482b = result >> 24;
  } else {
    //unsigned 16-bit x 16-bit multiplication
    uint16 r0 = (uint16)(r4824 | r4825 << 8);
    uint16 r1 = (uint16)(r4820 | r4821 << 8);

    uint result = r0 * r1;
    r4828 = result;
    r4829 = result >> 8;
    r482a = result >> 16;
    r482b = result >> 24;
  }

  r482f &= 0x7f;
}

auto SPC7110::alu_divide() -> void {
  add_clocks(40);

  if(r482e & 1) {
    //signed 32-bit x 16-bit division
    int32 dividend = (int32)(r4820 | r4821 << 8 | r4822 << 16 | r4823 << 24);
    int16 divisor  = (int16)(r4826 | r4827 << 8);

    int32 quotient;
    int16 remainder;

    if(divisor) {
      quotient  = (int32)(dividend / divisor);
      remainder = (int32)(dividend % divisor);
    } else {
      //illegal division by zero
      quotient  = 0;
      remainder = dividend;
    }

    r4828 = quotient;
    r4829 = quotient >> 8;
    r482a = quotient >> 16;
    r482b = quotient >> 24;

    r482c = remainder;
    r482d = remainder >> 8;
  } else {
    //unsigned 32-bit x 16-bit division
    uint32 dividend = (uint32)(r4820 | r4821 << 8 | r4822 << 16 | r4823 << 24);
    uint16 divisor  = (uint16)(r4826 | r4827 << 8);

    uint32 quotient;
    uint16 remainder;

    if(divisor) {
      quotient  = (uint32)(dividend / divisor);
      remainder = (uint16)(dividend % divisor);
    } else {
      //illegal division by zero
      quotient  = 0;
      remainder = dividend;
    }

    r4828 = quotient;
    r4829 = quotient >> 8;
    r482a = quotient >> 16;
    r482b = quotient >> 24;

    r482c = remainder;
    r482d = remainder >> 8;
  }

  r482f &= 0x7f;
}
