122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			122 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
 | 
						|
    This file is part of libgtemu, a library for Gigatron emulation.
 | 
						|
    Copyright (C) 2019 David Heiko Kolf
 | 
						|
 | 
						|
    Published under the BSD-2-Clause license.
 | 
						|
    https://opensource.org/licenses/BSD-2-Clause
 | 
						|
 | 
						|
    Version 0.1.0
 | 
						|
 | 
						|
*/
 | 
						|
 | 
						|
#ifndef GTEMU_H
 | 
						|
#define GTEMU_H 1
 | 
						|
 | 
						|
#include <stddef.h>
 | 
						|
 | 
						|
#define GT_SCREENWIDTH 160
 | 
						|
#define GT_SCREENHEIGHT 480
 | 
						|
 | 
						|
struct GTRomEntry {
 | 
						|
	unsigned char i;
 | 
						|
	unsigned char d;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
GTState containes the state of the CPU and its fields are open for
 | 
						|
inspection and manipulation.
 | 
						|
*/
 | 
						|
struct GTState {
 | 
						|
	int pc;
 | 
						|
	unsigned char ir, d, ac, x, y, out, in;
 | 
						|
	struct GTRomEntry *rom;
 | 
						|
	size_t romcount;
 | 
						|
	unsigned char *ram;
 | 
						|
	unsigned int rammask;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
GTPeriph contains the state of the peripherals; the board, the video
 | 
						|
output, the audio output, the GT1 loader and the serial output.  The
 | 
						|
variables are implementation details and should not be accessed directly.
 | 
						|
*/
 | 
						|
struct GTPeriph {
 | 
						|
	struct {
 | 
						|
		int booted;
 | 
						|
		unsigned char xout, undef;
 | 
						|
		unsigned long long clock;
 | 
						|
	} board;
 | 
						|
	struct {
 | 
						|
		int x, y;
 | 
						|
	} video;
 | 
						|
	struct {
 | 
						|
		unsigned long long sampleticks1k, sampletickscount1k;
 | 
						|
		unsigned short sample;
 | 
						|
	} audio;
 | 
						|
	struct {
 | 
						|
		int state;
 | 
						|
		int bitcount;
 | 
						|
		unsigned char remainingframe;
 | 
						|
		unsigned char remainingfiller;
 | 
						|
		unsigned short addr;
 | 
						|
		unsigned char checksum;
 | 
						|
		const unsigned char *data;
 | 
						|
		size_t remainingdata, remainingsegment;
 | 
						|
		char prevkey;
 | 
						|
	} loader;
 | 
						|
	struct {
 | 
						|
		int invpulse, sentfull;
 | 
						|
		int count, bitcount;
 | 
						|
		unsigned char outchar;
 | 
						|
		char *buffer;
 | 
						|
		size_t *bufferpos, buffersize;
 | 
						|
	} serialout;
 | 
						|
};
 | 
						|
 | 
						|
/* functions defined in gtemu.u */
 | 
						|
 | 
						|
extern void gtemu_init (struct GTState *gt,
 | 
						|
	struct GTRomEntry *rom, size_t romsize,
 | 
						|
	unsigned char *ram, size_t ramsize);
 | 
						|
 | 
						|
extern void gtemu_initperiph (struct GTPeriph *ph, int audiofreq,
 | 
						|
	unsigned long randseed);
 | 
						|
 | 
						|
unsigned long gtemu_randomizemem (unsigned long seed,
 | 
						|
	void *mem, size_t size);
 | 
						|
 | 
						|
extern unsigned long long gtemu_getclock (struct GTPeriph *ph);
 | 
						|
 | 
						|
extern unsigned char gtemu_getxout (struct GTPeriph *ph);
 | 
						|
 | 
						|
extern int gtemu_processtick (struct GTState *gt, struct GTPeriph *ph);
 | 
						|
 | 
						|
extern int gtemu_processscreen (struct GTState *gt, struct GTPeriph *ph,
 | 
						|
	void *pixels, int pitch,
 | 
						|
	unsigned short *samples, size_t maxsamples, size_t *nsamples);
 | 
						|
 | 
						|
void gtemu_placelights (struct GTPeriph *ph, void *pixels, int pitch,
 | 
						|
	int power);
 | 
						|
 | 
						|
void gtserialout_setbuffer (struct GTPeriph *ph, char *buffer,
 | 
						|
	size_t buffersize, size_t *bufferpos);
 | 
						|
 | 
						|
/* functions defined in gtloader.c */
 | 
						|
 | 
						|
extern int gtloader_sendgt1 (struct GTPeriph *ph,
 | 
						|
	const char *data, size_t datasize);
 | 
						|
 | 
						|
extern int gtloader_isactive (struct GTPeriph *ph);
 | 
						|
 | 
						|
extern int gtloader_validategt1 (const char *data, size_t datasize);
 | 
						|
 | 
						|
extern int gtloader_sendtext (struct GTPeriph *ph,
 | 
						|
	const char *data, size_t datasize);
 | 
						|
 | 
						|
extern int gtloader_sendkey (struct GTState *gt, struct GTPeriph *ph,
 | 
						|
	char key);
 | 
						|
 | 
						|
#endif /* GTEMU_H */
 | 
						|
 |