/*
 * output one group of 3 bytes, pointed at by p, on file f.
 */
outdec(p, f)
char *p;
FILE *f;
{
	int c1, c2, c3, c4;

	c1 = *p >> 2;
	c2 = (*p << 4) & 060 | (p[1] >> 4) & 017;
	c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
	c4 = p[2] & 077;
	putc(ENC(c1), f);
	putc(ENC(c2), f);
	putc(ENC(c3), f);
	putc(ENC(c4), f);
}

/* ENC is the basic 1 character encoding function to make a char printing */
#define ENC(c) (((c) & 077) + ' ')

/*
with luck with will compile to:
	
	mov al, [esi]
	shr al, 2
	add al, ' '
	stosb
	mov al, [esi]
	shl al, 4
	and al, 60o
	mov ah, [esi+1]
	shr ah, 4
	and ah, 017o
	or al,ah
	add al, ' '
	stosb
	mov al, [esi+1]
	shl al, 2
	and al, 074o
	mov ah, [esi+2]
	shr ah, 6
	and ah, 03o
	or al,ah
	add al, ' '
	stosb
	mov al,[esi+2]
	and al, 077o
	add al, ' '
	stosb		

which is beaten all to hell by:

	lodsw
	dec esi
	mov edx,eax
	mov ecx,4
	.Repeat
		and al, 00111111y
		add al, ' '
		stosb
		shr edx, 6
		mov al,dl
		.Untilcxz