mirror of
https://github.com/Oibaf66/fbzx-wii.git
synced 2024-11-25 01:26:56 +01:00
Support for ABC stereo, fixed bug in SNA format
This commit is contained in:
parent
acc37ba021
commit
c993740080
@ -506,15 +506,11 @@ int load_sna(char *filename) {
|
|||||||
snap->IY=((word)tempo[15])+256*((word)tempo[16]);
|
snap->IY=((word)tempo[15])+256*((word)tempo[16]);
|
||||||
snap->IX=((word)tempo[17])+256*((word)tempo[18]);
|
snap->IX=((word)tempo[17])+256*((word)tempo[18]);
|
||||||
|
|
||||||
if (tempo[19]&0x01) {
|
if (tempo[19]&0x04) {
|
||||||
snap->IFF1=1;
|
snap->IFF1=1;
|
||||||
} else {
|
|
||||||
snap->IFF1=0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tempo[19]&0x02) {
|
|
||||||
snap->IFF2=1;
|
snap->IFF2=1;
|
||||||
} else {
|
} else {
|
||||||
|
snap->IFF1=0;
|
||||||
snap->IFF2=0;
|
snap->IFF2=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +521,7 @@ int load_sna(char *filename) {
|
|||||||
snap->Imode=tempo[25];
|
snap->Imode=tempo[25];
|
||||||
snap->border=tempo[26];
|
snap->border=tempo[26];
|
||||||
|
|
||||||
if (type==0) {
|
if (type==0) { //48k
|
||||||
|
|
||||||
v1=tempo[23];
|
v1=tempo[23];
|
||||||
v2=tempo[24];
|
v2=tempo[24];
|
||||||
@ -547,7 +543,7 @@ int load_sna(char *filename) {
|
|||||||
memcpy(snap->page[0],tempo+27,16384);
|
memcpy(snap->page[0],tempo+27,16384);
|
||||||
memcpy(snap->page[1],tempo+16411,16384);
|
memcpy(snap->page[1],tempo+16411,16384);
|
||||||
memcpy(snap->page[2],tempo+32795,16384);
|
memcpy(snap->page[2],tempo+32795,16384);
|
||||||
} else {
|
} else { //128k
|
||||||
snap->PC=((word)tempo2[0])+256*((word)tempo2[1]);
|
snap->PC=((word)tempo2[0])+256*((word)tempo2[1]);
|
||||||
memcpy(snap->page[5],tempo+27,16384);
|
memcpy(snap->page[5],tempo+27,16384);
|
||||||
memcpy(snap->page[2],tempo+16411,16384);
|
memcpy(snap->page[2],tempo+16411,16384);
|
||||||
|
@ -172,6 +172,7 @@ void computer_init () { //Called only on start-up
|
|||||||
ordenador.last_selected_poke_file[0]='\0';
|
ordenador.last_selected_poke_file[0]='\0';
|
||||||
ordenador.npixels=4;
|
ordenador.npixels=4;
|
||||||
ordenador.progressive=0;
|
ordenador.progressive=0;
|
||||||
|
ordenador.audio_mode=2; //ACB
|
||||||
}
|
}
|
||||||
|
|
||||||
void computer_set_palete() {
|
void computer_set_palete() {
|
||||||
@ -460,7 +461,7 @@ void register_screen (SDL_Surface * pantalla) {
|
|||||||
ordenador.current_buffer = sound[0];
|
ordenador.current_buffer = sound[0];
|
||||||
ordenador.num_buff = 0; // first buffer
|
ordenador.num_buff = 0; // first buffer
|
||||||
ordenador.sound_cuantity = 0;
|
ordenador.sound_cuantity = 0;
|
||||||
ordenador.sound_current_value = 0;
|
//ordenador.sound_current_value = 0;
|
||||||
|
|
||||||
update_npixels();
|
update_npixels();
|
||||||
}
|
}
|
||||||
@ -1553,6 +1554,8 @@ void ResetComputer () {
|
|||||||
|
|
||||||
ordenador.last_selected_poke_file[0]='\0';
|
ordenador.last_selected_poke_file[0]='\0';
|
||||||
|
|
||||||
|
ordenador.tst_sample=ordenador.cpufreq/ordenador.freq;
|
||||||
|
|
||||||
microdrive_reset();
|
microdrive_reset();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -129,13 +129,14 @@ struct computer {
|
|||||||
unsigned int aych_a,aych_b,aych_c,aych_n,aych_envel; // counters for AY emulation
|
unsigned int aych_a,aych_b,aych_c,aych_n,aych_envel; // counters for AY emulation
|
||||||
unsigned char ayval_a,ayval_b,ayval_c,ayval_n;
|
unsigned char ayval_a,ayval_b,ayval_c,ayval_n;
|
||||||
unsigned char ay_emul; // 0: no AY emulation; 1: AY emulation
|
unsigned char ay_emul; // 0: no AY emulation; 1: AY emulation
|
||||||
|
unsigned char audio_mode; //mono, ABC, ACB, BAC
|
||||||
unsigned char vol_a,vol_b,vol_c;
|
unsigned char vol_a,vol_b,vol_c;
|
||||||
unsigned int tst_ay;
|
unsigned int tst_ay;
|
||||||
unsigned int tst_ay2;
|
unsigned int tst_ay2;
|
||||||
unsigned int ay_latch;
|
unsigned int ay_latch;
|
||||||
signed char ay_envel_value;
|
signed char ay_envel_value;
|
||||||
unsigned char ay_envel_way;
|
unsigned char ay_envel_way;
|
||||||
unsigned char sound_current_value;
|
//unsigned char sound_current_value;
|
||||||
unsigned int wr;
|
unsigned int wr;
|
||||||
unsigned int r_fetch;
|
unsigned int r_fetch;
|
||||||
unsigned int io;
|
unsigned int io;
|
||||||
|
@ -486,7 +486,6 @@ int bucle, bucle2,ret2;
|
|||||||
ordenador.increment=ordenador.channels;
|
ordenador.increment=ordenador.channels;
|
||||||
|
|
||||||
for(bucle2=0;bucle2<NUM_SNDBUF;bucle2++) {
|
for(bucle2=0;bucle2<NUM_SNDBUF;bucle2++) {
|
||||||
//sound[bucle2]=(unsigned char *)malloc(ordenador.buffer_len*ordenador.increment+8);
|
|
||||||
//ASND Required alligned memory with padding
|
//ASND Required alligned memory with padding
|
||||||
sound[bucle2]=(unsigned char *)memalign(32,ordenador.buffer_len*ordenador.increment+32);
|
sound[bucle2]=(unsigned char *)memalign(32,ordenador.buffer_len*ordenador.increment+32);
|
||||||
for(bucle=0;bucle<ordenador.buffer_len*ordenador.increment+4;bucle++)
|
for(bucle=0;bucle<ordenador.buffer_len*ordenador.increment+4;bucle++)
|
||||||
@ -495,8 +494,6 @@ int bucle, bucle2,ret2;
|
|||||||
|
|
||||||
printf("Init sound 2\n");
|
printf("Init sound 2\n");
|
||||||
ordenador.tst_sample=ordenador.cpufreq/ordenador.freq;
|
ordenador.tst_sample=ordenador.cpufreq/ordenador.freq;
|
||||||
//printf("Set volume\n");
|
|
||||||
//set_volume(70);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void end_system() {
|
void end_system() {
|
||||||
@ -564,6 +561,7 @@ int save_config(struct computer *object, char *filename) {
|
|||||||
fprintf(fconfig,"joystick1=%c%c",48+object->joystick[0],10);
|
fprintf(fconfig,"joystick1=%c%c",48+object->joystick[0],10);
|
||||||
fprintf(fconfig,"joystick2=%c%c",48+object->joystick[1],10);
|
fprintf(fconfig,"joystick2=%c%c",48+object->joystick[1],10);
|
||||||
fprintf(fconfig,"ay_sound=%c%c",48+object->ay_emul,10);
|
fprintf(fconfig,"ay_sound=%c%c",48+object->ay_emul,10);
|
||||||
|
fprintf(fconfig,"audio_mode=%c%c",48+object->audio_mode,10);
|
||||||
fprintf(fconfig,"interface1=%c%c",48+object->mdr_active,10);
|
fprintf(fconfig,"interface1=%c%c",48+object->mdr_active,10);
|
||||||
fprintf(fconfig,"doublescan=%c%c",48+object->dblscan,10);
|
fprintf(fconfig,"doublescan=%c%c",48+object->dblscan,10);
|
||||||
fprintf(fconfig,"framerate=%c%c",48+jump_frames,10);
|
fprintf(fconfig,"framerate=%c%c",48+jump_frames,10);
|
||||||
@ -699,7 +697,7 @@ int load_config(struct computer *object, char *filename) {
|
|||||||
int pos, key_sdl=0;
|
int pos, key_sdl=0;
|
||||||
FILE *fconfig;
|
FILE *fconfig;
|
||||||
unsigned char volume=255,mode128k=255,issue=255,ntsc=255, joystick1=255,joystick2=255,ay_emul=255,mdr_active=255,
|
unsigned char volume=255,mode128k=255,issue=255,ntsc=255, joystick1=255,joystick2=255,ay_emul=255,mdr_active=255,
|
||||||
dblscan=255,framerate =255, screen =255, text=255, precision=255, bw=255, tap_fast=255,
|
dblscan=255,framerate =255, screen =255, text=255, precision=255, bw=255, tap_fast=255, audio_mode=255,
|
||||||
joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255;
|
joypad1=255, joypad2=255, rumble1=255, rumble2=255, joy_n=255, key_n=255, port=255, autoconf=255;
|
||||||
|
|
||||||
if (filename) strcpy(config_path,filename);
|
if (filename) strcpy(config_path,filename);
|
||||||
@ -758,6 +756,10 @@ int load_config(struct computer *object, char *filename) {
|
|||||||
ay_emul=line[9]-'0';
|
ay_emul=line[9]-'0';
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!strncmp(line,"audio_mode=",11)) {
|
||||||
|
audio_mode=line[11]-'0';
|
||||||
|
continue;
|
||||||
|
}
|
||||||
if (!strncmp(line,"interface1=",11)) {
|
if (!strncmp(line,"interface1=",11)) {
|
||||||
mdr_active=line[11]-'0';
|
mdr_active=line[11]-'0';
|
||||||
continue;
|
continue;
|
||||||
@ -844,6 +846,9 @@ int load_config(struct computer *object, char *filename) {
|
|||||||
if (ay_emul<2) {
|
if (ay_emul<2) {
|
||||||
object->ay_emul=ay_emul;
|
object->ay_emul=ay_emul;
|
||||||
}
|
}
|
||||||
|
if (audio_mode<4) {
|
||||||
|
object->audio_mode=audio_mode;
|
||||||
|
}
|
||||||
if (mdr_active<2) {
|
if (mdr_active<2) {
|
||||||
object->mdr_active=mdr_active;
|
object->mdr_active=mdr_active;
|
||||||
}
|
}
|
||||||
|
132
src/gui_sdl.c
132
src/gui_sdl.c
@ -67,11 +67,11 @@ static const char *main_menu_messages[] = {
|
|||||||
/*06*/ "^|Wiimote1|Wiimote2",
|
/*06*/ "^|Wiimote1|Wiimote2",
|
||||||
/*07*/ "Emulation settings",
|
/*07*/ "Emulation settings",
|
||||||
/*08*/ "Screen settings",
|
/*08*/ "Screen settings",
|
||||||
/*09*/ "Confs files",
|
/*09*/ "Audio settings",
|
||||||
/*10*/ "Microdrive",
|
/*10*/ "Config files",
|
||||||
/*11*/ "Tools",
|
/*11*/ "Microdrive",
|
||||||
/*12*/ "Reset",
|
/*12*/ "Tools",
|
||||||
/*13*/ "Help",
|
/*13*/ "Reset",
|
||||||
/*14*/ "Quit",
|
/*14*/ "Quit",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
@ -79,18 +79,27 @@ static const char *main_menu_messages[] = {
|
|||||||
static const char *emulation_messages[] = {
|
static const char *emulation_messages[] = {
|
||||||
/*00*/ "Emulated machine",
|
/*00*/ "Emulated machine",
|
||||||
/*01*/ "^|48k_2|48K_3|128k|+2|+2A/+3|128K_Sp|NTSC",
|
/*01*/ "^|48k_2|48K_3|128k|+2|+2A/+3|128K_Sp|NTSC",
|
||||||
/*02*/ "Volume",
|
/*02*/ "Frame rate",
|
||||||
/*03*/ "^|0|1|2|3|4|5|6|7|max",
|
/*03*/ "^|100%|50%|33%|25%|20%",
|
||||||
/*04*/ "Frame rate",
|
/*04*/ "Tap fast speed",
|
||||||
/*05*/ "^|100%|50%|33%|25%|20%",
|
/*05*/ "^|on|off",
|
||||||
/*06*/ "Tap fast speed",
|
/*06*/ "Turbo mode",
|
||||||
/*07*/ "^|on|off",
|
/*07*/ "^|off|speed|ultraspeed",
|
||||||
/*08*/ "Turbo mode",
|
/*08*/ "Precision",
|
||||||
/*09*/ "^|off|speed|ultraspeed",
|
/*09*/ "^|on|off",
|
||||||
/*10*/ "Precision",
|
NULL
|
||||||
/*11*/ "^|on|off",
|
};
|
||||||
/*12*/ "AY-3-8912 Emulation",
|
|
||||||
/*13*/ "^|on|off",
|
static const char *audio_messages[] = {
|
||||||
|
/*00*/ "Volume",
|
||||||
|
/*01*/ "^|0|1|2|3|4|5|6|7|max",
|
||||||
|
/*02*/ " ",
|
||||||
|
/*03*/ "AY-3-8912 Emulation",
|
||||||
|
/*04*/ "^|on|off",
|
||||||
|
/*05*/ " ",
|
||||||
|
/*06*/ "Audio mode",
|
||||||
|
/*07*/ "^|mono|ABC|ACB|BAC",
|
||||||
|
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -152,6 +161,8 @@ static const char *tools_messages[] = {
|
|||||||
/*09*/ " ",
|
/*09*/ " ",
|
||||||
/*10*/ "Port",
|
/*10*/ "Port",
|
||||||
/*11*/ "^|sd|usb|smb",
|
/*11*/ "^|sd|usb|smb",
|
||||||
|
/*12*/ " ",
|
||||||
|
/*13*/ "Help",
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -480,21 +491,20 @@ static void set_machine_model(int which)
|
|||||||
|
|
||||||
static void emulation_settings(void)
|
static void emulation_settings(void)
|
||||||
{
|
{
|
||||||
unsigned int submenus[7],submenus_old[7];
|
unsigned int submenus[5],submenus_old[5];
|
||||||
int opt, i;
|
int opt, i;
|
||||||
unsigned char old_mode, old_videosystem;
|
unsigned char old_mode, old_videosystem;
|
||||||
|
|
||||||
memset(submenus, 0, sizeof(submenus));
|
memset(submenus, 0, sizeof(submenus));
|
||||||
|
|
||||||
submenus[0] = get_machine_model();
|
submenus[0] = get_machine_model();
|
||||||
submenus[1] = ordenador.volume/2;
|
submenus[1] = jump_frames;
|
||||||
submenus[2] = jump_frames;
|
submenus[2] = !ordenador.tape_fast_load;
|
||||||
submenus[3] = !ordenador.tape_fast_load;
|
submenus[3] = ordenador.turbo;
|
||||||
submenus[4] = ordenador.turbo;
|
submenus[4] = !ordenador.precision;
|
||||||
submenus[5] = !ordenador.precision;
|
|
||||||
submenus[6] = !ordenador.ay_emul;
|
|
||||||
|
|
||||||
for (i=0; i<7; i++) submenus_old[i] = submenus[i];
|
|
||||||
|
for (i=0; i<5; i++) submenus_old[i] = submenus[i];
|
||||||
old_mode=ordenador.mode128k;
|
old_mode=ordenador.mode128k;
|
||||||
old_videosystem = ordenador.videosystem;
|
old_videosystem = ordenador.videosystem;
|
||||||
|
|
||||||
@ -504,16 +514,14 @@ static void emulation_settings(void)
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
set_machine_model(submenus[0]);
|
set_machine_model(submenus[0]);
|
||||||
if ((old_mode!=ordenador.mode128k)||(old_videosystem!=ordenador.videosystem)) ResetComputer(); else
|
if ((old_mode!=ordenador.mode128k)||(old_videosystem!=ordenador.videosystem)) ResetComputer();
|
||||||
ordenador.ay_emul = !submenus[6];
|
|
||||||
|
|
||||||
ordenador.volume = submenus[1]*2; //I should use set_volume() ?
|
jump_frames = submenus[1];
|
||||||
jump_frames = submenus[2];
|
ordenador.tape_fast_load = !submenus[2];
|
||||||
ordenador.tape_fast_load = !submenus[3];
|
ordenador.turbo = submenus[3];
|
||||||
ordenador.turbo = submenus[4];
|
|
||||||
|
|
||||||
curr_frames=0;
|
curr_frames=0;
|
||||||
if (submenus[4] != submenus_old[4])
|
if (submenus[3] != submenus_old[3])
|
||||||
{
|
{
|
||||||
switch(ordenador.turbo)
|
switch(ordenador.turbo)
|
||||||
{
|
{
|
||||||
@ -536,7 +544,34 @@ static void emulation_settings(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ordenador.turbo==0) ordenador.precision = !submenus[5];
|
if (ordenador.turbo==0) ordenador.precision = !submenus[4];
|
||||||
|
}
|
||||||
|
|
||||||
|
static void audio_settings(void)
|
||||||
|
{
|
||||||
|
unsigned int submenus[3];
|
||||||
|
int opt;
|
||||||
|
|
||||||
|
|
||||||
|
memset(submenus, 0, sizeof(submenus));
|
||||||
|
|
||||||
|
|
||||||
|
submenus[0] = ordenador.volume/2;
|
||||||
|
submenus[1] = !ordenador.ay_emul;
|
||||||
|
submenus[2] = ordenador.audio_mode;
|
||||||
|
|
||||||
|
|
||||||
|
opt = menu_select_title("Audio settings menu",
|
||||||
|
audio_messages, submenus);
|
||||||
|
if (opt < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
|
||||||
|
ordenador.volume = submenus[0]*2;
|
||||||
|
ordenador.ay_emul = !submenus[1];
|
||||||
|
ordenador.audio_mode = submenus[2];
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void save_load_general_configurations(int);
|
static void save_load_general_configurations(int);
|
||||||
@ -1251,6 +1286,11 @@ void load_poke_file()
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void help(void)
|
||||||
|
{
|
||||||
|
menu_select_title("FBZX-WII help",
|
||||||
|
help_messages, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void tools()
|
static void tools()
|
||||||
{
|
{
|
||||||
@ -1268,6 +1308,8 @@ static void tools()
|
|||||||
|
|
||||||
set_port(submenus[0]);
|
set_port(submenus[0]);
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
switch(opt)
|
switch(opt)
|
||||||
{
|
{
|
||||||
case 0: // Show keyboard
|
case 0: // Show keyboard
|
||||||
@ -1285,9 +1327,13 @@ static void tools()
|
|||||||
case 8: // Load poke file
|
case 8: // Load poke file
|
||||||
load_poke_file();
|
load_poke_file();
|
||||||
break;
|
break;
|
||||||
|
case 10:
|
||||||
|
help();
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
} while (opt == 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -1549,12 +1595,6 @@ static void manage_configurations()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void help(void)
|
|
||||||
{
|
|
||||||
menu_select_title("FBZX-WII help",
|
|
||||||
help_messages, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void main_menu()
|
void main_menu()
|
||||||
{
|
{
|
||||||
int submenus[3];
|
int submenus[3];
|
||||||
@ -1586,15 +1626,18 @@ void main_menu()
|
|||||||
screen_settings();
|
screen_settings();
|
||||||
break;
|
break;
|
||||||
case 9:
|
case 9:
|
||||||
manage_configurations();
|
audio_settings();
|
||||||
break;
|
break;
|
||||||
case 10:
|
case 10:
|
||||||
microdrive();
|
manage_configurations();
|
||||||
break;
|
break;
|
||||||
case 11:
|
case 11:
|
||||||
tools();
|
microdrive();
|
||||||
break;
|
break;
|
||||||
case 12:
|
case 12:
|
||||||
|
tools();
|
||||||
|
break;
|
||||||
|
case 13:
|
||||||
ResetComputer ();
|
ResetComputer ();
|
||||||
ordenador.pause = 1;
|
ordenador.pause = 1;
|
||||||
if (ordenador.tap_file != NULL) {
|
if (ordenador.tap_file != NULL) {
|
||||||
@ -1602,9 +1645,6 @@ void main_menu()
|
|||||||
rewind_tape (ordenador.tap_file,1);
|
rewind_tape (ordenador.tap_file,1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 13:
|
|
||||||
help();
|
|
||||||
break;
|
|
||||||
case 14:
|
case 14:
|
||||||
if (msgYesNo("Are you sure to quit?", 0, FULL_DISPLAY_X /2-138/RATIO, FULL_DISPLAY_Y /2-48/RATIO))
|
if (msgYesNo("Are you sure to quit?", 0, FULL_DISPLAY_X /2-138/RATIO, FULL_DISPLAY_Y /2-48/RATIO))
|
||||||
{salir = 0;}
|
{salir = 0;}
|
||||||
@ -1612,7 +1652,7 @@ void main_menu()
|
|||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} while (opt == 5 || opt == 7 || opt == 10 || opt == 13);
|
} while (opt == 4 || opt == 7 || opt == 11);
|
||||||
|
|
||||||
clean_screen();
|
clean_screen();
|
||||||
|
|
||||||
|
@ -2002,9 +2002,9 @@ if (freq == 0)
|
|||||||
if (ordenador.videosystem==0) ordenador.cpufreq = 3500000;
|
if (ordenador.videosystem==0) ordenador.cpufreq = 3500000;
|
||||||
else ordenador.cpufreq = 3527500;
|
else ordenador.cpufreq = 3527500;
|
||||||
break;
|
break;
|
||||||
case 3: // +2A/+3
|
|
||||||
case 1: // 128K
|
case 1: // 128K
|
||||||
case 2: // +2
|
case 2: // +2
|
||||||
|
case 3: // +2A/+3
|
||||||
case 4: // spanish 128K
|
case 4: // spanish 128K
|
||||||
ordenador.cpufreq = 3546900;
|
ordenador.cpufreq = 3546900;
|
||||||
break;
|
break;
|
||||||
|
@ -183,7 +183,7 @@ int sound_init_asnd() {
|
|||||||
ASND_Pause(0);
|
ASND_Pause(0);
|
||||||
ordenador.sign=0;
|
ordenador.sign=0;
|
||||||
ordenador.format=0; //8 bit
|
ordenador.format=0; //8 bit
|
||||||
ordenador.channels=1; //mono
|
ordenador.channels=2; //stereo
|
||||||
ordenador.freq=48000;
|
ordenador.freq=48000;
|
||||||
ordenador.buffer_len=4096;
|
ordenador.buffer_len=4096;
|
||||||
started_sound_asnd = 0;
|
started_sound_asnd = 0;
|
||||||
@ -495,17 +495,17 @@ void sound_play() {
|
|||||||
#ifdef GEKKO
|
#ifdef GEKKO
|
||||||
case SOUND_ASND: // ASND
|
case SOUND_ASND: // ASND
|
||||||
if (!started_sound_asnd) {
|
if (!started_sound_asnd) {
|
||||||
ASND_SetVoice(1,VOICE_MONO_8BIT_U,48000,0,sound[0],ordenador.buffer_len,
|
ASND_SetVoice(1,VOICE_STEREO_8BIT_U,ordenador.freq,0,sound[0],ordenador.buffer_len*ordenador.increment,
|
||||||
MID_VOLUME, MID_VOLUME, callback);
|
MID_VOLUME, MID_VOLUME, callback);
|
||||||
started_sound_asnd = 1;
|
started_sound_asnd = 1;
|
||||||
}
|
}
|
||||||
//Double buffer
|
//Double buffer
|
||||||
while (!ASND_TestVoiceBufferReady(1)){}; //Wait for one buffer to be free
|
while (!ASND_TestVoiceBufferReady(1)){}; //Wait for one buffer to be free
|
||||||
if (!ASND_TestPointer (1, sound[0]))
|
if (!ASND_TestPointer (1, sound[0]))
|
||||||
{ASND_AddVoice(1,sound[0],ordenador.buffer_len);
|
{ASND_AddVoice(1,sound[0],ordenador.buffer_len*ordenador.increment);
|
||||||
ordenador.current_buffer = sound[0]; }
|
ordenador.current_buffer = sound[0]; }
|
||||||
else
|
else
|
||||||
{ASND_AddVoice(1,sound[1],ordenador.buffer_len);
|
{ASND_AddVoice(1,sound[1],ordenador.buffer_len*ordenador.increment);
|
||||||
ordenador.current_buffer = sound[1]; }
|
ordenador.current_buffer = sound[1]; }
|
||||||
|
|
||||||
return;
|
return;
|
||||||
|
172
src/spk_ay.c
172
src/spk_ay.c
@ -187,8 +187,8 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
|
|
||||||
if (!noise_period) noise_period = 1;
|
if (!noise_period) noise_period = 1;
|
||||||
|
|
||||||
if (tone_period_a*ordenador.freq<110841) //Freq_camp > cpufreq/(2*16*tone_period)
|
if (tone_period_a<6) //max 20KHz
|
||||||
ordenador.aych_a =1;
|
ordenador.ayval_a =1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ordenador.aych_a<tone_period_a)
|
if (ordenador.aych_a<tone_period_a)
|
||||||
@ -200,8 +200,8 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tone_period_b*ordenador.freq<110841) //Freq_camp > cpufreq/(2*16*tone_period)
|
if (tone_period_b<6) //max 20KHz
|
||||||
ordenador.aych_b =1;
|
ordenador.ayval_b =1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ordenador.aych_b<tone_period_b)
|
if (ordenador.aych_b<tone_period_b)
|
||||||
@ -213,8 +213,8 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tone_period_c*ordenador.freq<110841) //Freq_camp > cpufreq/(2*16*tone_period)
|
if (tone_period_c<6) //max 20KHz
|
||||||
ordenador.aych_c =1;
|
ordenador.ayval_c =1;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (ordenador.aych_c<tone_period_c)
|
if (ordenador.aych_c<tone_period_c)
|
||||||
@ -262,61 +262,11 @@ inline void play_ay (unsigned int tstados) {
|
|||||||
noise >>= 1 ;
|
noise >>= 1 ;
|
||||||
|
|
||||||
ordenador.aych_n =0;
|
ordenador.aych_n =0;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Volume
|
//Mixer
|
||||||
//Each channel max 51
|
|
||||||
|
|
||||||
if (ordenador.ay_registers[8] & 0x10)
|
|
||||||
ordenador.vol_a =
|
|
||||||
(unsigned char) (levels[ordenador.ay_envel_value]*(unsigned int) ordenador.volume/80);
|
|
||||||
else
|
|
||||||
ordenador.vol_a =
|
|
||||||
(unsigned char) (levels[ordenador.ay_registers[8] &0x0F]*(unsigned int) ordenador.volume/80);
|
|
||||||
|
|
||||||
if (ordenador.ay_registers[10] & 0x10)
|
|
||||||
ordenador.vol_c =
|
|
||||||
(unsigned char) (levels[ordenador.ay_envel_value] *(unsigned int) ordenador.volume/80);
|
|
||||||
else
|
|
||||||
ordenador.vol_c =
|
|
||||||
(unsigned char) (levels[ordenador.ay_registers[10] & 0x0F] *(unsigned int) ordenador.volume/80);
|
|
||||||
|
|
||||||
if (ordenador.ay_registers[9] & 0x10)
|
|
||||||
ordenador.vol_b =
|
|
||||||
(unsigned char) (levels[ordenador.ay_envel_value] *(unsigned int) ordenador.volume/80);
|
|
||||||
else
|
|
||||||
ordenador.vol_b =
|
|
||||||
(unsigned char)(levels[ordenador.ay_registers[9] &0x0F] *(unsigned int) ordenador.volume/80);
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/* Creates the sound buffer during the TSTADOS tstate that the Z80 used to
|
|
||||||
execute last instruction */
|
|
||||||
|
|
||||||
inline void play_sound (unsigned int tstados) {
|
|
||||||
|
|
||||||
int bucle;
|
|
||||||
int value;
|
|
||||||
unsigned char sample_v;
|
|
||||||
|
|
||||||
ordenador.tstados_counter_sound += tstados;
|
|
||||||
|
|
||||||
while (ordenador.tstados_counter_sound >= ordenador.tst_sample) {
|
|
||||||
|
|
||||||
ordenador.tstados_counter_sound -= ordenador.tst_sample;
|
|
||||||
if (sound_type!=1) //!SOUND_OSS
|
|
||||||
for (bucle = 0; bucle < ordenador.increment; bucle++) {
|
|
||||||
sample_v = ordenador.sample1b[bucle];
|
|
||||||
if (ordenador.sound_bit && sample_v)
|
|
||||||
//Sound bit volume max 96
|
|
||||||
ordenador.sound_current_value=ordenador.volume*6;
|
|
||||||
else ordenador.sound_current_value=0;
|
|
||||||
value = ordenador.sound_current_value;
|
|
||||||
|
|
||||||
//Mixer
|
|
||||||
|
|
||||||
// The 8912 has three outputs, each output is the mix of one of the three
|
// The 8912 has three outputs, each output is the mix of one of the three
|
||||||
// tone generators and of the (single) noise generator. The two are mixed
|
// tone generators and of the (single) noise generator. The two are mixed
|
||||||
@ -331,22 +281,98 @@ inline void play_sound (unsigned int tstados) {
|
|||||||
// into the ON state (see above); and it has no effect if the volume is 0.
|
// into the ON state (see above); and it has no effect if the volume is 0.
|
||||||
// If the volume is 0, increase the counter, but don't touch the output.
|
// If the volume is 0, increase the counter, but don't touch the output.
|
||||||
|
|
||||||
if (ordenador.ay_emul) { // if emulation is ON, emulate it
|
if ((ordenador.ayval_a || (ordenador.ay_registers[7] & 0x01))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x08)))
|
||||||
//ordenador.ayval_n = 1;
|
{
|
||||||
if (sample_v &&((ordenador.ayval_a || (ordenador.ay_registers[7] & 0x01))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x08))))
|
if (ordenador.ay_registers[8] & 0x10)
|
||||||
value += (int) ordenador.vol_a;
|
ordenador.vol_a = levels[ordenador.ay_envel_value];
|
||||||
if (sample_v &&((ordenador.ayval_b || (ordenador.ay_registers[7] & 0x02))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x10))))
|
else
|
||||||
value += (int) ordenador.vol_b;
|
ordenador.vol_a = levels[ordenador.ay_registers[8] &0x0F];
|
||||||
if (sample_v &&((ordenador.ayval_c || (ordenador.ay_registers[7] & 0x04))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x20))))
|
}
|
||||||
value += (int) ordenador.vol_c;
|
else ordenador.vol_a = 0;
|
||||||
|
|
||||||
}
|
|
||||||
if (value > 255)
|
if ((ordenador.ayval_b || (ordenador.ay_registers[7] & 0x02))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x10)))
|
||||||
value = 255;
|
{
|
||||||
sample_v = (unsigned char)(value - (unsigned int)ordenador.sign);
|
if (ordenador.ay_registers[9] & 0x10)
|
||||||
*ordenador.current_buffer = sample_v;
|
ordenador.vol_b = levels[ordenador.ay_envel_value];
|
||||||
ordenador.current_buffer++;
|
else
|
||||||
|
ordenador.vol_b = levels[ordenador.ay_registers[9] &0x0F];
|
||||||
|
}
|
||||||
|
else ordenador.vol_b = 0;
|
||||||
|
|
||||||
|
if ((ordenador.ayval_c || (ordenador.ay_registers[7] & 0x04))&&(ordenador.ayval_n || (ordenador.ay_registers[7] & 0x20)))
|
||||||
|
{
|
||||||
|
if (ordenador.ay_registers[10] & 0x10)
|
||||||
|
ordenador.vol_c = levels[ordenador.ay_envel_value];
|
||||||
|
else
|
||||||
|
ordenador.vol_c = levels[ordenador.ay_registers[10] & 0x0F];
|
||||||
|
}
|
||||||
|
else ordenador.vol_c = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Creates the sound buffer during the TSTADOS tstate that the Z80 used to
|
||||||
|
execute last instruction */
|
||||||
|
|
||||||
|
inline void play_sound (unsigned int tstados) {
|
||||||
|
|
||||||
|
int value, lvalue, rvalue;
|
||||||
|
|
||||||
|
|
||||||
|
ordenador.tstados_counter_sound += tstados;
|
||||||
|
|
||||||
|
while (ordenador.tstados_counter_sound >= ordenador.tst_sample) {
|
||||||
|
|
||||||
|
ordenador.tstados_counter_sound -= ordenador.tst_sample;
|
||||||
|
|
||||||
|
if (ordenador.sound_bit) value=ordenador.volume*6; //Sound bit volume max 96
|
||||||
|
else value=0;
|
||||||
|
|
||||||
|
//Each channel max 51
|
||||||
|
|
||||||
|
if (ordenador.ay_emul)
|
||||||
|
{
|
||||||
|
switch (ordenador.audio_mode)
|
||||||
|
{
|
||||||
|
case 0: //Mono
|
||||||
|
lvalue = value + (ordenador.vol_a + ordenador.vol_b +ordenador.vol_c)*ordenador.volume/80;
|
||||||
|
rvalue = value + (ordenador.vol_a + ordenador.vol_b +ordenador.vol_c)*ordenador.volume/80;
|
||||||
|
break;
|
||||||
|
case 1: //ABC
|
||||||
|
lvalue = value + (ordenador.vol_a*2 + ordenador.vol_b)*ordenador.volume/80;
|
||||||
|
rvalue = value + (ordenador.vol_b + ordenador.vol_c*2)*ordenador.volume/80;
|
||||||
|
break;
|
||||||
|
case 2: //ACB
|
||||||
|
lvalue = value + (ordenador.vol_a*2 + ordenador.vol_c)*ordenador.volume/80;
|
||||||
|
rvalue = value + (ordenador.vol_c + ordenador.vol_b*2)*ordenador.volume/80;
|
||||||
|
break;
|
||||||
|
case 3: //BAC
|
||||||
|
lvalue = value + (ordenador.vol_b*2 + ordenador.vol_a)*ordenador.volume/80;
|
||||||
|
rvalue = value + (ordenador.vol_a + ordenador.vol_c*2)*ordenador.volume/80;
|
||||||
|
break;
|
||||||
|
default: //No emulation
|
||||||
|
rvalue = value;
|
||||||
|
lvalue = value;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rvalue = value;
|
||||||
|
lvalue = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
if (rvalue > 255) rvalue = 255;
|
||||||
|
if (lvalue > 255) lvalue = 255;
|
||||||
|
*/
|
||||||
|
|
||||||
|
*ordenador.current_buffer = (unsigned char)(rvalue - (unsigned int)ordenador.sign);
|
||||||
|
ordenador.current_buffer++;
|
||||||
|
*ordenador.current_buffer = (unsigned char)(lvalue - (unsigned int)ordenador.sign);
|
||||||
|
ordenador.current_buffer++;
|
||||||
|
|
||||||
ordenador.sound_cuantity++;
|
ordenador.sound_cuantity++;
|
||||||
|
|
||||||
if (ordenador.sound_cuantity == ordenador.buffer_len) { // buffer filled
|
if (ordenador.sound_cuantity == ordenador.buffer_len) { // buffer filled
|
||||||
|
Loading…
Reference in New Issue
Block a user