8bitworkshop/presets/williams/williams.h

118 lines
2.7 KiB
C

#ifndef _WILLIAMS_H
#define _WILLIAMS_H
typedef unsigned char byte;
typedef unsigned char bool;
typedef signed char sbyte;
typedef unsigned short word;
enum { false=0, true=1 };
byte* palette = 0xc000;
byte* nvram = 0xcc00;
#define input0 (*(byte*)0xc804)
#define input1 (*(byte*)0xc806)
#define input2 (*(byte*)0xc80c)
#define sound_pia (*(byte*)0xc80c)
#define rom_select *((byte*)0xc900)
#define video_counter *((byte*)0xcb00)
#define watchdog0x39 *((byte*)0xcbff)
#define WATCHDOG (watchdog0x39 = 0x39)
// switch flags
#define UP1 (input0 & 0x1)
#define DOWN1 (input0 & 0x2)
#define LEFT1 (input0 & 0x4)
#define RIGHT1 (input0 & 0x8)
#define START1 (input0 & 0x10)
#define START2 (input0 & 0x20)
#define UP2 (input0 & 0x40)
#define DOWN2 (input0 & 0x80)
#define LEFT2 (input1 & 0x1)
#define RIGHT2 (input1 & 0x2)
#define AUTOUP (input2 & 0x1)
#define ADVANCE (input2 & 0x2)
#define COIN2 (input2 & 0x4)
#define HIGHSCORERESET (input2 & 0x8)
#define COIN1 (input2 & 0x10)
#define COIN3 (input2 & 0x20)
#define TILTSWITCH (input2 & 0x40)
#define SOUNDACK (input2 & 0x80)
// blitter flags
#define SRCSCREEN 0x1
#define DSTSCREEN 0x2
#define ESYNC 0x4
#define FGONLY 0x8
#define SOLID 0x10
#define RSHIFT 0x20
#define EVENONLY 0x40
#define ODDONLY 0x80
struct {
byte flags;
byte solid;
word sstart;
word dstart;
byte width;
byte height;
} *_blitter = 0xca00;
#define blitter (*_blitter)
struct {
byte mem[152][256];
} *_vid = 0x0;
#define vidmem (_vid->mem)
#define BLIT_OP(_x,_y,_w,_h,_src,_color,_flags) do {\
blitter.width = (_w)^4; \
blitter.height = (_h)^4; \
blitter.sstart = (word)(_src); \
blitter.dstart = ((word)(_x)<<8)+(_y); \
blitter.solid = (_color); \
blitter.flags = (_flags); \
} while (0)
#define BLIT_SOLID(x, y, w, h, color) \
BLIT_OP(x, y, w, h, 0, color, DSTSCREEN|SOLID)
// x1: 0-151
// y1: 0-255
void blit_solid(byte x1, byte y1, byte w, byte h, byte color);
void blit_copy(byte x1, byte y1, byte w, byte h, const byte* data);
void blit_copy_solid(byte x1, byte y1, byte w, byte h, const byte* data, byte solid);
void blit_sprite(const byte* data, byte x, byte y);
void blit_sprite_solid(const byte* data, byte x, byte y, byte color);
void unblit_sprite_rect(const byte* data, byte x, byte y);
void blit_sprite_strided(const byte* data, byte x, byte y, byte stride);
void unblit_sprite_strided(const byte* data, byte x, byte y, byte stride);
// x1: 0-303
// y1: 0-255
void draw_pixel(word xx, byte y, byte color);
void draw_solid(word x, byte y, byte w, byte h, byte color);
void draw_vline(word x, byte y, byte h, byte color);
void draw_copy_solid(word x, byte y, byte w, byte h, const byte* data, byte solid);
// BCD
asm word bcd_add(word a, word b);
#endif