Xref: utzoo comp.sys.ibm.pc:9653 comp.sources.wanted:2774
Path: utzoo!utgpu!water!watmath!clyde!rutgers!ames!elroy!mahendo!jplgodo!wlbr!etn-rad!jru
From: jru@etn-rad.UUCP (John Unekis)
Newsgroups: comp.sys.ibm.pc,comp.sources.wanted
Subject: Re: Hercules graphic characters
Keywords: hercules, text, MASM, MSC
Message-ID: <319@etn-rad.UUCP>
Date: 18 Dec 87 00:29:46 GMT
References: <246@tolsun.oulu.fi>
Reply-To: jru@etn-rad.UUCP (John Unekis)
Organization: Eaton Inc. IMSD, Westlake Village, CA
Lines: 469
In article <246@tolsun.oulu.fi> reini@tolsun.oulu.fi (Jukka Reinikainen) writes:
>Help wanted: how to create text in Hercules graphic mode?
>Somebody *must* have written a program which draws characters and
...
Here are some routines for doing character or vector graphics on the
Hercules card. They come from the BLASTEN game, which I will post the
source from some day. To use these, compile with the LARGE model of
MSC (the /AL switch).
=========================CUT HERE======================================
int yadd[348]; /* array of start addresses of Herc. lines */
int chinit_done = 0; /* character array inited flag */
struct cxfx{ /* character bit pattern array */
char cc[8];
} chf[128] = { /* character bit patterns */
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x7e, 0x81, 0xa5, 0x81, 0xbd, 0x99, 0x81, 0x7e,
0x7e, 0xff, 0xdb, 0xff, 0xc3, 0xe7, 0xff, 0x7e,
0x6c, 0xfe, 0xfe, 0xfe, 0x7c, 0x38, 0x10, 0x0,
0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x10, 0x0,
0x38, 0x7c, 0x38, 0xfe, 0xfe, 0x7c, 0x38, 0x7c,
0x10, 0x10, 0x38, 0x7c, 0xfe, 0x7c, 0x38, 0x7c,
0x0, 0x0, 0x18, 0x3c, 0x3c, 0x18, 0x0, 0x0,
0xff, 0xff, 0xe7, 0xc3, 0xc3, 0xe7, 0xff, 0xff,
0x0, 0x3c, 0x66, 0x42, 0x42, 0x66, 0x3c, 0x0,
0xff, 0xc3, 0x99, 0xbd, 0xbd, 0x99, 0xc3, 0xff,
0xf, 0x7, 0xf, 0x7d, 0xcc, 0xcc, 0xcc, 0x78,
0x3c, 0x66, 0x66, 0x66, 0x3c, 0x18, 0x7e, 0x18,
0x3f, 0x33, 0x3f, 0x30, 0x30, 0x70, 0xf0, 0xe0,
0x7f, 0x63, 0x7f, 0x63, 0x63, 0x67, 0xe6, 0xc0,
0x99, 0x5a, 0x3c, 0xe7, 0xe7, 0x3c, 0x5a, 0x99,
0x80, 0xe0, 0xf8, 0xfe, 0xf8, 0xe0, 0x80, 0x0,
0x2, 0xe, 0x3e, 0xfe, 0x3e, 0xe, 0x2, 0x0,
0x18, 0x3c, 0x7e, 0x18, 0x18, 0x7e, 0x3c, 0x18,
0x66, 0x66, 0x66, 0x66, 0x66, 0x0, 0x66, 0x0,
0x7f, 0xdb, 0xdb, 0x7b, 0x1b, 0x1b, 0x1b, 0x0,
0x3e, 0x63, 0x38, 0x6c, 0x6c, 0x38, 0xcc, 0x78,
0x0, 0x0, 0x0, 0x0, 0x7e, 0x7e, 0x7e, 0x0,
0x18, 0x3c, 0x7e, 0x18, 0x7e, 0x3c, 0x18, 0xff,
0x18, 0x3c, 0x7e, 0x18, 0x18, 0x18, 0x18, 0x0,
0x18, 0x18, 0x18, 0x18, 0x7e, 0x3c, 0x18, 0x0,
0x0, 0x18, 0xc, 0xfe, 0xc, 0x18, 0x0, 0x0,
0x0, 0x30, 0x60, 0xfe, 0x60, 0x30, 0x0, 0x0,
0x0, 0x0, 0xc0, 0xc0, 0xc0, 0xfe, 0x0, 0x0,
0x0, 0x24, 0x66, 0xff, 0x66, 0x24, 0x0, 0x0,
0x0, 0x18, 0x3c, 0x7e, 0xff, 0xff, 0x0, 0x0,
0x0, 0xff, 0xff, 0x7e, 0x3c, 0x18, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x30, 0x78, 0x78, 0x30, 0x30, 0x0, 0x30, 0x0,
0x6c, 0x6c, 0x6c, 0x0, 0x0, 0x0, 0x0, 0x0,
0x6c, 0x6c, 0xfe, 0x6c, 0xfe, 0x6c, 0x6c, 0x0,
0x30, 0x7c, 0xc0, 0x78, 0xc, 0xf8, 0x30, 0x0,
0x0, 0xc6, 0xcc, 0x18, 0x30, 0x66, 0xc6, 0x0,
0x38, 0x6c, 0x38, 0x76, 0xdc, 0xcc, 0x76, 0x0,
0x60, 0x60, 0xc0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x18, 0x30, 0x60, 0x60, 0x60, 0x30, 0x18, 0x0,
0x60, 0x30, 0x18, 0x18, 0x18, 0x30, 0x60, 0x0,
0x0, 0x66, 0x3c, 0xff, 0x3c, 0x66, 0x0, 0x0,
0x0, 0x30, 0x30, 0xfc, 0x30, 0x30, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x30, 0x60,
0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x30, 0x30, 0x0,
0x6, 0xc, 0x18, 0x30, 0x60, 0xc0, 0x80, 0x0,
0x7c, 0xc6, 0xce, 0xde, 0xf6, 0xe6, 0x7c, 0x0,
0x30, 0x70, 0x30, 0x30, 0x30, 0x30, 0xfc, 0x0,
0x78, 0xcc, 0xc, 0x38, 0x60, 0xcc, 0xfc, 0x0,
0x78, 0xcc, 0xc, 0x38, 0xc, 0xcc, 0x78, 0x0,
0x1c, 0x3c, 0x6c, 0xcc, 0xfe, 0xc, 0x1e, 0x0,
0xfc, 0xc0, 0xf8, 0xc, 0xc, 0xcc, 0x78, 0x0,
0x38, 0x60, 0xc0, 0xf8, 0xcc, 0xcc, 0x78, 0x0,
0xfc, 0xcc, 0xc, 0x18, 0x30, 0x30, 0x30, 0x0,
0x78, 0xcc, 0xcc, 0x78, 0xcc, 0xcc, 0x78, 0x0,
0x78, 0xcc, 0xcc, 0x7c, 0xc, 0x18, 0x70, 0x0,
0x0, 0x30, 0x30, 0x0, 0x0, 0x30, 0x30, 0x0,
0x0, 0x30, 0x30, 0x0, 0x0, 0x30, 0x30, 0x60,
0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0,
0x0, 0x0, 0xfc, 0x0, 0x0, 0xfc, 0x0, 0x0,
0x60, 0x30, 0x18, 0xc, 0x18, 0x30, 0x60, 0x0,
0x78, 0xcc, 0xc, 0x18, 0x30, 0x0, 0x30, 0x0,
0x7c, 0xc6, 0xde, 0xde, 0xde, 0xc0, 0x78, 0x0,
0x30, 0x78, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0x0,
0xfc, 0x66, 0x66, 0x7c, 0x66, 0x66, 0xfc, 0x0,
0x3c, 0x66, 0xc0, 0xc0, 0xc0, 0x66, 0x3c, 0x0,
0xf8, 0x6c, 0x66, 0x66, 0x66, 0x6c, 0xf8, 0x0,
0xfe, 0x62, 0x68, 0x78, 0x68, 0x62, 0xfe, 0x0,
0xfe, 0x62, 0x68, 0x78, 0x68, 0x60, 0xf0, 0x0,
0x3c, 0x66, 0xc0, 0xc0, 0xce, 0x66, 0x3e, 0x0,
0xcc, 0xcc, 0xcc, 0xfc, 0xcc, 0xcc, 0xcc, 0x0,
0x78, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x0,
0x1e, 0xc, 0xc, 0xc, 0xcc, 0xcc, 0x78, 0x0,
0xe6, 0x66, 0x6c, 0x78, 0x6c, 0x66, 0xe6, 0x0,
0xf0, 0x60, 0x60, 0x60, 0x62, 0x66, 0xfe, 0x0,
0xc6, 0xee, 0xfe, 0xfe, 0xd6, 0xc6, 0xc6, 0x0,
0xc6, 0xe6, 0xf6, 0xde, 0xce, 0xc6, 0xc6, 0x0,
0x38, 0x6c, 0xc6, 0xc6, 0xc6, 0x6c, 0x38, 0x0,
0xfc, 0x66, 0x66, 0x7c, 0x60, 0x60, 0xf0, 0x0,
0x78, 0xcc, 0xcc, 0xcc, 0xdc, 0x78, 0x1c, 0x0,
0xfc, 0x66, 0x66, 0x7c, 0x6c, 0x66, 0xe6, 0x0,
0x78, 0xcc, 0xe0, 0x70, 0x1c, 0xcc, 0x78, 0x0,
0xfc, 0xb4, 0x30, 0x30, 0x30, 0x30, 0x78, 0x0,
0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xfc, 0x0,
0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x0,
0xc6, 0xc6, 0xc6, 0xd6, 0xfe, 0xee, 0xc6, 0x0,
0xc6, 0xc6, 0x6c, 0x38, 0x38, 0x6c, 0xc6, 0x0,
0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x30, 0x78, 0x0,
0xfe, 0xc6, 0x8c, 0x18, 0x32, 0x66, 0xfe, 0x0,
0x78, 0x60, 0x60, 0x60, 0x60, 0x60, 0x78, 0x0,
0xc0, 0x60, 0x30, 0x18, 0xc, 0x6, 0x2, 0x0,
0x78, 0x18, 0x18, 0x18, 0x18, 0x18, 0x78, 0x0,
0x10, 0x38, 0x6c, 0xc6, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff,
0x30, 0x30, 0x18, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x78, 0xc, 0x7c, 0xcc, 0x76, 0x0,
0xe0, 0x60, 0x60, 0x7c, 0x66, 0x66, 0xdc, 0x0,
0x0, 0x0, 0x78, 0xcc, 0xc0, 0xcc, 0x78, 0x0,
0x1c, 0xc, 0xc, 0x7c, 0xcc, 0xcc, 0x76, 0x0,
0x0, 0x0, 0x78, 0xcc, 0xfc, 0xc0, 0x78, 0x0,
0x38, 0x6c, 0x60, 0xf0, 0x60, 0x60, 0xf0, 0x0,
0x0, 0x0, 0x76, 0xcc, 0xcc, 0x7c, 0xc, 0xf8,
0xe0, 0x60, 0x6c, 0x76, 0x66, 0x66, 0xe6, 0x0,
0x30, 0x0, 0x70, 0x30, 0x30, 0x30, 0x78, 0x0,
0xc, 0x0, 0xc, 0xc, 0xc, 0xcc, 0xcc, 0x78,
0xe0, 0x60, 0x66, 0x6c, 0x78, 0x6c, 0xe6, 0x0,
0x70, 0x30, 0x30, 0x30, 0x30, 0x30, 0x78, 0x0,
0x0, 0x0, 0xcc, 0xfe, 0xfe, 0xd6, 0xc6, 0x0,
0x0, 0x0, 0xf8, 0xcc, 0xcc, 0xcc, 0xcc, 0x0,
0x0, 0x0, 0x78, 0xcc, 0xcc, 0xcc, 0x78, 0x0,
0x0, 0x0, 0xdc, 0x66, 0x66, 0x7c, 0x60, 0xf0,
0x0, 0x0, 0x76, 0xcc, 0xcc, 0x7c, 0xc, 0x1e,
0x0, 0x0, 0xdc, 0x76, 0x66, 0x60, 0xf0, 0x0,
0x0, 0x0, 0x7c, 0xc0, 0x78, 0xc, 0xf8, 0x0,
0x10, 0x30, 0x7c, 0x30, 0x30, 0x34, 0x18, 0x0,
0x0, 0x0, 0xcc, 0xcc, 0xcc, 0xcc, 0x76, 0x0,
0x0, 0x0, 0xcc, 0xcc, 0xcc, 0x78, 0x30, 0x0,
0x0, 0x0, 0xc6, 0xd6, 0xfe, 0xfe, 0x6c, 0x0,
0x0, 0x0, 0xc6, 0x6c, 0x38, 0x6c, 0xc6, 0x0,
0x0, 0x0, 0xcc, 0xcc, 0xcc, 0x7c, 0xc, 0xf8,
0x0, 0x0, 0xfc, 0x98, 0x30, 0x64, 0xfc, 0x0,
0x1c, 0x30, 0x30, 0xe0, 0x30, 0x30, 0x1c, 0x0,
0x18, 0x18, 0x18, 0x0, 0x18, 0x18, 0x18, 0x0,
0xe0, 0x30, 0x30, 0x1c, 0x30, 0x30, 0xe0, 0x0,
0x76, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x10, 0x38, 0x6c, 0xc6, 0xc6, 0xfe, 0x0 }
int yaddinit;
xoribmchr(x,y,c) /* exclusive or character c bit pattern at x,y */
/* first time draws character, second erases */
int x; /* x is byte (character number 0-89) along line */
int y; /* y is line number 0-348 */
char c; /* c is character to put up */
{
int i,j,k;
union ccffxx{
char ccc[2];
int iii;
} ccii;
union llll{
long ll;
int li[2];
}il;
char * ppcc;
long ly;
ccii.iii = 0; /* init array if not already done */
il.ll = 0;
if(yaddinit != 777)
{
setxdotyadd();
}
ccii.ccc[0] = c;
k = ccii.iii;
for(j=0;j<8;j++) /* chars are 8x8 bit grid, = 8 bytes */
{
il.li[0] = x + yadd[y+j]; /* add start of line offset to byte number */
ly = il.ll + 0xb8000000; /* add to start of screen memory */
ppcc = (char *) ly; /* create a pointer */
*ppcc ^= chf[k].cc[j]; /* xor in the bit pattern */
}
}
xoribmstr(x,y,s) /* exclusive or a string at x,y */
int x,y;
char * s;
{
int i,j,k;
char a,b;
a = *s++;
while(a != 0x00)
{
xoribmchr(x,y,a);
x = x + 1;
a = *s++;
}
}
=============================CUT HERE=====================================
struct ccrruumm{
char c;
};
union lpp{ /* union for parsing address pointers */
long lll;
int iii[2];
struct ccrruumm *ppp;
} lp ;
union lpp delt;
union lpp run;
long yadd[348]; /* array of address offsets for screen lines */
char xdot[8]; /* bytes with only bit N turned on */
int yaddinit; /* init flag */
xorspot(x,y) /* xor any spot on the 720x348 screen with 1 */
int x,y;
{
if(yaddinit != 777) {
setxdotyadd();
}
lp.lll = yadd[y]; /* screen start */
lp.iii[0] += x >> 3;
lp.ppp->c ^= xdot[x & 0x0007];
}
/* Image memory for the hercules starts at B800:0000 and is divided
into four banks of 8K each. The display on the screen in graphics
mode is built as follows:
1st line from bank 1
1st line from bank 2
1st line from bank 3
1st line from bank 4
2nd line from bank 1
2nd line from bank 2
2nd line from bank 3
2nd line from bank 4
3rd line from bank 1
...etc.
*/
setxdotyadd() /* set up addresses of each image line */
{ /* in an array indexed by line number */
char xd;
int i1,i2,i3;
long k1,k2;
xd = 0x01;
yaddinit = 777;
for(i1=7;i1>=0;i1--)
{
xdot[i1] = xd;
xd = xd << 1;
}
for(i1=0;i1<348;i1++)
{
lp.lll = 0xb8000000; /* base of memory */
i2 = i1 & 3;
i2 = i2 * 0x2000; /* 8k (2000hex) per memory bank */
lp.iii[0] += i2;
i2 = i1 >> 2;
i2 = i2 * 90; /* length of lines in bytes */
lp.iii[0] += i2;
yadd[i1] = lp.lll;
}
}
xorvect(x1,y1,x2,y2) /* xor dots along a vector with 1's */
int x1,y1,x2,y2; /* vector endpoints on 720x348 screen */
/* vector must be < 128 pixels long */
{
int dx,dy,j1,j2,j3;
register int loop;
if(yaddinit != 777) {
setxdotyadd();
}
run.lll = 0;
lp.lll = 0;
delt.lll = 0;
if(x2 > x1)
{
dx = x2 - x1;
if(y2 > y1)
{
dy = y2 - y1;
if(dx > dy)
{
delt.iii[1] = dy; /* use fixed point 8.8 bit math to emulate */
lp.iii[0] = dx; /* floating point math */
delt.lll = delt.lll / lp.lll;
run.iii[1] = y1;
for(loop=x1;loop<=x2;loop++)
{
lp.lll = yadd[run.iii[1]]; /* start of line */
lp.iii[0] += loop >> 3; /* byte number */
lp.ppp->c ^= xdot[loop & 0x0007]; /* xor bit within byte */
run.lll += delt.lll; /* increment running fixed point */
}
}
else
{
delt.iii[1] = dx;
lp.iii[0] = dy;
delt.lll = delt.lll / lp.lll;
run.iii[1] = x1;
for(loop=y1;loop<=y2;loop++)
{
lp.lll = yadd[loop];
lp.iii[0] += run.iii[1] >> 3;
lp.ppp->c ^= xdot[run.iii[1] & 0x0007];
run.lll += delt.lll;
}
}
}
else if(y1 > y2)
{
dy = y1 - y2;
if(dx > dy)
{
delt.iii[1] = dy;
lp.iii[0] = dx;
delt.lll = delt.lll / lp.lll;
run.iii[1] = y1;
for(loop=x1;loop<=x2;loop++)
{
lp.lll = yadd[run.iii[1]];
lp.iii[0] += loop >> 3;
lp.ppp->c ^= xdot[loop & 0x0007];
run.lll -= delt.lll;
}
}
else
{
delt.iii[1] = dx;
lp.iii[0] = dy;
delt.lll = delt.lll / lp.lll;
run.iii[1] = x1;
for(loop=y1;loop>=y2;loop--)
{
lp.lll = yadd[loop];
lp.iii[0] += run.iii[1] >> 3;
lp.ppp->c ^= xdot[run.iii[1] & 0x0007];
run.lll += delt.lll;
}
}
}
else if(y1 == y2)
{
for(loop=x1;loop<=x2;loop++)
{
lp.lll = yadd[y1];
lp.iii[0] += loop >> 3;
lp.ppp->c ^= xdot[loop & 0x0007];
}
}
}
else if(x1 > x2)
{
dx = x1 - x2;
if(y2 > y1)
{
dy = y2 - y1;
if(dx > dy)
{
delt.iii[1] = dy;
lp.iii[0] = dx;
delt.lll = delt.lll / lp.lll;
run.iii[1] = y1;
for(loop=x1;loop>=x2;loop--)
{
lp.lll = yadd[run.iii[1]];
lp.iii[0] += loop >> 3;
lp.ppp->c ^= xdot[loop & 0x0007];
run.lll += delt.lll;
}
}
else
{
delt.iii[1] = dx;
lp.iii[0] = dy;
delt.lll = delt.lll / lp.lll;
run.iii[1] = x1;
for(loop=y1;loop<=y2;loop++)
{
lp.lll = yadd[loop];
lp.iii[0] += run.iii[1] >> 3;
lp.ppp->c ^= xdot[run.iii[1] & 0x0007];
run.lll -= delt.lll;
}
}
}
else if(y1 > y2)
{
dy = y1 - y2;
if(dx > dy)
{
delt.iii[1] = dy;
lp.iii[0] = dx;
delt.lll = delt.lll / lp.lll;
run.iii[1] = y2;
for(loop=x2;loop<=x1;loop++)
{
lp.lll = yadd[run.iii[1]];
lp.iii[0] += loop >> 3;
lp.ppp->c ^= xdot[loop & 0x0007];
run.lll += delt.lll;
}
}
else
{
delt.iii[1] = dx;
lp.iii[0] = dy;
delt.lll = delt.lll / lp.lll;
run.iii[1] = x2;
for(loop=y2;loop<=y1;loop++)
{
lp.lll = yadd[loop];
lp.iii[0] += run.iii[1] >> 3;
lp.ppp->c ^= xdot[run.iii[1] & 0x0007];
run.lll += delt.lll;
}
}
}
else if(y1 == y2)
{
for(loop=x2;loop<=x1;loop++)
{
lp.lll = yadd[y1];
lp.iii[0] += loop >> 3;
lp.ppp->c ^= xdot[loop & 0x0007];
}
}
}
else if(x1 == x2)
{
if(y2 > y1)
{
for(loop=y1;loop> 3;
lp.ppp->c ^= xdot[x1 & 0x0007];
}
}
else
{
for(loop=y2;loop> 3;
lp.ppp->c ^= xdot[x1 & 0x0007];
}
}
}
}