summary refs log tree commit diff stats
path: root/doc/uml/141058.diagram
blob: 285ba67bc652d59389ed186a4d6164cfad9ca172 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
format 70

classinstance 128258 class_ref 169218 // Main
  name ""   xyz 64 4 2000 life_line_z 2000
classinstance 128386 class_ref 149378 // FM
  name ""   xyz 185 32 2000 life_line_z 2000
classinstance 128898 class_ref 128258 // DefaultUI
  name ""   mortal  xyz 289 80 2000 life_line_z 2000
classinstance 132226 class_ref 149122 // Environment
  name ""   xyz 421 84 2000 life_line_z 2000
classinstance 133122 class_ref 156034 // Widget
  name ""   xyz 544 107 2000 life_line_z 2000
classinstance 133762 class_ref 149250 // curses
  name ""   xyz 632 4 2000 life_line_z 2000
classinstance 134530 class_ref 148866 // Command
  name ""   xyz 727 4 2000 life_line_z 2000
note 136962 "This is outdated."
  xyzwh 352 23 2000 145 35
durationcanvas 128514 classinstance_ref 128258 // :Main
  xyzwh 83 82 2010 11 40
end
durationcanvas 128642 classinstance_ref 128386 // :FM
  xyzwh 204 82 2010 11 25
end
durationcanvas 129026 classinstance_ref 128258 // :Main
  xyzwh 83 130 2010 11 34
end
durationcanvas 129154 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 130 2010 11 58
  overlappingdurationcanvas 135426
    xyzwh 331 142 2020 11 40
    overlappingdurationcanvas 135682
      xyzwh 337 151 2030 11 25
    end
  end
end
durationcanvas 129410 classinstance_ref 128258 // :Main
  xyzwh 83 180 2010 11 35
end
durationcanvas 129538 classinstance_ref 128386 // :FM
  xyzwh 204 172 2010 11 468
  overlappingdurationcanvas 136450
    xyzwh 210 537 2020 11 25
  end
end
durationcanvas 129794 classinstance_ref 128258 // :Main
  xyzwh 83 655 2010 11 27
end
durationcanvas 129922 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 655 2010 11 27
end
durationcanvas 130178 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 265 2010 11 26
end
durationcanvas 130434 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 311 2010 11 26
end
durationcanvas 130690 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 381 2010 11 43
end
durationcanvas 131074 classinstance_ref 128898 // :DefaultUI
  xyzwh 325 467 2010 11 53
  overlappingdurationcanvas 134914
    xyzwh 331 489 2020 11 25
  end
end
durationcanvas 132354 classinstance_ref 132226 // :Environment
  xyzwh 469 606 2010 11 32
end
durationcanvas 132866 classinstance_ref 132226 // :Environment
  xyzwh 469 184 2010 11 27
end
durationcanvas 133250 classinstance_ref 133122 // :Widget
  xyzwh 571 280 2010 11 25
end
durationcanvas 133506 classinstance_ref 133122 // :Widget
  xyzwh 571 323 2010 11 25
end
durationcanvas 133890 classinstance_ref 133762 // :curses
  xyzwh 658 389 2010 11 31
end
durationcanvas 135170 classinstance_ref 133122 // :Widget
  xyzwh 571 501 2010 11 27
end
durationcanvas 135938 classinstance_ref 134530 // :Command
  xyzwh 767 506 2010 11 72
end
durationcanvas 136706 classinstance_ref 133122 // :Widget
  xyzwh 571 563 2010 11 34
end
msg 128770 synchronous
  from durationcanvas_ref 128514
  to durationcanvas_ref 128642
  yz 82 2015 msg operation_ref 141826 // "initialize()"
  show_full_operations_definition default drawing_language default
  label_xy 117 64
msg 129282 synchronous
  from durationcanvas_ref 129026
  to durationcanvas_ref 129154
  yz 130 2015 msg operation_ref 171138 // "initialize()"
  show_full_operations_definition default drawing_language default
  label_xy 124 111
msg 129666 synchronous
  from durationcanvas_ref 129410
  to durationcanvas_ref 129538
  yz 180 2015 msg operation_ref 141954 // "loop()"
  show_full_operations_definition default drawing_language default
  label_xy 129 162
msg 130050 synchronous
  from durationcanvas_ref 129794
  to durationcanvas_ref 129922
  yz 655 2015 msg operation_ref 134914 // "destroy()"
  show_full_operations_definition default drawing_language default
  label_xy 119 636
msg 130306 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 130178
  yz 265 2015 msg operation_ref 134530 // "draw()"
  show_full_operations_definition default drawing_language default
  label_xy 245 247
msg 130562 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 130434
  yz 311 2015 msg operation_ref 149378 // "finalize()"
  show_full_operations_definition default drawing_language default
  label_xy 240 293
msg 130818 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 130690
  yz 382 2015 msg operation_ref 148738 // "get_next_key()"
  show_full_operations_definition default drawing_language default
  label_xy 229 361
msg 130946 return
  from durationcanvas_ref 130690
  to durationcanvas_ref 129538
  yz 412 2020 unspecifiedmsg
  show_full_operations_definition default drawing_language default
msg 131202 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 131074
  yz 467 2015 msg operation_ref 148610 // "handle_key()"
  show_full_operations_definition default drawing_language default
  label_xy 234 449
msg 132482 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 132354
  yz 606 2015 msg operation_ref 171522 // "garbage_collect()"
  show_full_operations_definition default drawing_language default
  label_xy 260 587
msg 132994 synchronous
  from durationcanvas_ref 129538
  to durationcanvas_ref 132866
  yz 185 2020 msg operation_ref 171650 // "enter_dir()"
  show_full_operations_definition default drawing_language default
  label_xy 222 164
msg 133378 synchronous
  from durationcanvas_ref 130178
  to durationcanvas_ref 133250
  yz 280 2015 msg operation_ref 134530 // "draw()"
  show_full_operations_definition default drawing_language default
  label_xy 407 262
msg 133634 synchronous
  from durationcanvas_ref 130434
  to durationcanvas_ref 133506
  yz 323 2015 msg operation_ref 149378 // "finalize()"
  show_full_operations_definition default drawing_language default
  label_xy 405 303
msg 134018 synchronous
  from durationcanvas_ref 130690
  to durationcanvas_ref 133890
  yz 391 2015 msg operation_ref 171778 // "getch()"
  show_full_operations_definition default drawing_language default
  label_xy 713 361
msg 134402 return
  from durationcanvas_ref 133890
  to durationcanvas_ref 130690
  yz 408 2020 unspecifiedmsg
  show_full_operations_definition default drawing_language default
reflexivemsg 135042 synchronous
  to durationcanvas_ref 134914
  yz 489 2025 msg operation_ref 148482 // "handle_mouse()"
  show_full_operations_definition default drawing_language default
  label_xy 345 462
msg 135298 synchronous
  from durationcanvas_ref 134914
  to durationcanvas_ref 135170
  yz 502 2030 msg operation_ref 134786 // "click()"
  show_full_operations_definition default drawing_language default
  label_xy 474 484
reflexivemsg 135554 synchronous
  to durationcanvas_ref 135426
  yz 142 2025 msg operation_ref 148866 // "setup()"
  show_full_operations_definition default drawing_language default
  label_xy 340 120
reflexivemsg 135810 synchronous
  to durationcanvas_ref 135682
  yz 151 2035 msg operation_ref 149890 // "add_obj()"
  show_full_operations_definition default drawing_language default
  label_xy 372 143
msg 136066 synchronous
  from durationcanvas_ref 135170
  to durationcanvas_ref 135938
  yz 506 2015 msg operation_ref 164226 // "execute()"
  show_full_operations_definition default drawing_language default
  label_xy 593 488
