From 2b69ac0b74d9cf26525bbc66eb11ebeee5c2dba2 Mon Sep 17 00:00:00 2001 From: Alex Baines Date: Thu, 16 Mar 2017 02:16:34 +0000 Subject: [PATCH] GitHub release --- LICENSE | 19 + Makefile | 2 + README.md | 28 ++ anim.gif | Bin 0 -> 195075 bytes audio.c | 420 ++++++++++++++++++++++ debug.c | 302 ++++++++++++++++ minigbs.c | 1027 +++++++++++++++++++++++++++++++++++++++++++++++++++++ minigbs.h | 66 ++++ 8 files changed, 1864 insertions(+) create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 README.md create mode 100644 anim.gif create mode 100644 audio.c create mode 100644 debug.c create mode 100644 minigbs.c create mode 100644 minigbs.h diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1b59d28 --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2017 Alex Baines + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..9f760df --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +minigbs: minigbs.c debug.c audio.c minigbs.h + gcc -g -O2 -std=gnu99 minigbs.c debug.c audio.c -o $@ -lncursesw -lSDL2 -lm diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e6fba9 --- /dev/null +++ b/README.md @@ -0,0 +1,28 @@ +# MiniGBS + +MiniGBS is a small .gbs file (gameboy music) player with an ncurses UI. +It's not cycle-accurate, but still sounds good for most of the files I've tested. + +## Hotkeys + n/→ Next song + p/← Prev song + r/↑ Restart song + space/↓ Pause/Resume + -/= Volume down/up + 1/2/3/4 Toggle channel + esc/q Quit + +## Recommended Listening: + Asterix & Obelix - *Alberto Jose González* + Mole Mania - *Taro Bando* + Pokemon Crystal - *Junichi Masuda, Gō Ichinose* + Pokemon Red - *Junichi Masuda* + Shantae - *Jake Kaufman* + Street Fighter II - *Yoko Shimomura, Isao Abe* + The Smurfs' Nightmare - *Alberto Jose González* + Turok: Battle of the Bionosaurs - *Alberto Jose González* + Zelda Oracle of Ages/Seasons - *Kiyohiro Sada, Minako Adachi* + +![Screenshot](/anim.gif) + + diff --git a/anim.gif b/anim.gif new file mode 100644 index 0000000000000000000000000000000000000000..63314bd6b41b305968284489cd2c0fb6a964924f GIT binary patch literal 195075 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%0Ao>O$`UzLl32 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 literal 0 HcmV?d00001 diff --git a/audio.c b/audio.c new file mode 100644 index 0000000..bf7b08a --- /dev/null +++ b/audio.c @@ -0,0 +1,420 @@ +#include +#include "minigbs.h" + +struct chan_len_ctr { + int load; + bool enabled; + float counter; + float inc; +}; + +struct chan_vol_env { + int step; + bool up; + float counter; + float inc; +}; + +struct chan_freq_sweep { + int freq; + int rate; + bool up; + int shift; + float counter; + float inc; +}; + +static struct chan { + bool enabled; + bool powered; + bool on_left; + bool on_right; + bool user_mute; + + int volume; + int volume_init; + + uint16_t freq; + float freq_counter; + float freq_inc; + + int val; + int note; + + struct chan_len_ctr len; + struct chan_vol_env env; + struct chan_freq_sweep sweep; + + // square + int duty; + + // noise + uint16_t lfsr_reg; + bool lfsr_wide; + int lfsr_div; +} chans[4]; + +#define FREQ 44100 +#define FREQF ((float)FREQ) +#define HZ 59.7f +#define SAMPLES ((FREQ / (int)HZ)) +#define DBLSAMPLES (SAMPLES*2) + +static float samples[DBLSAMPLES]; +static SDL_AudioDeviceID audio; +static const float duty[] = { 0.125, 0.25, 0.5, 0.25 }; +static float logbase; +static const char* notes[] = { + "A-", "A#", "B-", "C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-", "G#" +}; + +void set_note_freq(struct chan* c, float freq){ + c->freq_inc = freq / FREQF; + c->note = MAX(0, (int)roundf(logf(freq/440.0f) / logbase) + 48); +} + +bool chan_muted(struct chan* c){ + return c->user_mute || !c->enabled || !(c->on_left || c->on_right); +} + +void chan_enable(int i, bool enable){ + chans[i].enabled = enable; + + uint8_t val = (mem[0xFF26] & 0x80) + | (chans[3].enabled << 3) + | (chans[2].enabled << 2) + | (chans[1].enabled << 1) + | (chans[0].enabled << 0); + + mem[0xFF26] = val; +} + +void update_env(struct chan* c){ + c->env.counter += c->env.inc; + + while(c->env.counter > 1.0f){ + c->volume += c->env.up ? 1 : -1; + c->volume = MAX(0, MIN(15, c->volume)); + c->env.counter -= 1.0f; + } +} + +void update_len(struct chan* c){ + + if(c->len.enabled){ + c->len.counter += c->len.inc; + if(c->len.counter > 1.0f){ + chan_enable(c - chans, 0); + c->len.counter = 0.0f; + } + } +} + +int update_freq(struct chan* c){ + c->freq_counter += c->freq_inc; + + int result = 0; + while(c->freq_counter > 1.0f){ + c->freq_counter -= 1.0f; + result++; + } + + return result; +} + +void update_sweep(struct chan* c){ + c->sweep.counter += c->sweep.inc; + + while(c->sweep.counter > 1.0f){ + if(c->sweep.shift){ + uint16_t inc = (c->sweep.freq >>= c->sweep.shift); + if(!c->sweep.up) inc *= -1; + + c->freq += inc; + c->sweep.freq = c->freq; + + set_note_freq(c, 4194304 / (float)((2048 - c->freq) << 5)); + } else { + c->enabled = 0; + } + c->sweep.counter -= 1.0f; + } +} + +void update_square(bool ch2){ + struct chan* c = chans + ch2; + + set_note_freq(c, 4194304 / (float)((2048 - c->freq) << 5)); + + for(int i = 0; i < DBLSAMPLES; i+=2){ + update_len(c); + + if(c->enabled){ + update_env(c); + if(!ch2) update_sweep(c); + + if(update_freq(c)){ + c->val = 1; + } else if(c->freq_counter > duty[c->duty]){ + c->val = -1; + } + + if(!chan_muted(c)){ + samples[i+0] += c->val * (c->volume / 15.0f) * 0.25 * c->on_left; + samples[i+1] += c->val * (c->volume / 15.0f) * 0.25 * c->on_right; + } + } + } +} + +void update_wave(void){ + struct chan* c = chans + 2; + + set_note_freq(c, 4194304 / (float)((2048 - c->freq) << 5)); + c->freq_inc *= 16.0f; + + for(int i = 0; i < DBLSAMPLES; i+=2){ + update_len(c); + + if(c->enabled){ + c->val = (c->val + update_freq(c)) & 31; + + uint8_t s = mem[0xFF30 + c->val / 2]; + if(c->val & 1){ + s &= 0xF; + } else { + s >>= 4; + } + + if(c->volume > 0){ + s >>= (c->volume - 1); + float diff = (float[]){ 7.5f, 3.75f, 1.875 }[c->volume - 1]; + float ss = (float)s; + + if(!chan_muted(c)){ + samples[i+0] += ((ss - diff) / 30.0f) * c->on_left; + samples[i+1] += ((ss - diff) / 30.0f) * c->on_right; + } + } + } + } +} + +void update_noise(void){ + struct chan* c = chans + 3; + + float freq = 4194304.0f / (float)((int[]){ 8, 16, 32, 48, 64, 80, 96, 112 }[c->lfsr_div] << c->freq); + set_note_freq(c, c->freq < 14 ? freq : 0.0f); + + for(int i = 0; i < DBLSAMPLES; i+=2){ + update_len(c); + + if(c->enabled){ + update_env(c); + + if(update_freq(c)){ + c->lfsr_reg = (c->lfsr_reg << 1) | (c->val == 1); + + if(c->lfsr_wide){ + c->val = !(((c->lfsr_reg >> 14) & 1) ^ ((c->lfsr_reg >> 13) & 1)) ? 1 : -1; + } else { + c->val = !(((c->lfsr_reg >> 6 ) & 1) ^ ((c->lfsr_reg >> 5 ) & 1)) ? 1 : -1; + } + } + + if(!chan_muted(c)){ + samples[i+0] += c->val * (c->volume / 15.0f) * 0.25f * c->on_left; + samples[i+1] += c->val * (c->volume / 15.0f) * 0.25f * c->on_right; + } + } + } +} + +bool audio_mute(int chan, int val){ + chans[chan-1].user_mute = (val != -1) ? val : !chans[chan-1].user_mute; +} + +void audio_output(){ + memset(samples, 0, sizeof(samples)); + + update_square(0); + update_square(1); + update_wave(); + update_noise(); + + // draw notes + if(!cfg.hide_ui){ + move((cfg.win_h-6)/6+9, (cfg.win_w-47)/2+9); + attron(A_BOLD); + for(int i = 0; i < 3; ++i){ + if(!chan_muted(chans + i)){ + printw("[ "); + attron(COLOR_PAIR(i+1)); + int octave = MAX(0, MIN(chans[i].note / 12, 9));; + printw("%s%d", notes[chans[i].note % 12], octave); + attroff(COLOR_PAIR(i+1)); + printw(" ] "); + } else { + printw("[ ] "); + } + } + attroff(A_BOLD); + } + + for(int i = 0; i < SAMPLES*2; ++i){ + samples[i] *= cfg.volume; + } + + while(SDL_GetQueuedAudioSize(audio) > (SAMPLES * sizeof(float) * 5)){ + usleep(250); + } + + SDL_QueueAudio(audio, samples, sizeof(samples)); +} + +void audio_pause(bool p){ + SDL_PauseAudioDevice(audio, p); +} + +void audio_init(void){ + + if(SDL_Init(SDL_INIT_AUDIO) != 0){ + fprintf(stderr, "Error calling SDL_Init: %s\n", SDL_GetError()); + exit(1); + } + + SDL_AudioSpec want = { + .freq = FREQ, + .channels = 2, + .samples = 512, + .format = AUDIO_F32SYS, + }; + + SDL_AudioSpec got; + if((audio = SDL_OpenAudioDevice(NULL, 0, &want, &got, 0)) == 0){ + printf("OpenAudio failed: %s.\n", SDL_GetError()); + exit(1); + } else if(cfg.debug_mode){ + printf("Got audio: freq=%d, samples=%d, format=%d.\n", got.freq, got.samples, got.format); + } + + logbase = log(1.059463094f); + + SDL_QueueAudio(audio, samples, sizeof(samples)); + SDL_PauseAudioDevice(audio, 0); +} + +void chan_trigger(int i){ + struct chan* c = chans + i; + + chan_enable(i, 1); + c->volume = c->volume_init; + + // volume envelope + { + uint8_t val = mem[0xFF12 + (i*5)]; + + c->env.step = val & 0x07; + c->env.up = val & 0x08; + c->env.inc = c->env.step ? (64.0f / (float)c->env.step) / FREQF : 0.0f; + c->env.counter = 0.0f; + } + + // freq sweep + if(i == 0){ + uint8_t val = mem[0xFF10]; + + c->sweep.freq = c->freq; + c->sweep.rate = (val >> 4) & 0x07; + c->sweep.up = !(val & 0x08); + c->sweep.shift = (val & 0x07); + c->sweep.inc = c->sweep.rate ? (128.0f / (float)(c->sweep.rate + 1)) / FREQF : 0.0f; + c->sweep.counter = 0.0f; + } + + int len_max = 64; + + if(i == 2){ // wave + len_max = 256; + } else if(i == 3){ // noise + c->lfsr_reg = 0xFFFF; + } + + c->len.inc = (256.0f / (float)(len_max - c->len.load)) / FREQF; + c->len.counter = 0.0f; + + c->freq_counter = 0.0f; + + c->val = 0; +} + +void audio_write(uint16_t addr, uint8_t val){ + + if(cfg.debug_mode){ + printf("Audio write: %4x <- %2x\n", addr, val); + } + + int i = (addr - 0xFF10)/5; + + switch(addr){ + + case 0xFF12: + case 0xFF17: + case 0xFF21: + chans[i].volume = chans[i].volume_init = val >> 4; + break; + + case 0xFF1C: + chans[i].volume = chans[i].volume_init = (val >> 5) & 0x03; + break; + + case 0xFF11: + case 0xFF16: + case 0xFF20: + chans[i].len.load = val & 0x3f; + chans[i].duty = val >> 6; + break; + + case 0xFF1B: + chans[i].len.load = val; + break; + + case 0xFF13: + case 0xFF18: + case 0xFF1D: + chans[i].freq &= 0xFF00; + chans[i].freq |= val; + break; + + case 0xFF1A: + chan_enable(i, val & 0x80); + break; + + case 0xFF14: + case 0xFF19: + case 0xFF1E: + chans[i].freq &= 0x00FF; + chans[i].freq |= ((val & 0x07) << 8); + case 0xFF23: + chans[i].len.enabled = val & 0x40; + if(val & 0x80){ + chan_trigger(i); + } + break; + + case 0xFF22: + chans[3].freq = val >> 4; + chans[3].lfsr_wide = !(val & 0x08); + chans[3].lfsr_div = val & 0x07; + break; + + case 0xFF25: { + for(int i = 0; i < 4; ++i){ + chans[i].on_left = (val >> (4 + i)) & 1; + chans[i].on_right = (val >> i) & 1; + } + } break; + } + + mem[addr] = val; +} diff --git a/debug.c b/debug.c new file mode 100644 index 0000000..4cf8fbd --- /dev/null +++ b/debug.c @@ -0,0 +1,302 @@ +#include +#include + +static const char* opcodes[] = { + [0x00] = "NOP", + [0x01] = "LD BC, %#2hhx", + [0x02] = "LD (BC), A", + [0x03] = "INC BC", + [0x04] = "INC B", + [0x05] = "DEC B", + [0x06] = "LD B, %#2hhx", + [0x07] = "RLCA", + [0x08] = "LD (%#4hx), SP", + [0x09] = "ADD HL,BC", + [0x0A] = "LD A, (BC)", + [0x0B] = "DEC BC", + [0x0C] = "INC C", + [0x0D] = "DEC C", + [0x0E] = "LD C, %#2hhx", + [0x0F] = "RRCA", + + [0x10] = "STOP 0", + [0x11] = "LD DE, %#4hx", + [0x12] = "LD (DE), A", + [0x13] = "INC DE", + [0x14] = "INC D", + [0x15] = "DEC D", + [0x16] = "LD D, %#2hhx", + [0x17] = "RLA", + [0x18] = "JR %+hhd", + [0x19] = "ADD HL, DE", + [0x1A] = "LD A, (DE)", + [0x1B] = "DEC DE", + [0x1C] = "INC E", + [0x1D] = "DEC E", + [0x1E] = "LD E, %#2hhx", + [0x1F] = "RRA", + + [0x20] = "JR NZ, %+hhd", + [0x21] = "LD HL, %#4hx", + [0x22] = "LD (HL+), A", + [0x23] = "INC HL", + [0x24] = "INC H", + [0x25] = "DEC H", + [0x26] = "LD H, %#2hhx", + [0x27] = "DAA", + [0x28] = "JR Z, %+hhd", + [0x29] = "ADD HL, HL", + [0x2A] = "LD A, (HL+)", + [0x2B] = "DEC HL", + [0x2C] = "INC L", + [0x2D] = "DEC L", + [0x2E] = "LD L, %#2hhx", + [0x2F] = "CPL", + + [0x30] = "JR NC, %+hhd", + [0x31] = "LD SP, %#4hx", + [0x32] = "LD (HL-), A", + [0x33] = "INC SP", + [0x34] = "INC (HL)", + [0x35] = "DEC (HL)", + [0x36] = "LD (HL), %#2hhx", + [0x37] = "SCF", + [0x38] = "JR C, %+hhd", + [0x39] = "ADD HL, SP", + [0x3A] = "LD A, (HL-)", + [0x3B] = "DEC SP", + [0x3C] = "INC A", + [0x3D] = "DEC A", + [0x3E] = "LD A, %#2hhx", + [0x3F] = "CCF", + + [0x40] = "LD B, B", + [0x41] = "LD B, C", + [0x42] = "LD B, D", + [0x43] = "LD B, E", + [0x44] = "LD B, H", + [0x45] = "LD B, L", + [0x46] = "LD B, (HL)", + [0x47] = "LD B, A", + [0x48] = "LD C, B", + [0x49] = "LD C, C", + [0x4A] = "LD C, D", + [0x4B] = "LD C, E", + [0x4C] = "LD C, H", + [0x4D] = "LD C, L", + [0x4E] = "LD C, (HL)", + [0x4F] = "LD C, A", + + [0x50] = "LD D, B", + [0x51] = "LD D, C", + [0x52] = "LD D, D", + [0x53] = "LD D, E", + [0x54] = "LD D, H", + [0x55] = "LD D, L", + [0x56] = "LD D, (HL)", + [0x57] = "LD D, A", + [0x58] = "LD E, B", + [0x59] = "LD E, C", + [0x5A] = "LD E, D", + [0x5B] = "LD E, E", + [0x5C] = "LD E, H", + [0x5D] = "LD E, L", + [0x5E] = "LD E, (HL)", + [0x5F] = "LD E, A", + + [0x60] = "LD H, B", + [0x61] = "LD H, C", + [0x62] = "LD H, D", + [0x63] = "LD H, E", + [0x64] = "LD H, H", + [0x65] = "LD H, L", + [0x66] = "LD H, (HL)", + [0x67] = "LD H, A", + [0x68] = "LD L, B", + [0x69] = "LD L, C", + [0x6A] = "LD L, D", + [0x6B] = "LD L, E", + [0x6C] = "LD L, H", + [0x6D] = "LD L, L", + [0x6E] = "LD L, (HL)", + [0x6F] = "LD L, A", + + [0x70] = "LD (HL),B", + [0x71] = "LD (HL),C", + [0x72] = "LD (HL),D", + [0x73] = "LD (HL),E", + [0x74] = "LD (HL),H", + [0x75] = "LD (HL),L", + [0x76] = "HALT", + [0x77] = "LD (HL),A", + [0x78] = "LD A,B", + [0x79] = "LD A,C", + [0x7A] = "LD A,D", + [0x7B] = "LD A,E", + [0x7C] = "LD A,H", + [0x7D] = "LD A,L", + [0x7E] = "LD A,(HL)", + [0x7F] = "LD A,A", + + [0x80] = "ADD A,B", + [0x81] = "ADD A,C", + [0x82] = "ADD A,D", + [0x83] = "ADD A,E", + [0x84] = "ADD A,H", + [0x85] = "ADD A,L", + [0x86] = "ADD A,(HL)", + [0x87] = "ADD A,A", + [0x88] = "ADC A,B", + [0x89] = "ADC A,C", + [0x8A] = "ADC A,D", + [0x8B] = "ADC A,E", + [0x8C] = "ADC A,H", + [0x8D] = "ADC A,L", + [0x8E] = "ADC A,(HL)", + [0x8F] = "ADC A,A", + + [0x90] = "SUB B", + [0x91] = "SUB C", + [0x92] = "SUB D", + [0x93] = "SUB E", + [0x94] = "SUB H", + [0x95] = "SUB L", + [0x96] = "SUB (HL)", + [0x97] = "SUB A", + [0x98] = "SBC A,B", + [0x99] = "SBC A,C", + [0x9A] = "SBC A,D", + [0x9B] = "SBC A,E", + [0x9C] = "SBC A,H", + [0x9D] = "SBC A,L", + [0x9E] = "SBC A,(HL)", + [0x9F] = "SBC A,A", + + [0xA0] = "AND B", + [0xA1] = "AND C", + [0xA2] = "AND D", + [0xA3] = "AND E", + [0xA4] = "AND H", + [0xA5] = "AND L", + [0xA6] = "AND (HL)", + [0xA7] = "AND A", + [0xA8] = "XOR B", + [0xA9] = "XOR C", + [0xAA] = "XOR D", + [0xAB] = "XOR E", + [0xAC] = "XOR H", + [0xAD] = "XOR L", + [0xAE] = "XOR (HL)", + [0xAF] = "XOR A", + + [0xB0] = "OR B", + [0xB1] = "OR C", + [0xB2] = "OR D", + [0xB3] = "OR E", + [0xB4] = "OR H", + [0xB5] = "OR L", + [0xB6] = "OR (HL)", + [0xB7] = "OR A", + [0xB8] = "CP B", + [0xB9] = "CP C", + [0xBA] = "CP D", + [0xBB] = "CP E", + [0xBC] = "CP H", + [0xBD] = "CP L", + [0xBE] = "CP (HL)", + [0xBF] = "CP A", + + [0xC0] = "RET NZ", + [0xC1] = "POP BC", + [0xC2] = "JP NZ, %#4hx", + [0xC3] = "JP %#4hx", + [0xC4] = "CALL NZ, %#4hx", + [0xC5] = "PUSH BC", + [0xC6] = "ADD A, %#2hhx", + [0xC7] = "RST 00H", + [0xC8] = "RET Z", + [0xC9] = "RET", + [0xCA] = "JP Z, %#4hx", + [0xCB] = "~~~ CB ~~~~", + [0xCC] = "CALL Z, %#4hx", + [0xCD] = "CALL %#4hx", + [0xCE] = "ADC A, %#2hhx", + [0xCF] = "RST 08H", + + [0xD0] = "RET NC", + [0xD1] = "POP DE", + [0xD2] = "JP NC, %#4hx", + [0xD3] = "???", + [0xD4] = "CALL NC, %#4hx", + [0xD5] = "PUSH DE", + [0xD6] = "SUB %#2hhx", + [0xD7] = "RST 10H", + [0xD8] = "RET C", + [0xD9] = "RETI", + [0xDA] = "JP C, %#4hx", + [0xDB] = "???", + [0xDC] = "CALL C, %#4hx", + [0xDD] = "???", + [0xDE] = "SBC A, %#2hhx", + [0xDF] = "RST 18H", + + [0xE0] = "LDH (%#2hhx), A", + [0xE1] = "POP HL", + [0xE2] = "LD (C), A", + [0xE3] = "???", + [0xE4] = "???", + [0xE5] = "PUSH HL", + [0xE6] = "AND %#2hhx", + [0xE7] = "RST 20H", + [0xE8] = "ADD SP, %+hhd", + [0xE9] = "JP (HL)", + [0xEA] = "LD (%#4x), A", + [0xEB] = "???", + [0xEC] = "???", + [0xED] = "???", + [0xEE] = "XOR %#2hhx", + [0xEF] = "RST 28H", + + [0xF0] = "LDH A, (%#2hhx)", + [0xF1] = "POP AF", + [0xF2] = "LD A, (C)", + [0xF3] = "DI", + [0xF4] = "???", + [0xF5] = "PUSH AF", + [0xF6] = "OR %#2hhx", + [0xF7] = "RST 30H", + [0xF8] = "LD HL,SP%+hhd", + [0xF9] = "LD SP, HL", + [0xFA] = "LD A, (%#2hhx)", + [0xFB] = "EI", + [0xFC] = "???", + [0xFD] = "???", + [0xFE] = "CP %#2hhx", + [0xFF] = "RST 38H", +}; + +static const char* cb_ops[] = { + "RLC", "RRC", "RL", "RR", "SLA", "SRA", "SWAP", "SRL", "BIT", "RES", "SET", +}; + +static const char* regs[] = { + "B", "C", "D", "E", "H", "L", "(HL)", "A" +}; + +void debug_dump(uint8_t* op){ + if(*op == 0xCB){ + size_t x = (op[1] >> 6); + size_t y = (op[1] >> 3) & 7; + size_t z = op[1] & 7; + + if(x == 0){ + printf("%s %s\n", cb_ops[y], regs[z]); + } else { + printf("%s %zu %s\n", cb_ops[x + 7], y, regs[z]); + } + } else { + const char* fmt = opcodes[*op]; + printf(fmt, *(uint16_t*)(op+1), 0); + puts(""); + } +} diff --git a/minigbs.c b/minigbs.c new file mode 100644 index 0000000..7ddf986 --- /dev/null +++ b/minigbs.c @@ -0,0 +1,1027 @@ +#include +#include +#include +#include +#include +#include "minigbs.h" + +#if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +#error "Some of the bitfield / casting used in here assumes little endian :(" +#endif + +struct Config cfg; +uint8_t* mem; + +static uint8_t* banks[32]; +static int next_counter; +static int boldness[16*3]; +static struct GBSHeader h; + +void bank_switch(int which){ + if(cfg.debug_mode) printf("Bank switching to %d.\n", which); + + // allowing bank switch to 0 seems to break some games + if(which > 0 && which < 32 && banks[which]){ + memcpy(mem + 0x4000, banks[which], 0x4000); + if(cfg.debug_mode) puts("Bank switch success."); + } +} + +static inline void mem_write(uint16_t addr, uint8_t val){ + if(addr >= 0x2000 && addr < 0x4000){ + bank_switch(val); + } else if(addr >= 0xFF10 && addr <= 0xFF40){ + if(!cfg.subdued && mem[addr] != val){ + boldness[addr - 0xFF10] = 8; + } + audio_write(addr, val); + next_counter = 0; + } else if(addr < 0x2000){ + //printf("rom write?: [%4x] <- [%2x]\n", addr, val); + } else { + if(cfg.debug_mode){ + switch(addr){ + case 0xFF04: printf("DIV write: %2x\n", val); break; + case 0xFF05: printf("TIMA write: %2x\n", val); break; + case 0xFF06: printf("TMA write: %2x\n", val); break; + case 0xFF07: printf("TAC write: %2x\n", val); break; + case 0xFF0F: printf("IF write: %2x\n", val); break; + case 0xFF41: printf("STAT: %2x\n", val); break; + case 0xFF46: printf("DMA: %2x\n", val); break; + case 0xFFFF: printf("IE: %2x\n", val); break; + } + } + mem[addr] = val; + } +} + +static inline uint8_t mem_read(uint16_t addr){ + uint8_t val = mem[addr]; + + static uint8_t ortab[] = { + 0x80, 0x3f, 0x00, 0xff, 0xbf, + 0xff, 0x3f, 0x00, 0xff, 0xbf, + 0x7f, 0xff, 0x9f, 0xff, 0xbf, + 0xff, 0xff, 0x00, 0x00, 0xbf, + 0x00, 0x00, 0x70 + }; + + if(addr >= 0xFF10 && addr <= 0xFF26){ + val |= ortab[addr - 0xFF10]; + } + + if(cfg.debug_mode){ + switch(addr){ + case 0xFF10 ... 0xFF40: printf("Audio read: [%4x] = [%2x]\n", addr, val); break; + case 0xFF04: printf("DIV read: %2x\n", val); break; + case 0xFF05: printf("TIMA read: %2x\n", val); break; + case 0xFF06: printf("TMA read: %2x\n", val); break; + case 0xFF07: printf("TAC read: %2x\n", val); break; + case 0xFF0F: printf("IF read: %2x\n", val); break; + case 0xFF41: printf("STAT read: %2x\n", val); break; + case 0xFF46: printf("DMA read: %2x\n", val); break; + case 0xFFFF: printf("IE read: %2x\n", val); break; + } + } + return val; +} + +bool cpu_step(void){ + + uint8_t op = mem[regs.pc]; + size_t x = op >> 6; + size_t y = (op >> 3) & 7; + size_t z = op & 7; + + bool is_ret = false; + unsigned cycles = 0; + + if(cfg.debug_mode){ + printf("[PC:%4x] [SP:%4x] [AF:%4x] [BC:%4x] [DE:%4x] [HL:%4x] [%2x] ", + regs.pc, regs.sp, regs.af, regs.bc, regs.de, regs.hl, op); + debug_dump(mem + regs.pc); + } + +#define OP(x) &&op_##x +#define ALUY (void*)(1) + + static const void* xmap[4] = { + [1] = OP(mov8), + [2] = ALUY + }; + + static const void* zmap[4][8] = { + [0] = { + [2] = OP(ldsta16), + [3] = OP(incdec16), + [4] = OP(inc8), + [5] = OP(dec8), + [6] = OP(ld8) + }, + [3] = { + [6] = ALUY, + [7] = OP(rst) + }, + }; + + static const void* ymap[4][8][8] = { + [0] = { + [0] = { OP(nop) , OP(stsp) , OP(stop), OP(jr) , OP(jrcc), OP(jrcc) , OP(jrcc), OP(jrcc) }, + [1] = { OP(ld16), OP(addhl), OP(ld16), OP(addhl), OP(ld16), OP(addhl), OP(ld16), OP(addhl) }, + [7] = { OP(rlca), OP(rrca) , OP(rla) , OP(rra) , OP(daa) , OP(cpl) , OP(scf) , OP(ccf) }, + }, + [3] = { + [0] = { OP(retcc) , OP(retcc) , OP(retcc) , OP(retcc) , OP(sth) , OP(addsp), OP(ldh) , OP(ldsp) }, + [1] = { OP(pop) , OP(ret) , OP(pop) , OP(reti) , OP(pop) , OP(jphl) , OP(pop) , OP(sphl) }, + [2] = { OP(jpcc) , OP(jpcc) , OP(jpcc) , OP(jpcc) , OP(stha) , OP(st16) , OP(ldha) , OP(lda16) }, + [3] = { OP(jp) , OP(cb) , OP(undef) , OP(undef) , OP(undef), OP(undef), OP(di) , OP(ei) }, + [4] = { OP(callcc), OP(callcc), OP(callcc), OP(callcc), OP(undef), OP(undef), OP(undef), OP(undef) }, + [5] = { OP(push) , OP(call) , OP(push) , OP(undef) , OP(push) , OP(undef), OP(push) , OP(undef) }, + } + }; + + static const void* alu[8] = { + OP(add), OP(adc), OP(sub), OP(sbc), OP(and), OP(xor), OP(or), OP(cp) + }; + + static const struct { + uint8_t shift; + uint8_t want; + } cc[] = { + { 7, 0 }, // NZ + { 7, 1 }, // Z + { 4, 0 }, // NC + { 4, 1 }, // C + }; + + // TODO: clean this mess up + uint8_t* r[] = { ®s.b, ®s.c, ®s.d, ®s.e, ®s.h, ®s.l, mem + regs.hl, ®s.a }; + static uint16_t* rr[] = { ®s.bc, ®s.de, ®s.hl, ®s.hl }; + static void* rot[] = { &&op_rlc, &&op_rrc, &&op_rl, &&op_rr, &&op_sla, &&op_sra, &&op_swap, &&op_srl }; + static uint16_t* rp2[] = { ®s.bc, ®s.de, ®s.hl, ®s.af }; + + uint8_t alu_val; + +#define R_READ(i) ({ uint8_t v; if(i == 6){ v = mem_read(regs.hl); } else { v = *r[i]; } v; }) +#define R_WRITE(i, v) ({ if(i == 6){ mem_write(regs.hl, v); } else { *r[i] = v; }; *r[i]; }) + + if(xmap[x] > ALUY){ + goto *xmap[x]; + } else if(xmap[x] == ALUY){ + alu_val = R_READ(z); + goto *alu[y]; + } else if(zmap[x][z] > ALUY){ + goto *zmap[x][z]; + } else if(zmap[x][z] == ALUY){ + alu_val = mem_read(++regs.pc); + goto *alu[y]; + } else { + goto *ymap[x][z][y]; + } + +#undef ALUY +#undef OP + +#define OP(name, len, cy, code) op_##name: { code; cycles += cy; regs.pc += len; goto end; } +#define CHECKCC(n) (((regs.flags.all >> cc[n].shift) & 1) == cc[n].want) + +#define SS(p) (((uint16_t*)®s.bc)[p]) +#define DD(p) (((uint16_t*)®s.bc)+(p)) +#define NN ((((uint16_t)mem_read(regs.pc+2)) << 8) | mem_read(regs.pc+1)) + + OP(mov8, 1, 4, { + if(z == 6 && y == 6){ + puts("HALT?"); + } else { + if(z == 6 || y == 6){ cycles += 4; } + R_WRITE(y, R_READ(z)); + } + }); + + OP(ldsta16, 1, 8, { + size_t p = y >> 1; + + if(y & 1){ + regs.a = mem_read(*rr[p]); + } else { + mem_write(*rr[p], regs.a); + } + + if(p == 2) regs.hl++; + else if(p == 3) regs.hl--; + }); + + OP(incdec16, 1, 8, { + if(y & 1){ + --*DD(y >> 1); + } else { + ++*DD(y >> 1); + } + }); + + OP(inc8, 1, 4, { + regs.flags.h = (R_READ(y) & 0xF) == 9; + R_WRITE(y, R_READ(y) + 1); + regs.flags.z = !R_READ(y); + regs.flags.n = 0; + }); + + OP(dec8, 1, 4, { + regs.flags.h = (R_READ(y) & 0xF) == 0; + R_WRITE(y, R_READ(y) - 1); + regs.flags.z = !R_READ(y); + regs.flags.n = 1; + }); + + OP(ld8, 2, 8, { + R_WRITE(y, mem_read(regs.pc + 1)); + if(y == 6) cycles += 4; + }); + + OP(nop, 1, 4, { + // skip + }); + + OP(stsp, 3, 20, { + mem_write(NN , regs.sp >> 8); + mem_write(NN+1, regs.sp & 0xFF); + }); + + OP(stop, 2, 4, { + // skip + }); + + OP(jr, 2, 12, { + regs.pc += (int8_t)mem_read(regs.pc+1); + }); + + OP(jrcc, 2, 8, { + if(CHECKCC(y - 4)){ + regs.pc += (int8_t)mem_read(regs.pc+1); + cycles += 4; + } + }); + + OP(ld16, 3, 8, { + *DD(y >> 1) = NN; + }); + + OP(addhl, 1, 8, { + uint16_t ss = SS(y >> 1); + regs.flags.h = (((ss&0x0FFF) + (regs.hl&0x0FFF)) & 0x1000) == 0x1000; + regs.flags.c = __builtin_add_overflow(regs.hl, ss, ®s.hl); + regs.flags.n = 0; + }); + + OP(rlca, 1, 4, { + regs.flags.c = regs.a >> 7; + regs.a = (regs.a << 1) | regs.flags.c; + regs.flags.z = regs.flags.n = regs.flags.h = 0; + }); + + OP(rrca, 1, 4, { + regs.flags.c = regs.a & 1; + regs.a = (regs.a >> 1) | regs.flags.c << 7; + regs.flags.z = regs.flags.n = regs.flags.h = 0; + }); + + OP(rla, 1, 4, { + size_t newc = regs.a >> 7; + regs.a = (regs.a << 1) | regs.flags.c; + regs.flags.c = newc; + regs.flags.z = regs.flags.n = regs.flags.h = 0; + }); + + OP(rra, 1, 4, { + size_t newc = regs.a & 1; + regs.a = (regs.a >> 1) | regs.flags.c << 7; + regs.flags.c = newc; + regs.flags.z = regs.flags.n = regs.flags.h = 0; + }); + + OP(daa, 1, 4, { + size_t up = regs.a >> 4; + size_t dn = regs.a & 0xF; + size_t newc = 0; + + if(dn >= 10 || regs.flags.h){ + if(regs.flags.n){ + newc |= __builtin_sub_overflow(regs.a, 0x06, ®s.a); + } else { + newc |= __builtin_add_overflow(regs.a, 0x06, ®s.a); + } + } + + if(up >= 10 || regs.flags.c){ + if(regs.flags.n){ + newc |= __builtin_sub_overflow(regs.a, 0x60, ®s.a); + } else { + newc |= __builtin_add_overflow(regs.a, 0x60, ®s.a); + } + } + + regs.flags.c = newc; + regs.flags.h = 0; + regs.flags.z = !regs.a; + }); + + OP(cpl, 1, 4, { + regs.a = ~regs.a; + regs.flags.h = 1; + regs.flags.n = 1; + }); + + OP(scf, 1, 4, { + regs.flags.c = 1; + regs.flags.h = 0; + regs.flags.n = 0; + }); + + OP(ccf, 1, 4, { + regs.flags.c = !regs.flags.c; + regs.flags.h = 0; + regs.flags.n = 0; + }); + + OP(retcc, 1, 8, { + if(CHECKCC(y)){ + regs.pc = ((mem_read(regs.sp+1) << 8) | mem_read(regs.sp)) - 1; + regs.sp += 2; + cycles += 12; + is_ret = true; + } + }); + + OP(sth, 2, 12, { + mem_write(0xFF00 + mem_read(regs.pc+1), regs.a); + }); + + OP(addsp, 2, 16, { + regs.flags.h = (((regs.sp&0x0FFF) + (mem_read(regs.pc+1)&0x0F)) & 0x1000) == 0x1000; + regs.flags.c = __builtin_add_overflow(regs.sp, mem_read(regs.pc+1), (int16_t*)®s.sp); + regs.flags.z = regs.flags.n = 0; + }); + + OP(ldh, 2, 12, { + regs.a = mem_read(0xFF00 + mem_read(regs.pc+1)); + }); + + OP(ldsp, 2, 12, { + regs.hl = *(uint16_t*)(mem + regs.sp + (char)mem[regs.pc+1]); + regs.flags.h = regs.flags.n = regs.flags.z = regs.flags.c = 0; // XXX: probably wrong + }); + + OP(pop, 1, 12, { + *rp2[y >> 1] = (mem_read(regs.sp+1) << 8) | mem_read(regs.sp); + regs.sp += 2; + }); + + OP(ret, 0, 16, { + regs.pc = (mem_read(regs.sp+1) << 8 | mem_read(regs.sp)); + regs.sp += 2; + is_ret = true; + }); + + OP(reti, 0, 16, { + regs.pc = mem_read(regs.sp+1) << 8 | mem_read(regs.sp); + regs.sp += 2; + // XXX: interrupts not implemented + is_ret = true; + }); + + OP(jphl, 0, 4, { + regs.pc = regs.hl; + }); + + OP(sphl, 1, 8, { + regs.sp = regs.hl; + }); + + OP(jpcc, 3, 12, { + if(CHECKCC(y)){ + regs.pc = NN - 3; + cycles += 4; + } + }); + + OP(stha, 1, 8, { + mem_write(0xFF00 + regs.c, regs.a); + }); + + OP(st16, 3, 16, { + mem_write(NN, regs.a); + }); + + OP(ldha, 1, 8, { + regs.a = mem_read(0xFF00 + regs.c); + }); + + OP(lda16, 3, 16, { + regs.a = mem_read(NN); + }); + + OP(jp, 0, 16, { + regs.pc = NN; + }); + + OP(cb, 0, 0, { + op = mem_read(++regs.pc); + x = (op >> 6); + y = (op >> 3) & 7; + z = op & 7; + + cycles += (z == 6) ? 16 : 8; + ++regs.pc; + + if(x == 0){ + goto *rot[y]; + } else if(x == 1){ // BIT + regs.flags.z = !(R_READ(z) & (1 << y)); + regs.flags.n = 0; + regs.flags.h = 1; + } else if(x == 2){ // RES + R_WRITE(z, R_READ(z) & ~(1 << y)); + } else { // SET + R_WRITE(z, R_READ(z) | (1 << y)); + } + }); + + OP(undef, 1, 4, { + // skip + }); + + OP(di, 1, 4, { + // XXX: interrupts not implemented + }); + + OP(ei, 1, 4, { + // XXX: interrupts not implemented + }); + + OP(callcc, 3, 12, { + if(CHECKCC(y)){ + mem_write(regs.sp-1, (regs.pc + 3) >> 8); + mem_write(regs.sp-2, (regs.pc + 3) & 0xFF); + regs.sp -= 2; + regs.pc = NN - 3; + cycles += 12; + } + }); + + OP(push, 1, 16, { + mem_write(regs.sp-2, *rp2[y >> 1] & 0xFF); + mem_write(regs.sp-1, *rp2[y >> 1] >> 8); + regs.sp -= 2; + }); + + OP(call, 0, 24, { + mem_write(regs.sp-1, (regs.pc + 3) >> 8); + mem_write(regs.sp-2, (regs.pc + 3) & 0xFF); + regs.sp -= 2; + regs.pc = NN; + }); + + OP(rst, 0, 16, { + mem_write(regs.sp-1, (regs.pc + 1) >> 8); + mem_write(regs.sp-2, (regs.pc + 1) & 0xFF); + regs.pc = h.load_addr + (y*8); + regs.sp -= 2; + }); + + OP(add, 1, 4, { + regs.flags.h = (((regs.a&0x0F) + (alu_val&0x0F)) & 0x10) == 0x10; + regs.flags.c = __builtin_add_overflow(regs.a, alu_val, ®s.a); + regs.flags.z = regs.a == 0; + regs.flags.n = 0; + }); + + OP(adc, 1, 4, { + regs.flags.h = (((regs.a&0x0F) + (alu_val&0x0F) + regs.flags.c) & 0x10) == 0x10; + uint8_t tmp; + regs.flags.c = __builtin_add_overflow(regs.a, regs.flags.c, &tmp) | __builtin_add_overflow(tmp, alu_val, ®s.a); + regs.flags.z = regs.a == 0; + regs.flags.n = 0; + }); + + OP(sub, 1, 4, { + regs.flags.h = (regs.a&0x0F) < (alu_val&0x0F); + regs.flags.c = __builtin_sub_overflow(regs.a, alu_val, ®s.a); + regs.flags.z = regs.a == 0; + regs.flags.n = 1; + }); + + OP(sbc, 1, 4, { + regs.flags.h = (regs.a&0x0F) < (alu_val&0x0F) || (regs.a&0x0F) < regs.flags.c; + uint8_t tmp; + regs.flags.c = __builtin_sub_overflow(regs.a, regs.flags.c, &tmp) | __builtin_sub_overflow(tmp, alu_val, ®s.a); + regs.flags.z = regs.a == 0; + regs.flags.n = 1; + }); + + OP(and, 1, 4, { + regs.flags.h = 1; + regs.flags.n = regs.flags.c = 0; + regs.a &= alu_val; + regs.flags.z = !regs.a; + }); + + OP(xor, 1, 4, { + regs.flags.h = regs.flags.n = regs.flags.c = 0; + regs.a ^= alu_val; + regs.flags.z = !regs.a; + }); + + OP(or, 1, 4, { + regs.flags.h = regs.flags.n = regs.flags.c = 0; + regs.a |= alu_val; + regs.flags.z = !regs.a; + }); + + OP(cp, 1, 4, { + uint8_t tmp; + regs.flags.h = (regs.a&0x0F) < (alu_val&0x0F); + regs.flags.c = __builtin_sub_overflow(regs.a, alu_val, &tmp); + regs.flags.z = tmp == 0; + regs.flags.n = 1; + }); + + OP(rlc, 0, 0, { + regs.flags.c = R_READ(z) >> 7; + R_WRITE(z, (R_READ(z) << 1) | regs.flags.c); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(rrc, 0, 0, { + regs.flags.c = R_READ(z) & 1; + R_WRITE(z, (R_READ(z) >> 1) | regs.flags.c << 7); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(rl, 0, 0, { + size_t newc = R_READ(z) >> 7; + R_WRITE(z, (R_READ(z) << 1) | regs.flags.c); + regs.flags.c = newc; + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(rr, 0, 0, { + size_t newc = R_READ(z) & 1; + R_WRITE(z, (R_READ(z) >> 1) | regs.flags.c << 7); + regs.flags.c = newc; + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(sla, 0, 0, { + regs.flags.c = R_READ(z) >> 7; + R_WRITE(z, R_READ(z) << 1); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(sra, 0, 0, { + regs.flags.c = R_READ(z) & 1; // ???? + R_WRITE(z, ((int8_t)R_READ(z)) >> 1); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + + OP(swap, 0, 0, { + uint8_t tmp = ((R_READ(z) & 0xF) << 4) | (R_READ(z) >> 4); + R_WRITE(z, tmp); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = regs.flags.c = 0; + }); + + OP(srl, 0, 0, { + regs.flags.c = R_READ(z) & 1; + R_WRITE(z, R_READ(z) >> 1); + regs.flags.z = !R_READ(z); + regs.flags.n = regs.flags.h = 0; + }); + +end:; + return is_ret; +} + +void usage(const char* argv0, FILE* out){ + fprintf(out, + "Usage: %s [-dhmqs] file [song index]\n\n" + " -h, Output this info to stdout.\n\n" + " -d, Debug mode : Dump a cpu trace to stdout, implies -q.\n" + " -m, Mono mode : Disable colors.\n" + " -q, Quiet mode : Disable UI.\n" + " -s, Subdued mode : Don't flash/embolden changed registers.\n\n", + argv0); +} + +static int msg_timer; +static char msg[128]; + +void set_msg(const char* fmt, ...){ + va_list va; + va_start(va, fmt); + + vsnprintf(msg, sizeof(msg), fmt, va); + + msg_timer = 20; + va_end(va); +} + +static uint64_t prev_time; + +uint64_t get_time(void){ + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return (ts.tv_sec * 1000UL) + (ts.tv_nsec / 1000000UL); +} + +void ui_draw_info(void){ + char buf[256] = {}; + int len = 0; + + move(0, 0); + attron(A_BOLD); + + len = snprintf(buf, countof(buf), "[%d/%d]", cfg.song_no, h.song_count - 1); + mvaddstr(0, cfg.win_w-len, buf); + len = 0; + *buf = 0; + + if(*h.title && strncmp(h.title, "", 4) != 0){ + len += snprintf(buf + len, countof(buf) - len, "%.32s", h.title); + } + if(*h.copyright && strncmp(h.copyright, "", 4) != 0){ + len += snprintf(buf + len, countof(buf) - len, " ©%.32s", h.copyright); + } + mvaddstr(1, (cfg.win_w-len)/2, buf); + *buf = 0; + + if(*h.author && strncmp(h.author, "", 4) != 0){ + len = snprintf(buf, countof(buf), "by %.32s ", h.author); + } + mvaddstr(2, (cfg.win_w-len)/2, buf); +} + +void ui_draw_regs(void){ + static const int color_map[3][16] = { + { 1, 1, 1, 1, 1, 5, 2, 2, 2, 2, 3, 3, 3, 3, 3, 5 }, + { 4, 4, 4, 4, 6, 6, 6, 5, 5, 5, 5, 5, 5, 5, 5, 5 }, + { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, + }; + + int x = (cfg.win_w-47)/2; + int y = (cfg.win_h-6)/6+4; + + move(y, x); + attron(A_BOLD); + for(int i = 0; i < 0x10; ++i) printw(" %1X", i); + attroff(A_BOLD); + + for(int i = 0; i < 3; ++i){ + move(y+i+1, x-4); + attron(A_BOLD); + printw("FF%d ", i+1); + attroff(A_BOLD); + for(int j = 0; j < 0x10; ++j){ + if(boldness[i*16+j]){ + attron(A_BOLD); + } + attron(COLOR_PAIR(color_map[i][j])); + printw(" %02x", mem[0xFF10 + (i*0x10) + j]); + attroff(COLOR_PAIR(color_map[i][j])); + if(boldness[i*16+j]){ + attroff(A_BOLD); + --boldness[i*16+j]; + } + } + } +} + +int main(int argc, char** argv){ + setlocale(LC_ALL, ""); + char* prog = argv[0]; + + int opt; + while((opt = getopt(argc, argv, "dhmqs")) != -1){ + switch(opt){ + case 'd': + cfg.hide_ui = cfg.debug_mode = true; + break; + case 'h': + usage(prog, stdout); + return 0; + case 'm': + cfg.monochrome = true; + break; + case 'q': + cfg.hide_ui = true; + break; + case 's': + cfg.subdued = true; + break; + default: + usage(prog, stderr); + return 1; + } + } + + if(optind >= argc){ + fprintf(stderr, "Missing file argument.\n\n"); + usage(argv[0], stderr); + return 1; + } + + argc -= (optind-1); + argv += (optind-1); + + FILE* f = fopen(argv[1], "r"); + if(!f){ + fprintf(stderr, "Error opening file '%s': %m\n", argv[1]); + return 1; + } + + if(fread(&h, sizeof(h), 1, f) != 1){ + return 1; + } + + if(strncmp(h.id, "GBS", 3) != 0){ + fprintf(stderr, "That doesn't look like a GBS file.\n"); + return 1; + } + + if(h.version != 1){ + fprintf(stderr, "This GBS file is version %d, I can only handle version 1 :(\n", h.version); + return 1; + } + + cfg.song_no = argc > 2 ? atoi(argv[2]) : 0; + if(cfg.song_no >= h.song_count){ + fprintf(stderr, "The file says it has %d tracks, index %d is out of range.\n", h.song_count, cfg.song_no); + return 1; + } + + if(cfg.debug_mode){ + printf("id : %.3s\n", h.id); + printf("ver : %d\n", h.version); + printf("count: %d\n", h.song_count); + printf("start: %d\n", h.start_song); + printf("load : %x\n", h.load_addr); + printf("init : %x\n", h.init_addr); + printf("play : %x\n", h.play_addr); + printf("sp : %x\n", h.sp); + printf("tma : %d\n", h.tma); + printf("tac : %d\n", h.tac); + printf("title: %.32s\n", h.title); + printf("authr: %.32s\n", h.author); + printf("copyr: %.32s\n", h.copyright); + } + + mem = mmap(NULL, 0x12000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(mem != MAP_FAILED); + mem += 0x1000; + + mprotect(mem - 0x1000 , 0x1000, PROT_NONE); + mprotect(mem + 0x10000, 0x1000, PROT_NONE); + + fseek(f, 0, SEEK_END); + long fsz = ftell(f) - 0x70; + fseek(f, 0x70, SEEK_SET); + + if(cfg.debug_mode){ + puts("rom banks:"); + } + + int bno = h.load_addr / 0x4000; + int off = h.load_addr % 0x4000; + + while(1){ + uint8_t* page = mmap(NULL, 0x4000, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); + assert(page != MAP_FAILED); + banks[bno] = page; + + size_t n = fread(page + off, 1, 0x4000 - off, f); + if(cfg.debug_mode){ + printf("Bank %d: %zu\n", bno, n); + } + + if(feof(f)){ + break; + } else if(ferror(f)){ + printf("Error reading file: %m\n"); + break; + } + + off = 0; + if(++bno >= 32){ + puts("Too many banks..."); + exit(1); + } + } + fclose(f); + + if(h.tac & 0x04){ + int rates[] = { 4096, 262144, 65536, 16384 }; + float rate = rates[h.tac & 0x03] / (float)(256 - h.tma); + if(h.tac & 0x80) rate *= 2.0f; + + if(fabsf(rate - 59.7f) > 1.0f){ + printf("NOTE: This GBS uses tma/tac timing instead of vblank [NYI] [%.4fhz].\n" + " Songs might be broken or play a bit too %s.\n", + rate, rate > 59.7f ? "slow" : "fast"); + } + } + + static const uint8_t regs_init[] = { + 0x80, 0xBF, 0xF3, 0xFF, 0xBF, 0xFF, 0x3F, 0x00, + 0xFF, 0xBF, 0x7F, 0xFF, 0x9F, 0xFF, 0xBF, 0xFF, + 0xFF, 0x00, 0x00, 0xBF, 0x77, 0xF3, 0xF1, + }; + + static const uint8_t wave_init[] = { + 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, + 0x00, 0xFF, 0x00, 0xFF, + }; + + if(!cfg.hide_ui){ + initscr(); + noecho(); + cbreak(); + timeout(0); + curs_set(0); + nodelay(stdscr, TRUE); + keypad(stdscr, TRUE); + set_escdelay(0); + + if(!cfg.monochrome){ + start_color(); + + if(can_change_color() && COLORS > 8){ + init_color(COLOR_BLACK, 91, 91, 102); + } + + init_pair(1, COLOR_CYAN , COLOR_BLACK); + init_pair(2, COLOR_MAGENTA, COLOR_BLACK); + init_pair(3, COLOR_RED , COLOR_BLACK); + init_pair(4, COLOR_YELLOW , COLOR_BLACK); + init_pair(5, COLOR_BLACK , COLOR_BLACK); + init_pair(6, COLOR_GREEN , COLOR_BLACK); + init_pair(7, COLOR_WHITE , COLOR_BLACK); + + bkgd(COLOR_PAIR(7)); + } + + getmaxyx(stdscr, cfg.win_h, cfg.win_w); + } + + cfg.volume = 1.0f; + audio_init(); + + bool paused; +restart: + + clear(); + if(banks[0]) memcpy(mem, banks[0], 0x4000); + if(banks[1]) memcpy(mem + 0x4000, banks[1], 0x4000); + + memset(®s, 0, sizeof(regs)); + memset(mem + 0x8000, 0, 0x8000); + + memcpy(mem, mem + h.load_addr, 0x40); + + regs.sp = h.sp - 2; + regs.pc = h.init_addr; + regs.a = cfg.song_no; + + mem[0xffff] = 1; // IE + mem[0xff06] = h.tma; + mem[0xff07] = h.tac; + + for(int i = 0; i < 23; ++i){ + mem_write(0xFF10 + i, regs_init[i]); + } + memcpy(mem + 0xff30, wave_init, 16); + + paused = false; + audio_pause(false); + + while(1){ + + if(paused){ + usleep(20000); + } else if(cpu_step() && regs.sp == h.sp){ + regs.pc = h.play_addr; + regs.sp -= 2; + + if(next_counter++ > 90){ + cfg.song_no = (cfg.song_no + 1) % h.song_count; + set_msg("Next\n"); + goto restart; + } + + if(cfg.debug_mode){ + puts("-------------------------"); + } + + audio_output(); + + if(!cfg.hide_ui){ + ui_draw_info(); + ui_draw_regs(); + refresh(); + } + + usleep(10000); + } + + if(cfg.hide_ui || get_time() - prev_time < 50) continue; + prev_time = get_time(); + + if(msg_timer > 0){ + int x, y; + getmaxyx(stdscr, y, x); + move(y-1, 0); + + if(--msg_timer == 0){ + clrtoeol(); + } else { + if(msg_timer > 15) attron(A_BOLD); + printw("%s\n", msg); + if(msg_timer > 15) attroff(A_BOLD); + } + } + + int key; + switch((key = getch())){ + + case 27: + if(getch() != -1) break; + case 'q': + goto end; + + case '1': + case '2': + case '3': + case '4': { + bool muted = audio_mute(key - '0', -1); + set_msg("Channel %c %smuted\n", key, muted ? "" : "un"); + } break; + + case 'n': + case KEY_RIGHT: + cfg.song_no = (cfg.song_no + 1) % h.song_count; + set_msg("Next\n"); + goto restart; + + case 'p': + case KEY_LEFT: + cfg.song_no = (h.song_count + cfg.song_no - 1) % h.song_count; + set_msg("Previous\n"); + goto restart; + + case 'r': + case KEY_UP: + set_msg("Replay\n"); + goto restart; + + case ' ': + case KEY_DOWN: + paused = !paused; + audio_pause(paused); + set_msg("%s\n", paused ? "Paused" : "Resumed"); + break; + + case KEY_RESIZE: + getmaxyx(stdscr, cfg.win_h, cfg.win_w); + clear(); + break; + + case '=': + case '+': + cfg.volume = MIN(1.0f, cfg.volume + 0.1f); + set_msg("Volume: %d%%\n", (int)roundf(100.0f * cfg.volume)); + break; + + case '-': + case '_': + cfg.volume = MAX(0.0f, cfg.volume - 0.1f); + set_msg("Volume: %d%%\n", (int)roundf(100.0f * cfg.volume)); + break; + + default: + break; + } + } + +end: + if(!cfg.hide_ui){ + endwin(); + } + + return 0; +} diff --git a/minigbs.h b/minigbs.h new file mode 100644 index 0000000..b51a9d3 --- /dev/null +++ b/minigbs.h @@ -0,0 +1,66 @@ +#include +#include +#include +#include +#include +#include + +void debug_dump(uint8_t* op); + +void audio_output(void); +void audio_init(void); +void audio_write(uint16_t addr, uint8_t val); +void audio_pause(bool); +bool audio_mute(int chan, int val); + +struct GBSHeader { + char id[3]; + uint8_t version; + uint8_t song_count; + uint8_t start_song; + uint16_t load_addr; + uint16_t init_addr; + uint16_t play_addr; + uint16_t sp; + uint8_t tma; + uint8_t tac; + char title[32]; + char author[32]; + char copyright[32]; +} __attribute__((packed)); + +struct { + union { + uint16_t af; + struct { + union { + struct { uint8_t _pad:4, c:1, h:1, n:1, z:1; }; + uint8_t all; + } flags; + uint8_t a; + }; + }; + union { uint16_t bc; struct { uint8_t c, b; }; }; + union { uint16_t de; struct { uint8_t e, d; }; }; + union { uint16_t hl; struct { uint8_t l, h; }; }; + uint16_t sp, pc; +} regs; + +struct Config { + bool debug_mode; + bool monochrome; + bool hide_ui; + bool subdued; + + int song_no; + float volume; + + int win_w, win_h; +}; + +extern struct Config cfg; +extern uint8_t* mem; + +#define MAX(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); _a > _b ? _a : _b; }) +#define MIN(a, b) ({ typeof(a) _a = (a); typeof(b) _b = (b); _a <= _b ? _a : _b; }) +#define countof(x) (sizeof(x)/sizeof(*x))