FPGA 版 FM 音源 (87) -- OPLx 実チップ上の ROM

以下のサイトで、YM3812 (OPL2) および YMF262 (OPL3) チップを「デキャップ」してダイ表面の写真を撮影し、ROM 内容を読み出したレポートが見られます。

Matthew Gambrell and Olli Niemitalo, 2008/04/20

OPLx decapsulated - Google ドキュメント

これまでソフトウェアや FPGA で使用してきたサイン波テーブルおよび対数-真数変換テーブルは、結論から言うと、(実質的に) 実チップ上の ROM と同内容であることが確かめられました。
FPGA 版のオペレータ部分では、2015 年 9 月 26 日付けの記事 (→こちら) に Velilog の memh 形式でテーブルの内容が示してあります。
C 言語の配列の初期値としてサイン波テーブルを定義したものを下に示します。

//
//  file: "slbtab_opl3.c"
//  1024 point sine table
//  only first 256 points (0..pi/2) for symmetry

// depth=256;
// width=12;
// data_radix=dec;

const uint16_t slbtab[256] = {
  2137, 1731, 1543, 1419, 1326, 1252, 1190, 1137, 
  1091, 1050, 1013,  979,  949,  920,  894,  869, 
   846,  825,  804,  785,  767,  749,  732,  717, 
   701,  687,  672,  659,  646,  633,  621,  609, 
   598,  587,  576,  566,  556,  546,  536,  527, 
   518,  509,  501,  492,  484,  476,  468,  461, 
   453,  446,  439,  432,  425,  418,  411,  405, 
   399,  392,  386,  380,  375,  369,  363,  358, 
   352,  347,  341,  336,  331,  326,  321,  316, 
   311,  307,  302,  297,  293,  289,  284,  280, 
   276,  271,  267,  263,  259,  255,  251,  248, 
   244,  240,  236,  233,  229,  226,  222,  219, 
   215,  212,  209,  205,  202,  199,  196,  193, 
   190,  187,  184,  181,  178,  175,  172,  169, 
   167,  164,  161,  159,  156,  153,  151,  148, 
   146,  143,  141,  138,  136,  134,  131,  129, 
   127,  125,  122,  120,  118,  116,  114,  112, 
   110,  108,  106,  104,  102,  100,   98,   96, 
    94,   92,   91,   89,   87,   85,   83,   82, 
    80,   78,   77,   75,   74,   72,   70,   69, 
    67,   66,   64,   63,   62,   60,   59,   57, 
    56,   55,   53,   52,   51,   49,   48,   47, 
    46,   45,   43,   42,   41,   40,   39,   38, 
    37,   36,   35,   34,   33,   32,   31,   30, 
    29,   28,   27,   26,   25,   24,   23,   23, 
    22,   21,   20,   20,   19,   18,   17,   17, 
    16,   15,   15,   14,   13,   13,   12,   12, 
    11,   10,   10,    9,    9,    8,    8,    7, 
     7,    7,    6,    6,    5,    5,    5,    4, 
     4,    4,    3,    3,    3,    2,    2,    2, 
     2,    1,    1,    1,    1,    1,    1,    1, 
     0,    0,    0,    0,    0,    0,    0,    0, 
}; // const uint16_t slbtab[]

この内容は、上記のサイトで示されている内容と完全に一致しています。
log2() の小数部 8 ビットからリニア値への変換に使用しているテーブルは次のようになります。

//
//  file: "lbtab_opl3.c"
//  table for 8-bit lb fraction to 11-bit linear conversion
//  (256 entries)
//

//depth=256;
//width=11;
//data_radix=dec;

const uint16_t lb2lin[256] = {
  2042, 2037, 2031, 2026, 2020, 2015, 2010, 2004,
  1999, 1993, 1988, 1983, 1977, 1972, 1966, 1961,
  1956, 1951, 1945, 1940, 1935, 1930, 1924, 1919,
  1914, 1909, 1904, 1898, 1893, 1888, 1883, 1878,
  1873, 1868, 1863, 1858, 1853, 1848, 1843, 1838,
  1833, 1828, 1823, 1818, 1813, 1808, 1803, 1798,
  1794, 1789, 1784, 1779, 1774, 1769, 1765, 1760,
  1755, 1750, 1746, 1741, 1736, 1732, 1727, 1722,
  1717, 1713, 1708, 1704, 1699, 1694, 1690, 1685,
  1681, 1676, 1672, 1667, 1663, 1658, 1654, 1649,
  1645, 1640, 1636, 1631, 1627, 1623, 1618, 1614,
  1609, 1605, 1601, 1596, 1592, 1588, 1584, 1579,
  1575, 1571, 1566, 1562, 1558, 1554, 1550, 1545,
  1541, 1537, 1533, 1529, 1525, 1520, 1516, 1512,
  1508, 1504, 1500, 1496, 1492, 1488, 1484, 1480,
  1476, 1472, 1468, 1464, 1460, 1456, 1452, 1448,
  1444, 1440, 1436, 1433, 1429, 1425, 1421, 1417,
  1413, 1409, 1406, 1402, 1398, 1394, 1391, 1387,
  1383, 1379, 1376, 1372, 1368, 1364, 1361, 1357,
  1353, 1350, 1346, 1342, 1339, 1335, 1332, 1328,
  1324, 1321, 1317, 1314, 1310, 1307, 1303, 1300,
  1296, 1292, 1289, 1286, 1282, 1279, 1275, 1272,
  1268, 1265, 1261, 1258, 1255, 1251, 1248, 1244,
  1241, 1238, 1234, 1231, 1228, 1224, 1221, 1218,
  1214, 1211, 1208, 1205, 1201, 1198, 1195, 1192,
  1188, 1185, 1182, 1179, 1176, 1172, 1169, 1166,
  1163, 1160, 1157, 1154, 1150, 1147, 1144, 1141,
  1138, 1135, 1132, 1129, 1126, 1123, 1120, 1117,
  1114, 1111, 1108, 1105, 1102, 1099, 1096, 1093,
  1090, 1087, 1084, 1081, 1078, 1075, 1072, 1069,
  1066, 1064, 1061, 1058, 1055, 1052, 1049, 1046,
  1044, 1041, 1038, 1035, 1032, 1030, 1027, 1024,
}; // const uint16_t lb2lin[]

これは、表面的には、上記のサイトで示されている ROM 内容とは一致していません。
しかし、

  • アドレスが反転している
  • 実チップ上の ROM では、「常時 1」になっているビット (数値としては「1024」) は ROM 容量節約のために省略されている

ことを考慮した上で比較すると完全に一致しています。