8bitworkshop/presets/vicdual/skeleton.sdcc

166 lines
3.4 KiB
Plaintext

#include <string.h>
typedef unsigned char byte;
typedef unsigned short word;
// PLATFORM DEFINITION
__sfr __at (0x0) input0;
__sfr __at (0x1) input1;
__sfr __at (0x2) input2;
__sfr __at (0x3) input3;
__sfr __at (0x1) ay8910_reg;
__sfr __at (0x2) ay8910_data;
__sfr __at (0x40) palette;
byte __at (0xe000) cellram[28][32];
byte __at (0xe800) tileram[256][8];
#define LEFT1 !(input1 & 0x10)
#define RIGHT1 !(input1 & 0x20)
#define UP1 !(input1 & 0x40)
#define DOWN1 !(input1 & 0x80)
#define FIRE1 !(input2 & 0x20)
#define COIN1 (input3 & 0x8)
#define START1 !(input2 & 0x10)
#define START2 !(input3 & 0x20)
#define TIMER500HZ (input2 & 0x8)
inline void set8910(byte reg, byte data) {
ay8910_reg = reg;
ay8910_data = data;
}
typedef enum {
AY_PITCH_A_LO, AY_PITCH_A_HI,
AY_PITCH_B_LO, AY_PITCH_B_HI,
AY_PITCH_C_LO, AY_PITCH_C_HI,
AY_NOISE_PERIOD,
AY_ENABLE,
AY_ENV_VOL_A,
AY_ENV_VOL_B,
AY_ENV_VOL_C,
AY_ENV_PERI_LO, AY_ENV_PERI_HI,
AY_ENV_SHAPE
} AY8910Register;
// STARTUP CODE
void main();
void gsinit();
// start routine @ 0x0
void start() {
__asm
LD SP,#0xE800 ; set up stack pointer
DI ; disable interrupts
__endasm;
gsinit();
main();
}
#define INIT_MAGIC 0xdeadbeef
static long is_initialized = INIT_MAGIC;
// set initialized portion of global memory
// by copying INITIALIZER area -> INITIALIZED area
void gsinit() {
// already initialized? skip it
if (is_initialized == INIT_MAGIC)
return;
__asm
; copy initialized data to RAM
LD BC, #l__INITIALIZER
LD A, B
LD DE, #s__INITIALIZED
LD HL, #s__INITIALIZER
LDIR
__endasm;
}
// PLATFORM CODE
static word lfsr = 1;
word rand() {
unsigned lsb = lfsr & 1; /* Get LSB (i.e., the output bit). */
lfsr >>= 1; /* Shift register */
if (lsb) { /* If the output bit is 1, apply toggle mask. */
lfsr ^= 0xB400u;
}
return lfsr;
}
void delay(byte msec) {
while (msec--) {
while (TIMER500HZ != 0) lfsr++;
while (TIMER500HZ == 0) lfsr++;
}
}
#define PE(fg,bg) (((fg)<<5) | ((bg)<<1))
const byte __at (0x4000) color_prom[32] = {
PE(7,0),PE(3,0),PE(1,0),PE(3,0),PE(6,0),PE(3,0),PE(2,0),PE(6,0),
PE(7,0),PE(3,0),PE(1,0),PE(3,0),PE(6,0),PE(3,0),PE(2,0),PE(6,0),
PE(7,0),PE(3,0),PE(1,0),PE(3,0),PE(6,0),PE(3,0),PE(2,0),PE(6,0),
PE(7,0),PE(3,0),PE(1,0),PE(3,0),PE(6,0),PE(3,0),PE(2,0),PE(6,0),
};
#define LOCHAR 0x0
#define HICHAR 0xff
#define CHAR(ch) (ch-LOCHAR)
void clrscr() {
memset(cellram, CHAR(' '), sizeof(cellram));
}
byte getchar(byte x, byte y) {
return cellram[x][y];
}
void putchar(byte x, byte y, byte attr) {
cellram[x][y] = attr;
}
void putstring(byte x, byte y, const char* string) {
while (*string) {
putchar(x++, y, CHAR(*string++));
}
}
// PC font (code page 437)
//#link "cp437.c"
extern byte font8x8[0x100][8];
const char BOX_CHARS[8] = { 218, 191, 192, 217, 196, 196, 179, 179 };
void draw_box(byte x, byte y, byte x2, byte y2, const char* chars) {
byte x1 = x;
putchar(x, y, chars[2]);
putchar(x2, y, chars[3]);
putchar(x, y2, chars[0]);
putchar(x2, y2, chars[1]);
while (++x < x2) {
putchar(x, y, chars[5]);
putchar(x, y2, chars[4]);
}
while (++y < y2) {
putchar(x1, y, chars[6]);
putchar(x2, y, chars[7]);
}
}
// GAME CODE
void main() {
palette = 0;
memset(cellram, 0, sizeof(cellram));
memcpy(tileram, font8x8, sizeof(font8x8));
draw_box(0, 0, 27, 31, BOX_CHARS);
while (1) ;
}