1
1
// license:BSD-3-Clause
2
- // copyright-holders:Wilbert Pol
2
+ // copyright-holders:Wilbert Pol, Felipe Sanches
3
3
/* ******************************************************************
4
4
5
5
Toshiba TLCS-900/H disassembly
@@ -9,6 +9,21 @@ Toshiba TLCS-900/H disassembly
9
9
#include " emu.h"
10
10
#include " dasm900.h"
11
11
12
+ template <typename T> std::string tlcs900_disassembler::address (T offset, int size) const
13
+ {
14
+ auto const symbol = std::lower_bound (
15
+ m_symbols,
16
+ m_symbols + m_symbol_count,
17
+ offset,
18
+ [] (auto const &sym, u16 addr) { return sym.first < addr; }
19
+ );
20
+
21
+ if ((m_symbol_count != (symbol - m_symbols)) && (symbol->first == offset))
22
+ return symbol->second ;
23
+ else
24
+ return util::string_format (" 0x%0*x" , size/4 , offset);
25
+ }
26
+
12
27
const char *const tlcs900_disassembler::s_mnemonic[] =
13
28
{
14
29
" adc" , " add" , " and" , " andcf" , " bit" , " bs1b" ,
@@ -1395,7 +1410,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1395
1410
break ;
1396
1411
1397
1412
case M_80:
1398
- buf = string_format ( " %s " , s_reg32[op & 0x07 ]) ;
1413
+ buf = s_reg32[op & 0x07 ];
1399
1414
op = opcodes.r8 ( pos++ );
1400
1415
dasm = &mnemonic_80[ op ];
1401
1416
break ;
@@ -1408,7 +1423,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1408
1423
break ;
1409
1424
1410
1425
case M_90:
1411
- buf = string_format ( " %s " , s_reg32[op & 0x07 ]) ;
1426
+ buf = s_reg32[op & 0x07 ];
1412
1427
op = opcodes.r8 ( pos++ );
1413
1428
dasm = &mnemonic_90[ op ];
1414
1429
break ;
@@ -1421,7 +1436,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1421
1436
break ;
1422
1437
1423
1438
case M_A0:
1424
- buf = string_format ( " %s " , s_reg32[op & 0x07 ]) ;
1439
+ buf = s_reg32[op & 0x07 ];
1425
1440
op = opcodes.r8 ( pos++ );
1426
1441
dasm = &mnemonic_a0[ op ];
1427
1442
break ;
@@ -1434,7 +1449,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1434
1449
break ;
1435
1450
1436
1451
case M_B0:
1437
- buf = string_format ( " %s " , s_reg32[op & 0x07 ]) ;
1452
+ buf = s_reg32[op & 0x07 ];
1438
1453
op = opcodes.r8 ( pos++ );
1439
1454
dasm = &mnemonic_b0[ op ];
1440
1455
break ;
@@ -1451,13 +1466,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1451
1466
{
1452
1467
case 0x00 : /* 0xC0 */
1453
1468
imm = opcodes.r8 ( pos++ );
1454
- buf = string_format ( " 0x%02x " , imm );
1469
+ buf = address (imm, 8 );
1455
1470
break ;
1456
1471
1457
1472
case 0x01 : /* 0xC1 */
1458
1473
imm = opcodes.r8 ( pos++ );
1459
1474
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
1460
- buf = string_format ( " 0x%04x " , imm );
1475
+ buf = address (imm, 16 );
1461
1476
break ;
1462
1477
1463
1478
case 0x02 : /* 0xC2 */
@@ -1472,7 +1487,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1472
1487
switch ( imm & 0x03 )
1473
1488
{
1474
1489
case 0x00 :
1475
- buf = string_format ( " %s " , s_allreg32[imm]) ;
1490
+ buf = s_allreg32[imm];
1476
1491
break ;
1477
1492
1478
1493
case 0x01 :
@@ -1528,12 +1543,12 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1528
1543
case oC8:
1529
1544
if ( op & 0x08 )
1530
1545
{
1531
- buf = string_format ( " %s " , s_reg8[ op & 0x07 ]) ;
1546
+ buf = s_reg8[ op & 0x07 ];
1532
1547
}
1533
1548
else
1534
1549
{
1535
1550
imm = opcodes.r8 ( pos++ );
1536
- buf = string_format ( " %s " , s_allreg8[imm]) ;
1551
+ buf = s_allreg8[imm];
1537
1552
}
1538
1553
op = opcodes.r8 ( pos++ );
1539
1554
dasm = &mnemonic_c8[ op ];
@@ -1544,13 +1559,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1544
1559
{
1545
1560
case 0x00 : /* 0xD0 */
1546
1561
imm = opcodes.r8 ( pos++ );
1547
- buf = string_format ( " 0x%02x " , imm );
1562
+ buf = address (imm, 8 );
1548
1563
break ;
1549
1564
1550
1565
case 0x01 : /* 0xD1 */
1551
1566
imm = opcodes.r8 ( pos++ );
1552
1567
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
1553
- buf = string_format ( " 0x%04x " , imm );
1568
+ buf = address (imm, 16 );
1554
1569
break ;
1555
1570
1556
1571
case 0x02 : /* 0xD2 */
@@ -1565,7 +1580,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1565
1580
switch ( imm & 0x03 )
1566
1581
{
1567
1582
case 0x00 :
1568
- buf = string_format ( " %s " , s_allreg32[imm]) ;
1583
+ buf = s_allreg32[imm];
1569
1584
break ;
1570
1585
1571
1586
case 0x01 :
@@ -1621,12 +1636,12 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1621
1636
case oD8:
1622
1637
if ( op & 0x08 )
1623
1638
{
1624
- buf = string_format ( " %s " , s_reg16[ op & 0x07 ]) ;
1639
+ buf = s_reg16[ op & 0x07 ];
1625
1640
}
1626
1641
else
1627
1642
{
1628
1643
imm = opcodes.r8 ( pos++ );
1629
- buf = string_format ( " %s " , s_allreg16[imm]) ;
1644
+ buf = s_allreg16[imm];
1630
1645
}
1631
1646
1632
1647
op = opcodes.r8 ( pos++ );
@@ -1638,13 +1653,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1638
1653
{
1639
1654
case 0x00 : /* 0xE0 */
1640
1655
imm = opcodes.r8 ( pos++ );
1641
- buf = string_format ( " 0x%02x " , imm );
1656
+ buf = address (imm, 8 );
1642
1657
break ;
1643
1658
1644
1659
case 0x01 : /* 0xE1 */
1645
1660
imm = opcodes.r8 ( pos++ );
1646
1661
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
1647
- buf = string_format ( " 0x%04x " , imm );
1662
+ buf = address (imm, 16 );
1648
1663
break ;
1649
1664
1650
1665
case 0x02 : /* 0xE2 */
@@ -1659,7 +1674,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1659
1674
switch ( imm & 0x03 )
1660
1675
{
1661
1676
case 0x00 :
1662
- buf = string_format ( " %s " , s_allreg32[imm]) ;
1677
+ buf = s_allreg32[imm];
1663
1678
break ;
1664
1679
1665
1680
case 0x01 :
@@ -1715,12 +1730,12 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1715
1730
case M_E8:
1716
1731
if ( op & 0x08 )
1717
1732
{
1718
- buf = string_format ( " %s " , s_reg32[ op & 0x07 ]) ;
1733
+ buf = s_reg32[ op & 0x07 ];
1719
1734
}
1720
1735
else
1721
1736
{
1722
1737
imm = opcodes.r8 ( pos++ );
1723
- buf = string_format ( " %s " , s_allreg32[imm]) ;
1738
+ buf = s_allreg32[imm];
1724
1739
}
1725
1740
op = opcodes.r8 ( pos++ );
1726
1741
dasm = &mnemonic_e8[ op ];
@@ -1731,13 +1746,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1731
1746
{
1732
1747
case 0x00 : /* 0xF0 */
1733
1748
imm = opcodes.r8 ( pos++ );
1734
- buf = string_format ( " 0x%02x " , imm );
1749
+ buf = address (imm, 8 );
1735
1750
break ;
1736
1751
1737
1752
case 0x01 : /* 0xF1 */
1738
1753
imm = opcodes.r8 ( pos++ );
1739
1754
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
1740
- buf = string_format ( " 0x%04x " , imm );
1755
+ buf = address (imm, 16 );
1741
1756
break ;
1742
1757
1743
1758
case 0x02 : /* 0xF2 */
@@ -1752,7 +1767,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1752
1767
switch ( imm & 0x03 )
1753
1768
{
1754
1769
case 0x00 :
1755
- buf = string_format ( " %s " , s_allreg32[imm]) ;
1770
+ buf = s_allreg32[imm];
1756
1771
break ;
1757
1772
1758
1773
case 0x01 :
@@ -1763,7 +1778,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1763
1778
break ;
1764
1779
1765
1780
case 0x02 :
1766
- buf = string_format ( " unknown" ) ;
1781
+ buf = " unknown" ;
1767
1782
break ;
1768
1783
1769
1784
case 0x03 :
@@ -1806,7 +1821,7 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1806
1821
break ;
1807
1822
}
1808
1823
1809
- util::stream_format ( stream, " %s " , s_mnemonic[ dasm->mnemonic ]) ;
1824
+ stream << s_mnemonic[ dasm->mnemonic ];
1810
1825
1811
1826
switch ( dasm->mnemonic )
1812
1827
{
@@ -1957,13 +1972,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1957
1972
1958
1973
case O_I8:
1959
1974
imm = opcodes.r8 ( pos++ );
1960
- util::stream_format (stream, " 0x%02x " , imm);
1975
+ util::stream_format (stream, " %s " , address ( imm, 8 ) );
1961
1976
break ;
1962
1977
1963
1978
case O_I16:
1964
1979
imm = opcodes.r8 ( pos++ );
1965
1980
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
1966
- util::stream_format (stream, " 0x%04x " , imm);
1981
+ util::stream_format (stream, " %s " , address ( imm, 16 ) );
1967
1982
break ;
1968
1983
1969
1984
case O_I24:
@@ -1997,13 +2012,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
1997
2012
1998
2013
case O_M8:
1999
2014
imm = opcodes.r8 ( pos++ );
2000
- util::stream_format (stream, " (0x%02x )" , imm);
2015
+ util::stream_format (stream, " (%s )" , address ( imm, 8 ) );
2001
2016
break ;
2002
2017
2003
2018
case O_M16:
2004
2019
imm = opcodes.r8 ( pos++ );
2005
2020
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
2006
- util::stream_format (stream, " (0x%04x )" , imm);
2021
+ util::stream_format (stream, " (%s )" , address ( imm, 16 ) );
2007
2022
break ;
2008
2023
2009
2024
case O_R:
@@ -2145,13 +2160,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
2145
2160
2146
2161
case O_I8:
2147
2162
imm = opcodes.r8 ( pos++ );
2148
- util::stream_format (stream, " ,0x%02x " , imm);
2163
+ util::stream_format (stream, " ,%s " , address ( imm, 8 ) );
2149
2164
break ;
2150
2165
2151
2166
case O_I16:
2152
2167
imm = opcodes.r8 ( pos++ );
2153
2168
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
2154
- util::stream_format (stream, " ,0x%04x " , imm);
2169
+ util::stream_format (stream, " ,%s " , address ( imm, 16 ) );
2155
2170
break ;
2156
2171
2157
2172
case O_I24:
@@ -2185,13 +2200,13 @@ offs_t tlcs900_disassembler::disassemble(std::ostream &stream, offs_t pc, const
2185
2200
2186
2201
case O_M8:
2187
2202
imm = opcodes.r8 ( pos++ );
2188
- util::stream_format (stream, " ,(0x%02x )" , imm);
2203
+ util::stream_format (stream, " ,(%s )" , address ( imm, 8 ) );
2189
2204
break ;
2190
2205
2191
2206
case O_M16:
2192
2207
imm = opcodes.r8 ( pos++ );
2193
2208
imm = imm | (opcodes.r8 ( pos++ ) << 8 );
2194
- util::stream_format (stream, " ,(0x%04x )" , imm);
2209
+ util::stream_format (stream, " ,(%s )" , address ( imm, 16 ) );
2195
2210
break ;
2196
2211
2197
2212
case O_R:
0 commit comments