aboutsummaryrefslogtreecommitdiff
path: root/pokeytest/playsdl2.c
diff options
context:
space:
mode:
Diffstat (limited to 'pokeytest/playsdl2.c')
-rw-r--r--pokeytest/playsdl2.c153
1 files changed, 153 insertions, 0 deletions
diff --git a/pokeytest/playsdl2.c b/pokeytest/playsdl2.c
new file mode 100644
index 0000000..3970a2e
--- /dev/null
+++ b/pokeytest/playsdl2.c
@@ -0,0 +1,153 @@
+#include <SDL.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "pokey.h"
+
+#define ROM_FILE "../jumpmanjr.rom"
+#define ROM_SIZE 0x4000
+
+#define FREQ 44100
+
+#define PAL_BUF_SIZE 882
+#define NTSC_BUF_SIZE 735
+
+#define PAL_DELAY 20
+#define NTSC_DELAY 17
+
+unsigned char sndbuf[PAL_BUF_SIZE + 1];
+
+int buf_size = NTSC_BUF_SIZE;
+int delay = NTSC_DELAY;
+
+unsigned char rom[ROM_SIZE];
+
+void usage(void) {
+ fprintf(stderr, "usage: playsnd [-p] 0xaddr\n");
+ exit(1);
+}
+
+void load_rom(void) {
+ int size;
+ FILE *f;
+
+ f = fopen(ROM_FILE, "rb");
+ if(!f) {
+ perror(ROM_FILE);
+ usage();
+ }
+
+ size = fread(rom, 1, ROM_SIZE, f);
+ if(size != ROM_SIZE) {
+ fprintf(stderr, "file %s should be %d bytes long, not %d\n",
+ ROM_FILE, ROM_SIZE, size);
+ usage();
+ }
+
+ fprintf(stderr, "loaded ROM %s, %d bytes\n", ROM_FILE, size);
+}
+
+void play_frames(unsigned char count) {
+ fprintf(stderr, "playing for %d frames\n", count);
+ while(count--) {
+ SDL_Delay(delay);
+ }
+}
+
+void play_sfx(int addr) {
+ unsigned char *p = rom + (addr - 0x8000);
+
+ while(1) {
+ fprintf(stderr, "$%04lx: $%02x\n", (p - rom + 0x8000), *p);
+ switch(*p) {
+ case 0:
+ fprintf(stderr, "opcode 0 (snd_end)\n");
+ return;
+ case 1:
+ fprintf(stderr, "opcode 1 (snd_audc)\n");
+ Update_pokey_sound(audc1, *++p);
+ play_frames(*++p);
+ ++p;
+ break;
+ case 2:
+ fprintf(stderr, "opcode 2 (snd_jump)\n");
+ addr = *++p;
+ addr |= ( (*++p) << 8);
+ addr -= 0x8000;
+ p = rom + addr;
+ break;
+ case 3:
+ fprintf(stderr, "opcode 3 (snd_rest)\n");
+ Update_pokey_sound(audc1, 0);
+ play_frames(*++p);
+ ++p;
+ break;
+ default:
+ fprintf(stderr, "opcode $%02x (snd_note)\n", *p);
+ Update_pokey_sound(audf1, *p);
+ play_frames(*++p);
+ ++p;
+ break;
+ }
+ }
+}
+
+void sdl_audio_callback(void *userdata, Uint8* stream, int len) {
+ Pokey_process(stream, len);
+}
+
+void init_sdl_audio(void) {
+ SDL_AudioSpec want, have;
+ SDL_AudioDeviceID dev;
+
+ if(SDL_Init(SDL_INIT_AUDIO) < 0) {
+ fprintf(stderr, "Couldn't initialize SDL: %s\n", SDL_GetError());
+ exit(-1);
+ }
+ atexit(SDL_Quit);
+
+ SDL_memset(&want, 0, sizeof(want));
+ want.freq = FREQ;
+ want.format = AUDIO_U8;
+ want.channels = 1;
+ want.samples = buf_size;
+ want.callback = sdl_audio_callback;
+
+ dev = SDL_OpenAudioDevice(0, 0, &want, &have, 0);
+ if(!dev) {
+ fprintf(stderr, "Failed to open audio: %s\n", SDL_GetError());
+ exit(-1);
+ }
+
+ SDL_PauseAudioDevice(dev, 0);
+}
+
+int main(int argc, char **argv) {
+ int addr;
+
+ if(argc < 2 || argc > 3) usage();
+
+ if(argc == 3) {
+ buf_size = PAL_BUF_SIZE;
+ delay = PAL_DELAY;
+ addr = (int)strtol(argv[2], 0, 16);
+ } else {
+ addr = (int)strtol(argv[1], 0, 16);
+ }
+
+ if(addr < 0x8000 || addr > 0xbfff) {
+ fprintf(stderr, "invalid address, must be 0x8fff thru 0xbfff\n");
+ usage();
+ }
+
+ load_rom();
+
+ fprintf(stderr, "playing sfx at $%04x, buf_size %d\n", addr, buf_size);
+
+ Pokey_sound_init(FREQ_17_APPROX, FREQ);
+ init_sdl_audio();
+ play_sfx(addr);
+
+ return(0);
+}