Skip to content

Commit 03856c4

Browse files
committed
добавил задержку между инструкциями
1 parent a480302 commit 03856c4

File tree

2 files changed

+137
-66
lines changed

2 files changed

+137
-66
lines changed

bcomp-ng-ui/src/main/java/ru/ifmo/cs/bcomp/ui/components/AssemblerView.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,10 @@ public void actionPerformed(ActionEvent e) {
116116
for (String err: asm.getErrors()) {
117117
errors = errors + err + '\n';
118118
}
119+
119120
errors = errors + ft;
121+
if(asm.getErrors().isEmpty()) errors = errors + "\n" + pobj.toCompiledWords();
122+
120123
errorarea.setText(errors);
121124
if (pobj != null) {
122125
gui.getBasicComp().loadProgram(new ProgramBinary(pobj.getBinaryFormat()));

bcomp-ng-ui/src/main/java/ru/ifmo/cs/bcomp/ui/components/TraceView.java

Lines changed: 134 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@
44
import ru.ifmo.cs.bcomp.CPU;
55
import ru.ifmo.cs.bcomp.ControlSignal;
66
import ru.ifmo.cs.bcomp.Reg;
7-
import ru.ifmo.cs.components.Utils;
87
import ru.ifmo.cs.bcomp.ui.GUI;
98
import ru.ifmo.cs.components.DataDestination;
9+
import ru.ifmo.cs.components.Utils;
1010

1111
import javax.swing.*;
1212
import 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

Comments
 (0)