msg 136578 synchronous
  from durationcanvas_ref 135938
  to durationcanvas_ref 136450
  yz 537 2025 explicitmsg "<command>"
  show_full_operations_definition default drawing_language default
  label_xy 222 520
msg 136834 synchronous
  from durationcanvas_ref 135938
  to durationcanvas_ref 136706
  yz 567 2030 explicitmsg "<command>"
  show_full_operations_definition default drawing_language default
  label_xy 581 554
end
ght .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 011run.cc</title>
<meta name="Generator" content="Vim/8.1">
<meta name="plugin-version" content="vim8.1_v1">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal-light">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #000000; background-color: #c6c6c6; }
body { font-size:12pt; font-family: monospace; color: #000000; background-color: #c6c6c6; }
a { color:inherit; }
* { font-size:12pt; font-size: 1em; }
.cSpecial { color: #008000; }
.LineNr { }
.SpecialChar { color: #d70000; }
.Comment { color: #005faf; }
.Delimiter { color: #c000c0; }
.Identifier { color: #af5f00; }
.Constant { color: #008787; }
.Normal { color: #000000; background-color: #c6c6c6; padding-bottom: 1px; }
.SalientComment { color: #0000af; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  var lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<a href='https://github.com/akkartik/mu/blob/main/011run.cc'>https://github.com/akkartik/mu/blob/main/011run.cc</a>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment">//: Running SubX programs on the VM.</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//: (Not to be confused with the 'run' subcommand for running ELF binaries on</span>
<span id="L4" class="LineNr">  4 </span><span class="Comment">//: the VM. That comes later.)</span>
<span id="L5" class="LineNr">  5 </span>
<span id="L6" class="LineNr">  6 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Texts&quot;)</span>
<span id="L7" class="LineNr">  7 </span><a href='001help.cc.html#L235'>put_new</a><span class="Delimiter">(</span><span class="SpecialChar"><a href='001help.cc.html#L53'>Help</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;syntax&quot;</span><span class="Delimiter">,</span>
<span id="L8" class="LineNr">  8 </span>  <span class="Constant">&quot;SubX programs consist of <a href='011run.cc.html#L106'>segments</a>, each segment in turn consisting of lines.\n&quot;</span>
<span id="L9" class="LineNr">  9 </span>  <span class="Constant">&quot;Line-endings are significant; each <a href='011run.cc.html#L121'>line</a> should contain a single\n&quot;</span>
<span id="L10" class="LineNr"> 10 </span>  <span class="Constant">&quot;instruction, macro or directive.\n&quot;</span>
<span id="L11" class="LineNr"> 11 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L12" class="LineNr"> 12 </span>  <span class="Constant">&quot;Comments start with the '#' character. It should be at the start of a word\n&quot;</span>
<span id="L13" class="LineNr"> 13 </span>  <span class="Constant">&quot;(start of <a href='011run.cc.html#L121'>line</a>, or following a space).\n&quot;</span>
<span id="L14" class="LineNr"> 14 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L15" class="LineNr"> 15 </span>  <span class="Constant">&quot;Each segment starts with a header <a href='011run.cc.html#L121'>line</a>: a '==' delimiter followed by the <a href='011run.cc.html#L111'>name</a> of\n&quot;</span>
<span id="L16" class="LineNr"> 16 </span>  <span class="Constant">&quot;the segment and a (sometimes approximate) starting address in memory.\n&quot;</span>
<span id="L17" class="LineNr"> 17 </span>  <span class="Constant">&quot;The <a href='011run.cc.html#L111'>name</a> 'code' is special; instructions to execute should always go here.\n&quot;</span>
<span id="L18" class="LineNr"> 18 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L19" class="LineNr"> 19 </span>  <span class="Constant">&quot;The resulting binary starts running code from a label called 'Entry'\n&quot;</span>
<span id="L20" class="LineNr"> 20 </span>  <span class="Constant">&quot;in the code segment.\n&quot;</span>
<span id="L21" class="LineNr"> 21 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L22" class="LineNr"> 22 </span>  <span class="Constant">&quot;Segments with the same <a href='011run.cc.html#L111'>name</a> get merged together. This rule helps keep functions\n&quot;</span>
<span id="L23" class="LineNr"> 23 </span>  <span class="Constant">&quot;and their data close together in .subx files.\n&quot;</span>
<span id="L24" class="LineNr"> 24 </span>  <span class="Constant">&quot;You don't have to specify the starting address after the first time.\n&quot;</span>
<span id="L25" class="LineNr"> 25 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L26" class="LineNr"> 26 </span>  <span class="Constant">&quot;Lines consist of a series of words. Words can contain arbitrary metadata\n&quot;</span>
<span id="L27" class="LineNr"> 27 </span>  <span class="Constant">&quot;after a '/', but they can never contain whitespace. Metadata has no effect\n&quot;</span>
<span id="L28" class="LineNr"> 28 </span>  <span class="Constant">&quot;at runtime, but can be handy when rewriting macros.\n&quot;</span>
<span id="L29" class="LineNr"> 29 </span>  <span class="Constant">&quot;\n&quot;</span>
<span id="L30" class="LineNr"> 30 </span>  <span class="Constant">&quot;Check out the example programs in the apps/ directory, particularly apps/ex*.\n&quot;</span>
<span id="L31" class="LineNr"> 31 </span><span class="Delimiter">);</span>
<span id="L32" class="LineNr"> 32 </span><span class="Delimiter">:(before &quot;End <a href='001help.cc.html#L53'>Help</a> Contents&quot;)</span>
<span id="L33" class="LineNr"> 33 </span>cerr &lt;&lt; <span class="Constant">&quot;  syntax\n&quot;</span><span class="Delimiter">;</span>
<span id="L34" class="LineNr"> 34 </span>
<span id="L35" class="LineNr"> 35 </span><span class="Delimiter">:(code)</span>
<span id="L36" class="LineNr"> 36 </span><span class="Normal">void</span> <a href='011run.cc.html#L36'>test_copy_imm32_to_EAX</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L37" class="LineNr"> 37 </span>  <span class="Comment">// At the lowest level, SubX programs are a series of hex bytes, each</span>
<span id="L38" class="LineNr"> 38 </span>  <span class="Comment">// (variable-length) instruction on one line.</span>
<span id="L39" class="LineNr"> 39 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L40" class="LineNr"> 40 </span>      <span class="Comment">// Comments start with '#' and are ignored.</span>
<span id="L41" class="LineNr"> 41 </span>      <span class="Constant">&quot;# comment\n&quot;</span>
<span id="L42" class="LineNr"> 42 </span>      <span class="Comment">// Segment headers start with '==', a name and a starting hex address.</span>
<span id="L43" class="LineNr"> 43 </span>      <span class="Comment">// There's usually one code and one data segment. The code segment</span>
<span id="L44" class="LineNr"> 44 </span>      <span class="Comment">// always comes first.</span>
<span id="L45" class="LineNr"> 45 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>  <span class="Comment">// code segment</span>
<span id="L46" class="LineNr"> 46 </span>
<span id="L47" class="LineNr"> 47 </span>      <span class="Comment">// After the header, each segment consists of lines, and each line</span>
<span id="L48" class="LineNr"> 48 </span>      <span class="Comment">// consists of words separated by whitespace.</span>
<span id="L49" class="LineNr"> 49 </span>      <span class="Comment">//</span>
<span id="L50" class="LineNr"> 50 </span>      <span class="Comment">// All words can have metadata after a '/'. No spaces allowed in</span>
<span id="L51" class="LineNr"> 51 </span>      <span class="Comment">// metadata, of course.</span>
<span id="L52" class="LineNr"> 52 </span>      <span class="Comment">// Unrecognized metadata never causes errors, so you can use it for</span>
<span id="L53" class="LineNr"> 53 </span>      <span class="Comment">// documentation.</span>
<span id="L54" class="LineNr"> 54 </span>      <span class="Comment">//</span>
<span id="L55" class="LineNr"> 55 </span>      <span class="Comment">// Within the code segment in particular, x86 instructions consist of</span>
<span id="L56" class="LineNr"> 56 </span>      <span class="Comment">// some number of the following parts and sub-parts (see the Readme and</span>
<span id="L57" class="LineNr"> 57 </span>      <span class="Comment">// cheatsheet.pdf for details):</span>
<span id="L58" class="LineNr"> 58 </span>      <span class="Comment">//   opcodes: 1-3 bytes</span>
<span id="L59" class="LineNr"> 59 </span>      <span class="Comment">//   ModR/M byte</span>
<span id="L60" class="LineNr"> 60 </span>      <span class="Comment">//   SIB byte</span>
<span id="L61" class="LineNr"> 61 </span>      <span class="Comment">//   displacement: 0/1/2/4 bytes</span>
<span id="L62" class="LineNr"> 62 </span>      <span class="Comment">//   immediate: 0/1/2/4 bytes</span>
<span id="L63" class="LineNr"> 63 </span>      <span class="Comment">// opcode        ModR/M                    SIB                   displacement    immediate</span>
<span id="L64" class="LineNr"> 64 </span>      <span class="Comment">// instruction   mod, reg, Reg/Mem bits    scale, index, base</span>
<span id="L65" class="LineNr"> 65 </span>      <span class="Comment">// 1-3 bytes     0/1 byte                  0/1 byte              0/1/2/4 bytes   0/1/2/4 bytes</span>
<span id="L66" class="LineNr"> 66 </span>      <span class="Constant">&quot;  b8            .                         .                     .               0a 0b 0c 0d\n&quot;</span>  <span class="Comment">// copy 0x0d0c0b0a to EAX</span>
<span id="L67" class="LineNr"> 67 </span>      <span class="Comment">// The periods are just to help the eye track long gaps between columns,</span>
<span id="L68" class="LineNr"> 68 </span>      <span class="Comment">// and are otherwise ignored.</span>
<span id="L69" class="LineNr"> 69 </span>  <span class="Delimiter">);</span>
<span id="L70" class="LineNr"> 70 </span>  <span class="Comment">// This program, when run, causes the following events in the trace:</span>
<span id="L71" class="LineNr"> 71 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L72" class="LineNr"> 72 </span>      <span class="Constant">&quot;load: 0x00000001 -&gt; b8\n&quot;</span>
<span id="L73" class="LineNr"> 73 </span>      <span class="Constant">&quot;load: 0x00000002 -&gt; 0a\n&quot;</span>
<span id="L74" class="LineNr"> 74 </span>      <span class="Constant">&quot;load: 0x00000003 -&gt; 0b\n&quot;</span>
<span id="L75" class="LineNr"> 75 </span>      <span class="Constant">&quot;load: 0x00000004 -&gt; 0c\n&quot;</span>
<span id="L76" class="LineNr"> 76 </span>      <span class="Constant">&quot;load: 0x00000005 -&gt; 0d\n&quot;</span>
<span id="L77" class="LineNr"> 77 </span>      <span class="Constant">&quot;run: copy imm32 0x0d0c0b0a to EAX\n&quot;</span>
<span id="L78" class="LineNr"> 78 </span>  <span class="Delimiter">);</span>
<span id="L79" class="LineNr"> 79 </span><span class="Delimiter">}</span>
<span id="L80" class="LineNr"> 80 </span>
<span id="L81" class="LineNr"> 81 </span><span class="Comment">// top-level helper for tests: parse the input, load the hex bytes into memory, run</span>
<span id="L82" class="LineNr"> 82 </span><span class="Normal">void</span> <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; text_bytes<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L83" class="LineNr"> 83 </span>  program p<span class="Delimiter">;</span>
<span id="L84" class="LineNr"> 84 </span>  istringstream in<span class="Delimiter">(</span>text_bytes<span class="Delimiter">);</span>
<span id="L85" class="LineNr"> 85 </span>  <span class="Comment">// Loading Test Program</span>
<span id="L86" class="LineNr"> 86 </span>  parse<span class="Delimiter">(</span>in<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L87" class="LineNr"> 87 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// if any stage raises errors, stop immediately</span>
<span id="L88" class="LineNr"> 88 </span>  <span class="Comment">// Running Test Program</span>
<span id="L89" class="LineNr"> 89 </span>  <a href='011run.cc.html#L248'>load</a><span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L90" class="LineNr"> 90 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L91" class="LineNr"> 91 </span>  <span class="Comment">// convenience to keep tests concise: 'Entry' label need not be provided</span>
<span id="L92" class="LineNr"> 92 </span>  <span class="Comment">// not allowed in real programs</span>
<span id="L93" class="LineNr"> 93 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L105'>entry</a><span class="Delimiter">)</span>
<span id="L94" class="LineNr"> 94 </span>    <a href='010vm.cc.html#L26'>EIP</a> = p<span class="Delimiter">.</span><a href='011run.cc.html#L105'>entry</a><span class="Delimiter">;</span>
<span id="L95" class="LineNr"> 95 </span>  <span class="Normal">else</span>
<span id="L96" class="LineNr"> 96 </span>    <a href='010vm.cc.html#L26'>EIP</a> = find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)-&gt;</span>start<span class="Delimiter">;</span>
<span id="L97" class="LineNr"> 97 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a> &lt; <span class="SpecialChar"><a href='010vm.cc.html#L166'>End_of_program</a></span><span class="Delimiter">)</span>
<span id="L98" class="LineNr"> 98 </span>    <a href='010vm.cc.html#L277'>run_one_instruction</a><span class="Delimiter">();</span>
<span id="L99" class="LineNr"> 99 </span><span class="Delimiter">}</span>
<span id="L100" class="LineNr">100 </span>
<span id="L101" class="LineNr">101 </span><span class="SalientComment">//:: core data structures</span>
<span id="L102" class="LineNr">102 </span>
<span id="L103" class="LineNr">103 </span><span class="Delimiter">:(before &quot;End Types&quot;)</span>
<span id="L104" class="LineNr">104 </span><span class="Normal">struct</span> program <span class="Delimiter">{</span>
<span id="L105" class="LineNr">105 </span>  <span class="Normal">uint32_t</span> <a href='011run.cc.html#L105'>entry</a><span class="Delimiter">;</span>
<span id="L106" class="LineNr">106 </span>  vector&lt;segment&gt; <a href='011run.cc.html#L106'>segments</a><span class="Delimiter">;</span>
<span id="L107" class="LineNr">107 </span>  program<span class="Delimiter">()</span> <span class="Delimiter">{</span> <a href='011run.cc.html#L105'>entry</a> = <span class="Constant">0</span><span class="Delimiter">;</span> <span class="Delimiter">}</span>
<span id="L108" class="LineNr">108 </span><span class="Delimiter">};</span>
<span id="L109" class="LineNr">109 </span><span class="Delimiter">:(before &quot;struct program&quot;)</span>
<span id="L110" class="LineNr">110 </span><span class="Normal">struct</span> segment <span class="Delimiter">{</span>
<span id="L111" class="LineNr">111 </span>  string <a href='011run.cc.html#L111'>name</a><span class="Delimiter">;</span>
<span id="L112" class="LineNr">112 </span>  <span class="Normal">uint32_t</span> start<span class="Delimiter">;</span>
<span id="L113" class="LineNr">113 </span>  vector&lt;line&gt; <a href='011run.cc.html#L113'>lines</a><span class="Delimiter">;</span>
<span id="L114" class="LineNr">114 </span>  <span class="Comment">// End segment Fields</span>
<span id="L115" class="LineNr">115 </span>  segment<span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L116" class="LineNr">116 </span>    start = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L117" class="LineNr">117 </span>    <span class="Comment">// End segment Constructor</span>
<span id="L118" class="LineNr">118 </span>  <span class="Delimiter">}</span>
<span id="L119" class="LineNr">119 </span><span class="Delimiter">};</span>
<span id="L120" class="LineNr">120 </span><span class="Delimiter">:(before &quot;struct segment&quot;)</span>
<span id="L121" class="LineNr">121 </span><span class="Normal">struct</span> <a href='011run.cc.html#L121'>line</a> <span class="Delimiter">{</span>
<span id="L122" class="LineNr">122 </span>  vector&lt;word&gt; <a href='011run.cc.html#L122'>words</a><span class="Delimiter">;</span>
<span id="L123" class="LineNr">123 </span>  vector&lt;string&gt; metadata<span class="Delimiter">;</span>
<span id="L124" class="LineNr">124 </span>  string original<span class="Delimiter">;</span>
<span id="L125" class="LineNr">125 </span><span class="Delimiter">};</span>
<span id="L126" class="LineNr">126 </span><span class="Delimiter">:(before &quot;struct line&quot;)</span>
<span id="L127" class="LineNr">127 </span><span class="Normal">struct</span> <a href='011run.cc.html#L127'>word</a> <span class="Delimiter">{</span>
<span id="L128" class="LineNr">128 </span>  string original<span class="Delimiter">;</span>
<span id="L129" class="LineNr">129 </span>  string data<span class="Delimiter">;</span>
<span id="L130" class="LineNr">130 </span>  vector&lt;string&gt; metadata<span class="Delimiter">;</span>
<span id="L131" class="LineNr">131 </span><span class="Delimiter">};</span>
<span id="L132" class="LineNr">132 </span>
<span id="L133" class="LineNr">133 </span><span class="SalientComment">//:: parse</span>
<span id="L134" class="LineNr">134 </span>
<span id="L135" class="LineNr">135 </span><span class="Delimiter">:(code)</span>
<span id="L136" class="LineNr">136 </span><span class="Normal">void</span> parse<span class="Delimiter">(</span>istream&amp; fin<span class="Delimiter">,</span> program&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L137" class="LineNr">137 </span>  segment* curr_segment = <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L138" class="LineNr">138 </span>  vector&lt;line&gt; l<span class="Delimiter">;</span>
<span id="L139" class="LineNr">139 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L247'>has_data</a><span class="Delimiter">(</span>fin<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L140" class="LineNr">140 </span>    string line_data<span class="Delimiter">;</span>
<span id="L141" class="LineNr">141 </span>    <a href='011run.cc.html#L121'>line</a> curr<span class="Delimiter">;</span>
<span id="L142" class="LineNr">142 </span>    getline<span class="Delimiter">(</span>fin<span class="Delimiter">,</span> line_data<span class="Delimiter">);</span>
<span id="L143" class="LineNr">143 </span>    curr<span class="Delimiter">.</span>original = line_data<span class="Delimiter">;</span>
<span id="L144" class="LineNr">144 </span>    <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;line: &quot;</span> &lt;&lt; line_data &lt;&lt; end<span class="Delimiter">();</span>
<span id="L145" class="LineNr">145 </span>    <span class="Comment">// End Line Parsing Special-cases(line_data -&gt; l)</span>
<span id="L146" class="LineNr">146 </span>    istringstream lin<span class="Delimiter">(</span>line_data<span class="Delimiter">);</span>
<span id="L147" class="LineNr">147 </span>    <span class="Normal">while</span> <span class="Delimiter">(</span><a href='001help.cc.html#L247'>has_data</a><span class="Delimiter">(</span>lin<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L148" class="LineNr">148 </span>      string word_data<span class="Delimiter">;</span>
<span id="L149" class="LineNr">149 </span>      lin &gt;&gt; word_data<span class="Delimiter">;</span>
<span id="L150" class="LineNr">150 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>word_data<span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L151" class="LineNr">151 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>word_data[<span class="Constant">0</span>] == <span class="Constant">'#'</span><span class="Delimiter">)</span> <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// comment</span>
<span id="L152" class="LineNr">152 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>word_data == <span class="Constant">&quot;.&quot;</span><span class="Delimiter">)</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>  <span class="Comment">// comment token</span>
<span id="L153" class="LineNr">153 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>word_data == <span class="Constant">&quot;==&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L154" class="LineNr">154 </span>        <a href='011run.cc.html#L198'>flush</a><span class="Delimiter">(</span>curr_segment<span class="Delimiter">,</span> l<span class="Delimiter">);</span>
<span id="L155" class="LineNr">155 </span>        string segment_name<span class="Delimiter">;</span>
<span id="L156" class="LineNr">156 </span>        lin &gt;&gt; segment_name<span class="Delimiter">;</span>
<span id="L157" class="LineNr">157 </span>        curr_segment = find<span class="Delimiter">(</span>out<span class="Delimiter">,</span> segment_name<span class="Delimiter">);</span>
<span id="L158" class="LineNr">158 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span>curr_segment != <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L159" class="LineNr">159 </span>          <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;appending to segment '&quot;</span> &lt;&lt; segment_name &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L160" class="LineNr">160 </span>        <span class="Delimiter">}</span>
<span id="L161" class="LineNr">161 </span>        <span class="Normal">else</span> <span class="Delimiter">{</span>
<span id="L162" class="LineNr">162 </span>          <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new segment '&quot;</span> &lt;&lt; segment_name &lt;&lt; <span class="Constant">&quot;'&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L163" class="LineNr">163 </span>          <span class="Normal">uint32_t</span> seg_start = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L164" class="LineNr">164 </span>          lin &gt;&gt; std::hex &gt;&gt; seg_start<span class="Delimiter">;</span>
<span id="L165" class="LineNr">165 </span>          <a href='011run.cc.html#L219'>sanity_check_program_segment</a><span class="Delimiter">(</span>out<span class="Delimiter">,</span> seg_start<span class="Delimiter">);</span>
<span id="L166" class="LineNr">166 </span>          out<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>segment<span class="Delimiter">());</span>
<span id="L167" class="LineNr">167 </span>          curr_segment = &amp;out<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>back<span class="Delimiter">();</span>
<span id="L168" class="LineNr">168 </span>          curr_segment<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L111'>name</a> = segment_name<span class="Delimiter">;</span>
<span id="L169" class="LineNr">169 </span>          curr_segment<span class="Delimiter">-&gt;</span>start = seg_start<span class="Delimiter">;</span>
<span id="L170" class="LineNr">170 </span>          <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L171" class="LineNr">171 </span>          <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;starts at address 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; curr_segment<span class="Delimiter">-&gt;</span>start &lt;&lt; end<span class="Delimiter">();</span>
<span id="L172" class="LineNr">172 </span>        <span class="Delimiter">}</span>
<span id="L173" class="LineNr">173 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>  <span class="Comment">// skip rest of line</span>
<span id="L174" class="LineNr">174 </span>      <span class="Delimiter">}</span>
<span id="L175" class="LineNr">175 </span>      <span class="Normal">if</span> <span class="Delimiter">(</span>word_data[<span class="Constant">0</span>] == <span class="Constant">':'</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr">176 </span>        <span class="Comment">// todo: line metadata</span>
<span id="L177" class="LineNr">177 </span>        <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L178" class="LineNr">178 </span>      <span class="Delimiter">}</span>
<span id="L179" class="LineNr">179 </span>      curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span><a href='011run.cc.html#L127'>word</a><span class="Delimiter">());</span>
<span id="L180" class="LineNr">180 </span>      <a href='011run.cc.html#L209'>parse_word</a><span class="Delimiter">(</span>word_data<span class="Delimiter">,</span> curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">());</span>
<span id="L181" class="LineNr">181 </span>      <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;word: &quot;</span> &lt;&lt; to_string<span class="Delimiter">(</span>curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>back<span class="Delimiter">());</span>
<span id="L182" class="LineNr">182 </span>    <span class="Delimiter">}</span>
<span id="L183" class="LineNr">183 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!curr<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span>
<span id="L184" class="LineNr">184 </span>      l<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>curr<span class="Delimiter">);</span>
<span id="L185" class="LineNr">185 </span>  <span class="Delimiter">}</span>
<span id="L186" class="LineNr">186 </span>  <a href='011run.cc.html#L198'>flush</a><span class="Delimiter">(</span>curr_segment<span class="Delimiter">,</span> l<span class="Delimiter">);</span>
<span id="L187" class="LineNr">187 </span>  <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;done&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
<span id="L189" class="LineNr">189 </span>
<span id="L190" class="LineNr">190 </span>segment* find<span class="Delimiter">(</span>program&amp; p<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; segment_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L191" class="LineNr">191 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L192" class="LineNr">192 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L111'>name</a> == segment_name<span class="Delimiter">)</span>
<span id="L193" class="LineNr">193 </span>      <span class="Identifier">return</span> &amp;p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L194" class="LineNr">194 </span>  <span class="Delimiter">}</span>
<span id="L195" class="LineNr">195 </span>  <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L196" class="LineNr">196 </span><span class="Delimiter">}</span>
<span id="L197" class="LineNr">197 </span>
<span id="L198" class="LineNr">198 </span><span class="Normal">void</span> <a href='011run.cc.html#L198'>flush</a><span class="Delimiter">(</span>segment* s<span class="Delimiter">,</span> vector&lt;line&gt;&amp; <a href='011run.cc.html#L113'>lines</a><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L199" class="LineNr">199 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>empty<span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L200" class="LineNr">200 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>s == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L201" class="LineNr">201 </span>    <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;input does not start with a '==' section header\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L202" class="LineNr">202 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L203" class="LineNr">203 </span>  <span class="Delimiter">}</span>
<span id="L204" class="LineNr">204 </span>  <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">3</span><span class="Delimiter">,</span> <span class="Constant">&quot;parse&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;flushing segment&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L205" class="LineNr">205 </span>  s<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>insert<span class="Delimiter">(</span>s<span class="Delimiter">-&gt;</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>end<span class="Delimiter">(),</span> <a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>begin<span class="Delimiter">(),</span> <a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L206" class="LineNr">206 </span>  <a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>clear<span class="Delimiter">();</span>
<span id="L207" class="LineNr">207 </span><span class="Delimiter">}</span>
<span id="L208" class="LineNr">208 </span>
<span id="L209" class="LineNr">209 </span><span class="Normal">void</span> <a href='011run.cc.html#L209'>parse_word</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; data<span class="Delimiter">,</span> word&amp; out<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L210" class="LineNr">210 </span>  out<span class="Delimiter">.</span>original = data<span class="Delimiter">;</span>
<span id="L211" class="LineNr">211 </span>  istringstream win<span class="Delimiter">(</span>data<span class="Delimiter">);</span>
<span id="L212" class="LineNr">212 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>getline<span class="Delimiter">(</span>win<span class="Delimiter">,</span> out<span class="Delimiter">.</span>data<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L213" class="LineNr">213 </span>    string m<span class="Delimiter">;</span>
<span id="L214" class="LineNr">214 </span>    <span class="Normal">while</span> <span class="Delimiter">(</span>getline<span class="Delimiter">(</span>win<span class="Delimiter">,</span> m<span class="Delimiter">,</span> <span class="Constant">'/'</span><span class="Delimiter">))</span>
<span id="L215" class="LineNr">215 </span>      out<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>m<span class="Delimiter">);</span>
<span id="L216" class="LineNr">216 </span>  <span class="Delimiter">}</span>
<span id="L217" class="LineNr">217 </span><span class="Delimiter">}</span>
<span id="L218" class="LineNr">218 </span>
<span id="L219" class="LineNr">219 </span><span class="Normal">void</span> <a href='011run.cc.html#L219'>sanity_check_program_segment</a><span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> <span class="Normal">uint32_t</span> addr<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L220" class="LineNr">220 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L221" class="LineNr">221 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>start == addr<span class="Delimiter">)</span>
<span id="L222" class="LineNr">222 </span>      <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;can't have multiple segments starting at address 0x&quot;</span> &lt;&lt; HEXWORD &lt;&lt; addr &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L223" class="LineNr">223 </span>  <span class="Delimiter">}</span>
<span id="L224" class="LineNr">224 </span><span class="Delimiter">}</span>
<span id="L225" class="LineNr">225 </span>
<span id="L226" class="LineNr">226 </span><span class="Comment">// helper for tests</span>
<span id="L227" class="LineNr">227 </span><span class="Normal">void</span> parse<span class="Delimiter">(</span><span class="Normal">const</span> string&amp; text_bytes<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L228" class="LineNr">228 </span>  program p<span class="Delimiter">;</span>
<span id="L229" class="LineNr">229 </span>  istringstream in<span class="Delimiter">(</span>text_bytes<span class="Delimiter">);</span>
<span id="L230" class="LineNr">230 </span>  parse<span class="Delimiter">(</span>in<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L231" class="LineNr">231 </span><span class="Delimiter">}</span>
<span id="L232" class="LineNr">232 </span>
<span id="L233" class="LineNr">233 </span><span class="Normal">void</span> <a href='011run.cc.html#L233'>test_detect_duplicate_segments</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L234" class="LineNr">234 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L235" class="LineNr">235 </span>  parse<span class="Delimiter">(</span>
<span id="L236" class="LineNr">236 </span>      <span class="Constant">&quot;== segment1 0xee\n&quot;</span>
<span id="L237" class="LineNr">237 </span>      <span class="Constant">&quot;ab\n&quot;</span>
<span id="L238" class="LineNr">238 </span>      <span class="Constant">&quot;== segment2 0xee\n&quot;</span>
<span id="L239" class="LineNr">239 </span>      <span class="Constant">&quot;cd\n&quot;</span>
<span id="L240" class="LineNr">240 </span>  <span class="Delimiter">);</span>
<span id="L241" class="LineNr">241 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L242" class="LineNr">242 </span>      <span class="Constant">&quot;error: can't have multiple segments starting at address 0x000000ee\n&quot;</span>
<span id="L243" class="LineNr">243 </span>  <span class="Delimiter">);</span>
<span id="L244" class="LineNr">244 </span><span class="Delimiter">}</span>
<span id="L245" class="LineNr">245 </span>
<span id="L246" class="LineNr">246 </span><span class="SalientComment">//:: load</span>
<span id="L247" class="LineNr">247 </span>
<span id="L248" class="LineNr">248 </span><span class="Normal">void</span> <a href='011run.cc.html#L248'>load</a><span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L249" class="LineNr">249 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>find<span class="Delimiter">(</span>p<span class="Delimiter">,</span> <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span> == <span class="Constant">NULL</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L250" class="LineNr">250 </span>    <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;no code to run\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L251" class="LineNr">251 </span>    <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L252" class="LineNr">252 </span>  <span class="Delimiter">}</span>
<span id="L253" class="LineNr">253 </span>  <span class="Comment">// Ensure segments are disjoint.</span>
<span id="L254" class="LineNr">254 </span>  set&lt;<span class="Normal">uint32_t</span>&gt; overlap<span class="Delimiter">;</span>
<span id="L255" class="LineNr">255 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>   i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L256" class="LineNr">256 </span>    <span class="Normal">const</span> segment&amp; seg = p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L257" class="LineNr">257 </span>    <span class="Normal">uint32_t</span> addr = seg<span class="Delimiter">.</span>start<span class="Delimiter">;</span>
<span id="L258" class="LineNr">258 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>!already_allocated<span class="Delimiter">(</span>addr<span class="Delimiter">))</span>
<span id="L259" class="LineNr">259 </span>      <span class="SpecialChar"><a href='010vm.cc.html#L163'>Mem</a></span><span class="Delimiter">.</span>push_back<span class="Delimiter">(</span>vma<span class="Delimiter">(</span>seg<span class="Delimiter">.</span>start<span class="Delimiter">));</span>
<span id="L260" class="LineNr">260 </span>    <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;loading segment &quot;</span> &lt;&lt; i &lt;&lt; <span class="Constant">&quot; from &quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; end<span class="Delimiter">();</span>
<span id="L261" class="LineNr">261 </span>    <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> j = <span class="Constant">0</span><span class="Delimiter">;</span>  j &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">);</span>  ++j<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L262" class="LineNr">262 </span>      <span class="Normal">const</span> line&amp; l = seg<span class="Delimiter">.</span><a href='011run.cc.html#L113'>lines</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>j<span class="Delimiter">);</span>
<span id="L263" class="LineNr">263 </span>      <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> k = <span class="Constant">0</span><span class="Delimiter">;</span>  k &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">);</span>  ++k<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L264" class="LineNr">264 </span>        <span class="Normal">const</span> word&amp; w = l<span class="Delimiter">.</span><a href='011run.cc.html#L122'>words</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>k<span class="Delimiter">);</span>
<span id="L265" class="LineNr">265 </span>        <span class="Normal">uint8_t</span> val = <a href='011run.cc.html#L288'>hex_byte</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>data<span class="Delimiter">);</span>
<span id="L266" class="LineNr">266 </span>        <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>
<span id="L267" class="LineNr">267 </span>        assert<span class="Delimiter">(</span>overlap<span class="Delimiter">.</span>find<span class="Delimiter">(</span>addr<span class="Delimiter">)</span> == overlap<span class="Delimiter">.</span>end<span class="Delimiter">());</span>
<span id="L268" class="LineNr">268 </span>        <a href='010vm.cc.html#L244'>write_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">,</span> val<span class="Delimiter">);</span>
<span id="L269" class="LineNr">269 </span>        overlap<span class="Delimiter">.</span>insert<span class="Delimiter">(</span>addr<span class="Delimiter">);</span>
<span id="L270" class="LineNr">270 </span>        <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="Constant">99</span><span class="Delimiter">,</span> <span class="Constant">&quot;load&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; addr &lt;&lt; <span class="Constant">&quot; -&gt; &quot;</span> &lt;&lt; <a href='010vm.cc.html#L407'>HEXBYTE</a> &lt;&lt; <a href='010vm.cc.html#L410'>NUM</a><span class="Delimiter">(</span><a href='010vm.cc.html#L174'>read_mem_u8</a><span class="Delimiter">(</span>addr<span class="Delimiter">))</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L271" class="LineNr">271 </span>        ++addr<span class="Delimiter">;</span>
<span id="L272" class="LineNr">272 </span>      <span class="Delimiter">}</span>
<span id="L273" class="LineNr">273 </span>    <span class="Delimiter">}</span>
<span id="L274" class="LineNr">274 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>seg<span class="Delimiter">.</span><a href='011run.cc.html#L111'>name</a> == <span class="Constant">&quot;code&quot;</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L275" class="LineNr">275 </span>      <span class="SpecialChar"><a href='010vm.cc.html#L166'>End_of_program</a></span> = addr<span class="Delimiter">;</span>
<span id="L276" class="LineNr">276 </span>    <span class="Delimiter">}</span>
<span id="L277" class="LineNr">277 </span>  <span class="Delimiter">}</span>
<span id="L278" class="LineNr">278 </span><span class="Delimiter">}</span>
<span id="L279" class="LineNr">279 </span>
<span id="L280" class="LineNr">280 </span><span class="Normal">const</span> segment* find<span class="Delimiter">(</span><span class="Normal">const</span> program&amp; p<span class="Delimiter">,</span> <span class="Normal">const</span> string&amp; segment_name<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L281" class="LineNr">281 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L282" class="LineNr">282 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span><a href='011run.cc.html#L111'>name</a> == segment_name<span class="Delimiter">)</span>
<span id="L283" class="LineNr">283 </span>      <span class="Identifier">return</span> &amp;p<span class="Delimiter">.</span><a href='011run.cc.html#L106'>segments</a><span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L284" class="LineNr">284 </span>  <span class="Delimiter">}</span>
<span id="L285" class="LineNr">285 </span>  <span class="Identifier">return</span> <span class="Constant">NULL</span><span class="Delimiter">;</span>
<span id="L286" class="LineNr">286 </span><span class="Delimiter">}</span>
<span id="L287" class="LineNr">287 </span>
<span id="L288" class="LineNr">288 </span><span class="Normal">uint8_t</span> <a href='011run.cc.html#L288'>hex_byte</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L289" class="LineNr">289 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='011run.cc.html#L449'>contains_uppercase</a><span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L290" class="LineNr">290 </span>    <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;uppercase hex not allowed: &quot;</span> &lt;&lt; s &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L291" class="LineNr">291 </span>    <span class="Identifier">return</span> <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L292" class="LineNr">292 </span>  <span class="Delimiter">}</span>
<span id="L293" class="LineNr">293 </span>  istringstream in<span class="Delimiter">(</span>s<span class="Delimiter">);</span>
<span id="L294" class="LineNr">294 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L295" class="LineNr">295 </span>  in &gt;&gt; std::hex &gt;&gt; result<span class="Delimiter">;</span>
<span id="L296" class="LineNr">296 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!in || !in<span class="Delimiter">.</span>eof<span class="Delimiter">())</span> <span class="Delimiter">{</span>
<span id="L297" class="LineNr">297 </span>    <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;token '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;' is not a hex byte\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L298" class="LineNr">298 </span>    <span class="Identifier">return</span> <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
<span id="L299" class="LineNr">299 </span>  <span class="Delimiter">}</span>
<span id="L300" class="LineNr">300 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>result &gt; <span class="Constant">0xff</span> || result &lt; -<span class="Constant">0x8f</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L301" class="LineNr">301 </span>    <a href='003trace.cc.html#L226'>raise</a> &lt;&lt; <span class="Constant">&quot;token '&quot;</span> &lt;&lt; s &lt;&lt; <span class="Constant">&quot;' is not a hex byte\n&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L302" class="LineNr">302 </span>    <span class="Identifier">return</span> <span class="cSpecial">'\0'</span><span class="Delimiter">;</span>
<span id="L303" class="LineNr">303 </span>  <span class="Delimiter">}</span>
<span id="L304" class="LineNr">304 </span>  <span class="Identifier">return</span> <span class="Normal">static_cast</span>&lt;<span class="Normal">uint8_t</span>&gt;<span class="Delimiter">(</span>result<span class="Delimiter">);</span>
<span id="L305" class="LineNr">305 </span><span class="Delimiter">}</span>
<span id="L306" class="LineNr">306 </span>
<span id="L307" class="LineNr">307 </span><span class="Normal">void</span> <a href='011run.cc.html#L307'>test_number_too_large</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L308" class="LineNr">308 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L309" class="LineNr">309 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L310" class="LineNr">310 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L311" class="LineNr">311 </span>      <span class="Constant">&quot;01 cab\n&quot;</span>
<span id="L312" class="LineNr">312 </span>  <span class="Delimiter">);</span>
<span id="L313" class="LineNr">313 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L314" class="LineNr">314 </span>      <span class="Constant">&quot;error: token 'cab' is not a hex byte\n&quot;</span>
<span id="L315" class="LineNr">315 </span>  <span class="Delimiter">);</span>
<span id="L316" class="LineNr">316 </span><span class="Delimiter">}</span>
<span id="L317" class="LineNr">317 </span>
<span id="L318" class="LineNr">318 </span><span class="Normal">void</span> <a href='011run.cc.html#L318'>test_invalid_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L319" class="LineNr">319 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L320" class="LineNr">320 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L321" class="LineNr">321 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L322" class="LineNr">322 </span>      <span class="Constant">&quot;01 cx\n&quot;</span>
<span id="L323" class="LineNr">323 </span>  <span class="Delimiter">);</span>
<span id="L324" class="LineNr">324 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L325" class="LineNr">325 </span>      <span class="Constant">&quot;error: token 'cx' is not a hex byte\n&quot;</span>
<span id="L326" class="LineNr">326 </span>  <span class="Delimiter">);</span>
<span id="L327" class="LineNr">327 </span><span class="Delimiter">}</span>
<span id="L328" class="LineNr">328 </span>
<span id="L329" class="LineNr">329 </span><span class="Normal">void</span> <a href='011run.cc.html#L329'>test_negative_number</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L330" class="LineNr">330 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L331" class="LineNr">331 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L332" class="LineNr">332 </span>      <span class="Constant">&quot;01 -02\n&quot;</span>
<span id="L333" class="LineNr">333 </span>  <span class="Delimiter">);</span>
<span id="L334" class="LineNr">334 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L335" class="LineNr">335 </span><span class="Delimiter">}</span>
<span id="L336" class="LineNr">336 </span>
<span id="L337" class="LineNr">337 </span><span class="Normal">void</span> <a href='011run.cc.html#L337'>test_negative_number_too_small</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L338" class="LineNr">338 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L339" class="LineNr">339 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L340" class="LineNr">340 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L341" class="LineNr">341 </span>      <span class="Constant">&quot;01 -12345\n&quot;</span>
<span id="L342" class="LineNr">342 </span>  <span class="Delimiter">);</span>
<span id="L343" class="LineNr">343 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L344" class="LineNr">344 </span>      <span class="Constant">&quot;error: token '-12345' is not a hex byte\n&quot;</span>
<span id="L345" class="LineNr">345 </span>  <span class="Delimiter">);</span>
<span id="L346" class="LineNr">346 </span><span class="Delimiter">}</span>
<span id="L347" class="LineNr">347 </span>
<span id="L348" class="LineNr">348 </span><span class="Normal">void</span> <a href='011run.cc.html#L348'>test_hex_prefix</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L349" class="LineNr">349 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L350" class="LineNr">350 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L351" class="LineNr">351 </span>      <span class="Constant">&quot;0x01 -0x02\n&quot;</span>
<span id="L352" class="LineNr">352 </span>  <span class="Delimiter">);</span>
<span id="L353" class="LineNr">353 </span>  <a href='003trace.cc.html#L294'>CHECK_TRACE_COUNT</a><span class="Delimiter">(</span><span class="Constant">&quot;error&quot;</span><span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L354" class="LineNr">354 </span><span class="Delimiter">}</span>
<span id="L355" class="LineNr">355 </span>
<span id="L356" class="LineNr">356 </span><span class="Normal">void</span> <a href='011run.cc.html#L356'>test_repeated_segment_merges_data</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L357" class="LineNr">357 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L358" class="LineNr">358 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>
<span id="L359" class="LineNr">359 </span>      <span class="Constant">&quot;11 22\n&quot;</span>
<span id="L360" class="LineNr">360 </span>      <span class="Constant">&quot;== code\n&quot;</span>  <span class="Comment">// again</span>
<span id="L361" class="LineNr">361 </span>      <span class="Constant">&quot;33 44\n&quot;</span>
<span id="L362" class="LineNr">362 </span>  <span class="Delimiter">);</span>
<span id="L363" class="LineNr">363 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L364" class="LineNr">364 </span>      <span class="Constant">&quot;parse: new segment 'code'\n&quot;</span>
<span id="L365" class="LineNr">365 </span>      <span class="Constant">&quot;parse: appending to segment 'code'\n&quot;</span>
<span id="L366" class="LineNr">366 </span>      <span class="Comment">// first segment</span>
<span id="L367" class="LineNr">367 </span>      <span class="Constant">&quot;load: 0x00000001 -&gt; 11\n&quot;</span>
<span id="L368" class="LineNr">368 </span>      <span class="Constant">&quot;load: 0x00000002 -&gt; 22\n&quot;</span>
<span id="L369" class="LineNr">369 </span>      <span class="Comment">// second segment</span>
<span id="L370" class="LineNr">370 </span>      <span class="Constant">&quot;load: 0x00000003 -&gt; 33\n&quot;</span>
<span id="L371" class="LineNr">371 </span>      <span class="Constant">&quot;load: 0x00000004 -&gt; 44\n&quot;</span>
<span id="L372" class="LineNr">372 </span>  <span class="Delimiter">);</span>
<span id="L373" class="LineNr">373 </span><span class="Delimiter">}</span>
<span id="L374" class="LineNr">374 </span>
<span id="L375" class="LineNr">375 </span><span class="Normal">void</span> <a href='011run.cc.html#L375'>test_error_on_missing_segment_header</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L376" class="LineNr">376 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L377" class="LineNr">377 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L378" class="LineNr">378 </span>      <span class="Constant">&quot;01 02\n&quot;</span>
<span id="L379" class="LineNr">379 </span>  <span class="Delimiter">);</span>
<span id="L380" class="LineNr">380 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L381" class="LineNr">381 </span>      <span class="Constant">&quot;error: input does not start with a '==' section header\n&quot;</span>
<span id="L382" class="LineNr">382 </span>  <span class="Delimiter">);</span>
<span id="L383" class="LineNr">383 </span><span class="Delimiter">}</span>
<span id="L384" class="LineNr">384 </span>
<span id="L385" class="LineNr">385 </span><span class="Normal">void</span> <a href='011run.cc.html#L385'>test_error_on_uppercase_hex</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L386" class="LineNr">386 </span>  <span class="SpecialChar">Hide_errors</span> = <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L387" class="LineNr">387 </span>  <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span>
<span id="L388" class="LineNr">388 </span>      <span class="Constant">&quot;== code\n&quot;</span>
<span id="L389" class="LineNr">389 </span>      <span class="Constant">&quot;01 Ab\n&quot;</span>
<span id="L390" class="LineNr">390 </span>  <span class="Delimiter">);</span>
<span id="L391" class="LineNr">391 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L392" class="LineNr">392 </span>      <span class="Constant">&quot;error: uppercase hex not allowed: Ab\n&quot;</span>
<span id="L393" class="LineNr">393 </span>  <span class="Delimiter">);</span>
<span id="L394" class="LineNr">394 </span><span class="Delimiter">}</span>
<span id="L395" class="LineNr">395 </span>
<span id="L396" class="LineNr">396 </span><span class="Comment">//: helper for tests</span>
<span id="L397" class="LineNr">397 </span><span class="Normal">void</span> <a href='011run.cc.html#L397'>parse_and_load</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; text_bytes<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L398" class="LineNr">398 </span>  program p<span class="Delimiter">;</span>
<span id="L399" class="LineNr">399 </span>  istringstream in<span class="Delimiter">(</span>text_bytes<span class="Delimiter">);</span>
<span id="L400" class="LineNr">400 </span>  parse<span class="Delimiter">(</span>in<span class="Delimiter">,</span> p<span class="Delimiter">);</span>
<span id="L401" class="LineNr">401 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='003trace.cc.html#L262'>trace_contains_errors</a><span class="Delimiter">())</span> <span class="Identifier">return</span><span class="Delimiter">;</span>  <span class="Comment">// if any stage raises errors, stop immediately</span>
<span id="L402" class="LineNr">402 </span>  <a href='011run.cc.html#L248'>load</a><span class="Delimiter">(</span>p<span class="Delimiter">);</span>
<span id="L403" class="LineNr">403 </span><span class="Delimiter">}</span>
<span id="L404" class="LineNr">404 </span>
<span id="L405" class="LineNr">405 </span><span class="SalientComment">//:: run</span>
<span id="L406" class="LineNr">406 </span>
<span id="L407" class="LineNr">407 </span><span class="Delimiter">:(before &quot;End Initialize Op Names&quot;)</span>
<span id="L408" class="LineNr">408 </span><a href='001help.cc.html#L235'>put_new</a><span class="Delimiter">(</span><span class="SpecialChar"><a href='010vm.cc.html#L355'>Name</a></span><span class="Delimiter">,</span> <span class="Constant">&quot;b8&quot;</span><span class="Delimiter">,</span> <span class="Constant">&quot;copy imm32 to <a href='010vm.cc.html#L10'>EAX</a> (mov)&quot;</span><span class="Delimiter">);</span>
<span id="L409" class="LineNr">409 </span>
<span id="L410" class="LineNr">410 </span><span class="Comment">//: our first opcode</span>
<span id="L411" class="LineNr">411 </span>
<span id="L412" class="LineNr">412 </span><span class="Delimiter">:(before &quot;End Single-Byte Opcodes&quot;)</span>
<span id="L413" class="LineNr">413 </span><span class="Normal">case</span> <span class="Constant">0xb8</span>: <span class="Delimiter">{</span>  <span class="Comment">// copy imm32 to EAX</span>
<span id="L414" class="LineNr">414 </span>  <span class="Normal">const</span> <span class="Normal">int32_t</span> src = <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">();</span>
<span id="L415" class="LineNr">415 </span>  <a href='003trace.cc.html#L96'>trace</a><span class="Delimiter">(</span><span class="SpecialChar">Callstack_depth</span>+<span class="Constant">1</span><span class="Delimiter">,</span> <span class="Constant">&quot;run&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;copy imm32 0x&quot;</span> &lt;&lt; <a href='010vm.cc.html#L408'>HEXWORD</a> &lt;&lt; src &lt;&lt; <span class="Constant">&quot; to EAX&quot;</span> &lt;&lt; end<span class="Delimiter">();</span>
<span id="L416" class="LineNr">416 </span>  <span class="SpecialChar"><a href='010vm.cc.html#L25'>Reg</a></span>[EAX]<span class="Delimiter">.</span>i = src<span class="Delimiter">;</span>
<span id="L417" class="LineNr">417 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L418" class="LineNr">418 </span><span class="Delimiter">}</span>
<span id="L419" class="LineNr">419 </span>
<span id="L420" class="LineNr">420 </span><span class="Delimiter">:(code)</span>
<span id="L421" class="LineNr">421 </span><span class="Normal">void</span> <a href='011run.cc.html#L421'>test_copy_imm32_to_EAX_again</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L422" class="LineNr">422 </span>  <a href='011run.cc.html#L82'>run</a><span class="Delimiter">(</span>
<span id="L423" class="LineNr">423 </span>      <span class="Constant">&quot;== code 0x1\n&quot;</span>  <span class="Comment">// code segment</span>
<span id="L424" class="LineNr">424 </span>      <span class="Comment">// op     ModR/M  SIB   displacement  immediate</span>
<span id="L425" class="LineNr">425 </span>      <span class="Constant">&quot;  b8                                 0a 0b 0c 0d \n&quot;</span>  <span class="Comment">// copy 0x0d0c0b0a to EAX</span>
<span id="L426" class="LineNr">426 </span>  <span class="Delimiter">);</span>
<span id="L427" class="LineNr">427 </span>  <a href='003trace.cc.html#L290'>CHECK_TRACE_CONTENTS</a><span class="Delimiter">(</span>
<span id="L428" class="LineNr">428 </span>      <span class="Constant">&quot;run: copy imm32 0x0d0c0b0a to EAX\n&quot;</span>
<span id="L429" class="LineNr">429 </span>  <span class="Delimiter">);</span>
<span id="L430" class="LineNr">430 </span><span class="Delimiter">}</span>
<span id="L431" class="LineNr">431 </span>
<span id="L432" class="LineNr">432 </span><span class="Comment">// read a 32-bit int in little-endian order from the instruction stream</span>
<span id="L433" class="LineNr">433 </span><span class="Normal">int32_t</span> <a href='011run.cc.html#L433'>next32</a><span class="Delimiter">()</span> <span class="Delimiter">{</span>
<span id="L434" class="LineNr">434 </span>  <span class="Normal">int32_t</span> result = <a href='010vm.cc.html#L185'>read_mem_i32</a><span class="Delimiter">(</span><a href='010vm.cc.html#L26'>EIP</a><span class="Delimiter">);</span>
<span id="L435" class="LineNr">435 </span>  EIP+=<span class="Constant">4</span><span class="Delimiter">;</span>
<span id="L436" class="LineNr">436 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L437" class="LineNr">437 </span><span class="Delimiter">}</span>
<span id="L438" class="LineNr">438 </span>
<span id="L439" class="LineNr">439 </span><span class="SalientComment">//:: helpers</span>
<span id="L440" class="LineNr">440 </span>
<span id="L441" class="LineNr">441 </span>string to_string<span class="Delimiter">(</span><span class="Normal">const</span> word&amp; w<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L442" class="LineNr">442 </span>  ostringstream out<span class="Delimiter">;</span>
<span id="L443" class="LineNr">443 </span>  out &lt;&lt; w<span class="Delimiter">.</span>data<span class="Delimiter">;</span>
<span id="L444" class="LineNr">444 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>w<span class="Delimiter">.</span>metadata<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L445" class="LineNr">445 </span>    out &lt;&lt; <span class="Constant">&quot; /&quot;</span> &lt;&lt; w<span class="Delimiter">.</span>metadata<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">);</span>
<span id="L446" class="LineNr">446 </span>  <span class="Identifier">return</span> out<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L447" class="LineNr">447 </span><span class="Delimiter">}</span>
<span id="L448" class="LineNr">448 </span>
<span id="L449" class="LineNr">449 </span><span class="Normal">bool</span> <a href='011run.cc.html#L449'>contains_uppercase</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L450" class="LineNr">450 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; <a href='001help.cc.html#L166'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">);</span>  ++i<span class="Delimiter">)</span>
<span id="L451" class="LineNr">451 </span>    <span class="Normal">if</span> <span class="Delimiter">(</span>isupper<span class="Delimiter">(</span>s<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Identifier">return</span> <span class="Constant">true</span><span class="Delimiter">;</span>
<span id="L452" class="LineNr">452 </span>  <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L453" class="LineNr">453 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->