void
0x17e()
{
	save(si);

	xchg(ax, si);
	xchg(ax, dx);
	if (ax) {
		ax *= bx;
	}
	if (cx) {
		xchg(ax, cx);
		ax *= si;
		ax += cx;
	}
	xchg(ax, si);
	ax *= bx;
	dx += si;

	load(si);
}

void
0x262()
{
	if (cl >= 0x10) {
		cl -= 0x10;
		xchg(ax, dx);
		ax = 0;
		dx = dx << cl;
	} else {
		bx = ax;
		ax = ax << cl;
		dx = dx << cl;
		cl = ~cl;
		cl += 0x10;
		bx = bx >> cl;
		dx |= bx;
	}
}

void
0x283()
{
	if (cl >= 0x10) {
		cl -= 0x10;
		xchg(ax, dx);
		dx = extend_dword(ax);
		ax >>= cl;
	} else {
		bx = dx;
		ax >>= cl;
		dx >>= cl;
		cl = ~cl;
		cl += 0x10;
		bx <<= cl;
		ax |= bx;
	}
}

void
function()
{
	enter();

	save(si);

	ax = *(bp + 0x6);
	ax &= 0xf;
	*(bp - 0x6) = ax;
	dx = extend_dword(ax);

	bx = *(bp + 0xc);

	save(ax);
	save(dx);
	save(bx);
	load(ax);
	load(dx);
	load(cx);

	bx = *(bp + 0xa);
	bx += cx;
	ax += dx + carry;
	save(bx);
	save(ax);

	ax = *(bp - 0x6);
	dx = extend_dword(ax);
	save(ax);
	save(dx);

	dx = *(bp + 0x10);
	ax = *(bp + 0xe);

	load(bx);
	load(cx);
	ax += cx;
	dx += bx + carry;

	load(cx);
	load(bx);

	((void *()) 0x17e)();

	/* Tohle vypada tak hashovite ;-)). */
	bx = *(bp + 0xc);
	cx = *(bp + 0xa);
	cx += *(bp + 0xe);
	bx += *(bp + 0x10) + carry;
	cx += *(bp + 0x12);
	bx += *(bp + 0x14) + carry;
	cx += *(bp + 0x6);
	bx += *(bp + 0x8) + carry;
	cx += ax;
	bx += dx;

	ax = *(bp - 0x6);
	dx = extend_dword(ax);

	si = *(bp + 0x14);

	save(cx);
	save(bx);

	bx = *(bp + 0x12);
	bx += ax;
	si += dx + carry;
	ax = *(bp - 0x6);
	dx = extend_dword(ax);

	save(bx);
	save(si);
	save(ax);
	save(dx);

	dx = *(bp + 0x8);
	ax = *(bp + 0x6);
	load(bx);
	load(cx);
	ax += cx;
	dx += bx + carry;
	load(bx);
	load(cx);
	
	((void *()) 0x17e)();

	load(bx);
	load(cx);
	cx += ax;
	bx += dx + carry;

	*(bp - 0x2) = bx;
	*(bp - 0x4) = cx;
	dx = *(bp - 0x2);
	ax = *(bp - 0x4);
	cl = *(bp - 0x6); /* cx = cx & 0xff00 | (*(bp - 0x6) & 0xff) */

	((void *()) 0x262)(); /* huh, to je nejake divne ;-) */

	bx = *(bp - 0x2);
	cx = *(bp - 0x4);

	cx += ax;
	bx += dx + carry;
	dx = *(bp - 0xc);
	ax = *(bp - 0xa);

	save(cx);
	cl = 0x7;
	save(bx);

	((void *()) 0x262)(); /* huh, to je nejake divne ;-) */

	load(bx);
	load(cx);

	cx += ax;
	bx += dx + carry;
	dx = *(bp + 0x14);
	ax = *(bp + 0x12);

	save(cx);
	cl = 0xb;
	save(bx);

	((void *()) 0x262)(); /* huh, to je nejake divne ;-) */
	
	load(bx);
	load(cx);

	cx += ax;
	bx += dx + carry;
	dx = *(bp + 0x10);
	ax = *(bp + 0xe);

	save(cx);
	cl = 0x11;
	save(bx);

	((void *()) 0x262)(); /* huh, to je nejake divne ;-) */

	load(bx);
	load(cx);

	cx += ax;
	bx += dx + carry;
	dx = *(bp - 0x2);
	ax = *(bp - 0x4);

	cl = 0xd;

	((void *()) 0x262)(); /* huh, to je nejake divne ;-) */

	save(ax);
	save(dx);

	dx = *(bp - 0x2);
	ax = *(bp - 0x4);

	cl = 0xf;

	((void *()) 0x283)(); /* huh, to je take nejake divne ;-) */
	
	load(bx);
	load(cx);

	cx += ax;
	bx += dx + carry;
	*(bp - 0x4) = cx;
	*(bp - 0x2) = bx;
	*(bp - 0x4) &= 0xffff;
	*(bp - 0x2) &= 0x7fff;
	*(bp - 0x4) |= 0x0;
	*(bp - 0x2) |= 0x4000;

	dx = *(bp - 0x2);
	ax = *(bp - 0x4);

	goto _3528;
_3528:
	load(si);

	leave();
}
