Add more tests for save/restore feature

This commit is contained in:
Aaron Culliney 2016-10-14 20:07:16 -07:00
parent 1be2c6fd27
commit a417249691
7 changed files with 28243 additions and 15 deletions

View File

@ -35,7 +35,7 @@
// [AppleWin-TC] From FUSE's sound.c module
#if !defined(APPLE2IX)
#if 0 // !defined(APPLE2IX)
#include "StdAfx.h"
#include <windows.h>
@ -50,6 +50,9 @@
# include "common.h"
# include "audio/AY8910.h"
# include "audio/mockingboard.h" // For g_uTimer1IrqCount
# if TESTING
# include "greatest.h"
# endif
#endif
/* The AY white noise RNG algorithm is based on info from MAME's ay8910.c -
@ -1302,6 +1305,74 @@ static bool _loadState(StateHelper_s *helper, struct CAY8910 *_this) {
return loaded;
}
# if TESTING
int _testStateA2V2(struct CAY8910 *_this, uint8_t **exData) {
unsigned int *p32 = (unsigned int *)(*exData);
ASSERT(_this->ay_tone_tick[0] == *p32++);
ASSERT(_this->ay_tone_tick[1] == *p32++);
ASSERT(_this->ay_tone_tick[2] == *p32++);
ASSERT(_this->ay_tone_high[0] == *p32++);
ASSERT(_this->ay_tone_high[1] == *p32++);
ASSERT(_this->ay_tone_high[2] == *p32++);
ASSERT(_this->ay_noise_tick == *p32++);
ASSERT(_this->ay_tone_subcycles == *p32++);
ASSERT(_this->ay_env_subcycles == *p32++);
ASSERT(_this->ay_env_internal_tick == *p32++);
ASSERT(_this->ay_env_tick == *p32++);
ASSERT(_this->ay_tick_incr == *p32++);
ASSERT(_this->ay_tone_period[0] == *p32++);
ASSERT(_this->ay_tone_period[1] == *p32++);
ASSERT(_this->ay_tone_period[2] == *p32++);
ASSERT(_this->ay_noise_period == *p32++);
ASSERT(_this->ay_env_period == *p32++);
ASSERT(_this->rng == *p32++);
ASSERT(_this->noise_toggle == *p32++);
ASSERT(_this->env_first == *p32++);
ASSERT(_this->env_rev == *p32++);
ASSERT(_this->env_counter == *p32++);
// Registers
uint8_t *p8 = (uint8_t *)p32;
for (unsigned int i=0; i<16; i++) {
ASSERT(_this->sound_ay_registers[i] == *p8++);
}
p32 = (unsigned int *)p8;
int changeCount = _this->ay_change_count;
ASSERT(changeCount == *p32++);
ASSERT(changeCount >= 0);
p8 = (uint8_t *)p32;
if (changeCount) {
for (int i=0; i<changeCount; i++) {
unsigned long *pL = (unsigned long *)p8;
ASSERT(_this->ay_change[i].tstates == *pL++);
p8 = (uint8_t *)pL;
unsigned short *pS = (unsigned short *)p8;
ASSERT(_this->ay_change[i].ofs == *pS++);
p8 = (uint8_t *)pS;
ASSERT(_this->ay_change[i].reg == *p8++);
ASSERT(_this->ay_change[i].val == *p8++);
}
}
*exData = p8;
PASS();
}
# endif
#else
void CAY8910::SaveSnapshot(YamlSaveHelper& yamlSaveHelper, std::string& suffix)
{
@ -1564,6 +1635,13 @@ bool _ay8910_loadState(StateHelper_s *helper, unsigned int chip) {
assert(chip < MAX_8910);
return _loadState(helper, &g_AY8910[chip]);
}
# if TESTING
int _ay8910_testAssertA2V2(unsigned int chip, uint8_t **exData) {
return _testStateA2V2(&g_AY8910[chip], exData);
}
# endif
#else
UINT AY8910_SaveSnapshot(YamlSaveHelper& yamlSaveHelper, UINT uChip, std::string& suffix)
{

View File

@ -35,6 +35,9 @@ void AY8910UpdateSetCycles();
#if 1 // APPLE2IX
bool _ay8910_saveState(StateHelper_s *helper, unsigned int chip);
bool _ay8910_loadState(StateHelper_s *helper, unsigned int chip);
# if TESTING
int _ay8910_testAssertA2V2(unsigned int chip, uint8_t **exData);
# endif
#else
UINT AY8910_SaveSnapshot(class YamlSaveHelper& yamlSaveHelper, UINT uChip, std::string& suffix);
UINT AY8910_LoadSnapshot(class YamlLoadHelper& yamlLoadHelper, UINT uChip, std::string& suffix);

View File

@ -114,6 +114,9 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
# if defined(__linux) && !defined(ANDROID)
# include <sys/io.h>
# endif
# if TESTING
# include "greatest.h"
# endif
#if defined(FAILED)
#undef FAILED
@ -2885,7 +2888,83 @@ exit_load:
return loaded;
}
#else
# if TESTING
static int _sy6522_testAssertA2V2(SY6522 *sy6522, uint8_t **exData) {
uint8_t *expected = *exData;
ASSERT(sy6522->ORA == *expected++);
ASSERT(sy6522->ORB == *expected++);
ASSERT(sy6522->DDRA == *expected++);
ASSERT(sy6522->DDRB == *expected++);
uint16_t *expected16 = (uint16_t *)expected;
ASSERT(sy6522->TIMER1_COUNTER.w == *expected16++);
ASSERT(sy6522->TIMER1_LATCH.w == *expected16++);
ASSERT(sy6522->TIMER2_COUNTER.w == *expected16++);
ASSERT(sy6522->TIMER2_LATCH.w == *expected16++);
expected = (uint8_t *)expected16;
ASSERT(sy6522->SERIAL_SHIFT == *expected++);
ASSERT(sy6522->ACR == *expected++);
ASSERT(sy6522->PCR == *expected++);
ASSERT(sy6522->IFR == *expected++);
ASSERT(sy6522->IER == *expected++);
*exData = expected;
PASS();
}
static int _ssi263_testAssertA2V2(SSI263A *ssi263, uint8_t **exData) {
uint8_t *expected = *exData;
ASSERT(ssi263->DurationPhoneme == *expected++);
ASSERT(ssi263->Inflection == *expected++);
ASSERT(ssi263->RateInflection == *expected++);
ASSERT(ssi263->CtrlArtAmp == *expected++);
ASSERT(ssi263->FilterFreq == *expected++);
ASSERT(ssi263->CurrentMode == *expected++);
*exData = expected;
PASS();
}
int mb_testAssertA2V2(uint8_t *exData, size_t dataSiz) {
uint8_t *exStart = exData;
for (unsigned int i=0; i<NUM_DEVS_PER_MB; i++) {
for (unsigned int j=0; j<NUM_MB; j++) {
unsigned int idx = (i<<1) + j;
SY6522_AY8910 *mb = &g_MB[idx];
_sy6522_testAssertA2V2(&(mb->sy6522), &exData);
_ay8910_testAssertA2V2(idx, &exData);
_ssi263_testAssertA2V2(&(mb->SpeechChip), &exData);
ASSERT(mb->nAYCurrentRegister == *exData);
++exData;
// TIMER1 IRQ
// TIMER2 IRQ
// SPEECH IRQ
++mb;
}
}
ASSERT(exData - exStart == dataSiz);
PASS();
}
# endif // TESTING
#else // !APPLE2IX
static UINT DoWriteFile(const HANDLE hFile, const void* const pData, const UINT Length)
{

View File

@ -117,6 +117,9 @@ void MB_SetVolume(unsigned long dwVolume, unsigned long dwVolumeMax);
#if 1 // APPLE2IX
bool mb_saveState(StateHelper_s *helper);
bool mb_loadState(StateHelper_s *helper);
# if TESTING
int mb_testAssertA2V2(uint8_t *exData, size_t dataSiz);
# endif
#else
void MB_GetSnapshot_v1(struct SS_CARD_MOCKINGBOARD_v1* const pSS, const DWORD dwSlot); // For debugger
int MB_SetSnapshot_v1(const struct SS_CARD_MOCKINGBOARD_v1* const pSS, const DWORD dwSlot);

13724
src/test/a2v2-good1.h Normal file

File diff suppressed because it is too large Load Diff

13666
src/test/a2vm-good1.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -42,12 +42,14 @@ static void testui_teardown(void *arg) {
# define BLANK_TRACK_WIDTH 6040
#endif
extern uint8_t (*iie_read_peripheral_card)(uint16_t);
static int _assert_blank_boot(void) {
// Disk6 ...
ASSERT(disk6.motor_off == 1);
ASSERT(disk6.drive == 0);
ASSERT(disk6.ddrw == 0);
ASSERT(disk6.disk_byte == 0x0);
ASSERT(disk6.disk_byte == 0xAA);
extern int stepper_phases;
ASSERT(stepper_phases == 0x0);
ASSERT(disk6.disk[0].is_protected);
@ -65,7 +67,7 @@ static int _assert_blank_boot(void) {
ASSERT(!disk6.disk[0].track_dirty);
extern int skew_table_6_do[16];
ASSERT(disk6.disk[0].skew_table == skew_table_6_do);
// VM ...
ASSERT(softswitches == 0x000140d1);
ASSERT_SHA_BIN("97AADDDF5D20B793C4558A8928227F0B52565A98", apple_ii_64k[0], /*len:*/sizeof(apple_ii_64k));
@ -79,12 +81,12 @@ static int _assert_blank_boot(void) {
ASSERT(base_hgrwrt == apple_ii_64k[0]);
ASSERT(base_stackzp == apple_ii_64k[0]);
ASSERT(base_c3rom == apple_ii_64k[1]);
ASSERT(base_cxrom == apple_ii_64k[0]);
ASSERT(base_cxrom == (void *)&iie_read_peripheral_card);
ASSERT(base_d000_rd == apple_ii_64k[0]);
ASSERT(base_d000_wrt == language_banks[0] - 0xD000);
ASSERT(base_e000_rd == apple_ii_64k[0]);
ASSERT(base_e000_wrt == language_card[0] - 0xE000);
// CPU ...
ASSERT(cpu65_pc == 0xE783);
ASSERT(cpu65_ea == 0x1F33);
@ -93,7 +95,7 @@ static int _assert_blank_boot(void) {
ASSERT(cpu65_x == 0xFF);
ASSERT(cpu65_y == 0x00);
ASSERT(cpu65_sp == 0xF6);
PASS();
}
@ -103,7 +105,7 @@ TEST test_save_state_1() {
BOOT_TO_DOS();
_assert_blank_boot();
char *savFile = NULL;
ASPRINTF(&savFile, "%s/emulator-test.state", HOMEDIR);
@ -116,6 +118,13 @@ TEST test_save_state_1() {
TEST test_load_state_1() {
// ensure stable test
disk6_eject(0);
c_debugger_set_timeout(1);
c_debugger_clear_watchpoints();
c_debugger_go();
c_debugger_set_timeout(0);
char *savFile = NULL;
ASPRINTF(&savFile, "%s/emulator-test.state", HOMEDIR);
@ -133,15 +142,679 @@ TEST test_load_state_1() {
PASS();
}
TEST test_load_A2VM_1() {
TEST test_load_A2VM_good1() {
// test A2VM original format
// ensure stable test
disk6_eject(0);
c_debugger_set_timeout(1);
c_debugger_clear_watchpoints();
c_debugger_go();
c_debugger_set_timeout(0);
////#include "test/a2vm-sample.h"
// write saved state to disk
#warning save the binary data to state file, then load and assert various stuff-n-things
#include "test/a2vm-good1.h"
FAIL();
const char *homedir = HOMEDIR;
char *savData = NULL;
ASPRINTF(&savData, "%s/a2_emul_a2vm.dat", homedir);
if (savData) {
unlink(savData);
}
FILE *fp = fopen(savData, "w");
ASSERT(fp);
size_t dataSiz = sizeof(data);
if (fwrite(data, 1, dataSiz, fp) != dataSiz) {
ASSERT(false);
}
fflush(fp); fclose(fp); fp = NULL;
// load state and assert
bool ret = emulator_loadState(savData);
ASSERT(ret);
// ASSERT framebuffer matches expected
ASSERT_SHA("9C654FEF2A672E16D89ED2FB80C593CD2005A026");
// Disk6 ...
ASSERT(disk6.motor_off == 1);
ASSERT(disk6.drive == 0);
ASSERT(disk6.ddrw == 0);
ASSERT(disk6.disk_byte == 0xAA);
extern int stepper_phases;
ASSERT(stepper_phases == 0x0);
ASSERT(disk6.disk[0].is_protected);
const char *file_name = strrchr(disk6.disk[0].file_name, '/');
ASSERT(strcmp(file_name, "/testdisplay1.dsk") == 0);
ASSERT(disk6.disk[0].phase == 34);
ASSERT(disk6.disk[0].run_byte == 2000);
ASSERT(disk6.disk[0].fd > 0);
ASSERT(disk6.disk[0].mmap_image != 0);
ASSERT(disk6.disk[0].mmap_image != MAP_FAILED);
ASSERT(disk6.disk[0].whole_len == 143360);
ASSERT(disk6.disk[0].whole_image != NULL);
ASSERT(disk6.disk[0].track_width == BLANK_TRACK_WIDTH);
ASSERT(!disk6.disk[0].nibblized);
ASSERT(!disk6.disk[0].track_dirty);
extern int skew_table_6_do[16];
ASSERT(disk6.disk[0].skew_table == skew_table_6_do);
// VM ...
ASSERT(softswitches == 0x000343d1);
ASSERT_SHA_BIN("2E3C6163EEAA817B02B00766B9E118D3197D16AF", apple_ii_64k[0], /*len:*/sizeof(apple_ii_64k));
ASSERT_SHA_BIN("2C82E33E964936187CA1DABF71AE6148916BD131", language_card[0], /*len:*/sizeof(language_card));
ASSERT_SHA_BIN("36F1699537024EC6017A22641FF0EC277AFFD49D", language_banks[0], /*len:*/sizeof(language_banks));
ASSERT(base_ramrd == apple_ii_64k[0]);
ASSERT(base_ramwrt == apple_ii_64k[0]);
ASSERT(base_textrd == apple_ii_64k[0]);
ASSERT(base_textwrt == apple_ii_64k[0]);
ASSERT(base_hgrrd == apple_ii_64k[0]);
ASSERT(base_hgrwrt == apple_ii_64k[0]);
ASSERT(base_stackzp == apple_ii_64k[0]);
ASSERT(base_c3rom == apple_ii_64k[1]);
ASSERT(base_cxrom == (void *)&iie_read_peripheral_card);
ASSERT(base_d000_rd == apple_ii_64k[0]);
ASSERT(base_d000_wrt == language_banks[0] - 0xD000);
ASSERT(base_e000_rd == apple_ii_64k[0]);
ASSERT(base_e000_wrt == language_card[0] - 0xE000);
// CPU ...
ASSERT(cpu65_pc == 0xC83D);
ASSERT(cpu65_ea == 0x004E);
ASSERT(cpu65_a == 0x0D);
ASSERT(cpu65_f == 0x35);
ASSERT(cpu65_x == 0x09);
ASSERT(cpu65_y == 0x01);
ASSERT(cpu65_sp == 0xEA);
unlink(savData);
FREE(savData);
PASS();
}
TEST test_load_A2V2_good1() {
// ensure stable test
disk6_eject(0);
c_debugger_set_timeout(1);
c_debugger_clear_watchpoints();
c_debugger_go();
c_debugger_set_timeout(0);
// write saved state to disk
#include "test/a2v2-good1.h"
const char *homedir = HOMEDIR;
char *savData = NULL;
ASPRINTF(&savData, "%s/a2_emul_a2v2.dat", homedir);
if (savData) {
unlink(savData);
}
FILE *fp = fopen(savData, "w");
ASSERT(fp);
size_t dataSiz = sizeof(data);
if (fwrite(data, 1, dataSiz, fp) != dataSiz) {
ASSERT(false);
}
fflush(fp); fclose(fp); fp = NULL;
// load state and assert
bool ret = emulator_loadState(savData);
ASSERT(ret);
// ASSERT framebuffer matches expected
ASSERT_SHA("EE8AF0ADB3AF477A713B9E5FD02D655CF8371F7B");
// Disk6 ...
ASSERT(disk6.motor_off == 1);
ASSERT(disk6.drive == 0);
ASSERT(disk6.ddrw == 0);
ASSERT(disk6.disk_byte == 0x96);
extern int stepper_phases;
ASSERT(stepper_phases == 0x0);
ASSERT(disk6.disk[0].is_protected);
const char *file_name = strrchr(disk6.disk[0].file_name, '/');
ASSERT(strcmp(file_name, "/NSCT.dsk") == 0);
ASSERT(disk6.disk[0].phase == 26);
ASSERT(disk6.disk[0].run_byte == 5562);
ASSERT(disk6.disk[0].fd > 0);
ASSERT(disk6.disk[0].mmap_image != 0);
ASSERT(disk6.disk[0].mmap_image != MAP_FAILED);
ASSERT(disk6.disk[0].whole_len == 143360);
ASSERT(disk6.disk[0].whole_image != NULL);
ASSERT(disk6.disk[0].track_width == BLANK_TRACK_WIDTH);
ASSERT(!disk6.disk[0].nibblized);
ASSERT(!disk6.disk[0].track_dirty);
extern int skew_table_6_do[16];
ASSERT(disk6.disk[0].skew_table == skew_table_6_do);
// VM ...
ASSERT(softswitches == 0x000140f5);
ASSERT_SHA_BIN("0AEA333FBDAE26959719E3BDD6AEFA408784F614", apple_ii_64k[0], /*len:*/sizeof(apple_ii_64k));
ASSERT_SHA_BIN("6D54FC0A19EC396113863C15D607EAE55F369C0D", language_card[0], /*len:*/sizeof(language_card));
ASSERT_SHA_BIN("36F1699537024EC6017A22641FF0EC277AFFD49D", language_banks[0], /*len:*/sizeof(language_banks));
ASSERT(base_ramrd == apple_ii_64k[0]);
ASSERT(base_ramwrt == apple_ii_64k[0]);
ASSERT(base_textrd == apple_ii_64k[0]);
ASSERT(base_textwrt == apple_ii_64k[0]);
ASSERT(base_hgrrd == apple_ii_64k[0]);
ASSERT(base_hgrwrt == apple_ii_64k[0]);
ASSERT(base_stackzp == apple_ii_64k[0]);
ASSERT(base_c3rom == apple_ii_64k[1]);
ASSERT(base_cxrom == (void *)&iie_read_peripheral_card);
ASSERT(base_d000_rd == language_banks[0]-0xD000);
ASSERT(base_d000_wrt == language_banks[0]-0xD000);
ASSERT(base_e000_rd == language_card[0]-0xE000);
ASSERT(base_e000_wrt == language_card[0]-0xE000);
// CPU ...
ASSERT(cpu65_pc == 0xF30F);
ASSERT(cpu65_ea == 0xF30E);
ASSERT(cpu65_a == 0x01);
ASSERT(cpu65_f == 0x30);
ASSERT(cpu65_x == 0x0D);
ASSERT(cpu65_y == 0x03);
ASSERT(cpu65_sp == 0xFC);
// Timing ...
long scaleFactor = (long)(cpu_scale_factor * 100.);
ASSERT(scaleFactor = 100);
long altScaleFactor = (long)(cpu_altscale_factor * 100.);
ASSERT(altScaleFactor = 200);
ASSERT(alt_speed_enabled);
// Mockingboard ...
{
uint8_t *exData = MALLOC(1024);
uint8_t *p8 = exData;
uint16_t *p16 = 0;
unsigned int *p32 = 0;
unsigned int changeCount = 0;
unsigned long *pL = 0;
unsigned short *pS = 0;
// ----------------------------------------------------------------- 00
// --------------- SY6522
*p8++ = 0x00; // ORA
*p8++ = 0x04; // ORB
*p8++ = 0xFF; // DDRA
*p8++ = 0x07; // DDRB
p16 = (uint16_t *)p8;
*p16++ = 0x02EC; // TIMER1_COUNTER
*p16++ = 0x4FBA; // TIMER1_LATCH
*p16++ = 0xDFDF; // TIMER2_COUNTER
*p16++ = 0x0000; // TIMER2_LATCH
p8 = (uint8_t *)p16;
*p8++ = 0x00; // SERIAL_SHIFT
*p8++ = 0x40; // ACR
*p8++ = 0x00; // PCR
*p8++ = 0x00; // IFR
*p8++ = 0x40; // IER
// --------------- AY8910
p32 = (unsigned int *)p8;
*p32++ = (unsigned int)105; // ay_tone_tick[0]
*p32++ = (unsigned int)35; // ay_tone_tick[1]
*p32++ = (unsigned int)43; // ay_tone_tick[2]
*p32++ = (unsigned int)1; // ay_tone_high[0]
*p32++ = (unsigned int)0; // ay_tone_high[1]
*p32++ = (unsigned int)0; // ay_tone_high[2]
*p32++ = (unsigned int)1; // ay_noise_tick
*p32++ = (unsigned int)152756; // ay_tone_subcycles
*p32++ = (unsigned int)677044; // ay_env_subcycles
*p32++ = (unsigned int)5; // ay_env_internal_tick
*p32++ = (unsigned int)12; // ay_env_tick
*p32++ = (unsigned int)3033035; // ay_tick_incr
*p32++ = (unsigned int)162; // ay_tone_period[0]
*p32++ = (unsigned int)460; // ay_tone_period[1]
*p32++ = (unsigned int)60; // ay_tone_period[2]
*p32++ = (unsigned int)5; // ay_noise_period
*p32++ = (unsigned int)15; // ay_env_period
*p32++ = (unsigned int)71674; // rng
*p32++ = (unsigned int)1; // noise_toggle
*p32++ = (unsigned int)0; // env_first
*p32++ = (unsigned int)0; // env_rev
*p32++ = (unsigned int)0; // env_counter
p8 = (uint8_t *)p32;
*p8++ = 0xA2; // sound_ay_registers[0]
*p8++ = 0x00; // sound_ay_registers[1]
*p8++ = 0xCC; // sound_ay_registers[2]
*p8++ = 0x01; // sound_ay_registers[3]
*p8++ = 0x3C; // sound_ay_registers[4]
*p8++ = 0x00; // sound_ay_registers[5]
*p8++ = 0x05; // sound_ay_registers[6]
*p8++ = 0xF8; // sound_ay_registers[7]
*p8++ = 0x0D; // sound_ay_registers[8]
*p8++ = 0x0E; // sound_ay_registers[9]
*p8++ = 0x04; // sound_ay_registers[10]
*p8++ = 0x0F; // sound_ay_registers[11]
*p8++ = 0x00; // sound_ay_registers[12]
*p8++ = 0x00; // sound_ay_registers[13]
*p8++ = 0x00; // sound_ay_registers[14]
*p8++ = 0x00; // sound_ay_registers[15]
p32 = (unsigned int *)p8;
changeCount = 13;
*p32++ = changeCount; // ay_change_count
pL = (unsigned long *)p32;
*pL++ = 102; // ay_change[0].tstates
pS = (uint16_t *)pL;
*pS++ = 2; // ay_change[0].ofs
p8 = (uint8_t *)pS;
*p8++ = 0; // ay_change[0].reg
*p8++ = 102; // ay_change[0].val
pL = (unsigned long *)p8;
*pL++ = 159; // ay_change[1].tstates
pS = (uint16_t *)pL;
*pS++ = 3; // ay_change[1].ofs
p8 = (uint8_t *)pS;
*p8++ = 1; // ay_change[1].reg
*p8++ = 0; // ay_change[1].val
pL = (unsigned long *)p8;
*pL++ = 216; // ay_change[2].tstates
pS = (uint16_t *)pL;
*pS++ = 4; // ay_change[2].ofs
p8 = (uint8_t *)pS;
*p8++ = 2; // ay_change[2].reg
*p8++ = 102; // ay_change[2].val
pL = (unsigned long *)p8;
*pL++ = 273; // ay_change[3].tstates
pS = (uint16_t *)pL;
*pS++ = 5; // ay_change[3].ofs
p8 = (uint8_t *)pS;
*p8++ = 3; // ay_change[3].reg
*p8++ = 2; // ay_change[3].val
pL = (unsigned long *)p8;
*pL++ = 330; // ay_change[4].tstates
pS = (uint16_t *)pL;
*pS++ = 7; // ay_change[4].ofs
p8 = (uint8_t *)pS;
*p8++ = 4; // ay_change[4].reg
*p8++ = 60; // ay_change[4].val
pL = (unsigned long *)p8;
*pL++ = 387; // ay_change[5].tstates
pS = (uint16_t *)pL;
*pS++ = 8; // ay_change[5].ofs
p8 = (uint8_t *)pS;
*p8++ = 5; // ay_change[5].reg
*p8++ = 0; // ay_change[5].val
pL = (unsigned long *)p8;
*pL++ = 444; // ay_change[6].tstates
pS = (uint16_t *)pL;
*pS++ = 9; // ay_change[6].ofs
p8 = (uint8_t *)pS;
*p8++ = 6; // ay_change[6].reg
*p8++ = 5; // ay_change[6].val
pL = (unsigned long *)p8;
*pL++ = 501; // ay_change[7].tstates
pS = (uint16_t *)pL;
*pS++ = 10; // ay_change[7].ofs
p8 = (uint8_t *)pS;
*p8++ = 7; // ay_change[7].reg
*p8++ = 248; // ay_change[7].val
pL = (unsigned long *)p8;
*pL++ = 563; // ay_change[8].tstates
pS = (uint16_t *)pL;
*pS++ = 12; // ay_change[8].ofs
p8 = (uint8_t *)pS;
*p8++ = 8; // ay_change[8].reg
*p8++ = 13; // ay_change[8].val
pL = (unsigned long *)p8;
*pL++ = 621; // ay_change[9].tstates
pS = (uint16_t *)pL;
*pS++ = 13; // ay_change[9].ofs
p8 = (uint8_t *)pS;
*p8++ = 9; // ay_change[9].reg
*p8++ = 14; // ay_change[9].val
pL = (unsigned long *)p8;
*pL++ = 679; // ay_change[10].tstates
pS = (uint16_t *)pL;
*pS++ = 14; // ay_change[10].ofs
p8 = (uint8_t *)pS;
*p8++ = 10; // ay_change[10].reg
*p8++ = 3; // ay_change[10].val
pL = (unsigned long *)p8;
*pL++ = 731; // ay_change[11].tstates
pS = (uint16_t *)pL;
*pS++ = 15; // ay_change[11].ofs
p8 = (uint8_t *)pS;
*p8++ = 11; // ay_change[11].reg
*p8++ = 15; // ay_change[11].val
pL = (unsigned long *)p8;
*pL++ = 788; // ay_change[12].tstates
pS = (uint16_t *)pL;
*pS++ = 17; // ay_change[12].ofs
p8 = (uint8_t *)pS;
*p8++ = 12; // ay_change[12].reg
*p8++ = 0; // ay_change[12].val
// --------------- SSI263
*p8++ = 0x00; // DurationPhoneme
*p8++ = 0x00; // Inflection
*p8++ = 0x00; // RateInflection
*p8++ = 0x00; // CtrlArtAmp
*p8++ = 0x00; // FilterFreq
*p8++ = 0x00; // CurrentMode
// ---------------
*p8++ = 0x0C; // nAYCurrentRegister
// ----------------------------------------------------------------- 01
// --------------- SY6522
*p8++ = 0x00; // ORA
*p8++ = 0x04; // ORB
*p8++ = 0xFF; // DDRA
*p8++ = 0x07; // DDRB
p16 = (uint16_t *)p8;
*p16++ = 0xDFDF; // TIMER1_COUNTER
*p16++ = 0x0000; // TIMER1_LATCH
*p16++ = 0xDFDF; // TIMER2_COUNTER
*p16++ = 0x0000; // TIMER2_LATCH
p8 = (uint8_t *)p16;
*p8++ = 0x00; // SERIAL_SHIFT
*p8++ = 0x00; // ACR
*p8++ = 0x00; // PCR
*p8++ = 0x00; // IFR
*p8++ = 0x00; // IER
// --------------- AY8910
p32 = (unsigned int *)p8;
*p32++ = (unsigned int)17; // ay_tone_tick[0]
*p32++ = (unsigned int)416; // ay_tone_tick[1]
*p32++ = (unsigned int)27; // ay_tone_tick[2]
*p32++ = (unsigned int)1; // ay_tone_high[0]
*p32++ = (unsigned int)0; // ay_tone_high[1]
*p32++ = (unsigned int)0; // ay_tone_high[2]
*p32++ = (unsigned int)0; // ay_noise_tick
*p32++ = (unsigned int)152756; // ay_tone_subcycles
*p32++ = (unsigned int)677044; // ay_env_subcycles
*p32++ = (unsigned int)10; // ay_env_internal_tick
*p32++ = (unsigned int)13; // ay_env_tick
*p32++ = (unsigned int)3033035; // ay_tick_incr
*p32++ = (unsigned int)121; // ay_tone_period[0]
*p32++ = (unsigned int)547; // ay_tone_period[1]
*p32++ = (unsigned int)60; // ay_tone_period[2]
*p32++ = (unsigned int)5; // ay_noise_period
*p32++ = (unsigned int)15; // ay_env_period
*p32++ = (unsigned int)55289; // rng
*p32++ = (unsigned int)0; // noise_toggle
*p32++ = (unsigned int)0; // env_first
*p32++ = (unsigned int)0; // env_rev
*p32++ = (unsigned int)0; // env_counter
p8 = (uint8_t *)p32;
*p8++ = 0x79; // sound_ay_registers[0]
*p8++ = 0x00; // sound_ay_registers[1]
*p8++ = 0x23; // sound_ay_registers[2]
*p8++ = 0x02; // sound_ay_registers[3]
*p8++ = 0x3C; // sound_ay_registers[4]
*p8++ = 0x00; // sound_ay_registers[5]
*p8++ = 0x05; // sound_ay_registers[6]
*p8++ = 0xF8; // sound_ay_registers[7]
*p8++ = 0x0D; // sound_ay_registers[8]
*p8++ = 0x0E; // sound_ay_registers[9]
*p8++ = 0x04; // sound_ay_registers[10]
*p8++ = 0x0F; // sound_ay_registers[11]
*p8++ = 0x00; // sound_ay_registers[12]
*p8++ = 0x00; // sound_ay_registers[13]
*p8++ = 0x00; // sound_ay_registers[14]
*p8++ = 0x00; // sound_ay_registers[15]
p32 = (unsigned int *)p8;
changeCount = 0;
*p32++ = changeCount; // ay_change_count
p8 = (uint8_t *)p32;
// --------------- SSI263
*p8++ = 0x00; // DurationPhoneme
*p8++ = 0x00; // Inflection
*p8++ = 0x00; // RateInflection
*p8++ = 0x00; // CtrlArtAmp
*p8++ = 0x00; // FilterFreq
*p8++ = 0x00; // CurrentMode
// ---------------
*p8++ = 0x0C; // nAYCurrentRegister
// ----------------------------------------------------------------- 02
// --------------- SY6522
*p8++ = 0x00; // ORA
*p8++ = 0x00; // ORB
*p8++ = 0x00; // DDRA
*p8++ = 0x00; // DDRB
p16 = (uint16_t *)p8;
*p16++ = 0xDFDF; // TIMER1_COUNTER
*p16++ = 0x0000; // TIMER1_LATCH
*p16++ = 0xDFDF; // TIMER2_COUNTER
*p16++ = 0x0000; // TIMER2_LATCH
p8 = (uint8_t *)p16;
*p8++ = 0x00; // SERIAL_SHIFT
*p8++ = 0x00; // ACR
*p8++ = 0x00; // PCR
*p8++ = 0x00; // IFR
*p8++ = 0x00; // IER
// --------------- AY8910
p32 = (unsigned int *)p8;
*p32++ = (unsigned int)0; // ay_tone_tick[0]
*p32++ = (unsigned int)0; // ay_tone_tick[1]
*p32++ = (unsigned int)0; // ay_tone_tick[2]
*p32++ = (unsigned int)1; // ay_tone_high[0]
*p32++ = (unsigned int)1; // ay_tone_high[1]
*p32++ = (unsigned int)1; // ay_tone_high[2]
*p32++ = (unsigned int)3529473; // ay_noise_tick
*p32++ = (unsigned int)234404; // ay_tone_subcycles
*p32++ = (unsigned int)758692; // ay_env_subcycles
*p32++ = (unsigned int)1; // ay_env_internal_tick
*p32++ = (unsigned int)3529473; // ay_env_tick
*p32++ = (unsigned int)3033035; // ay_tick_incr
*p32++ = (unsigned int)1; // ay_tone_period[0]
*p32++ = (unsigned int)1; // ay_tone_period[1]
*p32++ = (unsigned int)1; // ay_tone_period[2]
*p32++ = (unsigned int)0; // ay_noise_period
*p32++ = (unsigned int)0; // ay_env_period
*p32++ = (unsigned int)71376; // rng
*p32++ = (unsigned int)1; // noise_toggle
*p32++ = (unsigned int)0; // env_first
*p32++ = (unsigned int)0; // env_rev
*p32++ = (unsigned int)0; // env_counter
p8 = (uint8_t *)p32;
*p8++ = 0x00; // sound_ay_registers[0]
*p8++ = 0x00; // sound_ay_registers[1]
*p8++ = 0x00; // sound_ay_registers[2]
*p8++ = 0x00; // sound_ay_registers[3]
*p8++ = 0x00; // sound_ay_registers[4]
*p8++ = 0x00; // sound_ay_registers[5]
*p8++ = 0x00; // sound_ay_registers[6]
*p8++ = 0x00; // sound_ay_registers[7]
*p8++ = 0x00; // sound_ay_registers[8]
*p8++ = 0x00; // sound_ay_registers[9]
*p8++ = 0x00; // sound_ay_registers[10]
*p8++ = 0x00; // sound_ay_registers[11]
*p8++ = 0x00; // sound_ay_registers[12]
*p8++ = 0x00; // sound_ay_registers[13]
*p8++ = 0x00; // sound_ay_registers[14]
*p8++ = 0x00; // sound_ay_registers[15]
p32 = (unsigned int *)p8;
changeCount = 0;
*p32++ = changeCount; // ay_change_count
p8 = (uint8_t *)p32;
// --------------- SSI263
*p8++ = 0x00; // DurationPhoneme
*p8++ = 0x00; // Inflection
*p8++ = 0x00; // RateInflection
*p8++ = 0x00; // CtrlArtAmp
*p8++ = 0x00; // FilterFreq
*p8++ = 0x00; // CurrentMode
// ---------------
*p8++ = 0x00; // nAYCurrentRegister
// ----------------------------------------------------------------- 03
// --------------- SY6522
*p8++ = 0x00; // ORA
*p8++ = 0x00; // ORB
*p8++ = 0x00; // DDRA
*p8++ = 0x00; // DDRB
p16 = (uint16_t *)p8;
*p16++ = 0xDFDF; // TIMER1_COUNTER
*p16++ = 0x0000; // TIMER1_LATCH
*p16++ = 0xDFDF; // TIMER2_COUNTER
*p16++ = 0x0000; // TIMER2_LATCH
p8 = (uint8_t *)p16;
*p8++ = 0x00; // SERIAL_SHIFT
*p8++ = 0x00; // ACR
*p8++ = 0x00; // PCR
*p8++ = 0x00; // IFR
*p8++ = 0x00; // IER
// --------------- AY8910
p32 = (unsigned int *)p8;
*p32++ = (unsigned int)0; // ay_tone_tick[0]
*p32++ = (unsigned int)0; // ay_tone_tick[1]
*p32++ = (unsigned int)0; // ay_tone_tick[2]
*p32++ = (unsigned int)1; // ay_tone_high[0]
*p32++ = (unsigned int)1; // ay_tone_high[1]
*p32++ = (unsigned int)1; // ay_tone_high[2]
*p32++ = (unsigned int)3529473; // ay_noise_tick
*p32++ = (unsigned int)234404; // ay_tone_subcycles
*p32++ = (unsigned int)758692; // ay_env_subcycles
*p32++ = (unsigned int)1; // ay_env_internal_tick
*p32++ = (unsigned int)3529473; // ay_env_tick
*p32++ = (unsigned int)3033035; // ay_tick_incr
*p32++ = (unsigned int)1; // ay_tone_period[0]
*p32++ = (unsigned int)1; // ay_tone_period[1]
*p32++ = (unsigned int)1; // ay_tone_period[2]
*p32++ = (unsigned int)0; // ay_noise_period
*p32++ = (unsigned int)0; // ay_env_period
*p32++ = (unsigned int)71376; // rng
*p32++ = (unsigned int)1; // noise_toggle
*p32++ = (unsigned int)0; // env_first
*p32++ = (unsigned int)0; // env_rev
*p32++ = (unsigned int)0; // env_counter
p8 = (uint8_t *)p32;
*p8++ = 0x00; // sound_ay_registers[0]
*p8++ = 0x00; // sound_ay_registers[1]
*p8++ = 0x00; // sound_ay_registers[2]
*p8++ = 0x00; // sound_ay_registers[3]
*p8++ = 0x00; // sound_ay_registers[4]
*p8++ = 0x00; // sound_ay_registers[5]
*p8++ = 0x00; // sound_ay_registers[6]
*p8++ = 0x00; // sound_ay_registers[7]
*p8++ = 0x00; // sound_ay_registers[8]
*p8++ = 0x00; // sound_ay_registers[9]
*p8++ = 0x00; // sound_ay_registers[10]
*p8++ = 0x00; // sound_ay_registers[11]
*p8++ = 0x00; // sound_ay_registers[12]
*p8++ = 0x00; // sound_ay_registers[13]
*p8++ = 0x00; // sound_ay_registers[14]
*p8++ = 0x00; // sound_ay_registers[15]
p32 = (unsigned int *)p8;
changeCount = 0;
*p32++ = changeCount; // ay_change_count
p8 = (uint8_t *)p32;
// --------------- SSI263
*p8++ = 0x00; // DurationPhoneme
*p8++ = 0x00; // Inflection
*p8++ = 0x00; // RateInflection
*p8++ = 0x00; // CtrlArtAmp
*p8++ = 0x00; // FilterFreq
*p8++ = 0x00; // CurrentMode
// ---------------
*p8++ = 0x00; // nAYCurrentRegister
// --------------------------------------------------------------------
size_t exSiz = p8 - exData;
ASSERT(exSiz <= 1024);
mb_testAssertA2V2(exData, exSiz);
FREE(exData);
}
unlink(savData);
FREE(savData);
PASS();
}
// ----------------------------------------------------------------------------
@ -151,7 +824,7 @@ GREATEST_SUITE(test_suite_ui) {
pthread_mutex_lock(&interface_mutex);
test_thread_running = true;
GREATEST_SET_SETUP_CB(testui_setup, NULL);
GREATEST_SET_TEARDOWN_CB(testui_teardown, NULL);
GREATEST_SET_BREAKPOINT_CB(test_breakpoint, NULL);
@ -161,7 +834,9 @@ GREATEST_SUITE(test_suite_ui) {
RUN_TESTp(test_save_state_1);
RUN_TESTp(test_load_state_1);
RUN_TESTp(test_load_A2VM_1); // legacy A2VM ...
RUN_TESTp(test_load_A2VM_good1);
RUN_TESTp(test_load_A2V2_good1);
#if INTERFACE_TOUCH
# warning TODO : touch joystick(s), keyboard, mouse, menu