131 lines
8.3 KiB
C
131 lines
8.3 KiB
C
/*-*- mode:c;indent-tabs-mode:nil;c-basic-offset:2;tab-width:8;coding:utf-8 -*-│
|
||
│vi: set net ft=c ts=8 sts=2 sw=2 fenc=utf-8 :vi│
|
||
╞══════════════════════════════════════════════════════════════════════════════╡
|
||
│ Copyright 2020 Justine Alexandra Roberts Tunney │
|
||
│ │
|
||
│ This program is free software; you can redistribute it and/or modify │
|
||
│ it under the terms of the GNU General Public License as published by │
|
||
│ the Free Software Foundation; version 2 of the License. │
|
||
│ │
|
||
│ This program is distributed in the hope that it will be useful, but │
|
||
│ WITHOUT ANY WARRANTY; without even the implied warranty of │
|
||
│ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU │
|
||
│ General Public License for more details. │
|
||
│ │
|
||
│ You should have received a copy of the GNU General Public License │
|
||
│ along with this program; if not, write to the Free Software │
|
||
│ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA │
|
||
│ 02110-1301 USA │
|
||
╠──────────────────────────────────────────────────────────────────────────────╣
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░█▀█░█▀█░▀█▀░█░█░█▀█░█░░░█░░░█░█░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░█▀█░█░▄░░█░░█░█░█▀█░█░░░█░░░▀█▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░▀░▀░▀▀▀░░▀░░▀▀▀░▀░▀░▀▀▀░▀▀▀░░▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░█▀█░█▀█░█▀█░▀█▀░█▀█░█▀█░█░░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░█▀▀░█ █░██▀░░█░░█▀█░█▀█░█░░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░▀░░░▀▀▀░▀░▀░░▀░░▀░▀░▀▀▀░▀▀▀░▀▀▀░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
|
||
│░░░░░░░█▀▀░█░█░█▀▀░█▀█░█░█░▀█▀░█▀█░█▀█░█░░█▀▀░░░░░░░░░░░░░░░░░░░░░░░░▄▄░░░▐█░░│
|
||
│░░░░░░░█▀▀░▄▀▄░█▀▀░█░▄░█░█░░█░░█▀█░█▀█░█░░█▀▀░░░░░░░░░░░░▄▄▄░░░▄██▄░░█▀░░░█░▄░│
|
||
│░░░░░░░▀▀▀░▀░▀░▀▀▀░▀▀▀░▀▀▀░░▀░░▀░▀░▀▀▀░▀▀░▀▀▀░░░░░░░░░░▄██▀█▌░██▄▄░░▐█▀▄░▐█▀░░│
|
||
│░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░▐█▀▀▌░░░▄▀▌░▌░█░▌░░▌░▌░░│
|
||
╠──────────────────────────────────────────────────────▌▀▄─▐──▀▄─▐▄─▐▄▐▄─▐▄─▐▄─│
|
||
│ αcτµαlly pδrταblε εxεcµταblε § pc display helpers │
|
||
╚─────────────────────────────────────────────────────────────────────────────*/
|
||
#ifndef COSMOPOLITAN_LIBC_NEXGEN32E_VIDYA_H_
|
||
#define COSMOPOLITAN_LIBC_NEXGEN32E_VIDYA_H_
|
||
|
||
/**
|
||
* @fileoverview PC Display Helpers.
|
||
*
|
||
* These functions provide the baseline of PC graphics & teletype
|
||
* emulation support that doesn't require switching context or cpu mode.
|
||
*
|
||
* @see https://youtu.be/yHXx3orN35Y
|
||
* @see https://youtu.be/H1p1im_2uf4
|
||
* @see Google's SGABIOS which logs MDA/CGA displays to UART as ASCII
|
||
* @mode long,legacy,real
|
||
*/
|
||
|
||
#define VIDYA_ROWS 25
|
||
#define VIDYA_COLUMNS 80
|
||
#define VIDYA_SIZE (VIDYA_ROWS * VIDYA_COLUMNS * 2)
|
||
#define VIDYA_MODE_MDA 7
|
||
#define VIDYA_MODE_CGA 3
|
||
#define VIDYA_ADDR_MDA 0xb0000
|
||
#define VIDYA_ADDR_CGA 0xb8000
|
||
#define VIDYA_ATTR_NORMAL 0x07 /* cozy default for both mda and cga */
|
||
#define VIDYA_REWIND ~0x7fff /* derived from mode addr min. lzcnt */
|
||
#define VIDYA_SERVICE 0x10
|
||
#define VIDYA_SET_MODE 0
|
||
#define VIDYA_SET_CURSOR 0x0100
|
||
#define VIDYA_SET_CURSOR_NONE 0x2000
|
||
#define VIDYA_SET_BLINKING 0x1003
|
||
#define VIDYA_SET_BLINKING_NONE 0x0000
|
||
|
||
#if !(__ASSEMBLER__ + __LINKER__ + 0)
|
||
|
||
enum VidyaMode {
|
||
kVidyaModeMda = VIDYA_MODE_MDA,
|
||
kVidyaModeCga = VIDYA_MODE_CGA
|
||
};
|
||
|
||
enum VidyaColor {
|
||
kVidyaColorBlack = 0x0,
|
||
kVidyaColorBlue = 0x1,
|
||
kVidyaColorGreen = 0x2,
|
||
kVidyaColorCyan = 0x3,
|
||
kVidyaColorRed = 0x4,
|
||
kVidyaColorMagenta = 0x5,
|
||
kVidyaColorBrown = 0x6,
|
||
kVidyaColorLightGray = 0x7,
|
||
kVidyaColorDarkGray = 0x8,
|
||
kVidyaColorLightBlue = 0x9,
|
||
kVidyaColorLightGreen = 0xa,
|
||
kVidyaColorLightCyan = 0xb,
|
||
kVidyaColorLightRed = 0xc,
|
||
kVidyaColorLightMagenta = 0xd,
|
||
kVidyaColorYellow = 0xe,
|
||
kVidyaColorWhite = 0xf
|
||
};
|
||
|
||
struct thatispacked VidyaCell {
|
||
unsigned glyph : 8; /* IBM Code Page 437 */
|
||
union VidyaAttr {
|
||
enum {
|
||
kVidyaAttrBlank = 0x00,
|
||
kVidyaAttrNormal = VIDYA_ATTR_NORMAL,
|
||
kVidyaAttrMdaFlipped = 0x70,
|
||
kVidyaAttrMdaFlippedFaded = 0x78,
|
||
kVidyaAttrMdaFlippedIntense = 0xf0,
|
||
kVidyaAttrMdaFlippedFadedIntense = 0xf8
|
||
} preset : 8;
|
||
struct VidyaTextDecoration { /* MDA Only */
|
||
unsigned underline : 1;
|
||
unsigned __ignore1 : 1;
|
||
unsigned bold : 1;
|
||
unsigned __ignore2 : 3;
|
||
unsigned intense : 1;
|
||
} decoration;
|
||
struct { /* CGA Only */
|
||
enum VidyaColor fg : 4;
|
||
enum VidyaColor bg : 4;
|
||
} color;
|
||
} attr;
|
||
};
|
||
|
||
typedef union VidyaAttr VidyaAttr;
|
||
typedef struct VidyaCell VidyaCell;
|
||
typedef struct VidyaCell VidyaPage[VIDYA_ROWS][VIDYA_COLUMNS];
|
||
|
||
__far VidyaPage *vinit(enum VidyaMode mode);
|
||
__far VidyaPage *vcls(__far VidyaCell *pos);
|
||
__far VidyaCell *vputc(__far VidyaCell *pos, int c);
|
||
__far VidyaCell *vputs(__far VidyaCell *pos, const char *str);
|
||
__far VidyaCell *vtput(__far VidyaCell *pos, const void *data, size_t size);
|
||
__far VidyaCell *vscroll(__far VidyaCell *pos, size_t bytes);
|
||
|
||
#endif /* !(__ASSEMBLER__ + __LINKER__ + 0) */
|
||
#endif /* COSMOPOLITAN_LIBC_NEXGEN32E_VIDYA_H_ */
|