/*////////////////////////////////////////////////////////////////////////// // 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 #include #include #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"); }