44import ru .ifmo .cs .bcomp .CPU ;
55import ru .ifmo .cs .bcomp .ControlSignal ;
66import ru .ifmo .cs .bcomp .Reg ;
7- import ru .ifmo .cs .components .Utils ;
87import ru .ifmo .cs .bcomp .ui .GUI ;
98import ru .ifmo .cs .components .DataDestination ;
9+ import ru .ifmo .cs .components .Utils ;
1010
1111import javax .swing .*;
1212import javax .swing .text .AttributeSet ;
@@ -34,6 +34,14 @@ public class TraceView extends BCompPanel implements ActionListener {
3434 private static JTextPane text ;
3535 private StringBuilder stringRegsCsv = new StringBuilder ();
3636
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+
3745 private String getReg (Reg reg ) {
3846 return Utils .toHex (cpu .getRegValue (reg ), cpu .getRegWidth (reg ));
3947 }
@@ -89,12 +97,6 @@ private String printRegs(String add, String addCsv) {
8997 return stringBuilderRegsCsv .toString ();
9098 }
9199
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-
98100 private String getMemory (long addr ) {
99101 return Utils .toHex (addr , 11 ) + "\t " + Utils .toHex (cpu .getMemory ().getValue (addr ), 16 );
100102 }
@@ -111,13 +113,31 @@ public TraceView(final GUI gui) {
111113 this .cmanager = gui .getComponentManager ();
112114
113115 JPanel mainPanel = new JPanel ();
116+ JPanel leftPanel = new JPanel ();
114117 JPanel bottomButtons = new JPanel ();
115118
116119 add (mainPanel );
117120 mainPanel .setLayout (new BorderLayout ());
118121 bottomButtons .setLayout (new FlowLayout (FlowLayout .LEFT ));
119122
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+
120139 mainPanel .add (bottomButtons , BorderLayout .SOUTH );
140+ mainPanel .add (leftPanel , BorderLayout .EAST );
121141
122142 text = new JTextPane ();
123143 text .setFont (FONT_COURIER_BOLD_21 );
@@ -129,85 +149,129 @@ public TraceView(final GUI gui) {
129149 scroll .setBounds (TEXTAREA_X , TEXTAREA_Y , TEXTAREA_WIDTH , TEXTAREA_HEIGHT );
130150 mainPanel .add (scroll , BorderLayout .CENTER );
131151
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+
132177 JButton button = new JButton ("Выполнить трассировку" );
133178 button .setForeground (COLOR_TEXT );
134179 button .setBackground (COLOR_VALUE );
135180 button .setFont (FONT_COURIER_PLAIN_12 );
136181 button .setBounds (625 , 1 , 200 , BUTTONS_HEIGHT );
137182 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+
138199 button .addActionListener (new ActionListener () {
139200 @ Override
140201 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 ("Остановить" );
144208
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- });
154209
210+ cpu .addDestination (ControlSignal .STOR , new DataDestination () {
211+ @ Override
212+ public void setValue (long value ) {
213+ long addr = cpu .getRegValue (Reg .AR );
155214
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 );
181217 }
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+ });
184248
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 ;
190254
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+ });
196260
197- sleep = sleeptime ;
198- cpu .startStart ();
199- cpu .startContinue ();
200261
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 ;
205267 }
206268 }
207269 });
208- mainPanel .add (button , BorderLayout .EAST );
270+ c .weighty = 1.0 ;
271+ gbl .setConstraints (button , c );
272+ leftPanel .add (button );
209273
210- final JTextField textField = new JTextField ("" , 10 );
274+ JTextField textField = new JTextField ("" , 10 );
211275 bottomButtons .add (textField );
212276
213277 JButton btn1 = new JButton ("Задать адрес началы программы" );
@@ -306,10 +370,14 @@ public void redrawArrows() {
306370 @ Override
307371 public void panelActivate () {
308372 text .requestFocus ();
373+
309374 }
310375
311376 @ Override
312- public void panelDeactivate () { }
377+ public void panelDeactivate () {
378+ if (!isRun )
379+ sleep = 0 ;
380+ }
313381
314382 @ Override
315383 public void actionPerformed (ActionEvent e ) {
0 commit comments