2017-03-30 21:26:06 +00:00
|
|
|
#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)
|
2017-04-19 18:26:46 +00:00
|
|
|
#define TIMER500HZ (input2 & 0x8)
|
2017-03-30 21:26:06 +00:00
|
|
|
|
2017-03-31 17:25:18 +00:00
|
|
|
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
|
2017-03-30 21:26:06 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2017-03-31 17:25:18 +00:00
|
|
|
// PLATFORM CODE
|
2017-03-30 21:26:06 +00:00
|
|
|
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
|
2017-04-12 02:46:06 +00:00
|
|
|
void delay(byte msec) {
|
|
|
|
while (msec--) {
|
|
|
|
while (TIMER500HZ != 0) lfsr++;
|
|
|
|
while (TIMER500HZ == 0) lfsr++;
|
|
|
|
}
|
2017-03-30 21:26:06 +00:00
|
|
|
}
|
|
|
|
|
2017-04-12 02:46:06 +00:00
|
|
|
#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),
|
|
|
|
};
|
|
|
|
|
2017-03-30 21:26:06 +00:00
|
|
|
#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)
|
2018-07-02 22:48:17 +00:00
|
|
|
//#link "cp437.c"
|
2018-07-02 13:34:20 +00:00
|
|
|
extern byte font8x8[0x100][8];
|
2017-03-30 21:26:06 +00:00
|
|
|
|
|
|
|
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]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-03-31 17:25:18 +00:00
|
|
|
// GAME CODE
|
2017-03-30 21:26:06 +00:00
|
|
|
|
|
|
|
void main() {
|
|
|
|
palette = 0;
|
|
|
|
memset(cellram, 0, sizeof(cellram));
|
|
|
|
memcpy(tileram, font8x8, sizeof(font8x8));
|
|
|
|
draw_box(0, 0, 27, 31, BOX_CHARS);
|
|
|
|
while (1) ;
|
|
|
|
}
|