4
4
import ru .ifmo .cs .bcomp .CPU ;
5
5
import ru .ifmo .cs .bcomp .ControlSignal ;
6
6
import ru .ifmo .cs .bcomp .Reg ;
7
- import ru .ifmo .cs .components .Utils ;
8
7
import ru .ifmo .cs .bcomp .ui .GUI ;
9
8
import ru .ifmo .cs .components .DataDestination ;
9
+ import ru .ifmo .cs .components .Utils ;
10
10
11
11
import javax .swing .*;
12
12
import javax .swing .text .AttributeSet ;
@@ -34,6 +34,14 @@ public class TraceView extends BCompPanel implements ActionListener {
34
34
private static JTextPane text ;
35
35
private StringBuilder stringRegsCsv = new StringBuilder ();
36
36
37
+ private final ArrayList <Long > writelist = new ArrayList <Long >();
38
+ private volatile long savedPointer ;
39
+ private volatile boolean printOnStop = true ;
40
+ private volatile int sleep = 0 ;
41
+ private int sleeptime = 5 ;
42
+
43
+ private boolean isRun = false ;
44
+
37
45
private String getReg (Reg reg ) {
38
46
return Utils .toHex (cpu .getRegValue (reg ), cpu .getRegWidth (reg ));
39
47
}
@@ -89,12 +97,6 @@ private String printRegs(String add, String addCsv) {
89
97
return stringBuilderRegsCsv .toString ();
90
98
}
91
99
92
- private final ArrayList <Long > writelist = new ArrayList <Long >();
93
- private volatile long savedPointer ;
94
- private volatile boolean printOnStop = true ;
95
- private volatile int sleep = 0 ;
96
- private int sleeptime = 0 ;
97
-
98
100
private String getMemory (long addr ) {
99
101
return Utils .toHex (addr , 11 ) + "\t " + Utils .toHex (cpu .getMemory ().getValue (addr ), 16 );
100
102
}
@@ -111,13 +113,31 @@ public TraceView(final GUI gui) {
111
113
this .cmanager = gui .getComponentManager ();
112
114
113
115
JPanel mainPanel = new JPanel ();
116
+ JPanel leftPanel = new JPanel ();
114
117
JPanel bottomButtons = new JPanel ();
115
118
116
119
add (mainPanel );
117
120
mainPanel .setLayout (new BorderLayout ());
118
121
bottomButtons .setLayout (new FlowLayout (FlowLayout .LEFT ));
119
122
123
+ GridBagLayout gbl = new GridBagLayout ();
124
+ leftPanel .setLayout (gbl );
125
+
126
+ GridBagConstraints c = new GridBagConstraints ();
127
+ c .anchor = GridBagConstraints .NORTH ;
128
+ c .fill = GridBagConstraints .BOTH ;
129
+ c .gridheight = 1 ;
130
+ c .gridwidth = GridBagConstraints .REMAINDER ;
131
+ c .gridx = GridBagConstraints .RELATIVE ;
132
+ c .gridy = GridBagConstraints .RELATIVE ;
133
+ c .insets = new Insets (0 , 0 , 0 , 0 );
134
+ c .ipadx = 0 ;
135
+ c .ipady = 0 ;
136
+ c .weightx = 0.0 ;
137
+ c .weighty = 0.0 ;
138
+
120
139
mainPanel .add (bottomButtons , BorderLayout .SOUTH );
140
+ mainPanel .add (leftPanel , BorderLayout .EAST );
121
141
122
142
text = new JTextPane ();
123
143
text .setFont (FONT_COURIER_BOLD_21 );
@@ -129,85 +149,129 @@ public TraceView(final GUI gui) {
129
149
scroll .setBounds (TEXTAREA_X , TEXTAREA_Y , TEXTAREA_WIDTH , TEXTAREA_HEIGHT );
130
150
mainPanel .add (scroll , BorderLayout .CENTER );
131
151
152
+
153
+
154
+
155
+ //left
156
+ JTextField sleepTb = new JTextField (String .valueOf (sleeptime ));
157
+ c .insets = new Insets (15 , 0 , 0 , 0 );
158
+ gbl .setConstraints (sleepTb , c );
159
+ leftPanel .add (sleepTb );
160
+
161
+ JButton sleepBtn = new JButton ("Задать задержку" );
162
+ sleepBtn .setForeground (COLOR_TEXT );
163
+ sleepBtn .setBackground (COLOR_VALUE );
164
+ sleepBtn .setFont (FONT_COURIER_PLAIN_12 );
165
+ sleepBtn .addActionListener (new ActionListener () {
166
+ @ Override
167
+ public void actionPerformed (ActionEvent e ) {
168
+ sleep = Integer .parseInt (sleepTb .getText ());
169
+ setTrace ("Задержка установлена на " + sleep + "\n " );
170
+ }
171
+ });
172
+ c .insets = new Insets (5 , 0 , 20 , 0 );
173
+ gbl .setConstraints (sleepBtn , c );
174
+ leftPanel .add (sleepBtn );
175
+
176
+
132
177
JButton button = new JButton ("Выполнить трассировку" );
133
178
button .setForeground (COLOR_TEXT );
134
179
button .setBackground (COLOR_VALUE );
135
180
button .setFont (FONT_COURIER_PLAIN_12 );
136
181
button .setBounds (625 , 1 , 200 , BUTTONS_HEIGHT );
137
182
button .setFocusable (false );
183
+
184
+ Thread cpuRun = new Thread (() -> {
185
+ cpu .startStart ();
186
+ cpu .startContinue ();
187
+
188
+ cpu .executeContinue ();
189
+ while (true ) {
190
+ if (!Long .toHexString (cpu .getRegValue (Reg .CR )).equals ("100" ) && isRun )
191
+ cpu .executeContinue ();
192
+ else {
193
+ isRun = false ;
194
+ button .setText ("Выполнить трассировку" );
195
+ }
196
+ }
197
+ });
198
+
138
199
button .addActionListener (new ActionListener () {
139
200
@ Override
140
201
public void actionPerformed (ActionEvent e ) {
141
- printRegsTitle = true ;
142
- text .setText ("" );
143
- stringRegsCsv .setLength (0 );
202
+ if (!isRun ) {
203
+ printRegsTitle = true ;
204
+ isRun = true ;
205
+ text .setText ("" );
206
+ stringRegsCsv .setLength (0 );
207
+ button .setText ("Остановить" );
144
208
145
- cpu .addDestination (ControlSignal .STOR , new DataDestination () {
146
- @ Override
147
- public void setValue (long value ) {
148
- long addr = cpu .getRegValue (Reg .AR );
149
-
150
- if (!writelist .contains (addr ))
151
- writelist .add (addr );
152
- }
153
- });
154
209
210
+ cpu .addDestination (ControlSignal .STOR , new DataDestination () {
211
+ @ Override
212
+ public void setValue (long value ) {
213
+ long addr = cpu .getRegValue (Reg .AR );
155
214
156
- cpu .setCPUStartListener (new Runnable () {
157
- @ Override
158
- public void run () {
159
- if (!printOnStop )
160
- return ;
161
- writelist .clear ();
162
- savedPointer = cpu .getRegValue (cpu .getClockState () ? Reg .IP : Reg .MP );
163
- stringRegsCsv .append (printRegsTitle ());
164
- }
165
- });
166
-
167
- cpu .setCPUStopListener (new Runnable () {
168
- @ Override
169
- public void run () {
170
- if (!printOnStop )
171
- return ;
172
-
173
- Long _addr = 0L ;
174
- if (!writelist .isEmpty ()) _addr = writelist .remove (0 );
175
-
176
- stringRegsCsv .append (printRegs ( (_addr ==0L ? "" : "\t " + getMemory (_addr )), (_addr ==0L ? "" : "," + getMemoryCsv (_addr ))) );
177
- for (Long wraddr : writelist ) {
178
- System .out .println (wraddr );
179
- setTrace (String .format (",%1$34s" , "\t " ) + getMemory (wraddr ) + "\n " );
180
- stringRegsCsv .append (String .format (",%1$34s" , "," ) + getMemoryCsv (wraddr ) + "\n " );
215
+ if (!writelist .contains (addr ))
216
+ writelist .add (addr );
181
217
}
182
- }
183
- });
218
+ });
219
+
220
+ cpu .setCPUStartListener (new Runnable () {
221
+ @ Override
222
+ public void run () {
223
+ if (!printOnStop )
224
+ return ;
225
+ writelist .clear ();
226
+ savedPointer = cpu .getRegValue (cpu .getClockState () ? Reg .IP : Reg .MP );
227
+ stringRegsCsv .append (printRegsTitle ());
228
+ }
229
+ });
230
+
231
+ cpu .setCPUStopListener (new Runnable () {
232
+ @ Override
233
+ public void run () {
234
+ if (!printOnStop )
235
+ return ;
236
+
237
+ Long _addr = 0L ;
238
+ if (!writelist .isEmpty ()) _addr = writelist .remove (0 );
239
+
240
+ stringRegsCsv .append (printRegs ((_addr == 0L ? "" : "\t " + getMemory (_addr )), (_addr == 0L ? "" : "," + getMemoryCsv (_addr ))));
241
+ for (Long wraddr : writelist ) {
242
+ System .out .println (wraddr );
243
+ setTrace (String .format (",%1$34s" , "\t " ) + getMemory (wraddr ) + "\n " );
244
+ stringRegsCsv .append (String .format (",%1$34s" , "," ) + getMemoryCsv (wraddr ) + "\n " );
245
+ }
246
+ }
247
+ });
184
248
185
- cpu .setTickFinishListener (new Runnable () {
186
- @ Override
187
- public void run () {
188
- if (sleep <= 0 )
189
- return ;
249
+ cpu .setTickFinishListener (new Runnable () {
250
+ @ Override
251
+ public void run () {
252
+ if (sleep <= 0 )
253
+ return ;
190
254
191
- try {
192
- Thread .sleep (sleep );
193
- } catch (InterruptedException e ) { /*totally not empty*/ }
194
- }
195
- });
255
+ try {
256
+ Thread .sleep (sleep );
257
+ } catch (InterruptedException e ) { /*totally not empty*/ }
258
+ }
259
+ });
196
260
197
- sleep = sleeptime ;
198
- cpu .startStart ();
199
- cpu .startContinue ();
200
261
201
- cpu .executeContinue ();
202
- //какой то говнокод, зато работает
203
- while ( !Long .toHexString (cpu .getRegValue (Reg .CR )).equals ("100" ) ) {
204
- cpu .executeContinue ();
262
+ sleep = sleeptime ;
263
+ cpuRun .start ();
264
+ } else {
265
+ button .setText ("Выполнить трассировку" );
266
+ isRun = false ;
205
267
}
206
268
}
207
269
});
208
- mainPanel .add (button , BorderLayout .EAST );
270
+ c .weighty = 1.0 ;
271
+ gbl .setConstraints (button , c );
272
+ leftPanel .add (button );
209
273
210
- final JTextField textField = new JTextField ("" , 10 );
274
+ JTextField textField = new JTextField ("" , 10 );
211
275
bottomButtons .add (textField );
212
276
213
277
JButton btn1 = new JButton ("Задать адрес началы программы" );
@@ -306,10 +370,14 @@ public void redrawArrows() {
306
370
@ Override
307
371
public void panelActivate () {
308
372
text .requestFocus ();
373
+
309
374
}
310
375
311
376
@ Override
312
- public void panelDeactivate () { }
377
+ public void panelDeactivate () {
378
+ if (!isRun )
379
+ sleep = 0 ;
380
+ }
313
381
314
382
@ Override
315
383
public void actionPerformed (ActionEvent e ) {
0 commit comments