srcclean and manual cleanup

This commit is contained in:
Vas Crabb 2025-01-26 05:59:56 +11:00
parent afc4a360ba
commit 587598e618
44 changed files with 605 additions and 627 deletions

View File

@ -7983,7 +7983,7 @@ ATK test: OK
<notes><![CDATA[
ATK test: OK
]]></notes>
<!-- cover/floppy title -->
<!-- cover/floppy title -->
<info name="alt_title" value="Brutal Football" />
<part name="flop1" interface="floppy_3_5">
<feature name="part_id" value="Disk 1" />
@ -12097,7 +12097,7 @@ ATK test: OK
</part>
</software>
<!-- "F40 Pursuit Simulator" alt version known to exist (title screen) -->
<!-- "F40 Pursuit Simulator" alt version known to exist (title screen) -->
<software name="crazycr2" supported="no">
<!-- SPS (CAPS) release 311 -->
<description>Crazy Cars II (Europe)</description>
@ -12156,7 +12156,7 @@ ATK test: C:79 H:U 1 Sector Bad
</part>
</software>
<!-- PD version known to exist https://www.aminet.net/package/game/jump/CrazySueII -->
<!-- PD version known to exist https://www.aminet.net/package/game/jump/CrazySueII -->
<software name="crazsue2" supported="no">
<!-- SPS (CAPS) release 2195 -->
<description>Crazy Sue... Goes On (Europe)</description>
@ -12168,7 +12168,7 @@ ATK test: C:79 H:U 1 Sector Bad
TODO: test me in full, is track 43 onward bad just a side effect of using RNC cruncher?
ATK test: C:43 onward Bad
]]></notes>
<info name="alt_title" value="Crazy Sue II" />
<info name="alt_title" value="Crazy Sue II" />
<info name="magazine" value="Amiga Mania" />
<info name="release" value="199209xx" />
<!-- Omake: type "HIRONZMUSJUMPSHOE" on title screen to enable cheat mode -->

View File

@ -731,7 +731,7 @@ license:CC0-1.0
<description>Brutal Sports Series: Football</description>
<year>1994</year>
<publisher>Millennium</publisher>
<!-- Cover/CD title -->
<!-- Cover/CD title -->
<info name="alt_title" value="Brutal Football" />
<info name="disc_matrix" value="CDD3361 BRUTAL FOOTBALL : MASTERED BY NIMBUS" />
<part name="cdrom" interface="cdrom">

View File

@ -299,8 +299,8 @@ No sound, hardlocks then eventually throws an exception after the Dyna Cam logo
Switching items in main menu causes a glitch on the text
Rightmost column of gameplay has odd "overscan" area
]]></notes>
<!-- cover title, NOTE: different than all the other version -->
<info name="alt_title" value="Brutal Sports Football" />
<!-- cover title, NOTE: different than all the other version -->
<info name="alt_title" value="Brutal Sports Football" />
<info name="serial" value="JA100"/>
<part name="cart" interface="jaguar_cart">
<dataarea name="rom" size="2097152" width="32" endianness="big">

View File

@ -90,7 +90,7 @@ license:CC0-1.0
<info name="developer" value="EktaSoft"/>
<info name="comment" value="Recostruction of an additional JUKU PC utilities disk #4 with EKDOS 2.30 based on file list in READ.ME published by EKTA in December 1989."/> <!-- See https://github.com/infoaed/juku3000/blob/master/docs/ekdos230.txt for READ.ME. -->
<part name="flop1" interface="floppy_5_25">
<feature name="part_id" value="UTILS-4" /><!-- See https://juku3000.infoaed.ee/tarkvara-kataloog/#j3kutil4 for details. -->
<feature name="part_id" value="UTILS-4" /><!-- See https://juku3000.infoaed.ee/tarkvara-kataloog/#j3kutil4 for details. -->
<dataarea name="flop" size="819200">
<rom name="J3KUTIL4.JUK" size="819200" crc="839f20aa" sha1="fb8a5239cdd74eced3b0bb7ab8ec6e8b2092f4c3" />
</dataarea>

View File

@ -16443,7 +16443,7 @@ Black screen, requires sub CPU to be overclocked by 1.5x
<description>Music from the Sega CD Games - Jurassic Park, Batman Returns (USA)</description>
<year>1993</year>
<publisher>Sega Multimedia Studio</publisher>
<sharedfeat name="compatibility" value="NTSC-U"/>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cdrom" interface="scd_cdrom">
<diskarea name="cdrom">
<disk name="music from the sega cd games - jurassic park, batman returns (usa)" status="nodump"/>
@ -16462,7 +16462,7 @@ Black screen, requires sub CPU to be overclocked by 1.5x
<description>The Smurfs (USA, Prototype)</description>
<year>2014</year>
<publisher>Good Deal Games</publisher>
<sharedfeat name="compatibility" value="NTSC-U"/>
<sharedfeat name="compatibility" value="NTSC-U"/>
<part name="cdrom" interface="scd_cdrom">
<diskarea name="cdrom">
<disk name="the smurfs (usa, prototype)" status="nodump"/>

View File

@ -1056,10 +1056,10 @@ end
--------------------------------------------------
if opt_tool(FORMATS, "H17D_DSK") then
files {
MAME_DIR.. "src/lib/formats/h17disk.cpp",
MAME_DIR.. "src/lib/formats/h17disk.h",
}
files {
MAME_DIR.. "src/lib/formats/h17disk.cpp",
MAME_DIR.. "src/lib/formats/h17disk.h",
}
end
--------------------------------------------------

View File

@ -824,18 +824,18 @@ uint8_t mcs51_cpu_device::r_psw() { return SFR_A(ADDR_PSW); }
In order to simplify memory mapping to the data address bus, the following address map is assumed for partitioned mode:
PES = 0:
PES = 0:
0x00000-0x0ffff -> data memory on the expanded bus
0x10000-0x1ffff -> data memory on the byte-wide bus
PES = 1:
0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus
PES = 1:
0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus
For non-partitioned mode the following memory map is assumed:
PES = 0:
PES = 0:
0x00000-0x0ffff -> data memory (the bus used to access it does not matter)
PES = 1:
0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus
PES = 1:
0x20000-0x2ffff -> memory-mapped peripherals on the byte-wide bus
*/
offs_t mcs51_cpu_device::external_ram_iaddr(offs_t offset, offs_t mem_mask)

View File

