diff options
| -rw-r--r-- | README | 16 | ||||
| -rw-r--r-- | built/prog-z80-1.1.bin | bin | 0 -> 4608 bytes | |||
| -rw-r--r-- | built/prog-z80.bin | bin | 4608 -> 4864 bytes | |||
| -rw-r--r-- | c/echo.c | 47 | ||||
| -rw-r--r-- | c/echo.h | 11 | ||||
| -rw-r--r-- | c/echoblob.h | 490 | ||||
| -rw-r--r-- | doc/api-asm.68k | 33 | ||||
| -rw-r--r-- | doc/api-c.txt | 35 | ||||
| -rw-r--r-- | src-68k/echo.68k | 53 | ||||
| -rw-r--r-- | src-z80/core/main.z80 | 4 | ||||
| -rw-r--r-- | src-z80/player/pcm.z80 | 27 | ||||
| -rw-r--r-- | tester/core/entry.68k | 2 |
12 files changed, 462 insertions, 256 deletions
@@ -7,12 +7,12 @@ | | |_ |_ ___ | | | | | | | | | |_______ |_ |___| _| | | | | |_ |_____| _| |___________| |________| |___| |___| |_________| - ___ ___ _ _ ___ __ ___ ___ ___ _ ___ ___ _ _ - | _| | | | | \ | _| | _| | | _| | | | | - | |_| | | | | | | | | | |_| | | |_| | | | |_ _ _ ___ ___ | | | | - |_ | | | | | | | | | | _| | | | | | | | _| | | | __| _ \ | | | | - _| | | | | | | | | | | |_| | | | | | | | |_ | | | __| /_ | |_| | - |___|___|___|_|_|__/ |___|_|_|___|_|_|_|___| \_/|___|_|_\_| |_|_|_| + ___ ___ _ _ ___ __ ___ ___ ___ _ ___ ___ _ ___ + | _| | | | | \ | _| | _| | | _| | | |_ | + | |_| | | | | | | | | | |_| | | |_| | | | |_ _ _ ___ ___ | | _| | + |_ | | | | | | | | | | _| | | | | | | | _| | | | __| _ \ | | | _| + _| | | | | | | | | | | |_| | | | | | | | |_ | | | __| /_ | |_| |_ + |___|___|___|_|_|__/ |___|_|_|___|_|_|_|___| \_/|___|_|_\_| |_|_|___| ============================================================================= @@ -95,4 +95,8 @@ THANKS FOR TESTING: * Flygon (sorry for your headphones :P) * djcouchycouch (for using an API I didn't even check if it worked) +OTHER THANKS: + + * Titan (yay demoscene!) + ============================================================================= diff --git a/built/prog-z80-1.1.bin b/built/prog-z80-1.1.bin Binary files differnew file mode 100644 index 0000000..309036c --- /dev/null +++ b/built/prog-z80-1.1.bin diff --git a/built/prog-z80.bin b/built/prog-z80.bin Binary files differindex 309036c..2265d9f 100644 --- a/built/prog-z80.bin +++ b/built/prog-z80.bin @@ -97,14 +97,14 @@ void echo_send_command(uint8_t cmd) { } //*************************************************************************** -// echo_send_command_ex +// echo_send_command_addr // Sends a raw command to Echo. An address parameter is taken. //--------------------------------------------------------------------------- // param cmd: command to send // param addr: address parameter //*************************************************************************** -void echo_send_command_ex(uint8_t cmd, const void *addr) { +void echo_send_command_addr(uint8_t cmd, const void *addr) { // Since we need to split the address into multiple bytes we put it in an // integer. This is a bad practice in general, period, but since we don't // care about portability here we can afford to do it this time. @@ -135,6 +135,34 @@ void echo_send_command_ex(uint8_t cmd, const void *addr) { } //*************************************************************************** +// echo_send_command_byte +// Sends a raw command to Echo. A byte parameter is taken. +//--------------------------------------------------------------------------- +// param cmd: command to send +// param byte: parameter +//*************************************************************************** + +void echo_send_command_byte(uint8_t cmd, uint8_t byte) { + // We need access to Z80 bus + Z80_REQUEST(); + + // Is Echo busy yet? + while (z80_ram[0x1FFF] != 0x00) { + Z80_RELEASE(); + int16_t i; + for (i = 0x3FF; i >= 0; i--); + Z80_REQUEST(); + } + + // Write the command + z80_ram[0x1FFF] = cmd; + z80_ram[0x1FFC] = byte; + + // Done with the Z80 + Z80_RELEASE(); +} + +//*************************************************************************** // echo_play_bgm // Starts playing background music. //--------------------------------------------------------------------------- @@ -142,7 +170,7 @@ void echo_send_command_ex(uint8_t cmd, const void *addr) { //*************************************************************************** void echo_play_bgm(const void *ptr) { - echo_send_command_ex(ECHO_CMD_PLAYBGM, ptr); + echo_send_command_addr(ECHO_CMD_PLAYBGM, ptr); } //*************************************************************************** @@ -171,7 +199,7 @@ void echo_resume_bgm(void) { //*************************************************************************** void echo_play_sfx(const void *ptr) { - echo_send_command_ex(ECHO_CMD_PLAYSFX, ptr); + echo_send_command_addr(ECHO_CMD_PLAYSFX, ptr); } //*************************************************************************** @@ -184,6 +212,17 @@ void echo_stop_sfx(void) { } //*************************************************************************** +// echo_set_pcm_rate +// Changes the playback rate of PCM. +//--------------------------------------------------------------------------- +// param rate: new rate (timer A value) +//*************************************************************************** + +void echo_set_pcm_rate(uint8_t rate) { + echo_send_command_byte(ECHO_CMD_SETPCMRATE, rate); +} + +//*************************************************************************** // echo_get_status // Retrieves Echo's current status. //--------------------------------------------------------------------------- @@ -12,7 +12,8 @@ enum { ECHO_CMD_STOPSFX, /* 0x03 - Stop SFX playback */ ECHO_CMD_PLAYBGM, /* 0x04 - Play a BGM */ ECHO_CMD_STOPBGM, /* 0x05 - Stop BGM playback */ - ECHO_CMD_RESUMEBGM /* 0x06 - Resume BGM playback */ + ECHO_CMD_RESUMEBGM, /* 0x06 - Resume BGM playback */ + ECHO_CMD_SETPCMRATE, /* 0x07 - Set PCM rate */ }; /* Echo status flags */ @@ -27,8 +28,14 @@ void echo_stop_bgm(void); void echo_resume_bgm(void); void echo_play_sfx(const void *); void echo_stop_sfx(void); +void echo_set_pcm_rate(uint8_t); uint16_t echo_get_status(void); void echo_send_command(uint8_t); -void echo_send_command_ex(uint8_t, const void *); +void echo_send_command_addr(uint8_t, const void *); +void echo_send_command_byte(uint8_t, uint8_t); + +/* Deprecated functions */ +static void (* const echo_send_command_ex)(uint8_t, const void *) = + echo_send_command_addr; #endif diff --git a/c/echoblob.h b/c/echoblob.h index 0ac0d1b..e4bae7d 100644 --- a/c/echoblob.h +++ b/c/echoblob.h @@ -1,251 +1,267 @@ static uint8_t echo_blob[] = { 49,240, 31,175, 50,240, 31, 33, 17,127, 54,159, 54,191, 54,223, - 54,255,175, 50, 0, 17, 50, 16, 17, 50, 32, 17, 50, 48, 17, 33, + 54,255,175, 50, 0, 18, 50, 16, 18, 50, 32, 18, 50, 48, 18, 33, 0, 96,117,117,117,117,117,117,117,117,117,221, 33, 0, 64,253, - 38, 64,217, 1, 0, 0, 17, 0, 0, 33, 0, 96,217,221, 54, 0, - 43,221, 54, 1, 0, 30,127, 62, 64, 6, 4,221,119, 0,221,115, - 1,221,119, 2,221,115, 3, 60,221,119, 0,221,115, 1,221,119, - 2,221,115, 3, 60,221,119, 0,221,115, 1,221,119, 2,221,115, - 3, 60, 60, 16,214,221, 54, 0,180,221, 54, 1,192,221, 54, 0, - 181,221, 54, 1,192,221, 54, 0,182,221, 54, 1,192,221, 54, 2, - 180,221, 54, 3,192,221, 54, 2,181,221, 54, 3,192,221, 54, 2, - 182,221, 54, 3,192,221, 54, 0, 36,221, 54, 1,254,221, 54, 0, - 37,221, 54, 1, 3,221, 54, 0, 38,221, 54, 1,201,221, 54, 0, - 39,221, 54, 1, 63,195,242, 0, 61,202, 70, 1, 61,202,174, 4, - 61,202,211, 5, 61,202, 96, 2, 61,202,224, 3, 61,202,177, 2, - 58, 0, 64, 15,220,220, 1,175, 50,255, 31, 58, 0, 64, 15,220, - 220, 1, 58,255, 31,183, 32,208, 58, 0, 64, 15,220,220, 1, 58, - 0, 64,203, 79, 32, 8,203, 71,196,220, 1,195,242, 0,221,126, - 0,203, 71,196,220, 1,221, 54, 0, 39,221, 54, 1, 47, 58, 0, - 64, 15,220,220, 1,195, 40, 1, 58, 0, 64, 15,220,220, 1,195, - 50, 1, 58, 0, 64, 15,220,220, 1,195,155, 11, 58, 0, 64, 15, - 220,220, 1,195,242, 0, 33,252, 31, 78, 44, 94, 44, 86,235,175, - 50,255, 31, 17, 0, 28,205,116, 1,120,183,202,113, 1, 18, 20, - 205,116, 1,120, 18, 20,205,116, 1,120, 18, 21, 21, 28,195, 86, - 1,195,242, 0, 58,140, 17,185,202,145, 1,121, 50,140, 17,217, - 119, 15,119, 15,119, 15,119, 15,119, 15,119, 15,119,117, 15,119, - 217, 70, 44,194,157, 1, 36,194,157, 1, 38,128, 12,201,205,184, - 1,195, 39, 5, 58, 0, 64, 15,220,220, 1, 58,134, 17,183,194, - 197, 3,205,184, 1,195, 14, 3,205,116, 1,120,217, 6, 1, 38, - 28,111, 86, 36, 94, 36, 78, 33, 0, 96,217,221, 54, 0, 43,221, - 54, 1,128,221, 54, 0, 42,221, 54, 1,128,201,221, 54, 0, 39, - 221, 54, 1, 31,217,120,183, 40, 47, 58,140, 17,185,202, 4, 2, - 121, 50,140, 17,119, 15,119, 15,119, 15,119, 15,119, 15,119, 15, - 119,117, 15,119, 26, 60, 40, 18,221, 54, 0, 42,221,119, 1, 28, - 32, 6, 20, 32, 3, 22,128, 12,217,201, 6, 0,221, 54, 0, 42, - 221, 54, 1,128,221, 54, 0, 43,221, 54, 1, 0,217,201,205, 72, - 2,195, 39, 5, 58, 0, 64, 15,220,220, 1, 58,134, 17,183,194, - 14, 3,205, 72, 2,195, 14, 3,217, 6, 0,217,221, 54, 0, 43, - 221, 54, 1, 0,201, 62, 1, 50,134, 17,205, 72, 2,195, 39, 5, - 58, 0, 64, 15,220,220, 1,205, 14, 4, 58, 0, 64, 15,220,220, - 1, 58,240, 31,246, 2, 50,240, 31, 58, 0, 64, 15,220,220, 1, - 33,252, 31, 78, 44, 94, 44, 86, 58, 0, 64, 15,220,220, 1,175, - 50,255, 31, 33,141, 17, 54, 1, 44, 54, 1, 44,113, 44,115, 44, - 114, 58, 0, 64, 15,220,220, 1, 33,237, 2, 34, 48, 1,195,242, - 0,175, 50,255, 31, 6, 8, 17,135, 17, 58, 0, 64, 15,220,220, - 1, 26,183,194,210, 2, 58, 0, 64, 15,220,220, 1, 5,205,100, - 11, 4, 29, 5,194,186, 2, 58,240, 31,246, 2, 50,240, 31, 33, - 141, 17, 54, 1, 33,237, 2, 34, 48, 1,195,242, 0, 58, 0, 64, - 15,220,220, 1, 33,142, 17,126, 61,202, 0, 3,119,195, 50, 1, - 58, 0, 64, 15,220,220, 1, 44, 78, 44, 94, 44, 86,235, 58, 0, - 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1,120, - 254, 8,218,145, 6,254, 11,218, 87, 12,202,219, 12,254, 12,202, - 164, 1, 58, 0, 64, 15,220,220, 1,120,254, 24,218, 50, 7,254, - 28,218, 55, 13,202, 52, 2, 58, 0, 64, 15,220,220, 1,120,254, - 254,202, 61, 15,254,255,202,218, 3,254,252,202,132, 4,254,253, - 202,153, 4, 58, 0, 64, 15,220,220, 1,120,254, 40,218, 25, 9, - 254, 44,218,148, 13, 58, 0, 64, 15,220,220, 1,120,254, 56,218, - 96, 7,254, 59,218,168, 14,202, 2, 15, 58, 0, 64, 15,220,220, - 1,120,254, 72,218,223, 7,254, 76,218, 43, 14, 58, 0, 64, 15, - 220,220, 1,120,254,248,218,108, 10, 58, 0, 64, 15,220,220, 1, - 195,218, 3, 58, 0, 64, 15,220,220, 1, 44,194,197, 3, 36,194, - 197, 3, 38,128, 12, 58, 0, 64, 15,220,220, 1, 44,194,215, 3, - 36,194,215, 3, 38,128, 12,195, 14, 3,205,234, 3,195, 50, 1, - 175, 50,255, 31,205,234, 3,195,242, 0, 58,240, 31,230,253, 50, - 240, 31, 58, 0, 64, 15,220,220, 1,205, 14, 4, 58, 0, 64, 15, - 220,220, 1,175, 50,141, 17, 33, 50, 1, 34, 48, 1,201, 58,134, - 17,183,204, 72, 2, 6, 4, 17, 63, 17, 33,139, 17, 58, 0, 64, - 15,220,220, 1, 54, 0,123,214, 15, 95,126,183, 32, 2,175, 18, - 58, 0, 64, 15,220,220, 1, 29, 45, 16,226, 6, 8, 17, 79, 17, - 58, 0, 64, 15,220,220, 1, 62,127, 18, 29, 58, 0, 64, 15,220, - 220, 1,126,183,194,117, 4, 5,120,205,243, 10, 58, 0, 64, 15, - 220,220, 1,120,230, 4,253,111,120,230, 3,198,180,253,119, 0, - 253, 54, 1,192, 4, 45, 16,200, 33, 80, 17, 62,192, 6, 8,119, - 44, 16,252,201, 58, 0, 64, 15,220,220, 1,235, 44, 78, 44, 94, - 44, 86, 45, 45, 45,235,195, 14, 3, 58, 0, 64, 15,220,220, 1, - 235, 44,113, 44,115, 44,114, 45, 45, 45,235,195, 14, 3, 58, 0, - 64, 15,220,220, 1,205, 15, 6, 58, 0, 64, 15,220,220, 1, 58, - 240, 31,246, 1, 50,240, 31, 58, 0, 64, 15,220,220, 1, 33,252, - 31, 78, 44, 94, 44, 86, 58, 0, 64, 15,220,220, 1,175, 50,255, - 31, 33,149, 17, 54, 1, 44, 54, 1, 44,113, 44,115, 44,114, 58, - 0, 64, 15,220,220, 1, 33, 6, 5, 34, 38, 1, 58, 0, 64, 15, - 220,220, 1,195,242, 0, 58, 0, 64, 15,220,220, 1, 33,150, 17, - 126, 61,202, 25, 5,119,195, 40, 1, 58, 0, 64, 15,220,220, 1, - 44, 78, 44, 94, 44, 86,235, 58, 0, 64, 15,220,220, 1,205,116, - 1, 58, 0, 64, 15,220,220, 1,120,254, 8,218,139, 6,254, 11, - 218, 81, 12,202,213, 12,254, 12,202,158, 1, 58, 0, 64, 15,220, - 220, 1,120,254, 24,218, 44, 7,254, 28,218, 49, 13,202, 46, 2, - 58, 0, 64, 15,220,220, 1,120,254,254,202, 55, 15,254,255,202, - 205, 5, 58, 0, 64, 15,220,220, 1,120,254, 40,218, 19, 9,254, - 44,218,110, 13, 58, 0, 64, 15,220,220, 1,120,254, 56,218, 90, - 7,254, 59,218,162, 14,202,252, 14, 58, 0, 64, 15,220,220, 1, - 120,254, 72,218,217, 7,254, 76,218,229, 13, 58, 0, 64, 15,220, - 220, 1,120,254,232,218,193, 10,254,236,218, 15, 15,202, 85, 2, - 58, 0, 64, 15,220,220, 1,120,254,248,218, 61, 10,205,221, 5, - 195, 40, 1,175, 50,255, 31,205,221, 5,195,242, 0, 58, 0, 64, - 15,220,220, 1, 58,240, 31,230,254, 50,240, 31, 58, 0, 64, 15, - 220,220, 1,175, 50,149, 17, 33, 40, 1, 34, 38, 1, 58, 0, 64, - 15,220,220, 1,205, 15, 6, 58, 0, 64, 15,220,220, 1,201, 58, - 134, 17,183,196, 72, 2, 6, 4, 17,139, 17, 58, 0, 64, 15,220, - 220, 1, 26,183, 40, 64,175, 18, 58, 0, 64, 15,220,220, 1,120, - 15, 15, 15, 15, 61, 38, 17,111, 78,214, 15,111,113, 58, 0, 64, - 15,220,220, 1,213,125,198, 8,111,198, 4, 95, 84, 58, 0, 64, - 15,220,220, 1, 26,119, 44, 28, 26,119, 44, 28, 26,119,209, 58, - 0, 64, 15,220,220, 1, 29, 16,178, 6, 8, 58, 0, 64, 15,220, - 220, 1, 26,183,202,133, 6,175, 18, 58, 0, 64, 15,220,220, 1, - 5,205,100, 11, 4, 29, 5,194,107, 6,201,205,175, 6,195, 39, - 5, 71, 58, 0, 64, 15,220,220, 1,229,120,230, 7, 33,128, 17, - 133,111,126,225,183,194,197, 3,120,205,175, 6,195, 14, 3,230, - 7,221, 54, 0, 40,221,119, 1, 71, 8, 58, 0, 64, 15,220,220, - 1,120,230, 4, 15,253,111, 58, 0, 64, 15,220,220, 1,205,116, - 1, 58, 0, 64, 15,220,220, 1, 8,213,229, 87,230, 3,198,164, - 95, 58, 0, 64, 15,220,220, 1, 38, 16,120,230, 31,198,144,111, - 58, 0, 64, 15,220,220, 1,120,230,224, 15, 15, 71,126,176,253, - 115, 0,253,119, 1, 58, 0, 64, 15,220,220, 1,123,214, 4, 95, - 45,126,253,115, 0,253,119, 1, 58, 0, 64, 15,220,220, 1,122, - 246,240,221, 54, 0, 40,221,119, 1,225,209,201,205, 80, 7,195, - 39, 5, 71, 58, 0, 64, 15,220,220, 1,120,229,230, 7, 33,128, - 17,133,111,126,225,183,194, 14, 3,120,205, 80, 7,195, 14, 3, - 230, 7,221, 54, 0, 40,221,119, 1,201,205,126, 7,195, 39, 5, - 71, 58, 0, 64, 15,220,220, 1,120,229,230, 7, 33,128, 17,133, - 111,126,225,183,194,179, 3,120,205,126, 7,195, 14, 3,245, 71, - 58, 0, 64, 15,220,220, 1,120,230, 4, 15,253,111, 58, 0, 64, - 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1,241,213, - 230, 7, 87,230, 3,198,164, 95, 58, 0, 64, 15,220,220, 1,253, - 115, 0,253,112, 1, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, - 0, 64, 15,220,220, 1,123,214, 4, 95,253,115, 0,253,112, 1, - 58, 0, 64, 15,220,220, 1,209,201,205, 65, 8,195, 39, 5,230, - 7, 71, 58, 0, 64, 15,220,220, 1,213,197,120, 17, 64, 17,131, - 95, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220, - 220, 1,120, 18,123,198, 8, 95,175, 18, 89,193, 75,209, 58, 0, - 64, 15,220,220, 1,229,120, 38, 17,198,128,111,126,225,183,194, - 14, 3, 58, 0, 64, 15,220,220, 1,120,229, 33, 64, 17,133,111, - 70,225, 8, 58, 0, 64, 15,220,220, 1, 8,205, 86, 8,195, 14, - 3,230, 7, 8, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, 0, - 64, 15,220,220, 1, 8,245,230, 4, 15,253,111, 58, 0, 64, 15, - 220,220, 1,241,197,213,229, 38, 28,104, 86, 36, 94, 36, 78,235, - 245, 58, 0, 64, 15,220,220, 1, 6, 7, 17,154, 17,120, 8,205, - 116, 1,235,112,235, 28,205,116, 1,235,112,235, 28,205,116, 1, - 235,112,235, 28,205,116, 1,235,112,235, 28, 8, 71, 16,222,205, - 116, 1,235,112,235, 58, 0, 64, 15,220,220, 1,241, 71,205,243, - 10,120, 17, 88, 17,230, 7,131, 95,245,230, 3,198,176, 33,154, - 17, 8, 58, 0, 64, 15,220,220, 1, 8,253,119, 0, 70, 44,253, - 112, 1, 8,120, 18,123,198, 8, 95, 58, 0, 64, 15,220,220, 1, + 38, 64,217, 6, 0,217,221, 54, 0, 43,221, 54, 1, 0, 30,127, + 62, 64, 6, 4,221,119, 0,221,115, 1,221,119, 2,221,115, 3, + 60,221,119, 0,221,115, 1,221,119, 2,221,115, 3, 60,221,119, + 0,221,115, 1,221,119, 2,221,115, 3, 60, 60, 16,214,221, 54, + 0,180,221, 54, 1,192,221, 54, 0,181,221, 54, 1,192,221, 54, + 0,182,221, 54, 1,192,221, 54, 2,180,221, 54, 3,192,221, 54, + 2,181,221, 54, 3,192,221, 54, 2,182,221, 54, 3,192,221, 54, + 0, 36,221, 54, 1,254,221, 54, 0, 37,221, 54, 1, 3,221, 54, + 0, 38,221, 54, 1,201,221, 54, 0, 39,221, 54, 1, 63,195,239, + 0, 61,202, 67, 1, 61,202, 78, 5, 61,202,115, 6, 61,202, 0, + 3, 61,202,128, 4, 61,202, 81, 3, 61,202,222, 2, 58, 0, 64, + 15,220, 11, 2,175, 50,255, 31, 58, 0, 64, 15,220, 11, 2, 58, + 255, 31,183, 32,204, 58, 0, 64, 15,220, 11, 2, 58, 0, 64,203, + 79, 32, 8,203, 71,196, 11, 2,195,239, 0,221,126, 0,203, 71, + 196, 11, 2,221, 54, 0, 39,221, 54, 1, 47, 58, 0, 64, 15,220, + 11, 2,195, 37, 1, 58, 0, 64, 15,220, 11, 2,195, 47, 1, 58, + 0, 64, 15,220, 11, 2,195, 59, 12, 58, 0, 64, 15,220, 11, 2, + 195,239, 0, 33,252, 31, 78, 44, 94, 44, 86,235,175, 50,255, 31, + 17, 0, 28,205,113, 1,120,183,202,110, 1, 18, 20,205,113, 1, + 120, 18, 20,205,113, 1,120, 18, 21, 21, 28,195, 83, 1,195,239, + 0, 58,140, 18,185,202,145, 1,121, 50,140, 18,229, 33, 0, 96, + 119, 15,119, 15,119, 15,119, 15,119, 15,119, 15,119,116, 15,119, + 225, 70, 44,194,157, 1, 36,194,157, 1, 38,128, 12,201,205,184, + 1,195,199, 5, 58, 0, 64, 15,220, 11, 2, 58,134, 18,183,194, + 101, 4,205,184, 1,195,174, 3,205,113, 1,120,217, 38, 28,111, + 86, 36, 94, 36, 78, 33, 0, 96,121, 50,140, 18,119, 15,119, 15, + 119, 15,119, 15,119, 15,119, 15,119,116, 15,119, 38, 18,123,246, + 240,111, 69, 26,119, 28, 44,194,227, 1,104,123,183,194,247, 1, + 20,194,247, 1, 22,128, 12, 6, 1,217,221, 54, 0, 43,221, 54, + 1,128,221, 54, 0, 42,221, 54, 1,128,201,217,120,183, 40, 22, + 221, 54, 0, 39,221, 54, 1, 31,126, 60, 40, 12,221, 54, 0, 42, + 221,119, 1, 44, 40, 22,217,201, 6, 0,221, 54, 0, 42,221, 54, + 1,128,221, 54, 0, 43,221, 54, 1, 0,217,201, 58,140, 18,185, + 202, 90, 2,121, 50,140, 18, 33, 0, 96,119, 15,119, 15,119, 15, + 119, 15,119, 15,119, 15,119,116, 15,119, 33,240, 18, 26,119, 44, + 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, + 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, + 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, + 28, 26,119, 44, 28, 26,119, 44, 28, 26,119, 44, 28,194,167, 2, + 20,194,167, 2, 22,128, 12, 46,240,195, 16, 2,205,198, 2,195, + 199, 5, 58, 0, 64, 15,220, 11, 2, 58,134, 18,183,194,174, 3, + 205,198, 2,195,174, 3,217, 6, 0,217,221, 54, 0, 43,221, 54, + 1, 0,201, 62, 1, 50,134, 18,205,198, 2,195,199, 5, 58,252, + 31, 47, 71,175, 50,255, 31,120,221, 54, 0, 36, 15, 15,246,192, + 221,119, 1,120,221, 54, 0, 37,230, 3,221,119, 1,195,239, 0, + 58, 0, 64, 15,220, 11, 2,205,174, 4, 58, 0, 64, 15,220, 11, + 2, 58,240, 31,246, 2, 50,240, 31, 58, 0, 64, 15,220, 11, 2, + 33,252, 31, 78, 44, 94, 44, 86, 58, 0, 64, 15,220, 11, 2,175, + 50,255, 31, 33,141, 18, 54, 1, 44, 54, 1, 44,113, 44,115, 44, + 114, 58, 0, 64, 15,220, 11, 2, 33,141, 3, 34, 45, 1,195,239, + 0,175, 50,255, 31, 6, 8, 17,135, 18, 58, 0, 64, 15,220, 11, + 2, 26,183,194,114, 3, 58, 0, 64, 15,220, 11, 2, 5,205, 4, + 12, 4, 29, 5,194, 90, 3, 58,240, 31,246, 2, 50,240, 31, 33, + 141, 18, 54, 1, 33,141, 3, 34, 45, 1,195,239, 0, 58, 0, 64, + 15,220, 11, 2, 33,142, 18,126, 61,202,160, 3,119,195, 47, 1, + 58, 0, 64, 15,220, 11, 2, 44, 78, 44, 94, 44, 86,235, 58, 0, + 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2,120, + 254, 8,218, 49, 7,254, 11,218,247, 12,202,123, 13,254, 12,202, + 164, 1, 58, 0, 64, 15,220, 11, 2,120,254, 24,218,210, 7,254, + 28,218,215, 13,202,178, 2, 58, 0, 64, 15,220, 11, 2,120,254, + 254,202,221, 15,254,255,202,122, 4,254,252,202, 36, 5,254,253, + 202, 57, 5, 58, 0, 64, 15,220, 11, 2,120,254, 40,218,185, 9, + 254, 44,218, 52, 14, 58, 0, 64, 15,220, 11, 2,120,254, 56,218, + 0, 8,254, 59,218, 72, 15,202,162, 15, 58, 0, 64, 15,220, 11, + 2,120,254, 72,218,127, 8,254, 76,218,203, 14, 58, 0, 64, 15, + 220, 11, 2,120,254,248,218, 12, 11, 58, 0, 64, 15,220, 11, 2, + 195,122, 4, 58, 0, 64, 15,220, 11, 2, 44,194,101, 4, 36,194, + 101, 4, 38,128, 12, 58, 0, 64, 15,220, 11, 2, 44,194,119, 4, + 36,194,119, 4, 38,128, 12,195,174, 3,205,138, 4,195, 47, 1, + 175, 50,255, 31,205,138, 4,195,239, 0, 58,240, 31,230,253, 50, + 240, 31, 58, 0, 64, 15,220, 11, 2,205,174, 4, 58, 0, 64, 15, + 220, 11, 2,175, 50,141, 18, 33, 47, 1, 34, 45, 1,201, 58,134, + 18,183,204,198, 2, 6, 4, 17, 63, 18, 33,139, 18, 58, 0, 64, + 15,220, 11, 2, 54, 0,123,214, 15, 95,126,183, 32, 2,175, 18, + 58, 0, 64, 15,220, 11, 2, 29, 45, 16,226, 6, 8, 17, 79, 18, + 58, 0, 64, 15,220, 11, 2, 62,127, 18, 29, 58, 0, 64, 15,220, + 11, 2,126,183,194, 21, 5, 5,120,205,147, 11, 58, 0, 64, 15, + 220, 11, 2,120,230, 4,253,111,120,230, 3,198,180,253,119, 0, + 253, 54, 1,192, 4, 45, 16,200, 33, 80, 18, 62,192, 6, 8,119, + 44, 16,252,201, 58, 0, 64, 15,220, 11, 2,235, 44, 78, 44, 94, + 44, 86, 45, 45, 45,235,195,174, 3, 58, 0, 64, 15,220, 11, 2, + 235, 44,113, 44,115, 44,114, 45, 45, 45,235,195,174, 3, 58, 0, + 64, 15,220, 11, 2,205,175, 6, 58, 0, 64, 15,220, 11, 2, 58, + 240, 31,246, 1, 50,240, 31, 58, 0, 64, 15,220, 11, 2, 33,252, + 31, 78, 44, 94, 44, 86, 58, 0, 64, 15,220, 11, 2,175, 50,255, + 31, 33,149, 18, 54, 1, 44, 54, 1, 44,113, 44,115, 44,114, 58, + 0, 64, 15,220, 11, 2, 33,166, 5, 34, 35, 1, 58, 0, 64, 15, + 220, 11, 2,195,239, 0, 58, 0, 64, 15,220, 11, 2, 33,150, 18, + 126, 61,202,185, 5,119,195, 37, 1, 58, 0, 64, 15,220, 11, 2, + 44, 78, 44, 94, 44, 86,235, 58, 0, 64, 15,220, 11, 2,205,113, + 1, 58, 0, 64, 15,220, 11, 2,120,254, 8,218, 43, 7,254, 11, + 218,241, 12,202,117, 13,254, 12,202,158, 1, 58, 0, 64, 15,220, + 11, 2,120,254, 24,218,204, 7,254, 28,218,209, 13,202,172, 2, + 58, 0, 64, 15,220, 11, 2,120,254,254,202,215, 15,254,255,202, + 109, 6, 58, 0, 64, 15,220, 11, 2,120,254, 40,218,179, 9,254, + 44,218, 14, 14, 58, 0, 64, 15,220, 11, 2,120,254, 56,218,250, + 7,254, 59,218, 66, 15,202,156, 15, 58, 0, 64, 15,220, 11, 2, + 120,254, 72,218,121, 8,254, 76,218,133, 14, 58, 0, 64, 15,220, + 11, 2,120,254,232,218, 97, 11,254,236,218,175, 15,202,211, 2, + 58, 0, 64, 15,220, 11, 2,120,254,248,218,221, 10,205,125, 6, + 195, 37, 1,175, 50,255, 31,205,125, 6,195,239, 0, 58, 0, 64, + 15,220, 11, 2, 58,240, 31,230,254, 50,240, 31, 58, 0, 64, 15, + 220, 11, 2,175, 50,149, 18, 33, 37, 1, 34, 35, 1, 58, 0, 64, + 15,220, 11, 2,205,175, 6, 58, 0, 64, 15,220, 11, 2,201, 58, + 134, 18,183,196,198, 2, 6, 4, 17,139, 18, 58, 0, 64, 15,220, + 11, 2, 26,183, 40, 64,175, 18, 58, 0, 64, 15,220, 11, 2,120, + 15, 15, 15, 15, 61, 38, 18,111, 78,214, 15,111,113, 58, 0, 64, + 15,220, 11, 2,213,125,198, 8,111,198, 4, 95, 84, 58, 0, 64, + 15,220, 11, 2, 26,119, 44, 28, 26,119, 44, 28, 26,119,209, 58, + 0, 64, 15,220, 11, 2, 29, 16,178, 6, 8, 58, 0, 64, 15,220, + 11, 2, 26,183,202, 37, 7,175, 18, 58, 0, 64, 15,220, 11, 2, + 5,205, 4, 12, 4, 29, 5,194, 11, 7,201,205, 79, 7,195,199, + 5, 71, 58, 0, 64, 15,220, 11, 2,229,120,230, 7, 33,128, 18, + 133,111,126,225,183,194,101, 4,120,205, 79, 7,195,174, 3,230, + 7,221, 54, 0, 40,221,119, 1, 71, 8, 58, 0, 64, 15,220, 11, + 2,120,230, 4, 15,253,111, 58, 0, 64, 15,220, 11, 2,205,113, + 1, 58, 0, 64, 15,220, 11, 2, 8,213,229, 87,230, 3,198,164, + 95, 58, 0, 64, 15,220, 11, 2, 38, 17,120,230, 31,198,144,111, + 58, 0, 64, 15,220, 11, 2,120,230,224, 15, 15, 71,126,176,253, + 115, 0,253,119, 1, 58, 0, 64, 15,220, 11, 2,123,214, 4, 95, + 45,126,253,115, 0,253,119, 1, 58, 0, 64, 15,220, 11, 2,122, + 246,240,221, 54, 0, 40,221,119, 1,225,209,201,205,240, 7,195, + 199, 5, 71, 58, 0, 64, 15,220, 11, 2,120,229,230, 7, 33,128, + 18,133,111,126,225,183,194,174, 3,120,205,240, 7,195,174, 3, + 230, 7,221, 54, 0, 40,221,119, 1,201,205, 30, 8,195,199, 5, + 71, 58, 0, 64, 15,220, 11, 2,120,229,230, 7, 33,128, 18,133, + 111,126,225,183,194, 83, 4,120,205, 30, 8,195,174, 3,245, 71, + 58, 0, 64, 15,220, 11, 2,120,230, 4, 15,253,111, 58, 0, 64, + 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2,241,213, + 230, 7, 87,230, 3,198,164, 95, 58, 0, 64, 15,220, 11, 2,253, + 115, 0,253,112, 1, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, + 0, 64, 15,220, 11, 2,123,214, 4, 95,253,115, 0,253,112, 1, + 58, 0, 64, 15,220, 11, 2,209,201,205,225, 8,195,199, 5,230, + 7, 71, 58, 0, 64, 15,220, 11, 2,213,197,120, 17, 64, 18,131, + 95, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, + 11, 2,120, 18,123,198, 8, 95,175, 18, 89,193, 75,209, 58, 0, + 64, 15,220, 11, 2,229,120, 38, 18,198,128,111,126,225,183,194, + 174, 3, 58, 0, 64, 15,220, 11, 2,120,229, 33, 64, 18,133,111, + 70,225, 8, 58, 0, 64, 15,220, 11, 2, 8,205,246, 8,195,174, + 3,230, 7, 8, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, + 64, 15,220, 11, 2, 8,245,230, 4, 15,253,111, 58, 0, 64, 15, + 220, 11, 2,241,197,213,229, 38, 28,104, 86, 36, 94, 36, 78,235, + 245, 58, 0, 64, 15,220, 11, 2, 6, 7, 17,154, 18,120, 8,205, + 113, 1,235,112,235, 28,205,113, 1,235,112,235, 28,205,113, 1, + 235,112,235, 28,205,113, 1,235,112,235, 28, 8, 71, 16,222,205, + 113, 1,235,112,235, 58, 0, 64, 15,220, 11, 2,241, 71,205,147, + 11,120, 17, 88, 18,230, 7,131, 95,245,230, 3,198,176, 33,154, + 18, 8, 58, 0, 64, 15,220, 11, 2, 8,253,119, 0, 70, 44,253, + 112, 1, 8,120, 18,123,198, 8, 95, 58, 0, 64, 15,220, 11, 2, 8,214,128, 6, 28,253,119, 0, 78,253,113, 1,198, 4, 44, 16, - 244, 58, 0, 64, 15,220,220, 1,125,214, 24,111, 6, 4,126, 18, - 123,198, 8, 95, 44, 16,247, 58, 0, 64, 15,220,220, 1,241,225, - 209,193,201,205,118, 9,195, 39, 5,230, 7, 71, 58, 0, 64, 15, - 220,220, 1,213,197,120, 22, 17,198, 72, 95, 58, 0, 64, 15,220, - 220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1,235,112,235, 89, - 193, 75,209, 58, 0, 64, 15,220,220, 1,229,120, 33,128, 17,133, - 111,126,225,183,194, 14, 3, 58, 0, 64, 15,220,220, 1,120,229, - 33, 72, 17,133,111, 70,225,245, 58, 0, 64, 15,220,220, 1,241, - 205,137, 9,195, 14, 3,245, 58, 0, 64, 15,220,220, 1,205,116, - 1, 58, 0, 64, 15,220,220, 1,241,197,213,229,230, 7,245, 38, - 17,198, 88,111, 8, 58, 0, 64, 15,220,220, 1, 8,230, 4, 15, - 253,111, 58, 0, 64, 15,220,220, 1,241,230, 3,198, 64, 79,126, - 230, 7, 95, 58, 0, 64, 15,220,220, 1,125,198, 8,111,123,254, + 244, 58, 0, 64, 15,220, 11, 2,125,214, 24,111, 6, 4,126, 18, + 123,198, 8, 95, 44, 16,247, 58, 0, 64, 15,220, 11, 2,241,225, + 209,193,201,205, 22, 10,195,199, 5,230, 7, 71, 58, 0, 64, 15, + 220, 11, 2,213,197,120, 22, 18,198, 72, 95, 58, 0, 64, 15,220, + 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2,235,112,235, 89, + 193, 75,209, 58, 0, 64, 15,220, 11, 2,229,120, 33,128, 18,133, + 111,126,225,183,194,174, 3, 58, 0, 64, 15,220, 11, 2,120,229, + 33, 72, 18,133,111, 70,225,245, 58, 0, 64, 15,220, 11, 2,241, + 205, 41, 10,195,174, 3,245, 58, 0, 64, 15,220, 11, 2,205,113, + 1, 58, 0, 64, 15,220, 11, 2,241,197,213,229,230, 7,245, 38, + 18,198, 88,111, 8, 58, 0, 64, 15,220, 11, 2, 8,230, 4, 15, + 253,111, 58, 0, 64, 15,220, 11, 2,241,230, 3,198, 64, 79,126, + 230, 7, 95, 58, 0, 64, 15,220, 11, 2,125,198, 8,111,123,254, 7, 56, 14,253,113, 0,126,128,254,127, 56, 2, 62,127,253,119, - 1,121,198, 4, 79, 58, 0, 64, 15,220,220, 1,125,198, 8,111, + 1,121,198, 4, 79, 58, 0, 64, 15,220, 11, 2,125,198, 8,111, 123,254, 5, 56, 14,253,113, 0,126,128,254,127, 56, 2, 62,127, - 253,119, 1,121,198, 4, 79, 58, 0, 64, 15,220,220, 1,125,198, + 253,119, 1,121,198, 4, 79, 58, 0, 64, 15,220, 11, 2,125,198, 8,111,123,254, 4, 56, 14,253,113, 0,126,128,254,127, 56, 2, - 62,127,253,119, 1,121,198, 4, 79, 58, 0, 64, 15,220,220, 1, + 62,127,253,119, 1,121,198, 4, 79, 58, 0, 64, 15,220, 11, 2, 125,198, 8,111,253,113, 0,126,128,254,127, 56, 2, 62,127,253, - 119, 1, 58, 0, 64, 15,220,220, 1,225,209,193,201, 71, 58, 0, - 64, 15,220,220, 1,120,230, 4, 15,253,111,120, 8, 58, 0, 64, - 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1, 8,230, - 3,198,180,253,119, 0,253,112, 1,195, 39, 5, 71, 58, 0, 64, - 15,220,220, 1,120,120,230, 4, 15,253,111, 8, 58, 0, 64, 15, - 220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1, 8,229,230, - 7, 38, 17,198, 80,108,112, 8, 58, 0, 64, 15,220,220, 1, 8, - 230, 7,198,128,111, 8,126,183,225,194, 14, 3, 58, 0, 64, 15, - 220,220, 1, 8,230, 3,198,180,253,119, 0,253,112, 1,195, 14, - 3,230, 7, 71, 58, 0, 64, 15,220,220, 1,229, 38, 17,120,198, - 128,111, 54, 1,225, 58, 0, 64, 15,220,220, 1,120,230, 4, 15, + 119, 1, 58, 0, 64, 15,220, 11, 2,225,209,193,201, 71, 58, 0, + 64, 15,220, 11, 2,120,230, 4, 15,253,111,120, 8, 58, 0, 64, + 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2, 8,230, + 3,198,180,253,119, 0,253,112, 1,195,199, 5, 71, 58, 0, 64, + 15,220, 11, 2,120,230, 4, 15,253,111,120, 8, 58, 0, 64, 15, + 220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2, 8,229,230, + 7, 38, 18,198, 80,111,112, 8, 58, 0, 64, 15,220, 11, 2, 8, + 230, 7,198,128,111, 8,126,183,225,194,174, 3, 58, 0, 64, 15, + 220, 11, 2, 8,230, 3,198,180,253,119, 0,253,112, 1,195,174, + 3,230, 7, 71, 58, 0, 64, 15,220, 11, 2,229, 38, 18,120,198, + 128,111, 54, 1,225, 58, 0, 64, 15,220, 11, 2,120,230, 4, 15, 253,111,120,230, 3,135,135,198,180,253,119, 0,253, 54, 1,192, - 195, 39, 5,230, 7,245,213,229, 79,230, 4, 15,253,111,121,230, - 3,198, 64, 14, 6, 33,168, 16, 8, 58, 0, 64, 15,220,220, 1, + 195,199, 5,230, 7,245,213,229, 79,230, 4, 15,253,111,121,230, + 3,198, 64, 14, 6, 33,168, 17, 8, 58, 0, 64, 15,220, 11, 2, 8, 94,253,119, 0,198, 4,253,115, 1, 0,253,119, 0,198, 4, 253,115, 1, 0,253,119, 0,198, 4,253,115, 1, 0,253,119, 0, - 198, 4,253,115, 1, 44, 13,194, 8, 11,225,209, 58, 0, 64, 15, - 220,220, 1,241, 79,246,240,221, 54, 0, 40,221,113, 1,221, 54, + 198, 4,253,115, 1, 44, 13,194,168, 11,225,209, 58, 0, 64, 15, + 220, 11, 2,241, 79,246,240,221, 54, 0, 40,221,113, 1,221, 54, 0, 40,221,119, 1,221, 54, 0, 40,221,113, 1, 58, 0, 64, 15, - 220,220, 1,201,120, 38, 17,198, 64,111,197,120, 70,205, 86, 8, - 193, 58, 0, 64, 15,220,220, 1,197,125,198, 8,111,120, 70,205, - 137, 9,193,125,198, 8,111,120,230, 3,198,180,253,119, 0,126, - 253,119, 1, 58, 0, 64, 15,220,220, 1,201, 33, 48, 17, 6, 3, - 197,126,203,127, 32, 6, 6, 15, 44,195, 0, 12,230,127, 71, 44, - 126,128, 71, 58, 0, 64, 15,220,220, 1,197, 44, 78, 44, 94, 44, - 86,235, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15, - 220,220, 1,120,254,254,202, 39, 12,254,255,202, 60, 12,253,104, - 58, 0, 64, 15,220,220, 1,235,114, 45,115, 45,113, 45,193, 58, - 0, 64, 15,220,220, 1,253,125,128, 71,254, 16, 56, 2, 6, 15, - 58, 0, 64, 15,220,220, 1,120, 7, 7, 7,193,176, 15, 15, 15, - 246,144, 50, 17,127,125,214, 17,111, 58, 0, 64, 15,220,220, 1, - 5,242,160, 11,195, 60, 1, 58, 0, 64, 15,220,220, 1, 28,235, - 113, 44,115, 44,114,235, 29, 29, 29,195,194, 11, 58, 0, 64, 15, - 220,220, 1, 28,235, 78, 44, 94, 44, 86,235, 29, 29, 29,195,194, - 11,205,117, 12,195, 39, 5, 71, 58, 0, 64, 15,220,220, 1,120, - 229,230, 3, 33,136, 17,133,111,126,225,183,194,197, 3,120,205, - 117, 12,195, 14, 3,230, 3, 71, 8, 58, 0, 64, 15,220,220, 1, - 229, 38, 17,120, 15, 15, 15, 15,111,126,246,128,119, 58, 0, 64, - 15,220,220, 1,213, 44, 44, 84,125,198, 6, 95, 58, 0, 64, 15, - 220,220, 1, 26,119, 44, 28, 26,119, 44, 28, 26,119,209,225, 58, - 0, 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1, - 8,229,213, 38, 16,104, 17, 17,127, 15, 15, 15, 70,176, 18, 44, - 126, 18,209,225,201,205,232, 12,195, 39, 5, 58,139, 17,183,194, - 197, 3,205,232, 12,195, 14, 3, 58, 0, 64, 15,220,220, 1,229, - 33, 48, 17,126,246,128,119, 58, 0, 64, 15,220,220, 1,213, 44, - 44, 84,125,198, 6, 95, 58, 0, 64, 15,220,220, 1, 26,119, 44, - 28, 26,119, 44, 28, 26,119,209,225, 58, 0, 64, 15,220,220, 1, - 205,116, 1, 58, 0, 64, 15,220,220, 1, 62,224,176, 50, 17,127, - 201,205, 85, 13,195, 39, 5, 71, 58, 0, 64, 15,220,220, 1,120, - 229,230, 3, 33,136, 17,133,111,126,225,183,194, 14, 3,120,205, - 85, 13,195, 14, 3,230, 3, 71, 58, 0, 64, 15,220,220, 1,229, - 38, 17,120, 15, 15, 15, 15,111,126,230,127,119,225,201,230, 3, - 8, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220, - 220, 1, 8,229, 38, 17, 15, 15, 15, 15,111,126,230,128,176,119, - 225,195, 39, 5,230, 3, 8, 58, 0, 64, 15,220,220, 1,205,116, - 1, 58, 0, 64, 15,220,220, 1, 8,213,229,245, 17,136, 17,131, - 95, 26, 95, 58, 0, 64, 15,220,220, 1,241, 38, 17, 15, 15, 15, - 15,198, 15,111,112, 58, 0, 64, 15,220,220, 1,123,183, 32, 16, - 125,214, 15,111,126,230,128,176,119, 58, 0, 64, 15,220,220, 1, - 225,209,195, 14, 3,230, 3, 8, 58, 0, 64, 15,220,220, 1,205, - 116, 1, 58, 0, 64, 15,220,220, 1, 8,213,229, 22, 28, 88, 38, - 17, 15, 15, 15, 15,198, 10,111, 58, 0, 64, 15,220,220, 1, 26, - 119, 20, 45, 26,119, 20, 45, 26,119, 58, 0, 64, 15,220,220, 1, - 125,214, 8,111, 54, 0,225,209,195, 39, 5,230, 3, 8, 58, 0, - 64, 15,220,220, 1,205,116, 1, 58, 0, 64, 15,220,220, 1, 8, - 213,229, 22, 28, 88, 33,136, 17,245,133,111,241, 70, 38, 17, 15, - 15, 15, 15,198, 15,111, 58, 0, 64, 15,220,220, 1,119, 45, 26, - 119, 20, 45, 26,119, 20, 45, 26,119, 58, 0, 64, 15,220,220, 1, - 120,183,202,122, 14,225,209,195, 14, 3, 58, 0, 64, 15,220,220, - 1, 84,125,214, 4, 95,126, 18, 44, 28,126, 18, 44, 28,126, 18, - 58, 0, 64, 15,220,220, 1,125,214, 8,111, 54, 0,225,209,195, - 14, 3,205,198, 14,195, 39, 5, 71, 58, 0, 64, 15,220,220, 1, - 120,229,230, 15, 38, 17,198,128,111,126,225,183,194,179, 3,120, - 205,198, 14,195, 14, 3,230, 3, 8, 58, 0, 64, 15,220,220, 1, - 205,116, 1, 58, 0, 64, 15,220,220, 1, 8,213, 17, 17,127, 15, - 15, 15,176,246,128, 18, 58, 0, 64, 15,220,220, 1,205,116, 1, - 58, 0, 64, 15,220,220, 1,235,112,235,209,201,205, 25, 13,195, - 39, 5, 58,139, 17,183,194,197, 3,205, 25, 13,195, 14, 3,230, - 3, 71, 58, 0, 64, 15,220,220, 1,229, 38, 17,120,198,136,111, - 54, 1, 58, 0, 64, 15,220,220, 1,120, 15, 15, 15, 15,111, 38, - 17, 54, 0,225,195, 39, 5,205, 67, 15,195, 40, 1,205, 67, 15, - 195, 50, 1, 58, 0, 64, 15,220,220, 1,205,116, 1, 58, 0, 64, - 15,220,220, 1,235,114, 45,115, 45,113, 58, 0, 64, 15,220,220, - 1, 45,112,201,255,255,255,255,255,255,255,255,255,255,255,255, + 220, 11, 2,201,120, 38, 18,198, 64,111,197,120, 70,205,246, 8, + 193, 58, 0, 64, 15,220, 11, 2,197,125,198, 8,111,120, 70,205, + 41, 10,193,125,198, 8,111,120,230, 3,198,180,253,119, 0,126, + 253,119, 1, 58, 0, 64, 15,220, 11, 2,201, 33, 48, 18, 6, 3, + 197,126,203,127, 32, 6, 6, 15, 44,195,160, 12,230,127, 71, 44, + 126,128, 71, 58, 0, 64, 15,220, 11, 2,197, 44, 78, 44, 94, 44, + 86,235, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15, + 220, 11, 2,120,254,254,202,199, 12,254,255,202,220, 12,253,104, + 58, 0, 64, 15,220, 11, 2,235,114, 45,115, 45,113, 45,193, 58, + 0, 64, 15,220, 11, 2,253,125,128, 71,254, 16, 56, 2, 6, 15, + 58, 0, 64, 15,220, 11, 2,120, 7, 7, 7,193,176, 15, 15, 15, + 246,144, 50, 17,127,125,214, 17,111, 58, 0, 64, 15,220, 11, 2, + 5,242, 64, 12,195, 57, 1, 58, 0, 64, 15,220, 11, 2, 28,235, + 113, 44,115, 44,114,235, 29, 29, 29,195, 98, 12, 58, 0, 64, 15, + 220, 11, 2, 28,235, 78, 44, 94, 44, 86,235, 29, 29, 29,195, 98, + 12,205, 21, 13,195,199, 5, 71, 58, 0, 64, 15,220, 11, 2,120, + 229,230, 3, 33,136, 18,133,111,126,225,183,194,101, 4,120,205, + 21, 13,195,174, 3,230, 3, 71, 8, 58, 0, 64, 15,220, 11, 2, + 229, 38, 18,120, 15, 15, 15, 15,111,126,246,128,119, 58, 0, 64, + 15,220, 11, 2,213, 44, 44, 84,125,198, 6, 95, 58, 0, 64, 15, + 220, 11, 2, 26,119, 44, 28, 26,119, 44, 28, 26,119,209,225, 58, + 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2, + 8,229,213, 38, 17,104, 17, 17,127, 15, 15, 15, 70,176, 18, 44, + 126, 18,209,225,201,205,136, 13,195,199, 5, 58,139, 18,183,194, + 101, 4,205,136, 13,195,174, 3, 58, 0, 64, 15,220, 11, 2,229, + 33, 48, 18,126,246,128,119, 58, 0, 64, 15,220, 11, 2,213, 44, + 44, 84,125,198, 6, 95, 58, 0, 64, 15,220, 11, 2, 26,119, 44, + 28, 26,119, 44, 28, 26,119,209,225, 58, 0, 64, 15,220, 11, 2, + 205,113, 1, 58, 0, 64, 15,220, 11, 2, 62,224,176, 50, 17,127, + 201,205,245, 13,195,199, 5, 71, 58, 0, 64, 15,220, 11, 2,120, + 229,230, 3, 33,136, 18,133,111,126,225,183,194,174, 3,120,205, + 245, 13,195,174, 3,230, 3, 71, 58, 0, 64, 15,220, 11, 2,229, + 38, 18,120, 15, 15, 15, 15,111,126,230,127,119,225,201,230, 3, + 8, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, + 11, 2, 8,229, 38, 18, 15, 15, 15, 15,111,126,230,128,176,119, + 225,195,199, 5,230, 3, 8, 58, 0, 64, 15,220, 11, 2,205,113, + 1, 58, 0, 64, 15,220, 11, 2, 8,213,229,245, 17,136, 18,131, + 95, 26, 95, 58, 0, 64, 15,220, 11, 2,241, 38, 18, 15, 15, 15, + 15,198, 15,111,112, 58, 0, 64, 15,220, 11, 2,123,183, 32, 16, + 125,214, 15,111,126,230,128,176,119, 58, 0, 64, 15,220, 11, 2, + 225,209,195,174, 3,230, 3, 8, 58, 0, 64, 15,220, 11, 2,205, + 113, 1, 58, 0, 64, 15,220, 11, 2, 8,213,229, 22, 28, 88, 38, + 18, 15, 15, 15, 15,198, 10,111, 58, 0, 64, 15,220, 11, 2, 26, + 119, 20, 45, 26,119, 20, 45, 26,119, 58, 0, 64, 15,220, 11, 2, + 125,214, 8,111, 54, 0,225,209,195,199, 5,230, 3, 8, 58, 0, + 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, 15,220, 11, 2, 8, + 213,229, 22, 28, 88, 33,136, 18,245,133,111,241, 70, 38, 18, 15, + 15, 15, 15,198, 15,111, 58, 0, 64, 15,220, 11, 2,119, 45, 26, + 119, 20, 45, 26,119, 20, 45, 26,119, 58, 0, 64, 15,220, 11, 2, + 120,183,202, 26, 15,225,209,195,174, 3, 58, 0, 64, 15,220, 11, + 2, 84,125,214, 4, 95,126, 18, 44, 28,126, 18, 44, 28,126, 18, + 58, 0, 64, 15,220, 11, 2,125,214, 8,111, 54, 0,225,209,195, + 174, 3,205,102, 15,195,199, 5, 71, 58, 0, 64, 15,220, 11, 2, + 120,229,230, 15, 38, 18,198,128,111,126,225,183,194, 83, 4,120, + 205,102, 15,195,174, 3,230, 3, 8, 58, 0, 64, 15,220, 11, 2, + 205,113, 1, 58, 0, 64, 15,220, 11, 2, 8,213, 17, 17,127, 15, + 15, 15,176,246,128, 18, 58, 0, 64, 15,220, 11, 2,205,113, 1, + 58, 0, 64, 15,220, 11, 2,235,112,235,209,201,205,185, 13,195, + 199, 5, 58,139, 18,183,194,101, 4,205,185, 13,195,174, 3,230, + 3, 71, 58, 0, 64, 15,220, 11, 2,229, 38, 18,120,198,136,111, + 54, 1, 58, 0, 64, 15,220, 11, 2,120, 15, 15, 15, 15,111, 38, + 18, 54, 0,225,195,199, 5,205,227, 15,195, 37, 1,205,227, 15, + 195, 47, 1, 58, 0, 64, 15,220, 11, 2,205,113, 1, 58, 0, 64, + 15,220, 11, 2,235,114, 45,115, 45,113, 58, 0, 64, 15,220, 11, + 2, 45,112,201,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, @@ -286,5 +302,5 @@ static uint8_t echo_blob[] = { 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, - 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }; diff --git a/doc/api-asm.68k b/doc/api-asm.68k index e6f466c..ad552f3 100644 --- a/doc/api-asm.68k +++ b/doc/api-asm.68k @@ -88,6 +88,31 @@ Echo_GetStatus ============================================================================= +*** Settings *** + +Echo_SetPCMRate + + Changes the sample rate of PCM. Note this is a global parameter as it + affects both BGM and SFX. The value is what one would write in timer A of + the YM2612 register. Here are the approximate frequencies for some values + (default is $05): + + NTSC PAL | NTSC PAL + ----------------------------|-------------------------- + $02 ... 26632Hz ... 26389Hz | $08 ... 6658Hz ... 6597Hz + $03 ... 17755Hz ... 17593Hz | $09 ... 5918Hz ... 5864Hz + $04 ... 13316Hz ... 13194Hz | $0A ... 5326Hz ... 5278Hz + $05 ... 10653Hz ... 10556Hz | $0B ... 4842Hz ... 4798Hz + $06 .... 8877Hz .... 8796Hz | $0C ... 4439Hz ... 4398Hz + $07 .... 7609Hz .... 7539Hz | $0D ... 4097Hz ... 4060Hz + + The higher the sample rate, the better quality, but also takes up more + space and, more importantly, reduces CPU time available for other things + (which can hamper Echo's ability to process complex streams). Be careful + if you increase the sample rate. + +============================================================================= + *** Raw access *** Echo_SendCommand @@ -95,10 +120,16 @@ Echo_SendCommand Sends an argument-less command to Echo. The command ID is given as a byte in register d0. -Echo_SendCommandEx +Echo_SendCommandAddr Sends a command to Echo that takes an address as its argument. The command ID is given as a byte in register d0, while the address argument is given in register a0. +Echo_SendCommandByte + + Sends a command to Echo that takes a byte as its argument. The command ID + is given as a byte in register d0, while the byte argument is given in + register d1. + ============================================================================= diff --git a/doc/api-c.txt b/doc/api-c.txt index fcfd07b..a248051 100644 --- a/doc/api-c.txt +++ b/doc/api-c.txt @@ -92,6 +92,31 @@ uint16_t echo_get_status() ============================================================================= +*** Settings *** + +void echo_set_pcm_rate(uint8_t rate) + + Changes the sample rate of PCM. Note this is a global parameter as it + affects both BGM and SFX. The value is what one would write in timer A of + the YM2612 register. Here are the approximate frequencies for some values + (default is 0x05): + + NTSC PAL | NTSC PAL + -----------------------------|--------------------------- + 0x02 ... 26632Hz ... 26389Hz | 0x08 ... 6658Hz ... 6597Hz + 0x03 ... 17755Hz ... 17593Hz | 0x09 ... 5918Hz ... 5864Hz + 0x04 ... 13316Hz ... 13194Hz | 0x0A ... 5326Hz ... 5278Hz + 0x05 ... 10653Hz ... 10556Hz | 0x0B ... 4842Hz ... 4798Hz + 0x06 .... 8877Hz .... 8796Hz | 0x0C ... 4439Hz ... 4398Hz + 0x07 .... 7609Hz .... 7539Hz | 0x0D ... 4097Hz ... 4060Hz + + The higher the sample rate, the better quality, but also takes up more + space and, more importantly, reduces CPU time available for other things + (which can hamper Echo's ability to process complex streams). Be careful + if you increase the sample rate. + +============================================================================= + *** Raw access *** void echo_send_command(uint8_t command) @@ -103,7 +128,7 @@ void echo_send_command(uint8_t command) ECHO_CMD_RESUMEBGM ... Resume background music playback ECHO_CMD_STOPSFX ..... Stop sound effect playback -void echo_send_command_ex(uint8_t command, const void *address) +void echo_send_command_addr(uint8_t command, const void *address) Sends a command to Echo that takes an address as its argument. The parameter 'command' is the command to send, while the parameter 'address' @@ -117,4 +142,12 @@ void echo_send_command_ex(uint8_t command, const void *address) makes Echo load the instrument list by itself and it expects a different format from the one used by the C API. +void echo_send_command_byte(uint8_t command, uint8_t byte) + + Sends a command to Echo that takes a byte as its argument. The parameter + 'command' is the command to send, while the parameter 'byte' is the byte + to use as argument. The command may be... just this for now: + + ECHO_CMD_SETPCMRATE ... Change PCM sample rate + ============================================================================= diff --git a/src-68k/echo.68k b/src-68k/echo.68k index 9b1341f..94e42ca 100644 --- a/src-68k/echo.68k +++ b/src-68k/echo.68k @@ -61,13 +61,14 @@ Echo_SendCommand: rts ; End of subroutine ;**************************************************************************** -; Echo_SendCommandEx +; Echo_SendCommandAddr ; Sends an Echo command (with address parameter) ; ; input d0.b ... Echo command ; input a0.l ... Address parameter ;**************************************************************************** +Echo_SendCommandAddr: Echo_SendCommandEx: movem.l d0-d1, -(sp) ; Save register @@ -106,6 +107,35 @@ Echo_SendCommandEx: rts ; End of subroutine ;**************************************************************************** +; Echo_SendCommandByte +; Sends an Echo command (with a byte parameter) +; +; input d0.b ... Echo command +; input d1.b ... Byte parameter +;**************************************************************************** + +Echo_SendCommandByte: + Echo_Z80Request ; We need the Z80 bus + + move.w d1, -(sp) ; Save register +@Try: + tst.b ($A01FFF) ; Check if Echo is ready + beq.s @Ready ; Too busy? + Echo_Z80Release ; Let Echo continue + move.w #$FF, d1 ; Give it some time + dbf d1, * ; ... + Echo_Z80Request ; Get Z80 bus back + bra.s @Try ; Try again + +@Ready: + move.w (sp)+, d1 ; Restore register + move.b d0, ($A01FFF) ; Write command ID + move.b d1, ($A01FFC) ; Write parameter + Echo_Z80Release ; We're done with the Z80 bus + + rts ; End of subroutine + +;**************************************************************************** ; Echo_PlaySFX ; Plays a SFX ; @@ -115,7 +145,7 @@ Echo_SendCommandEx: Echo_PlaySFX: move.w d0, -(sp) ; Save register move.b #$02, d0 ; Command $02 = play SFX - bsr Echo_SendCommandEx ; Send command to Echo + bsr Echo_SendCommandAddr ; Send command to Echo move.w (sp)+, d0 ; Restore register rts ; End of subroutine @@ -141,7 +171,7 @@ Echo_StopSFX: Echo_PlayBGM: move.w d0, -(sp) ; Save register move.b #$04, d0 ; Command $04 = play BGM - bsr Echo_SendCommandEx ; Send command to Echo + bsr Echo_SendCommandAddr ; Send command to Echo move.w (sp)+, d0 ; Restore register rts ; End of subroutine @@ -170,6 +200,21 @@ Echo_ResumeBGM: rts ; End of subroutine ;**************************************************************************** +; Echo_SetPCMRate +; Sets the playback rate of PCM +; +; input d0.b ... New rate (timer A value) +;**************************************************************************** + +Echo_SetPCMRate: + movem.l d0-d1, -(sp) ; Save registers + move.b d0, d1 ; Put parameter in place + move.b #$07, d0 ; Command $07 = set PCM rate + bsr Echo_SendCommandByte ; Send command to Echo + movem.l (sp)+, d0-d1 ; Restore registers + rts ; End of subroutine + +;**************************************************************************** ; Echo_GetStatus ; Gets the current status of Echo ; @@ -258,6 +303,6 @@ Echo_Init: ; It should be located wherever Echo_ProgFile was defined ;**************************************************************************** -@Z80Program: incbin "..." +@Z80Program: incbin "../bin/prog-z80.bin" @Z80ProgSize equ *-@Z80Program even diff --git a/src-z80/core/main.z80 b/src-z80/core/main.z80 index 1bd6074..33d8ec4 100644 --- a/src-z80/core/main.z80 +++ b/src-z80/core/main.z80 @@ -101,6 +101,8 @@ PollPCM: macro ;**************************************************************************** ; RunCommand ; Checks which command to run +;---------------------------------------------------------------------------- +; To-do: replace with pointer list? ;**************************************************************************** RunCommand: @@ -116,6 +118,8 @@ RunCommand: jp z, StopBGMCmd dec a ; Command $06: resume BGM jp z, ResumeBGM + dec a ; Command $07: set PCM rate + jp z, SetPCMRate PollPCM diff --git a/src-z80/player/pcm.z80 b/src-z80/player/pcm.z80 index 18527d9..b5a4434 100644 --- a/src-z80/player/pcm.z80 +++ b/src-z80/player/pcm.z80 @@ -239,3 +239,30 @@ LockChannelPCM: call StopPCM ; Stop PCM playback jp ProcessSFXRun ; End of subroutine + +;**************************************************************************** +; SetPCMRate [command $07] +; Changes the sample rate of PCM +;**************************************************************************** + +SetPCMRate: + ld a, (RAM_ComBank) ; Get new rate + cpl + ld b, a + + xor a ; Parsed command already + ld (RAM_Command), a + + ld a, b ; Set high bits of timer + ld (ix+0), $24 + rrca + rrca + or $C0 + ld (ix+1), a + + ld a, b ; Set low bits of timer + ld (ix+0), $25 + and $03 + ld (ix+1), a + + jp IdleLoop ; End of subroutine diff --git a/tester/core/entry.68k b/tester/core/entry.68k index df13b5c..c0a120d 100644 --- a/tester/core/entry.68k +++ b/tester/core/entry.68k @@ -164,7 +164,7 @@ EntryPoint: ; 123456789012345678901234567890123456 @Str_Title1: dc.b "Echo sound engine", 0 -@Str_Title2: dc.b "Version 1.1 by Sik", 0 +@Str_Title2: dc.b "Version 1.2 by Sik", 0 @Str_Instr1: dc.b "Use D-pad to select song", 0 @Str_Instr2: dc.b "A/C: play, B: stop", 0 even |
