1
0
mirror of https://github.com/sehugg/8bitworkshop.git synced 2024-10-30 00:29:53 +00:00
8bitworkshop/presets/vicdual/soundtest.c

179 lines
15 KiB
C
Raw Normal View History

2017-02-14 23:15:06 +00:00
#include <string.h>
typedef unsigned char byte;
typedef unsigned char word;
__sfr __at (0x0) input0;
__sfr __at (0x1) input1;
__sfr __at (0x2) input2;
__sfr __at (0x3) input3;
2017-02-18 22:50:51 +00:00
__sfr __at (0x1) ay8910_reg;
__sfr __at (0x2) ay8910_data;
2017-02-14 23:15:06 +00:00
__sfr __at (0x40) palette;
2017-02-18 22:50:51 +00:00
byte __at (0xe000) cellram[32][32];
byte __at (0xe800) tileram[256][8];
2017-02-14 23:15:06 +00:00
2017-02-18 22:50:51 +00:00
#define LEFT1 !(input1 & 0x10)
#define RIGHT1 !(input1 & 0x20)
#define UP1 !(input1 & 0x40)
#define DOWN1 !(input1 & 0x80)
#define FIRE1 !(input2 & 0x20)
2017-02-14 23:15:06 +00:00
void main();
2017-02-18 22:50:51 +00:00
// start routine @ 0x0
2017-02-14 23:15:06 +00:00
void start() {
__asm
2017-02-18 22:50:51 +00:00
; set up stack pointer, interrupt flag
LD SP,#0xE800
2017-02-14 23:15:06 +00:00
DI
__endasm;
main();
}
2017-02-18 22:50:51 +00:00
////////
2017-02-14 23:15:06 +00:00
#define LOCHAR 0x0
#define HICHAR 0xff
#define CHAR(ch) (ch-LOCHAR)
2017-02-20 23:50:29 +00:00
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) {
2017-02-14 23:15:06 +00:00
cellram[x][y] = attr;
}
2017-02-20 23:50:29 +00:00
void putstring(byte x, byte y, const char* string) {
2017-02-14 23:15:06 +00:00
while (*string) {
2017-02-20 23:50:29 +00:00
putchar(x++, y, (*string++ - LOCHAR));
2017-02-14 23:15:06 +00:00
}
}
2017-02-20 23:50:29 +00:00
// PC font (code page 437)
2017-05-04 23:25:41 +00:00
const byte font8x8[0x100][8] = {/*{w:8,h:8,bpp:1,count:256,xform:"scaleX(-1) rotate(90deg)"}*/
2017-02-20 23:50:29 +00:00
{ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x7e,0x81,0x95,0xb1,0xb1,0x95,0x81,0x7e }, { 0x7e,0xff,0xeb,0xcf,0xcf,0xeb,0xff,0x7e }, { 0x0e,0x1f,0x3f,0x7e,0x3f,0x1f,0x0e,0x00 }, { 0x08,0x1c,0x3e,0x7f,0x3e,0x1c,0x08,0x00 }, { 0x38,0x3a,0x9f,0xff,0x9f,0x3a,0x38,0x00 }, { 0x10,0x38,0xbc,0xff,0xbc,0x38,0x10,0x00 }, { 0x00,0x00,0x18,0x3c,0x3c,0x18,0x00,0x00 }, { 0xff,0xff,0xe7,0xc3,0xc3,0xe7,0xff,0xff }, { 0x00,0x3c,0x66,0x42,0x42,0x66,0x3c,0x00 }, { 0xff,0xc3,0x99,0xbd,0xbd,0x99,0xc3,0xff }, { 0x70,0xf8,0x88,0x88,0xfd,0x7f,0x07,0x0f }, { 0x00,0x4e,0x5f,0xf1,0xf1,0x5f,0x4e,0x00 }, { 0xc0,0xe0,0xff,0x7f,0x05,0x05,0x07,0x07 }, { 0xc0,0xff,0x7f,0x05,0x05,0x65,0x7f,0x3f }, { 0x99,0x5a,0x3c,0xe7,0xe7,0x3c,0x5a,0x99 }, { 0x7f,0x3e,0x3e,0x1c,0x1c,0x08,0x08,0x00 }, { 0x08,0x08,0x1c,0x1c,0x3e,0x3e,0x7f,0x00 }, { 0x00,0x24,0x66,0xff,0xff,0x66,0x24,0x00 }, { 0x00,0x5f,0x5f,0x00,0x00,0x5f,0x5f,0x00 }, { 0x06,0x0f,0x09,0x7f,0x7f,0x01,0x7f,0x7f }, { 0xda,0xbf,0xa5,0xa5,0xfd,0x59,0x03,0x02 }, { 0x00,0x70,0x70,0x70,0x70,0x70,0x70,0x00 }, { 0x80,0x94,0xb6,0xff,0xff,0xb6,0x94,0x80 }, { 0x00,0x04,0x06,0x7f,0x7f,0x06,0x04,0x00 }, { 0x00,0x10,0x30,0x7f,0x7f,0x30,0x10,0x00 }, { 0x08,0x08,0x08,0x2a,0x3e,0x1c,0x08,0x00 }, { 0x08,0x1c,0x3e,0x2a,0x08,0x08,0x08,0x00 }, { 0x3c,0x3c,0x20,0x20,0x20,0x20,0x20,0x00 }, { 0x08,0x1c,0x3e,0x08,0x08,0x3e,0x1c,0x08 }, { 0x30,0x38,0x3c,0x3e,0x3e,0x3c,0x38,0x30 }, { 0x06,0x0e,0x1e,0x3e,0x3e,0x1e,0x0e,0x06 }, { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x06,0x5f,0x5f,0x06,0x00,0x00,0x00 }, { 0x00,0x07,0x07,0x00,0x07,0x07,0x00,0x00 }, { 0x14,0x7f,0x7f,0x14,0x7f,0x7f,0x14,0x00 }, { 0x24,0x2e,0x6b,0x6b,0x3a,0x12,0x00,0x00 }, { 0x46,0x66,0x30,0x18,0x0c,0x66,0x62,0x00 }, { 0x30,0x7a,0x4f,0x5d,0x37,0x7a,0x48,0x00 }, { 0x04,0x07,0x03,0x00,0x00,0x00,0x00,0x00 }, { 0x00,0x1c,0x3e,0x63,0x41,0x00,0x00,0x00 }, { 0x00,0x41,0x63,0x3e,0x1c,0x00,0x00,0x00 }, { 0x08,0x2a,0x3e,0x1c,0x1c,0x3e,0x2a,0x08 }, { 0x08,0x08,0x3e,0x3e,0x08,0x08,0x00,0x00 }, { 0x00,0xa0,0xe0,0x60,0x00,0x00,0x00,0x00 }, { 0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00 }, { 0x00,0x00,0x60,0x60,0x00,0x00,0x00,0x00 }, { 0x60,0x30,0x18,0x0c,0x06,0x03,0x01,0x00 }, { 0x3e,0x7f,0x59,0x4d,0x7f,0x3e,0x00,0x00 }, { 0x42,0x42,0x7f,0x7f,0x40,0x40,0x00,0x00 }, { 0x62,0x73,0x59,0x49,0x6f,0x66,0x00,0x00 }, { 0x22,0x63,0x49,0x49,0x7f,0x36,0x00,0x00 }, { 0x18,0x1c,0x16,0x13,0x7f,0x7f,0x10,0x00 }, { 0x27,0x67,0x45,0x45,0x7d,0x39,0x00,0x00 }, { 0x3c,0x7e,0x4b,0x49,0x79,0x30,0x00,0x00 }, { 0x03,0x63,0x71,0x19,0x0f,0x07,0x00,0x00 }, { 0x36,0x7f,0x49,0x49,0x7f,0x36,0x00,0x00 }, { 0x06,0x4f,0x49,0x69,0x3f,0x1e,0x00,0x00 }, { 0x00,0x00,0x6c,0x6c,0x00,0x00,0x00,0x00 }, { 0x00,0xa0,0xec,0x6c,0x00,0x00,0x00,0x00 }, { 0x08,0x1c,0x36,0x63,0x41,0x00,0x00,0x00 }, { 0x14,0x14,0x14,0x14,0x14,0x14,0x00,0x00 }, { 0x00,0x41,0x63,0x36,0x1c,0x08,0x00,0x00 }, { 0x02,0x03,0x51,0x59,0x0f,0x06,0x00,0x00 }, { 0x3e,0x7f,0x41,0x5d,0x5d,0x1f,0x1e,0x00 }, { 0x7c,0x7e,0x13,0x13,0x7e,0x7c,0x00,0x00 }, { 0x41,0x7f,0x7f,0x49,0x49,0x7f,0x36,0x00 }, { 0x1c,0x3e,0x63,0x41,0x41,0x63,0x22,0x00 }, { 0x41,0x7f,0x7f,0x41,0x63,0x7f,0x1c,0x00 }, { 0x41,0x7f,0x7f,0x49,0x5d,0x41,0x63,0x00 }, { 0x41,0x7f,0x7f,0x49,0x1d,0x01,0x03,0x00 }, { 0x1c,0x3e,0x63,0x41,0x51,0x73,0x72,0x00 }, { 0x7f,0x7f,0x08,0x08,0x7f,0x7f,0x00,0x00 }, { 0x00,0x41,0x7f,0x7f,0x41,0x00,0x00,0x00 }, { 0x30,0x70,0x40,0x41,0x7f,0x3f,0x01,0x00 }, { 0x41,0x7f,0x7f,0x08,0x1c,0x77,0x63,0x00 }, { 0x41,0x7f,0x7f,0x41,0x40,0x60,0x70,0x00 }, { 0x7f,0x7f,0x06,0x0c,0x06,0x7f,0x7f,0x00 }, { 0x7f,0x7f,0x06,0x0c,0x18,0x7f,0x7f,0x00 }, { 0x1c,0x3e,0x63,0x41,0x63,0x3e,0x1c,0x00 }, { 0x41,0x7f,0x7f,0x49,0x09,0x0f,0x06,0x00 }, { 0x1e,0x3f,0x21,0x71,0x7f,0x5e,0x00,0x00 }, { 0x41,0x7f,0x7f,0x19,0x39,0x6f,0x46,0x00 }, { 0x26,0x67,0x4d,0x59,0x7b,0x32,0x00,0x00 }, { 0x03,0x41,0x7f,0x7f,0x41,0x03,0x00,0x00 }, { 0x7f,0x7f,0x40,0x40,0x7f,0x7f,0x00,0x00 }, { 0x1f,0x3f,0x60,0x60,0x3f,0x1f,0x00,0x00 }, { 0x7f,0x7f,0x30,0x18,0x30,0x7f,0x7f,0x00 }, { 0x63,0x77,0x1c,0x08,0x1c,0x77,0x63,0x00 }, { 0x07,0x4f,0x78,0x78,0x4f,0x07,0x00,0x00 }, { 0x67,0x73,0x59,0x4d,0x47,0x63,0x71,0x00 },
};
2017-02-18 22:50:51 +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;
2017-02-20 23:50:29 +00:00
putchar(x, y, chars[2]);
putchar(x2, y, chars[3]);
putchar(x, y2, chars[0]);
putchar(x2, y2, chars[1]);
2017-02-18 22:50:51 +00:00
while (++x < x2) {
2017-02-20 23:50:29 +00:00
putchar(x, y, chars[5]);
putchar(x, y2, chars[4]);
2017-02-18 22:50:51 +00:00
}
while (++y < y2) {
2017-02-20 23:50:29 +00:00
putchar(x1, y, chars[6]);
putchar(x2, y, chars[7]);
2017-02-18 22:50:51 +00:00
}
}
inline void set8910(byte reg, byte data) {
ay8910_reg = reg;
ay8910_data = data;
}
const char* const AY8910REGNAMES[14] = {
"PITCH A LO", "PITCH A HI",
"PITCH B LO", "PITCH B HI",
"PITCH C LO", "PITCH C HI",
"NOISE PERI",
2017-03-30 21:26:06 +00:00
"!ENABLE",
2017-02-18 22:50:51 +00:00
"ENV-VOL A",
"ENV-VOL B",
"ENV-VOL C",
"ENV PERI LO",
"ENV PERI HI",
"ENV SHAPE"
};
const char* const AY8910MASKS[14] = {
"11111111", " 1111",
"11111111", " 1111",
"11111111", " 1111",
" 11111",
" cbaCBA",
2017-03-31 17:25:18 +00:00
" E1111", " E1111", " E1111",
2017-02-18 22:50:51 +00:00
"11111111", " 1111",
" CALH"
};
char is_control_active() {
return (LEFT1 || RIGHT1 || UP1 || DOWN1 || FIRE1);
}
void ay8910test() {
byte i,j,y;
byte curreg=0,curbit=0;
byte ay8910regs[16];
memset(ay8910regs, 0, sizeof(ay8910regs));
ay8910regs[7] = 0x3f;
while (1) {
for (i=0; i<=13; i++) {
const char* mask = AY8910MASKS[i];
y = 29-i*2;
if (i<10) {
2017-02-20 23:50:29 +00:00
putchar(3, y, CHAR(i+'0'));
2017-02-18 22:50:51 +00:00
} else {
2017-02-20 23:50:29 +00:00
putchar(2, y, CHAR('1'));
putchar(3, y, CHAR(i+'0'-10));
2017-02-18 22:50:51 +00:00
}
for (j=0; j<8; j++) {
char ch = mask[j];
byte bit = (ay8910regs[i] & (128>>j)) != 0;
if (!bit) {
if (ch == '1')
ch = '0';
else if (ch != ' ')
ch = '.';
}
2017-02-20 23:50:29 +00:00
putchar(6+j, y, ch);
2017-02-18 22:50:51 +00:00
}
2017-02-20 23:50:29 +00:00
putstring(16, y, AY8910REGNAMES[i]);
2017-02-18 22:50:51 +00:00
set8910(i, ay8910regs[i]);
}
y = 29-curreg*2;
j = 6+curbit;
2017-02-20 23:50:29 +00:00
putchar(1, y, 175);
putchar(j, y-1, 194);
putchar(j, y+1, 193);
2017-02-18 22:50:51 +00:00
while (is_control_active()) ;
while (!is_control_active()) ;
2017-02-20 23:50:29 +00:00
putchar(1, y, CHAR(' '));
putchar(j, y-1, CHAR(' '));
putchar(j, y+1, CHAR(' '));
2017-02-18 22:50:51 +00:00
if (LEFT1) curbit--;
if (RIGHT1) curbit++;
curbit &= 7;
if (UP1) curreg--;
if (DOWN1) curreg++;
curreg &= 15;
if (FIRE1) {
ay8910regs[curreg] ^= (128>>curbit);
while (FIRE1) ;
}
}
}
2017-02-14 23:15:06 +00:00
void main() {
2017-04-20 00:55:13 +00:00
palette = 0;
2017-02-14 23:15:06 +00:00
memcpy(tileram, font8x8, sizeof(font8x8));
2017-02-18 22:50:51 +00:00
memset(cellram, CHAR(' '), sizeof(cellram));
draw_box(0,0,27,31,BOX_CHARS);
ay8910test();
2017-02-14 23:15:06 +00:00
}