Date : Mon, 26 Mar 2001 15:12:23 -0800 (PST)
From : Thomas Harte <t.harte@...>
Subject: Re: 2 requests
Sent my reply straight to the original poster, as I usually quite stupidly
do, but is this a good solution to 'decoding a BBC [80 column] screen
address' ?
int x, y;
/* gets x and y in either
3 and's
8 shifts
7 adds
1 conditional branch
or
3 and's
10 shifts
8 adds
1 conditional branch
*/
void get_addr(int offset)
{
int yoffs;
/* take away bottom 3 bits */
yoffs = offset&7;
offset >>= 3;
/* in order to divide by 80, divide by 16 first, since 5*16=80 */
y = offset >> 4;
/*
now divide by 5 using a numeric method based on the observation that
x/5 = x/4 - x/10, and hence x/10 = x/8 - x/20, etc.
a few fractional bits are used to maintain some accuracy - either 3
or 5 depending on the low bit, since this produces the right result
*/
if(y&1)
{
y = + (y << 1) - (y >> 1)
+ (y >> 3) - (y >> 5)
+ (y >> 7);
y &= ~7;
}
else
{
y = + (y << 3) - (y << 1)
+ (y >> 1) - (y >> 3)
+ (y >> 5) - (y >> 7);
y = (y >> 2)& ~7;
}
/*
get x just with
offset - (y*60) = offset - y*64 - y*16
*/
x = offset - (y << 3) - (y << 1);
/* add back low 3 bits */
y += yoffs;
}
I made it up myself, and I've tested it and it works with 100% accuracy on
at least the range of valid screen addresses . . . just thought it might be
a little slow thats all.
-Thomas
_______________________________________________________
Send a cool gift with your E-Card
http://www.bluemountain.com/giftcenter/