165 lines
4.4 KiB
C
Executable File
165 lines
4.4 KiB
C
Executable File
/*
|
|
Copyright (C) 1994-1995 Apogee Software, Ltd.
|
|
|
|
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; either version 2
|
|
of the License, or (at your option) any later version.
|
|
|
|
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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
|
/* pcclone.h - machine specific parts of readflic. Structures and
|
|
* prototypes for polling the keyboard, checking the time,
|
|
* writing to the video screen, allocating large blocks of memory
|
|
* and reading files.
|
|
*
|
|
* Copyright (c) 1992 Jim Kent. This file may be freely used, modified,
|
|
* copied and distributed. This file was first published as part of
|
|
* an article for Dr. Dobb's Journal March 1993 issue.
|
|
*/
|
|
|
|
#ifndef PCCLONE_H /* Prevent file from being included twice. */
|
|
#define PCCLONE_H
|
|
|
|
typedef Uchar Pixel; /* Pixel type. */
|
|
|
|
typedef struct
|
|
{
|
|
Uchar r,g,b;
|
|
} Color; /* One color map entry r,g,b 0-255. */
|
|
|
|
typedef struct
|
|
{
|
|
Pixel pixels[2];
|
|
} Pixels2; /* For word-oriented run length encoding */
|
|
|
|
typedef struct
|
|
{
|
|
Pixel *pixels; /* Set to AOOO:0000 for hardware. */
|
|
int width, height; /* Dimensions of screen. (320x200) */
|
|
int old_mode; /* Mode screen was in originally. */
|
|
Boolean is_open; /* Is screen open? */
|
|
} Screen; /* Device specific screen type. */
|
|
|
|
|
|
/* Prototypes for routines that work on display screen. */
|
|
|
|
ErrCode screen_open(Screen *s);
|
|
/* Put machine into graphics mode and fill out screen structure. */
|
|
|
|
void screen_close(Screen *s);
|
|
/* Close screen. Restore original display mode. */
|
|
|
|
int screen_width(Screen *s);
|
|
/* Return width of screen. */
|
|
|
|
int screen_height(Screen *s);
|
|
/* Return height of screen. */
|
|
|
|
void screen_put_dot(Screen *s, int x, int y, Pixel color);
|
|
/* Set one dot. */
|
|
|
|
void screen_copy_seg(Screen *s, int x, int y, Pixel *pixels, int count);
|
|
/* Copy pixels from memory into screen. */
|
|
|
|
void screen_repeat_one(Screen *s, int x, int y, Pixel color, int count);
|
|
/* Draw a horizontal line of a solid color */
|
|
|
|
void screen_repeat_two(Screen *s, int x,int y, Pixels2 pixels2, int count);
|
|
/* Repeat 2 pixels count times on screen. */
|
|
|
|
void screen_put_colors(Screen *s, int start, Color *colors, int count);
|
|
/* Set count colors in color map starting at start. RGB values
|
|
* go from 0 to 255. */
|
|
|
|
void screen_put_colors_64(Screen *s, int start, Color *colors, int count);
|
|
/* Set count colors in color map starting at start. RGB values
|
|
* go from 0 to 64. */
|
|
|
|
|
|
/* Clock structure and routines. */
|
|
|
|
typedef struct
|
|
{
|
|
Ulong speed; /* Number of clock ticks per second. */
|
|
} Clock;
|
|
|
|
ErrCode clock_open(Clock *clock);
|
|
/* Set up millisecond clock. */
|
|
|
|
void clock_close(Clock *clock);
|
|
/* Return clock to normal. */
|
|
|
|
Ulong clock_ticks(Clock *clock);
|
|
/* Get time in terms of clock->speed. */
|
|
|
|
/* Keyboard structure and routines. */
|
|
|
|
typedef struct
|
|
{
|
|
Uchar ascii;
|
|
Ushort scancode;
|
|
} Key;
|
|
|
|
ErrCode key_open(Key *key);
|
|
/* Set up keyboard. */
|
|
|
|
void key_close(Key *key);
|
|
/* Close keyboard. */
|
|
|
|
Boolean key_ready(Key *key);
|
|
/* See if a key is ready. */
|
|
|
|
Uchar key_read(Key *key);
|
|
/* Get next key. */
|
|
|
|
|
|
/** MemPtr - handles allocating big blocks of memory (>64K) on the
|
|
** PC. On other machines may be much simpler. */
|
|
|
|
typedef Uchar * MemPtr;
|
|
|
|
ErrCode big_alloc(MemPtr *bb, Ulong size);
|
|
/* Allocate a big block. */
|
|
|
|
void big_free(MemPtr *bb);
|
|
/* Free up a big block. */
|
|
|
|
/** Stuff for reading files - regular and over 64k blocks at a time. **/
|
|
|
|
ErrCode file_open_to_read(FileHandle *phandle, char *name);
|
|
/* Open a binary file to read. */
|
|
|
|
ErrCode file_read_block(FileHandle handle, void *block, unsigned size);
|
|
/* Read in a block. If read less than size return error code. */
|
|
|
|
ErrCode file_read_big_block(FileHandle handle, MemPtr bb, Ulong size);
|
|
/* Read in a big block. Could be bigger than 64K. */
|
|
|
|
|
|
|
|
/** Machine structure - contains all the machine dependent stuff. **/
|
|
|
|
typedef struct
|
|
{
|
|
Screen screen;
|
|
Clock clock;
|
|
Key key;
|
|
} Machine;
|
|
|
|
ErrCode machine_open(Machine *machine);
|
|
/* Open up machine: keyboard, clock, screen. */
|
|
|
|
void machine_close(Machine *machine);
|
|
/* Close down machine. */
|
|
#endif /* PCCLONE_H */
|