Files
86Box/src/include/86box/vid_pgc.h
2023-08-23 04:15:58 -04:00

203 lines
6.3 KiB
C

/*
* 86Box A hypervisor and IBM PC system emulator that specializes in
* running old operating systems and software designed for IBM
* PC systems and compatibles from 1981 through fairly recent
* system designs based on the PCI bus.
*
* This file is part of the 86Box distribution.
*
* Definitions for the PGC driver.
*
*
*
* Authors: Fred N. van Kempen, <decwiz@yahoo.com>
* John Elliott, <jce@seasip.info>
*
* Copyright 2019 Fred N. van Kempen.
* Copyright 2019 John Elliott.
*/
#ifndef VID_PGC_H
#define VID_PGC_H
#define PGC_ERROR_RANGE 0x01
#define PGC_ERROR_INTEGER 0x02
#define PGC_ERROR_MEMORY 0x03
#define PGC_ERROR_OVERFLOW 0x04
#define PGC_ERROR_DIGIT 0x05
#define PGC_ERROR_OPCODE 0x06
#define PGC_ERROR_RUNNING 0x07
#define PGC_ERROR_STACK 0x08
#define PGC_ERROR_TOOLONG 0x09
#define PGC_ERROR_AREA 0x0A
#define PGC_ERROR_MISSING 0x0B
struct pgc;
typedef struct pgc_cl {
uint8_t *list;
uint32_t listmax;
uint32_t wrptr;
uint32_t rdptr;
uint32_t repeat;
struct pgc_cl *chain;
} pgc_cl_t;
typedef struct pgc_cmd {
char ascii[6];
uint8_t hex;
void (*handler)(struct pgc *);
int (*parser)(struct pgc *, pgc_cl_t *, int);
int p;
} pgc_cmd_t;
typedef struct pgc {
int8_t type; /* board type */
int8_t cga_enabled;
int8_t cga_selected;
volatile int8_t stopped;
mem_mapping_t mapping;
mem_mapping_t cga_mapping;
pgc_cl_t *clist;
pgc_cl_t *clcur;
const pgc_cmd_t *master;
const pgc_cmd_t *commands;
uint8_t mapram[2048]; /* host <> PGC communication buffer */
uint8_t *cga_vram;
uint8_t *vram;
char asc_command[7];
uint8_t hex_command;
uint32_t palette[256];
uint32_t userpal[256];
uint32_t maxw; /* maximum framebuffer size - Width */
uint32_t maxh; /* maximum framebuffer size - Height */
uint32_t visw; /* maximum screen size - Width */
uint32_t vish; /* maximum screen size - Height */
uint32_t screenw;
uint32_t screenh;
int16_t pan_x;
int16_t pan_y;
uint16_t win_x1;
uint16_t win_x2;
uint16_t win_y1;
uint16_t win_y2;
uint16_t vp_x1;
uint16_t vp_x2;
uint16_t vp_y1;
uint16_t vp_y2;
int16_t fill_pattern[16];
int16_t line_pattern;
uint8_t draw_mode;
uint8_t fill_mode;
uint8_t color;
uint8_t tjust_h; /* hor alignment 1=left 2=ctr 3=right*/
uint8_t tjust_v; /* vert alignment 1=bottom 2=ctr 3=top*/
int32_t tsize; /* horizontal spacing */
int32_t x;
int32_t y;
int32_t z; /* drawing position */
thread_t *pgc_thread;
event_t *pgc_wake_thread;
pc_timer_t wake_timer;
int waiting_input_fifo;
int waiting_output_fifo;
int waiting_error_fifo;
int ascii_mode;
int result_count;
int fontbase;
int linepos;
int displine;
int vc;
int cgadispon;
int con;
int coff;
int cursoron;
int cgablink;
int vsynctime;
int vadj;
uint16_t ma;
uint16_t maback;
int oddeven;
uint64_t dispontime;
uint64_t dispofftime;
pc_timer_t timer;
double native_pixel_clock;
int drawcursor;
int (*inputbyte)(struct pgc *, uint8_t *result);
} pgc_t;
/* I/O functions and worker thread handlers. */
extern void pgc_out(uint16_t addr, uint8_t val, void *priv);
extern uint8_t pgc_in(uint16_t addr, void *priv);
extern void pgc_write(uint32_t addr, uint8_t val, void *priv);
extern uint8_t pgc_read(uint32_t addr, void *priv);
extern void pgc_recalctimings(pgc_t *);
extern void pgc_poll(void *priv);
extern void pgc_reset(pgc_t *);
extern void pgc_wake(pgc_t *);
extern void pgc_sleep(pgc_t *);
extern void pgc_setdisplay(pgc_t *, int cga);
extern void pgc_speed_changed(void *priv);
extern void pgc_close_common(void *priv);
extern void pgc_close(void *priv);
extern void pgc_init(pgc_t *,
int maxw, int maxh, int visw, int vish,
int (*inpbyte)(pgc_t *, uint8_t *), double npc);
/* Misc support functions. */
extern void pgc_sto_raster(pgc_t *, int16_t *x, int16_t *y);
extern void pgc_ito_raster(pgc_t *, int32_t *x, int32_t *y);
extern void pgc_dto_raster(pgc_t *, double *x, double *y);
#if 0
extern int pgc_input_byte(pgc_t *, uint8_t *val);
extern int pgc_output_byte(pgc_t *, uint8_t val);
#endif
extern int pgc_output_string(pgc_t *, const char *val);
#if 0
extern int pgc_error_byte(pgc_t *, uint8_t val);
#endif
extern int pgc_error_string(pgc_t *, const char *val);
extern int pgc_error(pgc_t *, int err);
/* Graphics functions. */
extern uint8_t *pgc_vram_addr(pgc_t *, int16_t x, int16_t y);
extern void pgc_write_pixel(pgc_t *, uint16_t x, uint16_t y, uint8_t ink);
extern uint8_t pgc_read_pixel(pgc_t *, uint16_t x, uint16_t y);
extern void pgc_plot(pgc_t *, uint16_t x, uint16_t y);
extern uint16_t pgc_draw_line_r(pgc_t *, int32_t x1, int32_t y1,
int32_t x2, int32_t y2, uint16_t linemask);
extern void pgc_fill_line_r(pgc_t *, int32_t x0, int32_t x1, int32_t y);
extern uint16_t pgc_draw_line(pgc_t *, int32_t x1, int32_t y1,
int32_t x2, int32_t y2, uint16_t linemask);
extern void pgc_draw_ellipse(pgc_t *, int32_t x, int32_t y);
extern void pgc_fill_polygon(pgc_t *,
unsigned corners, int32_t *x, int32_t *y);
/* Command and parameter handling functions. */
extern int pgc_clist_byte(pgc_t *, uint8_t *val);
extern int pgc_cl_append(pgc_cl_t *, uint8_t v);
extern int pgc_parse_bytes(pgc_t *, pgc_cl_t *, int p);
extern int pgc_parse_words(pgc_t *, pgc_cl_t *, int p);
extern int pgc_parse_coords(pgc_t *, pgc_cl_t *, int p);
extern int pgc_param_byte(pgc_t *, uint8_t *val);
extern int pgc_param_word(pgc_t *, int16_t *val);
extern int pgc_param_coord(pgc_t *, int32_t *val);
extern int pgc_result_byte(pgc_t *, uint8_t val);
extern int pgc_result_word(pgc_t *, int16_t val);
extern int pgc_result_coord(pgc_t *, int32_t val);
/* Special overload functions for non-IBM implementations. */
extern void pgc_hndl_lut8(pgc_t *);
extern void pgc_hndl_lut8rd(pgc_t *);
#endif /*VID_PGC_H*/