@@ -41,43 +41,52 @@ DisTms32010::DisTms32010(const ValueFormatter::Plugins &plugins)
41
41
}
42
42
43
43
StrBuffer &DisTms32010::outDirect (StrBuffer &out, DisInsn &insn) const {
44
- // Store Status Register can access Data Page 1 only.
45
- static constexpr uint8_t SST = 0x7C ;
46
- const auto opc = insn.opCode ();
47
- uint8_t dma = opc & 0x7F ;
48
- if ((opc >> 8 ) == SST) {
49
- dma |= (1 << 7 );
50
- if (dma > dataMemoryLimit ())
51
- insn.setErrorIf (out, OVERFLOW_RANGE);
52
- }
44
+ const auto dma = toDmAddr (insn.opCode ());
45
+ if (!validDmAddr (insn.opCode (), dma))
46
+ insn.setErrorIf (out, OVERFLOW_RANGE);
53
47
outAbsAddr (out, dma, 8 );
54
48
return out;
55
49
}
56
50
57
51
StrBuffer &DisTms32010::outIndirect (StrBuffer &out, uint8_t mam) const {
52
+ const auto modify = (mam >> 4 ) & 7 ;
58
53
out.letter (' *' );
59
- if (mam & 0x20 )
60
- return out.letter (' +' );
61
- if (mam & 0x10 )
54
+ if (modify == 4 || modify == 7 )
55
+ out.text_P (PSTR (" BR0" ));
56
+ if (modify == 5 || modify == 6 )
57
+ out.letter (' 0' );
58
+ if (modify == 1 || modify == 4 || modify == 5 )
62
59
return out.letter (' -' );
60
+ if (modify == 2 || modify == 6 || modify == 7 )
61
+ return out.letter (' +' );
63
62
return out;
64
63
}
65
64
65
+ StrBuffer &DisTms32010::outModifyAR (StrBuffer &out, uint8_t mam) const {
66
+ const auto modify = (mam >> 4 ) & 7 ;
67
+ if (modify)
68
+ out.comma ();
69
+ return modify == 0 ? out : outIndirect (out, mam);
70
+ }
71
+
72
+ namespace {
73
+ bool hasNarp (uint_fast8_t mam) {
74
+ if ((mam & 0x80 ) == 0 )
75
+ return false ;
76
+ const auto narp = mam & 8 ;
77
+ return narp == 0 ;
78
+ }
79
+ } // namespace
80
+
66
81
StrBuffer &DisTms32010::outNextArp (StrBuffer &out, uint8_t mam) const {
67
- if ((mam & 0x80 ) && (mam & 8 ) == 0 ) {
68
- const RegName arp = (mam & 1 ) == 0 ? REG_AR0 : REG_AR1;
69
- outRegName (out.comma (), arp);
70
- }
82
+ if (hasNarp (mam))
83
+ outRegName (out.comma (), decodeAR (mam & maxAR ()));
71
84
return out;
72
85
}
73
86
74
87
StrBuffer &DisTms32010::outShiftCount (StrBuffer &out, uint8_t count, uint8_t mam) const {
75
- const bool indir = mam & (1 << 7 );
76
- const bool nar = (mam & (1 << 3 )) == 0 ;
77
- if (count || (indir && nar)) {
78
- out.comma ();
79
- outDec (out, count, 4 );
80
- }
88
+ if (count || hasNarp (mam))
89
+ outDec (out.comma (), count, 4 );
81
90
return out;
82
91
}
83
92
@@ -89,10 +98,10 @@ StrBuffer &DisTms32010::outProgramAddress(StrBuffer &out, DisInsn &insn) const {
89
98
}
90
99
91
100
void DisTms32010::decodeOperand (DisInsn &insn, StrBuffer &out, AddrMode mode) const {
92
- const Config:: opcode_t opc = insn.opCode ();
101
+ const auto opc = insn.opCode ();
93
102
switch (mode) {
94
103
case M_MAM:
95
- if (opc & ( 1 << 7 ) ) {
104
+ if (opc & 0x80 ) {
96
105
outIndirect (out, opc);
97
106
} else {
98
107
outDirect (out, insn);
@@ -109,15 +118,15 @@ void DisTms32010::decodeOperand(DisInsn &insn, StrBuffer &out, AddrMode mode) co
109
118
outShiftCount (out, (opc >> 8 ) & 7 , opc);
110
119
break ;
111
120
case M_AR:
112
- outRegName (out, ( opc & ( 1 << 8 )) == 0 ? REG_AR0 : REG_AR1 );
121
+ outRegName (out, decodeAR (( opc >> 8 ) & maxAR ()) );
113
122
break ;
114
123
case M_PA:
115
- outRegName (out, RegName ((( opc >> 8 ) & 7 ) + int8_t (REG_PA0 )));
124
+ outRegName (out, decodePA (( opc >> 8 ) & maxPA ( )));
116
125
break ;
117
126
case M_ARK:
118
- outRegName (out, (opc & 1 ) == 0 ? REG_AR0 : REG_AR1 );
127
+ outRegName (out, decodeAR (opc & maxAR ()) );
119
128
break ;
120
- case M_DPK :
129
+ case M_IM1 :
121
130
out.letter ((opc & 1 ) == 0 ? ' 0' : ' 1' );
122
131
break ;
123
132
case M_IM8:
@@ -127,7 +136,7 @@ void DisTms32010::decodeOperand(DisInsn &insn, StrBuffer &out, AddrMode mode) co
127
136
// Sign extends 13-bit number as 0x1000 is a sign bit.
128
137
outDec (out, signExtend (opc, 13 ), -13 );
129
138
break ;
130
- case M_PMA :
139
+ case M_PM12 :
131
140
outProgramAddress (out, insn);
132
141
break ;
133
142
default :
0 commit comments