Banner/banner.c
2023-12-08 17:20:48 +01:00

128 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");
}