129 lines
3.7 KiB
C
129 lines
3.7 KiB
C
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// BANNER PRINTING PROGRAM
|
||
|
//
|
||
|
// Martin Renters, March/2020
|
||
|
// KIZARM :
|
||
|
// Upraveno tak, aby to šlo přeložit i v RSX11M+ (zkrácení názvů).
|
||
|
// Pak jsou potřeba i soubory font.h, banner.odl, banner.cmd
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
#include <stdio.h>
|
||
|
#include <stdlib.h>
|
||
|
#include <string.h>
|
||
|
#include "banner.h"
|
||
|
/*
|
||
|
|
||
|
#define cputc putchar
|
||
|
void cputs (char *s) {
|
||
|
while (*s) cputc (* (s++));
|
||
|
}
|
||
|
unsigned char cgetc() {
|
||
|
unsigned char c = getchar();
|
||
|
if (c == '\n') c = '\r';
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
void cgets (char *buf, int n) {
|
||
|
char * i;
|
||
|
i = fgets (buf, n, stdin);
|
||
|
(void) i;
|
||
|
buf[strlen (buf)-1] = 0;
|
||
|
}
|
||
|
*/
|
||
|
#define PAGESIZE 66
|
||
|
#define MAXLINE 80
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// Include font data generated by mkfont
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
#include "font.h"
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// Output buffer
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
static char outbuf[FONT_MAXWIDTH+3]; /* Account for CR, LF, NUL */
|
||
|
static char *obfnex;
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// A bit pointer, includes pointer to byte and a bit mask for the bit
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
struct bitpointer {
|
||
|
unsigned char *byte;
|
||
|
int bit;
|
||
|
};
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// gbits: get next n bits
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
static unsigned int gbits (struct bitpointer *bp, int n) {
|
||
|
unsigned int v = 0;
|
||
|
unsigned char byte = *bp->byte;
|
||
|
for (byte = *bp->byte; n>0; n--) {
|
||
|
v <<= 1;
|
||
|
if (byte & bp->bit) v |= 1;
|
||
|
bp->bit >>= 1;
|
||
|
if (!bp->bit) {
|
||
|
byte = * (++bp->byte);
|
||
|
bp->bit = 0x80;
|
||
|
}
|
||
|
}
|
||
|
return v;
|
||
|
}
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// gopcod: get the next opcode. See font.h for details of encoding
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
static unsigned char gopcod (struct bitpointer *bp) {
|
||
|
unsigned int v;
|
||
|
|
||
|
v = gbits (bp, 2);
|
||
|
if (v == 1) v = gbits (bp, 3) + 1;
|
||
|
else if (v == 2) v = gbits (bp, 4) + 9;
|
||
|
else if (v == 3) v = gbits (bp, 6) + 25;
|
||
|
|
||
|
return flut[v];
|
||
|
}
|
||
|
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// findch: find beginning of character opcodes
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
static void findch (char c, struct bitpointer *bp) {
|
||
|
bp->byte = &mfont[foffs[c-32]];
|
||
|
bp->bit = 0x80;
|
||
|
}
|
||
|
/*//////////////////////////////////////////////////////////////////////////
|
||
|
// banchr: prints large character
|
||
|
//////////////////////////////////////////////////////////////////////////*/
|
||
|
void banchr (const char c) {
|
||
|
char colors[] = " #";
|
||
|
struct bitpointer bp;
|
||
|
int color;
|
||
|
unsigned char opcode;
|
||
|
|
||
|
color = 0;
|
||
|
findch (c, &bp);
|
||
|
obfnex = outbuf;
|
||
|
do {
|
||
|
opcode = gopcod (&bp);
|
||
|
if (opcode == OPCODE_EOL) {
|
||
|
* (obfnex++) = '\r';
|
||
|
* (obfnex++) = '\n';
|
||
|
* (obfnex++) = 0;
|
||
|
cputs (outbuf);
|
||
|
if (FONT_DOUBLED) cputs (outbuf);
|
||
|
obfnex = outbuf;
|
||
|
color = 0;
|
||
|
} else if (opcode == OPCODE_REPEAT) {
|
||
|
cputs (outbuf);
|
||
|
if (FONT_DOUBLED) cputs (outbuf);
|
||
|
} else if (opcode != OPCODE_EOC) {
|
||
|
while (opcode) {
|
||
|
* (obfnex++) = colors[color];
|
||
|
if (FONT_DOUBLED) * (obfnex++) = colors[color];
|
||
|
opcode--;
|
||
|
}
|
||
|
color = (color + 1) & 1; /* No native XOR on PDP11/05 */
|
||
|
}
|
||
|
} while (opcode != OPCODE_EOC);
|
||
|
cputs ("\r\n");
|
||
|
}
|