aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README16
-rw-r--r--built/prog-z80-1.1.binbin0 -> 4608 bytes
-rw-r--r--built/prog-z80.binbin4608 -> 4864 bytes
-rw-r--r--c/echo.c47
-rw-r--r--c/echo.h11
-rw-r--r--c/echoblob.h490
-rw-r--r--doc/api-asm.68k33
-rw-r--r--doc/api-c.txt35
-rw-r--r--src-68k/echo.68k53
-rw-r--r--src-z80/core/main.z804
-rw-r--r--src-z80/player/pcm.z8027
-rw-r--r--tester/core/entry.68k2
12 files changed, 462 insertions, 256 deletions
diff --git a/README b/README
index e1b52a3..d7dd98f 100644
--- a/README
+++ b/README
@@ -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
new file mode 100644
index 0000000..309036c
--- /dev/null
+++ b/built/prog-z80-1.1.bin
Binary files differ
diff --git a/built/prog-z80.bin b/built/prog-z80.bin
index 309036c..2265d9f 100644
--- a/built/prog-z80.bin
+++ b/built/prog-z80.bin
Binary files differ
diff --git a/c/echo.c b/c/echo.c
index dcc844c..b4368da 100644
--- a/c/echo.c
+++ b/c/echo.c
@@ -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.
//---------------------------------------------------------------------------
diff --git a/c/echo.h b/c/echo.h
index 8484c59..086535e 100644
--- a/c/echo.h
+++ b/c/echo.h
@@ -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