@ -256,7 +256,7 @@ void spg_renderer_device::draw_linemap(bool has_extended_tilemaps, const rectang
uint32_t palette_map = tilemapregs[3];
//if (scanline == 128)
// popmessage("draw draw_linemap reg0 %04x reg1 %04x bases %04x %04x\n", tilemapregs[0], tilemapregs[1], tilemap, palette_map);
// popmessage("draw draw_linemap reg0 %04x reg1 %04x bases %04x %04x\n", tilemapregs[0], tilemapregs[1], tilemap, palette_map);
//uint32_t xscroll = scrollregs[0];
uint32_t yscroll = scrollregs[1];

View File

@ -24,407 +24,388 @@
#include "emu.h"
#include "roland_sa.h"
DEFINE_DEVICE_TYPE(ROLAND_SA, roland_sa_device, "roland_sa", "Roland SA CPU-B Sound Generator")
namespace {
// LUT for the address speed
const uint32_t roland_sa_device::env_table[] = {
0x000000, 0x000023, 0x000026, 0x000029, 0x00002d, 0x000031, 0x000036,
0x00003b, 0x000040, 0x000046, 0x00004c, 0x000052, 0x00005a, 0x000062,
0x00006c, 0x000076, 0x000080, 0x00008c, 0x000098, 0x0000a4, 0x0000b4,
0x0000c4, 0x0000d8, 0x0000ec, 0x000104, 0x00011c, 0x000134, 0x00014c,
0x00016c, 0x00018c, 0x0001b4, 0x0001dc, 0x000200, 0x000230, 0x000260,
0x000290, 0x0002d0, 0x000310, 0x000360, 0x0003b0, 0x000400, 0x000460,
0x0004c0, 0x000520, 0x0005a0, 0x000620, 0x0006c0, 0x000760, 0x000800,
0x0008c0, 0x000980, 0x000a40, 0x000b40, 0x000c40, 0x000d80, 0x000ec0,
0x001000, 0x001180, 0x001300, 0x001480, 0x001680, 0x001880, 0x001b00,
0x001d80, 0x002000, 0x002300, 0x002600, 0x002900, 0x002d00, 0x003100,
0x003600, 0x003b00, 0x004000, 0x004600, 0x004c00, 0x005200, 0x005a00,
0x006200, 0x006c00, 0x007600, 0x008000, 0x008c00, 0x009800, 0x00a400,
0x00b400, 0x00c400, 0x00d800, 0x00ec00, 0x010000, 0x011800, 0x013000,
0x014800, 0x016800, 0x018800, 0x01b000, 0x01d800, 0x020000, 0x023000,
0x026000, 0x029000, 0x02d000, 0x031000, 0x036000, 0x03b000, 0x040000,
0x046000, 0x04c000, 0x052000, 0x05a000, 0x062000, 0x06c000, 0x076000,
0x080000, 0x08c000, 0x098000, 0x0a4000, 0x0b4000, 0x0c4000, 0x0d8000,
0x0ec000, 0x100000, 0x118000, 0x130000, 0x148000, 0x168000, 0x188000,
0x1b0000, 0x1d8000, 0x000000, 0x1fffdc, 0x1fffd9, 0x1fffd6, 0x1fffd2,
0x1fffce, 0x1fffc9, 0x1fffc4, 0x1fffbf, 0x1fffb9, 0x1fffb3, 0x1fffad,
0x1fffa5, 0x1fff9d, 0x1fff93, 0x1fff89, 0x1fff7f, 0x1fff73, 0x1fff67,
0x1fff5b, 0x1fff4b, 0x1fff3b, 0x1fff27, 0x1fff13, 0x1ffefb, 0x1ffee3,
0x1ffecb, 0x1ffeb3, 0x1ffe93, 0x1ffe73, 0x1ffe4b, 0x1ffe23, 0x1ffdff,
0x1ffdcf, 0x1ffd9f, 0x1ffd6f, 0x1ffd2f, 0x1ffcef, 0x1ffc9f, 0x1ffc4f,
0x1ffbff, 0x1ffb9f, 0x1ffb3f, 0x1ffadf, 0x1ffa5f, 0x1ff9df, 0x1ff93f,
0x1ff89f, 0x1ff7ff, 0x1ff73f, 0x1ff67f, 0x1ff5bf, 0x1ff4bf, 0x1ff3bf,
0x1ff27f, 0x1ff13f, 0x1fefff, 0x1fee7f, 0x1fecff, 0x1feb7f, 0x1fe97f,
0x1fe77f, 0x1fe4ff, 0x1fe27f, 0x1fdfff, 0x1fdcff, 0x1fd9ff, 0x1fd6ff,
0x1fd2ff, 0x1fceff, 0x1fc9ff, 0x1fc4ff, 0x1fbfff, 0x1fb9ff, 0x1fb3ff,
0x1fadff, 0x1fa5ff, 0x1f9dff, 0x1f93ff, 0x1f89ff, 0x1f7fff, 0x1f73ff,
0x1f67ff, 0x1f5bff, 0x1f4bff, 0x1f3bff, 0x1f27ff, 0x1f13ff, 0x1effff,
0x1ee7ff, 0x1ecfff, 0x1eb7ff, 0x1e97ff, 0x1e77ff, 0x1e4fff, 0x1e27ff,
0x1dffff, 0x1dcfff, 0x1d9fff, 0x1d6fff, 0x1d2fff, 0x1cefff, 0x1c9fff,
0x1c4fff, 0x1bffff, 0x1b9fff, 0x1b3fff, 0x1adfff, 0x1a5fff, 0x19dfff,
0x193fff, 0x189fff, 0x17ffff, 0x173fff, 0x167fff, 0x15bfff, 0x14bfff,
0x13bfff, 0x127fff, 0x113fff, 0x0fffff, 0x0e7fff, 0x0cffff, 0x0b7fff,
0x097fff, 0x077fff, 0x04ffff, 0x027fff};
const uint32_t env_table[] = {
0x000000, 0x000023, 0x000026, 0x000029, 0x00002d, 0x000031, 0x000036,
0x00003b, 0x000040, 0x000046, 0x00004c, 0x000052, 0x00005a, 0x000062,
0x00006c, 0x000076, 0x000080, 0x00008c, 0x000098, 0x0000a4, 0x0000b4,
0x0000c4, 0x0000d8, 0x0000ec, 0x000104, 0x00011c, 0x000134, 0x00014c,
0x00016c, 0x00018c, 0x0001b4, 0x0001dc, 0x000200, 0x000230, 0x000260,
0x000290, 0x0002d0, 0x000310, 0x000360, 0x0003b0, 0x000400, 0x000460,
0x0004c0, 0x000520, 0x0005a0, 0x000620, 0x0006c0, 0x000760, 0x000800,
0x0008c0, 0x000980, 0x000a40, 0x000b40, 0x000c40, 0x000d80, 0x000ec0,
0x001000, 0x001180, 0x001300, 0x001480, 0x001680, 0x001880, 0x001b00,
0x001d80, 0x002000, 0x002300, 0x002600, 0x002900, 0x002d00, 0x003100,
0x003600, 0x003b00, 0x004000, 0x004600, 0x004c00, 0x005200, 0x005a00,
0x006200, 0x006c00, 0x007600, 0x008000, 0x008c00, 0x009800, 0x00a400,
0x00b400, 0x00c400, 0x00d800, 0x00ec00, 0x010000, 0x011800, 0x013000,
0x014800, 0x016800, 0x018800, 0x01b000, 0x01d800, 0x020000, 0x023000,
0x026000, 0x029000, 0x02d000, 0x031000, 0x036000, 0x03b000, 0x040000,
0x046000, 0x04c000, 0x052000, 0x05a000, 0x062000, 0x06c000, 0x076000,
0x080000, 0x08c000, 0x098000, 0x0a4000, 0x0b4000, 0x0c4000, 0x0d8000,
0x0ec000, 0x100000, 0x118000, 0x130000, 0x148000, 0x168000, 0x188000,
0x1b0000, 0x1d8000, 0x000000, 0x1fffdc, 0x1fffd9, 0x1fffd6, 0x1fffd2,
0x1fffce, 0x1fffc9, 0x1fffc4, 0x1fffbf, 0x1fffb9, 0x1fffb3, 0x1fffad,
0x1fffa5, 0x1fff9d, 0x1fff93, 0x1fff89, 0x1fff7f, 0x1fff73, 0x1fff67,
0x1fff5b, 0x1fff4b, 0x1fff3b, 0x1fff27, 0x1fff13, 0x1ffefb, 0x1ffee3,
0x1ffecb, 0x1ffeb3, 0x1ffe93, 0x1ffe73, 0x1ffe4b, 0x1ffe23, 0x1ffdff,
0x1ffdcf, 0x1ffd9f, 0x1ffd6f, 0x1ffd2f, 0x1ffcef, 0x1ffc9f, 0x1ffc4f,
0x1ffbff, 0x1ffb9f, 0x1ffb3f, 0x1ffadf, 0x1ffa5f, 0x1ff9df, 0x1ff93f,
0x1ff89f, 0x1ff7ff, 0x1ff73f, 0x1ff67f, 0x1ff5bf, 0x1ff4bf, 0x1ff3bf,
0x1ff27f, 0x1ff13f, 0x1fefff, 0x1fee7f, 0x1fecff, 0x1feb7f, 0x1fe97f,
0x1fe77f, 0x1fe4ff, 0x1fe27f, 0x1fdfff, 0x1fdcff, 0x1fd9ff, 0x1fd6ff,
0x1fd2ff, 0x1fceff, 0x1fc9ff, 0x1fc4ff, 0x1fbfff, 0x1fb9ff, 0x1fb3ff,
0x1fadff, 0x1fa5ff, 0x1f9dff, 0x1f93ff, 0x1f89ff, 0x1f7fff, 0x1f73ff,
0x1f67ff, 0x1f5bff, 0x1f4bff, 0x1f3bff, 0x1f27ff, 0x1f13ff, 0x1effff,
0x1ee7ff, 0x1ecfff, 0x1eb7ff, 0x1e97ff, 0x1e77ff, 0x1e4fff, 0x1e27ff,
0x1dffff, 0x1dcfff, 0x1d9fff, 0x1d6fff, 0x1d2fff, 0x1cefff, 0x1c9fff,
0x1c4fff, 0x1bffff, 0x1b9fff, 0x1b3fff, 0x1adfff, 0x1a5fff, 0x19dfff,
0x193fff, 0x189fff, 0x17ffff, 0x173fff, 0x167fff, 0x15bfff, 0x14bfff,
0x13bfff, 0x127fff, 0x113fff, 0x0fffff, 0x0e7fff, 0x0cffff, 0x0b7fff,
0x097fff, 0x077fff, 0x04ffff, 0x027fff};
// LUT for bits 5/6/7/8 of the subphase
const uint16_t roland_sa_device::addr_table[] = {0x1e0, 0x080, 0x060, 0x04d, 0x040, 0x036, 0x02d, 0x026,
0x020, 0x01b, 0x016, 0x011, 0x00d, 0x00a, 0x006, 0x003};
const uint16_t addr_table[] = {0x1e0, 0x080, 0x060, 0x04d, 0x040, 0x036, 0x02d, 0x026,
0x020, 0x01b, 0x016, 0x011, 0x00d, 0x00a, 0x006, 0x003};
} // anonymous namespace
DEFINE_DEVICE_TYPE(ROLAND_SA, roland_sa_device, "roland_sa", "Roland SA CPU-B Sound Generator")
roland_sa_device::roland_sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
: device_t(mconfig, ROLAND_SA, tag, owner, clock)
, device_sound_interface(mconfig, *this)
, m_int_callback(*this)
, m_stream(nullptr)
: device_t(mconfig, ROLAND_SA, tag, owner, clock)
, device_sound_interface(mconfig, *this)
, m_int_callback(*this)
, m_stream(nullptr)
{
}
void roland_sa_device::device_start()
{
m_stream = stream_alloc(0, 2, 20000, STREAM_SYNCHRONOUS);
m_stream = stream_alloc(0, 2, 20000, STREAM_SYNCHRONOUS);
}
void roland_sa_device::device_reset()
{
m_int_callback(CLEAR_LINE);
m_int_callback(CLEAR_LINE);
m_irq_id = 0;
m_irq_triggered = false;
memset(m_parts, 0, sizeof(m_parts));
m_irq_id = 0;
m_irq_triggered = false;
memset(m_parts, 0, sizeof(m_parts));
}
void roland_sa_device::set_sr_mode(bool mode)
{
if (m_sr_mode != mode)
m_stream->set_sample_rate(mode ? 20000 : 32000);
m_sr_mode = mode;
if (m_sr_mode != mode)
m_stream->set_sample_rate(mode ? 20000 : 32000);
m_sr_mode = mode;
}
void roland_sa_device::load_roms(uint8_t *ic5, uint8_t *ic6, uint8_t *ic7)
{
// Exp table to for the subphase
// TODO: This is bit accurate, but I want to believe there is a better way to compute this function
for (size_t i = 0; i < 0x10000; i++)
{
// ROM IC11
uint16_t r11_pos = i % 4096;
uint16_t r11 = (uint16_t)round(exp2f(13.0 + r11_pos / 4096.0) - 4096 * 2);
bool r11_12 = !((r11 >> 12) & 1);
bool r11_11 = !((r11 >> 11) & 1);
bool r11_10 = !((r11 >> 10) & 1);
bool r11_9 = !((r11 >> 9) & 1);
bool r11_8 = !((r11 >> 8) & 1);
bool r11_7 = !((r11 >> 7) & 1);
bool r11_6 = !((r11 >> 6) & 1);
bool r11_5 = !((r11 >> 5) & 1);
bool r11_4 = (r11 >> 4) & 1;
bool r11_3 = (r11 >> 3) & 1;
bool r11_2 = (r11 >> 2) & 1;
bool r11_1 = (r11 >> 1) & 1;
bool r11_0 = (r11 >> 0) & 1;
// Exp table to for the subphase
// TODO: This is bit accurate, but I want to believe there is a better way to compute this function
for (size_t i = 0; i < 0x10000; i++)
{
// ROM IC11
uint16_t r11_pos = i % 4096;
uint16_t r11 = (uint16_t)round(exp2f(13.0 + r11_pos / 4096.0) - 4096 * 2);
bool r11_12 = !((r11 >> 12) & 1);
bool r11_11 = !((r11 >> 11) & 1);
bool r11_10 = !((r11 >> 10) & 1);
bool r11_9 = !((r11 >> 9) & 1);
bool r11_8 = !((r11 >> 8) & 1);
bool r11_7 = !((r11 >> 7) & 1);
bool r11_6 = !((r11 >> 6) & 1);
bool r11_5 = !((r11 >> 5) & 1);
bool r11_4 = (r11 >> 4) & 1;
bool r11_3 = (r11 >> 3) & 1;
bool r11_2 = (r11 >> 2) & 1;
bool r11_1 = (r11 >> 1) & 1;
bool r11_0 = (r11 >> 0) & 1;
uint8_t param_bus_0 = ((i / 0x1000) >> 0) & 1;
uint8_t param_bus_1 = ((i / 0x1000) >> 1) & 1;
uint8_t param_bus_2 = ((i / 0x1000) >> 2) & 1;
uint8_t param_bus_3 = ((i / 0x1000) >> 3) & 1;
uint8_t param_bus_0 = ((i / 0x1000) >> 0) & 1;
uint8_t param_bus_1 = ((i / 0x1000) >> 1) & 1;
uint8_t param_bus_2 = ((i / 0x1000) >> 2) & 1;
uint8_t param_bus_3 = ((i / 0x1000) >> 3) & 1;
// Copy pasted from silicon
bool result_b0 = (!r11_6 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_2 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_0 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3);
bool result_b1 = (!r11_7 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_3 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_0 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3);
bool result_b2 = !(!((!r11_8 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !(r11_0 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b3 = !(!((!r11_9 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_1 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b4 = !(!((!r11_10 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_2 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (0 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b5 = !(!((!r11_11 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_3 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b6 = !(!((!r11_12 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_4 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b7 = !(!((1 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((!r11_5 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b8 = !(!((0 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (1 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((!r11_6 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b9 = !(!((1 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3)) && !((!r11_5 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b10 = !(!((1 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)) && !(!r11_5 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b11 = (1 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b12 = (0 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (1 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b13 = (1 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b14 = !(1 && !(1 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) && !(!r11_12 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_10 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_9 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b15 = !(!(!param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_10 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b16 = !(!(param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b17 = !(!(!param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b18 = param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3;
// Copy pasted from silicon
bool result_b0 = (!r11_6 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_2 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_0 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3);
bool result_b1 = (!r11_7 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_3 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_0 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3);
bool result_b2 = !(!((!r11_8 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_1 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !(r11_0 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b3 = !(!((!r11_9 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_2 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_1 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b4 = !(!((!r11_10 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_2 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (0 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b5 = !(!((!r11_11 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_3 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_0 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b6 = !(!((!r11_12 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_5 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((r11_4 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_1 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b7 = !(!((1 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((!r11_5 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_2 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b8 = !(!((0 && !param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (1 && param_bus_0 && !param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3)) && !((!r11_6 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_5 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_3 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b9 = !(!((1 && !param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_7 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3)) && !((!r11_5 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (r11_4 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)));
bool result_b10 = !(!((1 && param_bus_0 && param_bus_1 && !param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_8 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3)) && !(!r11_5 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b11 = (1 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_9 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_6 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b12 = (0 && !param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (1 && param_bus_0 && !param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_10 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_9 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_7 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b13 = (1 && !param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_12 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) || (!r11_11 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_10 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_9 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) || (!r11_8 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3);
bool result_b14 = !(1 && !(1 && param_bus_0 && param_bus_1 && param_bus_2 && !param_bus_3) && !(!r11_12 && !param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_10 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_9 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b15 = !(!(!param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_10 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b16 = !(!(param_bus_0 && !param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && !param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_11 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b17 = !(!(!param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3) && !(!r11_12 && param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3));
bool result_b18 = param_bus_0 && param_bus_1 && !param_bus_2 && param_bus_3;
uint32_t result =
result_b18 << 18 | result_b17 << 17 | result_b16 << 16 | result_b15 << 15 | result_b14 << 14 | result_b13 << 13 |
result_b12 << 12 | result_b11 << 11 | result_b10 << 10 | result_b9 << 9 | result_b8 << 8 | result_b7 << 7 |
result_b6 << 6 | result_b5 << 5 | result_b4 << 4 | result_b3 << 3 | result_b2 << 2 | result_b1 << 1 | result_b0 << 0;
phase_exp_table[i] = result;
}
uint32_t result =
result_b18 << 18 | result_b17 << 17 | result_b16 << 16 | result_b15 << 15 | result_b14 << 14 | result_b13 << 13 |
result_b12 << 12 | result_b11 << 11 | result_b10 << 10 | result_b9 << 9 | result_b8 << 8 | result_b7 << 7 |
result_b6 << 6 | result_b5 << 5 | result_b4 << 4 | result_b3 << 3 | result_b2 << 2 | result_b1 << 1 | result_b0 << 0;
phase_exp_table[i] = result;
}
// Exp table to decode samples
// TODO: This is bit accurate, but I want to believe there is a better way to compute this function
for (size_t i = 0; i < 0x8000; i++)
{
// ROM IC10
uint16_t r10_pos = i % 1024;
uint16_t r10 = (uint16_t)round(exp2f(11.0 + ~r10_pos / 1024.0) - 1024);
bool r10_9 = (r10 >> 0) & 1;
bool r10_8 = (r10 >> 1) & 1;
bool r10_0 = (r10 >> 2) & 1;
bool r10_1 = (r10 >> 3) & 1;
bool r10_2 = (r10 >> 4) & 1;
bool r10_3 = !((r10 >> 5) & 1);
bool r10_4 = !((r10 >> 6) & 1);
bool r10_5 = !((r10 >> 7) & 1);
bool r10_6 = !((r10 >> 8) & 1);
bool r10_7 = !((r10 >> 9) & 1);
// Exp table to decode samples
// TODO: This is bit accurate, but I want to believe there is a better way to compute this function
for (size_t i = 0; i < 0x8000; i++)
{
// ROM IC10
uint16_t r10_pos = i % 1024;
uint16_t r10 = (uint16_t)round(exp2f(11.0 + ~r10_pos / 1024.0) - 1024);
bool r10_9 = BIT(r10, 0);
bool r10_8 = BIT(r10, 1);
bool r10_0 = BIT(r10, 2);
bool r10_1 = BIT(r10, 3);
bool r10_2 = BIT(r10, 4);
bool r10_3 = BIT(~r10, 5);
bool r10_4 = BIT(~r10, 6);
bool r10_5 = BIT(~r10, 7);
bool r10_6 = BIT(~r10, 8);
bool r10_7 = BIT(~r10, 9);
bool wavein_sign = i >= 0x4000;
uint8_t add_r_0 = ((i / 0x400) >> 0) & 1;
uint8_t add_r_1 = ((i / 0x400) >> 1) & 1;
uint8_t add_r_2 = ((i / 0x400) >> 2) & 1;
uint8_t add_r_3 = ((i / 0x400) >> 3) & 1;
bool wavein_sign = i >= 0x4000;
uint8_t add_r_0 = BIT(i / 0x400, 0);
uint8_t add_r_1 = BIT(i / 0x400, 1);
uint8_t add_r_2 = BIT(i / 0x400, 2);
uint8_t add_r_3 = BIT(i / 0x400, 3);
// Copy pasted from silicon
bool result_b14 = !((!(!add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!add_r_3 && !add_r_2 && !add_r_1 && !add_r_0 && wavein_sign));
bool result_b13 = !((((!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && wavein_sign) || (!((!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign));
bool result_b12 = !((((!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && wavein_sign) || (!((!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b11 = !((((!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && wavein_sign) || (!((!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !wavein_sign));
bool result_b10 = !((!((!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !(!add_r_3 && add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!(!((!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !(!add_r_3 && add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign));
bool result_b9 = !((((1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b8 = !((((1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (1 && 0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (1 && 0)) && !wavein_sign));
bool result_b7 = !((((1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b6 = !((!((1 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !(r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!(!((1 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !(r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign));
bool result_b5 = !((!((!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign) || (!(!((!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && !add_r_1 && add_r_0))) && wavein_sign));
bool result_b4 = !((!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && !add_r_0))) && wavein_sign));
bool result_b3 = !((!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && add_r_0))) && wavein_sign));
bool result_b2 = !((!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && !add_r_0))) && wavein_sign));
bool result_b1 = !((!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && add_r_0))) && wavein_sign));
bool result_b0 = !((!((r10_8 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (r10_2 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (r10_2 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && add_r_2 && add_r_1 && !add_r_0))) && wavein_sign));
// Copy pasted from silicon
bool result_b14 = !((!(!add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!add_r_3 && !add_r_2 && !add_r_1 && !add_r_0 && wavein_sign));
bool result_b13 = !((((!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && wavein_sign) || (!((!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign));
bool result_b12 = !((((!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && wavein_sign) || (!((!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b11 = !((((!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && wavein_sign) || (!((!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !wavein_sign));
bool result_b10 = !((!((!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !(!add_r_3 && add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!(!((!r10_7 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !(!add_r_3 && add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign));
bool result_b9 = !((((1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b8 = !((((1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (1 && 0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (1 && 0)) && !wavein_sign));
bool result_b7 = !((((1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign) || (!((1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign));
bool result_b6 = !((!((1 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !(r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) && !wavein_sign) || (!(!((1 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !(r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && wavein_sign));
bool result_b5 = !((!((!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign) || (!(!((!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_6 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && !add_r_1 && add_r_0))) && wavein_sign));
bool result_b4 = !((!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && !add_r_3 && add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && !add_r_0))) && wavein_sign));
bool result_b3 = !((!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_4 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (add_r_3 && !add_r_2 && add_r_1 && add_r_0))) && wavein_sign));
bool result_b2 = !((!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (!r10_3 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && !add_r_0))) && wavein_sign));
bool result_b1 = !((!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_0 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_2 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0)) && !((!r10_6 && add_r_3 && !add_r_2 && add_r_1 && add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (add_r_3 && add_r_2 && !add_r_1 && add_r_0))) && wavein_sign));
bool result_b0 = !((!((r10_8 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (r10_2 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && add_r_2 && add_r_1 && !add_r_0)) && !wavein_sign) || (!(!((r10_8 && !add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (r10_9 && !add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (r10_0 && !add_r_3 && add_r_2 && add_r_1 && !add_r_0) || (r10_1 && !add_r_3 && add_r_2 && add_r_1 && add_r_0) || (r10_2 && add_r_3 && !add_r_2 && !add_r_1 && !add_r_0) || (!r10_3 && add_r_3 && !add_r_2 && !add_r_1 && add_r_0) || (!r10_4 && add_r_3 && !add_r_2 && add_r_1 && !add_r_0) || (!r10_5 && add_r_3 && !add_r_2 && add_r_1 && add_r_0)) && !((!r10_6 && add_r_3 && add_r_2 && !add_r_1 && !add_r_0) || (!r10_7 && add_r_3 && add_r_2 && !add_r_1 && add_r_0) || (add_r_3 && add_r_2 && add_r_1 && !add_r_0))) && wavein_sign));
uint16_t result =
result_b14 << 14 | result_b13 << 13 | result_b12 << 12 | result_b11 << 11 | result_b10 << 10 |
result_b9 << 9 | result_b8 << 8 | result_b7 << 7 | result_b6 << 6 | result_b5 << 5 |
result_b4 << 4 | result_b3 << 3 | result_b2 << 2 | result_b1 << 1 | result_b0 << 0;
samples_exp_table[i] = result;
}
uint16_t result =
result_b14 << 14 | result_b13 << 13 | result_b12 << 12 | result_b11 << 11 | result_b10 << 10 |
result_b9 << 9 | result_b8 << 8 | result_b7 << 7 | result_b6 << 6 | result_b5 << 5 |
result_b4 << 4 | result_b3 << 3 | result_b2 << 2 | result_b1 << 1 | result_b0 << 0;
samples_exp_table[i] = result;
}
// Wave rom values
for (size_t i = 0; i < 0x20000; i++)
{
size_t descrambled_i = (
((i >> 0) & 1) << 0 |
((~i >> 1) & 1) << 1 |
((i >> 2) & 1) << 2 |
((~i >> 3) & 1) << 3 |
((i >> 4) & 1) << 4 |
((~i >> 5) & 1) << 5 |
((i >> 6) & 1) << 6 |
((i >> 7) & 1) << 7 |
((~i >> 8) & 1) << 8 |
((~i >> 9) & 1) << 9 |
((i >> 10) & 1) << 10 |
((i >> 11) & 1) << 11 |
((i >> 12) & 1) << 12 |
((i >> 13) & 1) << 13 |
((i >> 14) & 1) << 14 |
((i >> 15) & 1) << 15 |
((i >> 16) & 1) << 16
);
// Wave rom values
for (size_t i = 0; i < 0x20000; i++)
{
const size_t descrambled_i = i ^ 0b0'00000011'00101010;
uint16_t exp_sample = (
((ic5[descrambled_i] >> 0) & 1) << 13 |
((ic6[descrambled_i] >> 4) & 1) << 12 |
((ic7[descrambled_i] >> 4) & 1) << 11 |
((~ic6[descrambled_i] >> 0) & 1) << 10 |
((ic7[descrambled_i] >> 7) & 1) << 9 |
((ic5[descrambled_i] >> 7) & 1) << 8 |
((~ic5[descrambled_i] >> 5) & 1) << 7 |
((ic6[descrambled_i] >> 2) & 1) << 6 |
((ic7[descrambled_i] >> 2) & 1) << 5 |
((ic7[descrambled_i] >> 1) & 1) << 4 |
((~ic5[descrambled_i] >> 1) & 1) << 3 |
((ic5[descrambled_i] >> 3) & 1) << 2 |
((ic6[descrambled_i] >> 5) & 1) << 1 |
((~ic6[descrambled_i] >> 7) & 1) << 0
);
bool exp_sign = (~ic7[descrambled_i] >> 3) & 1;
samples_exp[i] = exp_sample;
samples_exp_sign[i] = exp_sign;
const uint16_t exp_sample =
BIT( ic5[descrambled_i], 0) << 13 |
BIT( ic6[descrambled_i], 4) << 12 |
BIT( ic7[descrambled_i], 4) << 11 |
BIT(~ic6[descrambled_i], 0) << 10 |
BIT( ic7[descrambled_i], 7) << 9 |
BIT( ic5[descrambled_i], 7) << 8 |
BIT(~ic5[descrambled_i], 5) << 7 |
BIT( ic6[descrambled_i], 2) << 6 |
BIT( ic7[descrambled_i], 2) << 5 |
BIT( ic7[descrambled_i], 1) << 4 |
BIT(~ic5[descrambled_i], 1) << 3 |
BIT( ic5[descrambled_i], 3) << 2 |
BIT( ic6[descrambled_i], 5) << 1 |
BIT(~ic6[descrambled_i], 7) << 0;
const bool exp_sign = BIT(~ic7[descrambled_i], 3);
samples_exp[i] = exp_sample;
samples_exp_sign[i] = exp_sign;
uint16_t delta_sample = (
((~ic7[descrambled_i] >> 6) & 1) << 8 |
((ic5[descrambled_i] >> 4) & 1) << 7 |
((ic7[descrambled_i] >> 0) & 1) << 6 |
((~ic6[descrambled_i] >> 3) & 1) << 5 |
((ic5[descrambled_i] >> 2) & 1) << 4 |
((~ic5[descrambled_i] >> 6) & 1) << 3 |
((ic6[descrambled_i] >> 6) & 1) << 2 |
((ic7[descrambled_i] >> 5) & 1) << 1 |
((~ic6[descrambled_i] >> 7) & 1) << 0
);
bool delta_sign = (ic6[descrambled_i] >> 1) & 1;
samples_delta[i] = delta_sample;
samples_delta_sign[i] = delta_sign;
}
const uint16_t delta_sample =
BIT(~ic7[descrambled_i], 6) << 8 |
BIT( ic5[descrambled_i], 4) << 7 |
BIT( ic7[descrambled_i], 0) << 6 |
BIT(~ic6[descrambled_i], 3) << 5 |
BIT( ic5[descrambled_i], 2) << 4 |
BIT(~ic5[descrambled_i], 6) << 3 |
BIT( ic6[descrambled_i], 6) << 2 |
BIT( ic7[descrambled_i], 5) << 1 |
BIT(~ic6[descrambled_i], 7) << 0;
const bool delta_sign = BIT(ic6[descrambled_i], 1);
samples_delta[i] = delta_sample;
samples_delta_sign[i] = delta_sign;
}
}
u8 roland_sa_device::read(offs_t offset)
{
if (!machine().side_effects_disabled())
return m_irq_id;
if (!machine().side_effects_disabled())
return m_irq_id;
return m_ctrl_mem[offset];
return m_ctrl_mem[offset];
}
void roland_sa_device::write(offs_t offset, u8 data)
{
m_int_callback(CLEAR_LINE);
m_irq_triggered = false;
m_int_callback(CLEAR_LINE);
m_irq_triggered = false;
m_ctrl_mem[offset] = data;
m_ctrl_mem[offset] = data;
}
void roland_sa_device::sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs)
{
outputs[0].fill(0);
outputs[0].fill(0);
int32_t *int_buffer = new int32_t[outputs[0].samples()];
for (size_t i = 0; i < outputs[0].samples(); i++)
int_buffer[i] = 0;
std::unique_ptr<int32_t []> int_buffer = make_unique_clear<int32_t []>(outputs[0].samples());
for (size_t voiceI = 0; voiceI < NUM_VOICES; voiceI++)
{
for (size_t partI = 0; partI < PARTS_PER_VOICE; partI++)
{
SA_Part &part = m_parts[voiceI][partI];
size_t mem_offset = voiceI * 0x100 + partI * 0x10;
uint32_t pitch_lut_i = m_ctrl_mem[mem_offset + 1] | (m_ctrl_mem[mem_offset + 0] << 8);
uint32_t wave_addr_loop = m_ctrl_mem[mem_offset + 2];
uint32_t wave_addr_high = m_ctrl_mem[mem_offset + 3];
uint32_t env_dest = m_ctrl_mem[mem_offset + 4];
uint32_t env_speed = m_ctrl_mem[mem_offset + 5];
uint32_t flags = m_ctrl_mem[mem_offset + 6];
uint32_t env_offset = m_ctrl_mem[mem_offset + 7];
for (size_t voiceI = 0; voiceI < NUM_VOICES; voiceI++)
{
for (size_t partI = 0; partI < PARTS_PER_VOICE; partI++)
{
SA_Part &part = m_parts[voiceI][partI];
size_t mem_offset = voiceI * 0x100 + partI * 0x10;
uint32_t pitch_lut_i = m_ctrl_mem[mem_offset + 1] | (m_ctrl_mem[mem_offset + 0] << 8);
uint32_t wave_addr_loop = m_ctrl_mem[mem_offset + 2];
uint32_t wave_addr_high = m_ctrl_mem[mem_offset + 3];
uint32_t env_dest = m_ctrl_mem[mem_offset + 4];
uint32_t env_speed = m_ctrl_mem[mem_offset + 5];
uint32_t flags = m_ctrl_mem[mem_offset + 6];
uint32_t env_offset = m_ctrl_mem[mem_offset + 7];
bool irq = false;
bool irq = false;
for (size_t i = 0; i < outputs[0].samples(); i++)
{
uint32_t volume;
uint32_t waverom_addr;
bool ag3_sel_sample_type;
bool ag1_phase_hi;
for (size_t i = 0; i < outputs[0].samples(); i++)
{
uint32_t volume;
uint32_t waverom_addr;
bool ag3_sel_sample_type;
bool ag1_phase_hi;
// IC19
{
bool env_speed_some_high =
BIT(env_speed, 6) || BIT(env_speed, 5) || BIT(env_speed, 4) || BIT(env_speed, 3) ||
BIT(env_speed, 2) || BIT(env_speed, 1) || BIT(env_speed, 0);
// IC19
{
bool env_speed_some_high =
BIT(env_speed, 6) || BIT(env_speed, 5) || BIT(env_speed, 4) || BIT(env_speed, 3) ||
BIT(env_speed, 2) || BIT(env_speed, 1) || BIT(env_speed, 0);
uint32_t adder1_a = part.env_value;
if (BIT(flags, 0))
adder1_a = 1 << 25;
uint32_t adder1_b = env_table[env_speed];
bool adder1_ci = env_speed_some_high && BIT(env_speed, 7);
if (adder1_ci)
adder1_b |= 0x7f << 21;
uint32_t adder1_a = part.env_value;
if (BIT(flags, 0))
adder1_a = 1 << 25;
uint32_t adder1_b = env_table[env_speed];
bool adder1_ci = env_speed_some_high && BIT(env_speed, 7);
if (adder1_ci)
adder1_b |= 0x7f << 21;
uint32_t adder3_o = 1 + (adder1_a >> 20) + env_offset;
uint32_t adder3_of = adder3_o > 0xff;
adder3_o &= 0xff;
uint32_t adder3_o = 1 + (adder1_a >> 20) + env_offset;
uint32_t adder3_of = adder3_o > 0xff;
adder3_o &= 0xff;
volume = ~(
((adder1_a >> 14) & 0b111111) |
((adder3_o & 0b1111) << 6) |
(adder3_of ? ((adder3_o & 0b11110000) << 6) : 0)
) & 0x3fff;
volume = ~(
((adder1_a >> 14) & 0b111111) |
((adder3_o & 0b1111) << 6) |
(adder3_of ? ((adder3_o & 0b11110000) << 6) : 0)
) & 0x3fff;
uint32_t adder1_o = adder1_a + adder1_b + (adder1_ci ? 1 : 0);
uint32_t adder1_of = adder1_o > 0xfffffff;
adder1_o &= 0xfffffff;
uint32_t adder1_o = adder1_a + adder1_b + (adder1_ci ? 1 : 0);
uint32_t adder1_of = adder1_o > 0xfffffff;
adder1_o &= 0xfffffff;
uint32_t adder2_o = (adder1_o >> 20) + (~env_dest & 0xff) + 1;
uint32_t adder2_of = adder2_o > 0xff;
uint32_t adder2_o = (adder1_o >> 20) + (~env_dest & 0xff) + 1;
uint32_t adder2_of = adder2_o > 0xff;
bool end_reached = env_speed_some_high && ((adder1_of != (BIT(env_speed, 7))) || ((BIT(env_speed, 7)) != adder2_of));
irq |= end_reached;
bool end_reached = env_speed_some_high && ((adder1_of != (BIT(env_speed, 7))) || ((BIT(env_speed, 7)) != adder2_of));
irq |= end_reached;
part.env_value = end_reached ? (env_dest << 20) : adder1_o;
}
part.env_value = end_reached ? (env_dest << 20) : adder1_o;
}
// IC9
{
uint32_t adder1 = (phase_exp_table[pitch_lut_i] + part.sub_phase) & 0xffffff;
uint32_t adder2 = 1 + (adder1 >> 16) + ((~wave_addr_loop) & 0xff);
bool adder2_co = adder2 > 0xff;
adder2 &= 0xff;
uint32_t adder1_and = BIT(flags, 1) ? 0 : (adder1 & 0xffff);
adder1_and |= (BIT(flags, 1) ? 0 : (adder2_co ? adder2 : (adder1 >> 16))) << 16;
// IC9
{
uint32_t adder1 = (phase_exp_table[pitch_lut_i] + part.sub_phase) & 0xffffff;
uint32_t adder2 = 1 + (adder1 >> 16) + ((~wave_addr_loop) & 0xff);
bool adder2_co = adder2 > 0xff;
adder2 &= 0xff;
uint32_t adder1_and = BIT(flags, 1) ? 0 : (adder1 & 0xffff);
adder1_and |= (BIT(flags, 1) ? 0 : (adder2_co ? adder2 : (adder1 >> 16))) << 16;
part.sub_phase = adder1_and;
waverom_addr = (wave_addr_high << 11) | ((part.sub_phase >> 9) & 0x7ff);
part.sub_phase = adder1_and;
waverom_addr = (wave_addr_high << 11) | ((part.sub_phase >> 9) & 0x7ff);
ag3_sel_sample_type = BIT(waverom_addr, 16) || BIT(waverom_addr, 15) || BIT(waverom_addr, 14) ||
!((BIT(waverom_addr, 13) && !BIT(waverom_addr, 11) && !BIT(waverom_addr, 12)) || !BIT(waverom_addr, 13));
ag1_phase_hi = (
(BIT(pitch_lut_i, 15) && BIT(pitch_lut_i, 14)) ||
(BIT(part.sub_phase, 23) || BIT(part.sub_phase, 22) || BIT(part.sub_phase, 21) || BIT(part.sub_phase, 20)) ||
BIT(flags, 1)
);
}
ag3_sel_sample_type = BIT(waverom_addr, 16) || BIT(waverom_addr, 15) || BIT(waverom_addr, 14) ||
!((BIT(waverom_addr, 13) && !BIT(waverom_addr, 11) && !BIT(waverom_addr, 12)) || !BIT(waverom_addr, 13));
ag1_phase_hi = (
(BIT(pitch_lut_i, 15) && BIT(pitch_lut_i, 14)) ||
(BIT(part.sub_phase, 23) || BIT(part.sub_phase, 22) || BIT(part.sub_phase, 21) || BIT(part.sub_phase, 20)) ||
BIT(flags, 1)
);
}
// IC8
{
uint32_t waverom_pa = samples_exp[waverom_addr];
uint32_t waverom_pb = samples_delta[waverom_addr];
bool sign_pa = samples_exp_sign[waverom_addr];
bool sign_pb = samples_delta_sign[waverom_addr];
waverom_pa |= ag3_sel_sample_type ? 1 : 0;
waverom_pb |= ag3_sel_sample_type ? 0 : 1;
// IC8
{
uint32_t waverom_pa = samples_exp[waverom_addr];
uint32_t waverom_pb = samples_delta[waverom_addr];
bool sign_pa = samples_exp_sign[waverom_addr];
bool sign_pb = samples_delta_sign[waverom_addr];
waverom_pa |= ag3_sel_sample_type ? 1 : 0;
waverom_pb |= ag3_sel_sample_type ? 0 : 1;
if (ag1_phase_hi)
volume |= 0b1111 << 10;
if (ag1_phase_hi)
volume |= 0b1111 << 10;
uint32_t tmp_1, tmp_2;
uint32_t tmp_1, tmp_2;
uint32_t adder1_o = volume + waverom_pa;
bool adder1_co = adder1_o > 0x3fff;
adder1_o &= 0x3fff;
if (adder1_co)
adder1_o |= 0x3c00;
tmp_1 = adder1_o;
uint32_t adder1_o = volume + waverom_pa;
bool adder1_co = adder1_o > 0x3fff;
adder1_o &= 0x3fff;
if (adder1_co)
adder1_o |= 0x3c00;
tmp_1 = adder1_o;
uint32_t adder3_o = addr_table[(part.sub_phase >> 5) & 0xf] + (waverom_pb & 0x1ff);
bool adder3_of = adder3_o > 0x1ff;
adder3_o &= 0x1ff;
if (adder3_of)
adder3_o |= 0x1e0;
uint32_t adder3_o = addr_table[(part.sub_phase >> 5) & 0xf] + (waverom_pb & 0x1ff);
bool adder3_of = adder3_o > 0x1ff;
adder3_o &= 0x1ff;
if (adder3_of)
adder3_o |= 0x1e0;
adder1_o = volume + (adder3_o << 5);
adder1_co = adder1_o > 0x3fff;
adder1_o &= 0x3fff;
if (adder1_co)
adder1_o |= 0x3c00;
tmp_2 = adder1_o;
adder1_o = volume + (adder3_o << 5);
adder1_co = adder1_o > 0x3fff;
adder1_o &= 0x3fff;
if (adder1_co)
adder1_o |= 0x3c00;
tmp_2 = adder1_o;
int32_t exp_val1 = samples_exp_table[(16384 * sign_pa) + (1024 * (tmp_1 >> 10)) + (tmp_1 & 1023)];
int32_t exp_val2 = samples_exp_table[(16384 * sign_pb) + (1024 * (tmp_2 >> 10)) + (tmp_2 & 1023)];
if (sign_pa)
exp_val1 = exp_val1 - 0x8000;
if (sign_pb)
exp_val2 = exp_val2 - 0x8000;
int32_t exp_val = exp_val1 + exp_val2;
int32_t exp_val1 = samples_exp_table[(16384 * sign_pa) + (1024 * (tmp_1 >> 10)) + (tmp_1 & 1023)];
int32_t exp_val2 = samples_exp_table[(16384 * sign_pb) + (1024 * (tmp_2 >> 10)) + (tmp_2 & 1023)];
if (sign_pa)
exp_val1 = exp_val1 - 0x8000;
if (sign_pb)
exp_val2 = exp_val2 - 0x8000;
int32_t exp_val = exp_val1 + exp_val2;
int_buffer[i] += exp_val;
}
}
int_buffer[i] += exp_val;
}
}
if (irq && !m_irq_triggered)
{
m_irq_id = partI | (voiceI << 4);
m_int_callback(ASSERT_LINE);
m_irq_triggered = true;
}
}
}
if (irq && !m_irq_triggered)
{
m_irq_id = partI | (voiceI << 4);
m_int_callback(ASSERT_LINE);
m_irq_triggered = true;
}
}
}
for (size_t i = 0; i < outputs[0].samples(); i++)
outputs[0].put_int(i, int_buffer[i], 0xffff);
delete[] int_buffer;
for (size_t i = 0; i < outputs[0].samples(); i++)
outputs[0].put_int(i, int_buffer[i], 0xffff);
}

View File

@ -8,53 +8,50 @@
class roland_sa_device : public device_t, public device_sound_interface
{
public:
roland_sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
roland_sa_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
auto int_callback() { return m_int_callback.bind(); }
auto int_callback() { return m_int_callback.bind(); }
u8 read(offs_t offset);
void write(offs_t offset, u8 data);
u8 read(offs_t offset);
void write(offs_t offset, u8 data);
void load_roms(uint8_t *ic5, uint8_t *ic6, uint8_t *ic7);
void set_sr_mode(bool mode);
void load_roms(uint8_t *ic5, uint8_t *ic6, uint8_t *ic7);
void set_sr_mode(bool mode);
protected:
// device_t implementation
virtual void device_start() override;
virtual void device_reset() override;
// device_t implementation
virtual void device_start() override ATTR_COLD;
virtual void device_reset() override ATTR_COLD;
// device_sound_interface implementation
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
// device_sound_interface implementation
virtual void sound_stream_update(sound_stream &stream, std::vector<read_stream_view> const &inputs, std::vector<write_stream_view> &outputs) override;
private:
static constexpr unsigned NUM_VOICES = 16;
static constexpr unsigned PARTS_PER_VOICE = 10;
static constexpr unsigned NUM_VOICES = 16;
static constexpr unsigned PARTS_PER_VOICE = 10;
static const uint32_t env_table[];
static const uint16_t addr_table[];
uint16_t samples_exp[0x20000];
bool samples_exp_sign[0x20000];
uint16_t samples_delta[0x20000];
bool samples_delta_sign[0x20000];
uint16_t samples_exp[0x20000];
bool samples_exp_sign[0x20000];
uint16_t samples_delta[0x20000];
bool samples_delta_sign[0x20000];
uint32_t phase_exp_table[0x10000];
uint16_t samples_exp_table[0x8000];
uint32_t phase_exp_table[0x10000];
uint16_t samples_exp_table[0x8000];
struct SA_Part
{
uint32_t sub_phase;
uint32_t env_value;
};
struct SA_Part
{
uint32_t sub_phase;
uint32_t env_value;
};
devcb_write_line m_int_callback;
devcb_write_line m_int_callback;
sound_stream *m_stream; // stream handle
SA_Part m_parts[NUM_VOICES][PARTS_PER_VOICE]; // channel memory
uint8_t m_ctrl_mem[0x2000]; // RAM IC12 (as the CPU writes it)
uint8_t m_irq_id; // voice/part that triggered the IRQ
bool m_irq_triggered; // if there is an IRQ currently waiting
bool m_sr_mode; // sample rate mode (true = 20 KHz, false = 32 KHz)
sound_stream *m_stream; // stream handle
SA_Part m_parts[NUM_VOICES][PARTS_PER_VOICE]; // channel memory
uint8_t m_ctrl_mem[0x2000]; // RAM IC12 (as the CPU writes it)
uint8_t m_irq_id; // voice/part that triggered the IRQ
bool m_irq_triggered; // if there is an IRQ currently waiting
bool m_sr_mode; // sample rate mode (true = 20 KHz, false = 32 KHz)
};
DECLARE_DEVICE_TYPE(ROLAND_SA, roland_sa_device)

View File

@ -2,15 +2,15 @@
// copyright-holders:Devin Acker
/***************************************************************************
NEC/Casio uPD931 synthesis chip
NEC/Casio uPD931 synthesis chip
Many details of this implementation are based on research and notes by Robin Whittle:
https://www.firstpr.com.au/rwi/casio/Casio-931-2006-06-17.txt
Any references to MT-65 behavior are based on this document.
Many details of this implementation are based on research and notes by Robin Whittle:
https://www.firstpr.com.au/rwi/casio/Casio-931-2006-06-17.txt
Any references to MT-65 behavior are based on this document.
TODO:
- implement vibrato register (CT-8000 doesn't use it)
- a few other unknown/unclear bits in the flags shift register
TODO:
- implement vibrato register (CT-8000 doesn't use it)
- a few other unknown/unclear bits in the flags shift register
***************************************************************************/
#include "emu.h"

View File

@ -1241,11 +1241,11 @@ void amiga_state::aga_map(address_map &map)
void amiga_state::custom_chip_reset()
{
// TODO: not entirely correct
// - OCS Denise returns open bus
// - ECS Denise should return 0xff << 8 | ID
// - AGA Lisa bits 15-10 are jumper selectable (at least on A4000), returns 0xfc << 8 | ID
// cfr. https://eab.abime.net/showpost.php?p=627136&postcount=59
// TODO: not entirely correct
// - OCS Denise returns open bus
// - ECS Denise should return 0xff << 8 | ID
// - AGA Lisa bits 15-10 are jumper selectable (at least on A4000), returns 0xfc << 8 | ID
// cfr. https://eab.abime.net/showpost.php?p=627136&postcount=59
CUSTOM_REG(REG_DENISEID) = m_denise_id;
CUSTOM_REG(REG_VPOSR) = m_agnus_id << 8;
CUSTOM_REG(REG_DDFSTRT) = 0x18;
@ -1571,7 +1571,7 @@ void amiga_state::custom_chip_w(offs_t offset, uint16_t data)
case REG_DDFSTOP:
/* impose hardware limits ( HRM, page 75 ) */
// amigaaga_flop:aladdin writes 0x0100 here, expecting the HW limit to hit instead
// amigaaga_flop:aladdin writes 0x0100 here, expecting the HW limit to hit instead
data &= (IS_AGA() || IS_ECS()) ? 0xfffe : 0xfffc;
if (data > 0xd8)
{

View File

@ -3,34 +3,34 @@
// thanks-to:BCM
/***************************************************************************
Casiotone 8000 / "Symphonytron" system
Casiotone 8000 / "Symphonytron" system
The Symphonytron was a modular electronic organ produced by Casio in 1983.
The full system consists of:
The Symphonytron was a modular electronic organ produced by Casio in 1983.
The full system consists of:
- up to two Casiotone 8000 keyboards (8049 CPU, 2x uPD931 "vowel-consonant synthesis")
- RC-1 accompaniment unit (uPD7801 CPU, uPD930 rhythm generator, analog percussion)
- MB-1 memory unit (8049 CPU, 2x uPD931, RAM cartridge slot)
- FK-1 pedal keyboard (8049 CPU, single uPD931)
- CS-100 or CS-200 keyboard stand with built-in mixer
- up to two Casiotone 8000 keyboards (8049 CPU, 2x uPD931 "vowel-consonant synthesis")
- RC-1 accompaniment unit (uPD7801 CPU, uPD930 rhythm generator, analog percussion)
- MB-1 memory unit (8049 CPU, 2x uPD931, RAM cartridge slot)
- FK-1 pedal keyboard (8049 CPU, single uPD931)
- CS-100 or CS-200 keyboard stand with built-in mixer
The keyboards and memory unit all connect to the RC-1 via 14-pin DIN connectors.
Although the RAM cart slot is located on the MB-1, all actual access to the cart is controlled
remotely by the RC-1, which uses the cart to record and play back both rhythm/chord and melody
data. The MB-1's sound hardware is then used to play back recorded melody data independently of
the keyboards. The RC-1 also has a "tone mix" feature, where note data received from one keyboard
is automatically forwarded to the other.
The keyboards and memory unit all connect to the RC-1 via 14-pin DIN connectors.
Although the RAM cart slot is located on the MB-1, all actual access to the cart is controlled
remotely by the RC-1, which uses the cart to record and play back both rhythm/chord and melody
data. The MB-1's sound hardware is then used to play back recorded melody data independently of
the keyboards. The RC-1 also has a "tone mix" feature, where note data received from one keyboard
is automatically forwarded to the other.
The individual units can also be used on their own; the MB-1 will also respond to notes and tone
selection commands via the DIN connector, but it needs the RC-1 present to do much else.
It's marked as "not working" for this reason.
The individual units can also be used on their own; the MB-1 will also respond to notes and tone
selection commands via the DIN connector, but it needs the RC-1 present to do much else.
It's marked as "not working" for this reason.
This driver also features MIDI in/thru support via an "adapter" device which translates a subset
of MIDI messages into the protocol used with the original connectors.
This driver also features MIDI in/thru support via an "adapter" device which translates a subset
of MIDI messages into the protocol used with the original connectors.
TODO:
- volume/expression pedal (for all systems)
- fix aliasing in BBD output for some presets
TODO:
- volume/expression pedal (for all systems)
- fix aliasing in BBD output for some presets
***************************************************************************/

View File

@ -2,66 +2,66 @@
// copyright-holders:Devin Acker
/***************************************************************************
Casiotone 8000 / Symphonytron MIDI interface
Casiotone 8000 / Symphonytron MIDI interface
Translates MIDI messages into the 4-bit parallel protocol used by the Symphonytron.
Aside from Note Off/On and Program Change messages, this also handles:
- CC #1 (vibrato)
- CC #64 (sustain pedal)
- CC #69 (sustain switch)
- CC #91 (reverb)
- CC #93 (chorus)
- CC #120 (all sound off)
- CC #121 (reset controllers)
- CC #123 (all notes off)
- CC #124-127 (equivalent to 123, otherwise no effect)
- MIDI reset (status 0xFF)
Translates MIDI messages into the 4-bit parallel protocol used by the Symphonytron.
Aside from Note Off/On and Program Change messages, this also handles:
- CC #1 (vibrato)
- CC #64 (sustain pedal)
- CC #69 (sustain switch)
- CC #91 (reverb)
- CC #93 (chorus)
- CC #120 (all sound off)
- CC #121 (reset controllers)
- CC #123 (all notes off)
- CC #124-127 (equivalent to 123, otherwise no effect)
- MIDI reset (status 0xFF)
Vibrato, reverb, and chorus CCs all behave as switches, where 64-127 is "on".
Vibrato, reverb, and chorus CCs all behave as switches, where 64-127 is "on".
-------------------------------------------------------------------------------
Summary of 4-bit Symphonytron messages
Summary of 4-bit Symphonytron messages
Messages are sent in 4-bit increments over the DIN connector, in the following order:
- high nibble of command
- number of following nibbles (normally 1 or 3)
- low nibble of command
- high nibble of data (if any)
- low nibble of data (if any)
Messages are sent in 4-bit increments over the DIN connector, in the following order:
- high nibble of command
- number of following nibbles (normally 1 or 3)
- low nibble of command
- high nibble of data (if any)
- low nibble of data (if any)
The exception is the reset command, which is a single 0xF nibble.
The exception is the reset command, which is a single 0xF nibble.
The CT-8000 recognizes these messages:
10 xx - set effects
11 xx - lock effects (corresponding buttons/pedal do nothing while set)
12 xx - ??? effects
^^ bit 0 = reverb
bit 1 = vibrato
bit 2 = sustain pedal (only affects the local keyboard)
bit 3 = stereo chorus
bit 4 = sustain switch
The CT-8000 recognizes these messages:
10 xx - set effects
11 xx - lock effects (corresponding buttons/pedal do nothing while set)
12 xx - ??? effects
^^ bit 0 = reverb
bit 1 = vibrato
bit 2 = sustain pedal (only affects the local keyboard)
bit 3 = stereo chorus
bit 4 = sustain switch
20 xx - set lowest possible note to send (default is none)
21 xx - set highest possible note to send (default is none)
22 xx - set lowest possible note to receive/play (default is 0x21 = C2)
23 xx - set highest possible note to receive/play (default is 0x61 = C6)
24 - stop all notes
28 xx - note on or off
^^ bit 7 = note on, bits 6-4 = octave, bits 3-0 = note from 0x1 (C) to 0xC (B)
20 xx - set lowest possible note to send (default is none)
21 xx - set highest possible note to send (default is none)
22 xx - set lowest possible note to receive/play (default is 0x21 = C2)
23 xx - set highest possible note to receive/play (default is 0x61 = C6)
24 - stop all notes
28 xx - note on or off
^^ bit 7 = note on, bits 6-4 = octave, bits 3-0 = note from 0x1 (C) to 0xC (B)
C0 xx - set tuning (signed, 1.5 cent increments, 0x32 = quarter tone up)
C0 xx - set tuning (signed, 1.5 cent increments, 0x32 = quarter tone up)
E1 xx - set patch number
E1 xx - set patch number
F - reset instrument
F - reset instrument
The MB-1 recognizes all of the above, plus:
A0 xx - ???
A1 xx - ???
A2 xx - ???
A3 xx - ???
A4 - clear values from A0-A3
The MB-1 recognizes all of the above, plus:
A0 xx - ???
A1 xx - ???
A2 xx - ???
A3 xx - ???
A4 - clear values from A0-A3
***************************************************************************/

View File

@ -186,7 +186,7 @@ uint32_t asterix_state::screen_update_asterix(screen_device &screen, bitmap_ind1
m_k056832->tilemap_draw(screen, bitmap, cliprect, layer[2], K056832_DRAW_FLAG_MIRROR, 4);
/* this isn't supported anymore and it is unsure if still needed; keeping here for reference
pdrawgfx_shadow_lowpri = 1; fix shadows in front of feet */
pdrawgfx_shadow_lowpri = 1; fix shadows in front of feet */
m_k053244->sprites_draw(bitmap, cliprect, screen.priority());
m_k056832->tilemap_draw(screen, bitmap, cliprect, 2, K056832_DRAW_FLAG_MIRROR, 0);

View File

@ -463,8 +463,8 @@ ioport_value wmg_state::wmg_mux_r()
u8 wmg_state::wmg_pia_0_r(offs_t offset)
{
/* if player presses P1 and P2 in a game, return to the menu.
Since there is no code in rom to handle this, it must be a hardware feature
which probably just resets the cpu. */
Since there is no code in rom to handle this, it must be a hardware feature
which probably just resets the cpu. */
uint8_t const data = m_pia[0]->read(offset);

View File

@ -572,7 +572,7 @@
- How to Set the Password:
1) Press and hold the PROGRAM key (key 9) while turning on or resetting the machine.
(The word 'TESTING' will be displayed on the screen)
(The word 'TESTING' will be displayed on the screen)
2) Enter the first desired input of the password, then press DOWN to confirm the choice.
3) Enter the second desired input of the password, then press DOWN to confirm the choice.
4) Enter the third desired input of the password, then press DOWN to confirm the choice.
@ -2217,7 +2217,7 @@ static INPUT_PORTS_START( pottnpkr )
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_COIN2 ) PORT_NAME("Coupon (Note In)")
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN1 ) PORT_NAME("Coin In") PORT_IMPULSE(3)
//* PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
//* PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Weight (Coupon In)") PORT_CODE(KEYCODE_H) PORT_TOGGLE
PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_UNKNOWN )
PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_UNKNOWN )

View File

@ -524,16 +524,16 @@ static INPUT_PORTS_START(codemagik)
PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_UNUSED )
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPNAME( 0x10, 0x00, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:1")
PORT_DIPSETTING( 0x10, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPNAME( 0x20, 0x20, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:2")
PORT_DIPSETTING( 0x20, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPNAME( 0x40, 0x40, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:3")
PORT_DIPSETTING( 0x40, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPNAME( 0x80, 0x80, DEF_STR( Unknown ) ) PORT_DIPLOCATION("SW1:4")
PORT_DIPSETTING( 0x80, DEF_STR( Off ) )
PORT_DIPSETTING( 0x00, DEF_STR( On ) )

View File

@ -620,7 +620,7 @@ uint8_t miniboy7_state::s_pia_pb_r()
case 0xfb:
case 0x7b: ret = m_input[4]->read(); break;
case 0xfd:
case 0x7d: ret = m_input[5]->read(); break;
case 0x7d: ret = m_input[5]->read(); break;
case 0x7f: ret = m_dsw2->read() & 0xf0; break; // high nibble of dip switch
}
return ret;

View File

@ -339,7 +339,7 @@ bool memorymoog_state::adc_comparator_on() const
if (m_selected_pot == 0)
{
LOGMASKED(LOG_ADC, "Comparator: %f %f %d %04x\n", v, dac_v, comp_on,
m_dac_latch);
m_dac_latch);
}
return comp_on;
}
@ -389,7 +389,7 @@ template<int N> u8 memorymoog_state::key_matrix_r(
if (pressed != 0xff)
LOGMASKED(LOG_KEYPRESS, "Pressed %s %02X: %02X\n", name, selection,
pressed);
pressed);
return pressed; // Returned value is active-low.
}
@ -421,7 +421,7 @@ void memorymoog_state::update_sh()
m_cv[m_selected_sh] = cv;
// TODO: all autotune CVs are divided by a 115K-10K divider.
LOGMASKED(LOG_CV, "CV: %02d %-20s %04X - %f\n", m_selected_sh,
CV_NAMES[m_selected_sh], m_dac_latch, cv);
CV_NAMES[m_selected_sh], m_dac_latch, cv);
}
void memorymoog_state::keyboard_w(u8 data)

View File

@ -134,7 +134,7 @@ struct dmx_voice_card_config
DISABLED, // 4.7K resistor connected to position 1 (+5V).
ENABLED, // Jumper disconnected.
ENABLED_ON_TR12, // 4.7K resistor connected to position 2 (/Q of U1B).
// Decay enabled when trigger mode is 1 or 2.
// Decay enabled when trigger mode is 1 or 2.
};
const decay_mode decay;
@ -143,7 +143,7 @@ struct dmx_voice_card_config
{
ENABLED, // Jumper connected to position 2 (+5V).
ENABLED_ON_TR1, // Jumper connected to position 1 (Q of U1A).
// Early decay enabled when trigger mode is 1.
// Early decay enabled when trigger mode is 1.
};
const early_decay_mode early_decay;
@ -247,7 +247,7 @@ void dmx_voice_card_vca::start(int trigger_mode)
m_selected_rc_inv = 1;
LOGMASKED(LOG_VOLUME, "Selected gain: %f, 1/RC: %f\n",
m_selected_gain, m_selected_rc_inv);
m_selected_gain, m_selected_rc_inv);
}
void dmx_voice_card_vca::decay()
@ -295,7 +295,7 @@ void dmx_voice_card_vca::sound_stream_update(sound_stream &stream, const std::ve
out.put(i, m_selected_gain * in.get(i));
LOGMASKED(LOG_SAMPLES, "%s VCA - just gain: %f. Samples: %f, %f.\n",
tag(), m_selected_gain, in.get(0), in.get(n - 1));
tag(), m_selected_gain, in.get(0), in.get(n - 1));
return;
}
@ -321,7 +321,7 @@ void dmx_voice_card_vca::sound_stream_update(sound_stream &stream, const std::ve
m_decay_done = true;
LOGMASKED(LOG_SAMPLES_DECAY, "%s VCA - in decay: %f. Samples: %f, %f.\n",
tag(), gain, in.get(0), in.get(n - 1));
tag(), gain, in.get(0), in.get(n - 1));
}
void dmx_voice_card_vca::init_gain_and_decay_variations(const dmx_voice_card_config &config)
@ -345,7 +345,7 @@ void dmx_voice_card_vca::init_gain_and_decay_variations(const dmx_voice_card_con
// For trigger mode 1.
m_gain.push_back((r12 * r17 * VCC + R8 * r12 * VD + R8 * r17 * VD) /
((R8 * r12 * r17) + (r12 * r17 * R9) + (R8 * r17 * R9) + (R8 * r12 * R9)));
((R8 * r12 * r17) + (r12 * r17 * R9) + (R8 * r17 * R9) + (R8 * r12 * R9)));
// For trigger mode 2.
m_gain.push_back((r12 * VCC + R8 * VD) / (r12 * R8 + R8 * R9 + r12 * R9));
// For trigger mode 3.
@ -354,7 +354,7 @@ void dmx_voice_card_vca::init_gain_and_decay_variations(const dmx_voice_card_con
for (int i = 0; i < m_gain.size(); ++i)
{
LOGMASKED(LOG_VOLUME, "%s: Gain variation %d: %f uA, %f\n",
tag(), i, m_gain[i] * 1e6F, m_gain[i] / MAX_IREF);
tag(), i, m_gain[i] * 1e6F, m_gain[i] / MAX_IREF);
m_gain[i] /= MAX_IREF; // Normalize.
}
@ -374,7 +374,7 @@ void dmx_voice_card_vca::init_gain_and_decay_variations(const dmx_voice_card_con
{
m_decay_rc_inv.push_back(1.0F / ((R8 + r) * c3));
LOGMASKED(LOG_VOLUME, "%s: Decay 1/RC variation %d: %f\n",
tag(), m_decay_rc_inv.size() - 1, m_decay_rc_inv.back());
tag(), m_decay_rc_inv.size() - 1, m_decay_rc_inv.back());
}
}
}
@ -564,11 +564,11 @@ void dmx_voice_card::init_pitch()
// For trigger mode 1.
const float alpha = 1.0F + r12 / m_config.r17;
m_cv.push_back((alpha * R5 + r12) * (2 * VCC - 3 * VD) /
(3 * alpha * R5 + 3 * r12 + 2 * alpha * R_555) + VD);
(3 * alpha * R5 + 3 * r12 + 2 * alpha * R_555) + VD);
// For trigger mode 2.
m_cv.push_back((R5 + r12) * (2 * VCC - 3 * VD) /
(3 * R5 + 3 * r12 + 2 * R_555) + VD);
(3 * R5 + 3 * r12 + 2 * R_555) + VD);
// For trigger mode 3.
m_cv.push_back(m_cv[0]);
@ -636,7 +636,7 @@ void dmx_voice_card::compute_pitch_variations()
m_sample_t[i] = attotime::from_double(t_high + t_low);
LOGMASKED(LOG_PITCH, "%s Pitch variation %d: %f (%f, %f)\n",
tag(), i, 1.0 / m_sample_t[i].as_double(), t_high, t_low);
tag(), i, 1.0 / m_sample_t[i].as_double(), t_high, t_low);
}
if (m_config.pitch_control)
@ -658,7 +658,7 @@ void dmx_voice_card::select_pitch()
m_timer->adjust(sampling_t, 0, sampling_t);
LOGMASKED(LOG_PITCH, "Setting sampling frequency: %f\n",
1.0 / sampling_t.as_double());
1.0 / sampling_t.as_double());
}
bool dmx_voice_card::is_decay_enabled() const
@ -723,7 +723,7 @@ TIMER_DEVICE_CALLBACK_MEMBER(dmx_voice_card::clock_callback)
if (!m_vca->in_decay() && is_decay_enabled())
{
if ((is_early_decay_enabled() && m_counter >= EARLY_DECAY_START) ||
m_counter >= LATE_DECAY_START)
m_counter >= LATE_DECAY_START)
{
m_vca->decay();
}
@ -1208,7 +1208,7 @@ u8 dmx_state::cassette_r()
const u8 d7 = BIT(data, 7); // PROT* (memory protect switch. Active low).
return (d7 << 7) | (d6 << 6) | (d5 << 5) | (d4 << 4) |
(d3 << 3) | (d2 << 2) | (d1 << 1) | d0;
(d3 << 3) | (d2 << 2) | (d1 << 1) | d0;
}
template<int GROUP> void dmx_state::gen_trigger_w(u8 data)
@ -1288,7 +1288,7 @@ void dmx_state::update_voice_volume(int voice)
m_right_mixer->set_input_gain(voice, gain_right);
LOGMASKED(LOG_FADERS, "Voice %d volume changed to: %d (gain L:%f, R:%f)\n",
voice, pot_percent, gain_left, gain_right);
voice, pot_percent, gain_left, gain_right);
}
void dmx_state::memory_map(address_map &map)

View File

@ -429,7 +429,7 @@ INPUT_PORTS_START(ob8)
INPUT_PORTS_END
ROM_START(ob8)
ROM_REGION(0X4000, MAINCPU_TAG, 0)
ROM_REGION(0x4000, MAINCPU_TAG, 0)
ROM_DEFAULT_BIOS("a8")
ROM_SYSTEM_BIOS(0, "a8", "OB-8 A8 OS")

View File

@ -62,15 +62,15 @@
2005 Let's!TVプレイ / / Let's! TV Play Dragon Ball Z Battle Taikan Kamehameha~ Omee to Fusion / Bandai / Japan
dumped: either here, xavix_2000.cpp, or xavix_2002.cpp
Let's!TVプレイ / / Let's! TV Play Taikan Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan
Let's!TVプレイ / / Let's! TV Play Narikiri Taikan Boukenger Hashire! Ute! Mission Start!! / Bandai / Japan
Webdiver Gradion /TAKARA/Japan - - - - - - -
Let's!TVプレイ / / Let's! TV Play Mahou Taiketsu Magiranger - Magimat de Dance & Battle / Bandai / Japan
anpan-man pyon-pyon ikunou mat /JoyPalette/Japan - - - - - - -
DX体感 / / Doko Demo Doraemon Nihon Ryokou Game DX Taikan! Doko Dora Grand Prix! / Epoch / Japan
Let's!TVプレイ / / Let's! TV Play Taikan Cast Off Kamen Rider Kabuto Clock Up & Rider Kick / Bandai / Japan
Let's!TVプレイ / / Let's! TV Play Narikiri Taikan Boukenger Hashire! Ute! Mission Start!! / Bandai / Japan
Webdiver Gradion /TAKARA/Japan - - - - - - -
Let's!TVプレイ / / Let's! TV Play Mahou Taiketsu Magiranger - Magimat de Dance & Battle / Bandai / Japan
anpan-man pyon-pyon ikunou mat /JoyPalette/Japan - - - - - - -
DX体感 / / Doko Demo Doraemon Nihon Ryokou Game DX Taikan! Doko Dora Grand Prix! / Epoch / Japan
Let's!TVプレイ MaxHeart MaxHeartにおどっちゃおう / / Let's! TV Play Futari wa PreCure - MaxHeart Mat de Dance MaxHeart ni Odotchaou / Bandai / Japan
anpan-man kazoku de ikunou mat DX /JoyPalette/Japan - - - - - - -
Excite Striker (UK)
anpan-man kazoku de ikunou mat DX /JoyPalette/Japan - - - - - - -
Excite Striker (UK)
connecTV OPUS /RADICA EU (different ROM to US?)
Let's!TVプレイ / / (Let's! TV Play Ongeki Battle! Kamen Rider Hibiki - Kimero! Ikki Kasei no Kata / Bandai / Japan)
Let's construct the town! /TAKARA/Japan - - - - - - -
@ -312,12 +312,12 @@ void xavix_state::mainram_w(offs_t offset, uint8_t data)
m_mainram[offset] = data;
/*
// trying to debug anpanmdx title screen issue
if ((offset == 0x3d) && (data == 0x77))
logerror("%s: writing 0x77 to 0x3d\n", machine().describe_context());
if ((offset == 0x98) && (data == 0x77))
logerror("%s: writing 0x77 to 0x98\n", machine().describe_context());
if ((offset == 0x3f2) && (data == 0x77))
logerror("%s: writing 0x77 to 0x3f2\n", machine().describe_context());
if ((offset == 0x3d) && (data == 0x77))
logerror("%s: writing 0x77 to 0x3d\n", machine().describe_context());
if ((offset == 0x98) && (data == 0x77))
logerror("%s: writing 0x77 to 0x98\n", machine().describe_context());
if ((offset == 0x3f2) && (data == 0x77))
logerror("%s: writing 0x77 to 0x3f2\n", machine().describe_context());
// but the unwanted? value of 0x77 is explicitly set by the code at 1c61c
*/
}