-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlarger-flowchart-example.html
More file actions
442 lines (372 loc) · 169 KB
/
larger-flowchart-example.html
File metadata and controls
442 lines (372 loc) · 169 KB
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
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
<html>
<head>
<meta charset="utf-8">
<script src="lib/bindings/utils.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/vis-network/9.1.2/dist/dist/vis-network.min.css" integrity="sha512-WgxfT5LWjfszlPHXRmBWHkV2eceiWTOBvrKCNbdgDYTHrT2AeLCGbF4sZlZw3UMN3WtL0tGUoIAKsu8mllg/XA==" crossorigin="anonymous" referrerpolicy="no-referrer" />
<script src="https://cdnjs.cloudflare.com/ajax/libs/vis-network/9.1.2/dist/vis-network.min.js" integrity="sha512-LnvoEWDFrqGHlHmDD2101OrLcbsfkrzoSpvtSQtxK3RMnRV0eOkhhBN2dXHKRrUU8p2DGRTk35n4O8nWSVe1mQ==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<center>
<h1></h1>
</center>
<!-- <link rel="stylesheet" href="../node_modules/vis/dist/vis.min.css" type="text/css" />
<script type="text/javascript" src="../node_modules/vis/dist/vis.js"> </script>-->
<link
href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/css/bootstrap.min.css"
rel="stylesheet"
integrity="sha384-eOJMYsd53ii+scO/bJGFsiCZc+5NDVN2yr8+0RDqr0Ql0h+rP48ckxlpbzKgwra6"
crossorigin="anonymous"
/>
<script
src="https://cdn.jsdelivr.net/npm/bootstrap@5.0.0-beta3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-JEW9xMcG8R+pH31jmWH6WWP0WintQrMb4s7ZOdauHnUtxwoG2vI5DkLtS3qm9Ekf"
crossorigin="anonymous"
></script>
<center>
<h1></h1>
</center>
<style type="text/css">
#mynetwork {
width: 100%;
height: 750px;
background-color: #ffffff;
border: 1px solid lightgray;
position: relative;
float: left;
}
#loadingBar {
position:absolute;
top:0px;
left:0px;
width: 100%;
height: 750px;
background-color:rgba(200,200,200,0.8);
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-ms-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
transition: all 0.5s ease;
opacity:1;
}
#bar {
position:absolute;
top:0px;
left:0px;
width:20px;
height:20px;
margin:auto auto auto auto;
border-radius:11px;
border:2px solid rgba(30,30,30,0.05);
background: rgb(0, 173, 246); /* Old browsers */
box-shadow: 2px 0px 4px rgba(0,0,0,0.4);
}
#border {
position:absolute;
top:10px;
left:10px;
width:500px;
height:23px;
margin:auto auto auto auto;
box-shadow: 0px 0px 4px rgba(0,0,0,0.2);
border-radius:10px;
}
#text {
position:absolute;
top:8px;
left:530px;
width:30px;
height:50px;
margin:auto auto auto auto;
font-size:22px;
color: #000000;
}
div.outerBorder {
position:relative;
top:400px;
width:600px;
height:44px;
margin:auto auto auto auto;
border:8px solid rgba(0,0,0,0.1);
background: rgb(252,252,252); /* Old browsers */
background: -moz-linear-gradient(top, rgba(252,252,252,1) 0%, rgba(237,237,237,1) 100%); /* FF3.6+ */
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(252,252,252,1)), color-stop(100%,rgba(237,237,237,1))); /* Chrome,Safari4+ */
background: -webkit-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Chrome10+,Safari5.1+ */
background: -o-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* Opera 11.10+ */
background: -ms-linear-gradient(top, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* IE10+ */
background: linear-gradient(to bottom, rgba(252,252,252,1) 0%,rgba(237,237,237,1) 100%); /* W3C */
filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#fcfcfc', endColorstr='#ededed',GradientType=0 ); /* IE6-9 */
border-radius:72px;
box-shadow: 0px 0px 10px rgba(0,0,0,0.2);
}
</style>
</head>
<body>
<div class="card" style="width: 100%">
<div id="mynetwork" class="card-body"></div>
</div>
<div id="loadingBar">
<div class="outerBorder">
<div id="text">0%</div>
<div id="border">
<div id="bar"></div>
</div>
</div>
</div>
<script type="text/javascript">
// initialize global variables.
var edges;
var nodes;
var allNodes;
var allEdges;
var nodeColors;
var originalNodes;
var network;
var container;
var options, data;
var filter = {
item : '',
property : '',
value : []
};
// This method is responsible for drawing the graph, returns the drawn network
function drawGraph() {
var container = document.getElementById('mynetwork');
// parsing and collecting nodes and edges from the python
nodes = new vis.DataSet([{"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parser", "label": "parser\n(Initialization)\n\"maximum number...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "parser - Initialization\n\nFile: parser.asm\nSection: .text\nDescription: maximum number of symbols\n\npush ebp\nmov ebp, esp\ncall init_symbol_table\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_header\nmov edx, 5\nint 0x80\nxor eax, eax\nmov [token_index], eax\nmov [current_pos], eax\nmov eax, 4\nmov ebx, 1\nmov ecx, buffer\nmov edx, 100\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parser.parse_loop", "label": ".parse_loop\n(Loop)\n\"Save current p...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".parse_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Save current position as line start\nLocal label under: parser\nConditional branch\n\nmov eax, [current_pos]\nmov [line_start], eax\ncall get_next_token\ntest al, al\njz .done\ncmp al, TOKEN_FUNCTION\nje parse_function_call\ncmp al, TOKEN_IDENTIFIER\nje parse_assignment_or_function\ncall syntax_error\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parser.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: parser\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_assignment_or_function", "label": "parse_assignment_or_function\n(Parsing Function)\n\"Save current t...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "parse_assignment_or_function - Parsing Function\n\nFile: parser.asm\nSection: .text\nDescription: Save current token index to allow backtracking\nReturns control to caller\n\ndec dword [token_index]\ncall parse_assignment\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_assignment", "label": "parse_assignment\n(Bitwise Operation)\n\"Get token type...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "parse_assignment - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Get token type (we expect identifier for assignment)\nUnconditional Jump\n\npush ebp\nmov ebp, esp\ncall get_next_token\ntest al, al\njz .done\ncmp al, TOKEN_IDENTIFIER\njne .not_assignment\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_assign\nmov edx, 11\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_id\nmov edx, 14\nint 0x80\ncall print_identifier\ncall get_next_token\ncmp al, TOKEN_ASSIGNMENT\njne .not_valid_assignment\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_num\nmov edx, 9\nint 0x80\ncall get_next_token\ncmp al, TOKEN_NUMBER\njne syntax_error\ncall print_value\ncall add_symbol\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\njmp parser.parse_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_assignment.not_assignment", "label": ".not_assignment\n(Function)\n\"If it\u0027s not an...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".not_assignment - Function\n\nFile: parser.asm\nSection: .text\nDescription: If it\u0027s not an identifier, it\u0027s not an assignment\nLocal label under: parse_assignment\nReturns control to caller\n\ndec dword [token_index]\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_assignment.not_valid_assignment", "label": ".not_valid_assignment\n(Function)\n\"If we found id...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".not_valid_assignment - Function\n\nFile: parser.asm\nSection: .text\nDescription: If we found identifier but not followed by =, it\u0027s an error\nLocal label under: parse_assignment\nReturns control to caller\n\ncall syntax_error\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_assignment.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: parse_assignment\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_identifier", "label": "print_identifier\n(Control Flow)\n\"Start at begin...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "print_identifier - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Start at beginning of line\n\nmov esi, [line_start]\nmov edi, identifier_buffer\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_identifier.copy_loop", "label": ".copy_loop\n(Loop)\n\"Get character ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".copy_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Get character from buffer\nLocal label under: print_identifier\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027 \u0027\nje .done_id\ncmp al, \u0027=\u0027\nje .done_id\ncmp al, 0\nje .done_id\ncmp al, 0xA\nje .done_id\nmov [edi], al\ninc esi\ninc edi\njmp .copy_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_identifier.done_id", "label": ".done_id\n(Print Function)\n\"Null-terminate...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done_id - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Null-terminate the identifier\nLocal label under: print_identifier\nReturns control to caller\n\nmov byte [edi], 0\nmov eax, 4\nmov ebx, 1\nmov ecx, identifier_buffer\nmov edx, edi\nsub edx, identifier_buffer\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value", "label": "print_value\n(Control Flow)\n\"Find the value...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "print_value - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Find the value after the \u0027=\u0027 sign\n\nmov esi, [line_start]\nmov edi, number_buffer\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.find_equals", "label": ".find_equals\n(Bitwise Operation)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".find_equals - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nLocal label under: print_value\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027=\u0027\nje .found_equals\ncmp al, 0\nje .not_found\ninc esi\njmp .find_equals\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.found_equals", "label": ".found_equals\n(Data Transfer)\n\"Skip \u0027=\u0027 and a...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".found_equals - Data Transfer\n\nFile: parser.asm\nSection: .text\nDescription: Skip \u0027=\u0027 and any spaces\nLocal label under: print_value\n\ninc esi\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.skip_spaces", "label": ".skip_spaces\n(Skip Section)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".skip_spaces - Skip Section\n\nFile: parser.asm\nSection: .text\nLocal label under: print_value\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027 \u0027\njne .copy_number\ninc esi\njmp .skip_spaces\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.copy_number", "label": ".copy_number\n(Control Flow)\n\"Copy numeric v...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".copy_number - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Copy numeric value to buffer\nLocal label under: print_value\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027 \u0027\nje .done\ncmp al, 0\nje .done\ncmp al, 0xA\nje .done\nmov [edi], al\ninc esi\ninc edi\njmp .copy_number\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#66cc99", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.done", "label": ".done\n(Completion Point)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Completion Point\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: print_value\nConditional branch\n\nmov byte [edi], 0\nmov [current_pos], esi\ncmp al, 0xA\njne .print_result\ninc dword [current_pos]\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.print_result", "label": ".print_result\n(Print Function)\n\"Print the value\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".print_result - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Print the value\nLocal label under: print_value\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, number_buffer\nmov edx, edi\nsub edx, number_buffer\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_value.not_found", "label": ".not_found\n(Print Function)\n\"Handle error -...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".not_found - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Handle error - didn\u0027t find equals sign\nLocal label under: print_value\nReturns control to caller\n\nmov byte [edi], \u0027?\u0027\nmov byte [edi + 1], 0\nmov eax, 4\nmov ebx, 1\nmov ecx, number_buffer\nmov edx, 2\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:get_next_token", "label": "get_next_token\n(Getter Function)\n\"Get current to...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "get_next_token - Getter Function\n\nFile: parser.asm\nSection: .text\nDescription: Get current token index\nReturns control to caller\n\nmov eax, [token_index]\nmov ebx, token_buffer\ncmp eax, 1024\njge .end_of_tokens\nmovzx eax, byte [ebx + eax]\ninc dword [token_index]\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:get_next_token.end_of_tokens", "label": ".end_of_tokens\n(Function)\n\"Return 0 to in...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".end_of_tokens - Function\n\nFile: parser.asm\nSection: .text\nDescription: Return 0 to indicate no more tokens\nLocal label under: get_next_token\nReturns control to caller\n\nxor eax, eax\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:parse_function_call", "label": "parse_function_call\n(Bitwise Operation)\n\"Print Function...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "parse_function_call - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Print Function Call header\nUnconditional Jump\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_func_call\nmov edx, 14\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_func\nmov edx, 12\nint 0x80\npush esi\nmov eax, 4\nmov ebx, 1\nmov ecx, func_output_name\nmov edx, 6\nint 0x80\npop esi\ncall get_next_token\ncmp al, TOKEN_OPEN_PAREN\njne syntax_error\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_ast_arg\nmov edx, 12\nint 0x80\ncall get_next_token\ncmp al, TOKEN_IDENTIFIER\njne syntax_error\ncall print_function_arg\ncall execute_output\ncall get_next_token\ncmp al, TOKEN_CLOSE_PAREN\njne syntax_error\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\njmp parser.parse_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg", "label": "print_function_arg\n(Control Flow)\n\"Find the argum...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "print_function_arg - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Find the argument between parentheses\n\nmov esi, [line_start]\nmov edi, identifier_buffer\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.find_paren", "label": ".find_paren\n(Bitwise Operation)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".find_paren - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nLocal label under: print_function_arg\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027(\u0027\nje .found_paren\ncmp al, 0\nje .not_found\ninc esi\njmp .find_paren\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.found_paren", "label": ".found_paren\n(Data Transfer)\n\"Skip \u0027(\u0027 and a...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".found_paren - Data Transfer\n\nFile: parser.asm\nSection: .text\nDescription: Skip \u0027(\u0027 and any spaces\nLocal label under: print_function_arg\n\ninc esi\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.skip_spaces", "label": ".skip_spaces\n(Skip Section)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".skip_spaces - Skip Section\n\nFile: parser.asm\nSection: .text\nLocal label under: print_function_arg\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027 \u0027\njne .copy_arg\ninc esi\njmp .skip_spaces\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.copy_arg", "label": ".copy_arg\n(Control Flow)\n\"Copy argument ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".copy_arg - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Copy argument to buffer\nLocal label under: print_function_arg\nUnconditional Jump\n\nmov al, [buffer + esi]\ncmp al, \u0027 \u0027\nje .done\ncmp al, \u0027)\u0027\nje .done\ncmp al, 0\nje .done\ncmp al, 0xA\nje .done\nmov [edi], al\ninc esi\ninc edi\njmp .copy_arg\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: print_function_arg\nReturns control to caller\n\nmov byte [edi], 0\nmov [current_pos], esi\nmov eax, 4\nmov ebx, 1\nmov ecx, identifier_buffer\nmov edx, edi\nsub edx, identifier_buffer\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:print_function_arg.not_found", "label": ".not_found\n(Print Function)\n\"Handle error -...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".not_found - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Handle error - didn\u0027t find equals sign\nLocal label under: print_function_arg\nReturns control to caller\n\nmov byte [edi], \u0027?\u0027\nmov byte [edi + 1], 0\nmov eax, 4\nmov ebx, 1\nmov ecx, identifier_buffer\nmov edx, 2\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:syntax_error", "label": "syntax_error\n(Initialization)\n\"Initialize the...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "syntax_error - Initialization\n\nFile: parser.asm\nSection: .text\nDescription: Initialize the symbol table\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_error\nmov edx, 13\nint 0x80\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:init_symbol_table", "label": "init_symbol_table\n(Initialization Function)\n\"Add or update ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "init_symbol_table - Initialization Function\n\nFile: parser.asm\nSection: .text\nDescription: Add or update a symbol in the symbol table\nReturns control to caller\n\nmov dword [sym_count], 0\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol", "label": "add_symbol\n(Bitwise Operation)\n\"First check if...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "add_symbol - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: First check if symbol already exists\nConditional branch\n\npush ebp\nmov ebp, esp\ncall find_symbol\ncmp eax, -1\njne .update_symbol\nmov eax, [sym_count]\ncmp eax, MAX_SYMBOLS\njge .table_full\nmov ebx, eax\nimul ebx, MAX_NAME_LENGTH\nmov esi, identifier_buffer\nmov edi, sym_names\nadd edi, ebx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol.copy_name_loop", "label": ".copy_name_loop\n(Loop)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".copy_name_loop - Loop\n\nFile: parser.asm\nSection: .text\nLocal label under: add_symbol\nUnconditional Jump\n\nmov al, [esi]\nmov [edi], al\ntest al, al\njz .name_copied\ninc esi\ninc edi\njmp .copy_name_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol.name_copied", "label": ".name_copied\n(Bitwise Operation)\n\"Convert number...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".name_copied - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Convert number string to integer value\nLocal label under: add_symbol\nUnconditional Jump\n\nmov esi, number_buffer\ncall atoi\nmov ebx, [sym_count]\nmov [sym_values + ebx * 4], eax\ninc dword [sym_count]\nmov eax, 1\njmp .done\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol.update_symbol", "label": ".update_symbol\n(Control Flow)\n\"edx already co...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".update_symbol - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: edx already contains the index of the symbol\nLocal label under: add_symbol\nUnconditional Jump\n\nmov esi, number_buffer\ncall atoi\nmov ebx, eax\nmov eax, edx\nmov [sym_values + eax * 4], ebx\nmov eax, 0\njmp .done\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol.table_full", "label": ".table_full\n(Data Transfer)\n\"Handle table f...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".table_full - Data Transfer\n\nFile: parser.asm\nSection: .text\nDescription: Handle table full error\nLocal label under: add_symbol\n\nmov eax, -1\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:add_symbol.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: add_symbol\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol", "label": "find_symbol\n(Bitwise Operation)\n\"Start from ind...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "find_symbol - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Start from index 0\n\npush ebp\nmov ebp, esp\nxor ecx, ecx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.search_loop", "label": ".search_loop\n(Loop)\n\"Check if we\u0027ve...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".search_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Check if we\u0027ve searched all symbols\nLocal label under: find_symbol\nConditional branch\n\ncmp ecx, [sym_count]\njge .not_found\nmov eax, ecx\nimul eax, MAX_NAME_LENGTH\nmov esi, identifier_buffer\nmov edi, sym_names\nadd edi, eax\npush ecx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.compare_loop", "label": ".compare_loop\n(Loop)\n\"Check if we re...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".compare_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Check if we reached the end\nLocal label under: find_symbol\nUnconditional Jump\n\nmov al, [esi]\nmov bl, [edi]\ncmp al, bl\njne .no_match\ntest al, al\njz .match_found\ninc esi\ninc edi\njmp .compare_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.no_match", "label": ".no_match\n(Control Flow)\n\"Restore counter\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".no_match - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Restore counter\nLocal label under: find_symbol\nUnconditional Jump\n\npop ecx\ninc ecx\njmp .search_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.match_found", "label": ".match_found\n(Control Flow)\n\"Restore counter\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".match_found - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Restore counter\nLocal label under: find_symbol\nUnconditional Jump\n\npop ecx\nmov edx, ecx\nmov eax, [sym_values + ecx * 4]\njmp .done\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.not_found", "label": ".not_found\n(Data Transfer)\n\"Handle error -...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".not_found - Data Transfer\n\nFile: parser.asm\nSection: .text\nDescription: Handle error - didn\u0027t find equals sign\nLocal label under: find_symbol\n\nmov eax, -1\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:find_symbol.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: find_symbol\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:atoi", "label": "atoi\n(Initialization)\n\"Initialize res...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "atoi - Initialization\n\nFile: parser.asm\nSection: .text\nDescription: Initialize result to 0\n\npush ebp\nmov ebp, esp\nxor eax, eax\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:atoi.convert_loop", "label": ".convert_loop\n(Loop)\n\"Get next chara...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".convert_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Get next character\nLocal label under: atoi\nUnconditional Jump\n\nmovzx ecx, byte [esi]\ntest ecx, ecx\njz .done\ncmp ecx, \u00270\u0027\njl .done\ncmp ecx, \u00279\u0027\njg .done\nimul eax, 10\nsub ecx, \u00270\u0027\nadd eax, ecx\ninc esi\njmp .convert_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:atoi.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: atoi\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa", "label": "itoa\n(Bitwise Operation)\n\"Handle negativ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "itoa - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Handle negative numbers\n\npush ebp\nmov ebp, esp\ntest eax, eax\njns .positive\nneg eax\nmov byte [edi], \u0027-\u0027\ninc edi\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.positive", "label": ".positive\n(Bitwise Operation)\n\"Save starting ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".positive - Bitwise Operation\n\nFile: parser.asm\nSection: .text\nDescription: Save starting position\nLocal label under: itoa\nUnconditional Jump\n\npush edi\ntest eax, eax\njnz .convert_loop\nmov byte [edi], \u00270\u0027\ninc edi\njmp .done\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.convert_loop", "label": ".convert_loop\n(Loop)\n\"Get next chara...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".convert_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Get next character\nLocal label under: itoa\nUnconditional Jump\n\ntest eax, eax\njz .reverse\nxor edx, edx\nmov ecx, 10\ndiv ecx\nadd dl, \u00270\u0027\nmov [edi], dl\ninc edi\njmp .convert_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.reverse", "label": ".reverse\n(Control Flow)\n\"Null terminate...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".reverse - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Null terminate the string\nLocal label under: itoa\n\nmov byte [edi], 0\npop esi\ndec edi\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.reverse_loop", "label": ".reverse_loop\n(Loop)\n\"Swap bytes\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".reverse_loop - Loop\n\nFile: parser.asm\nSection: .text\nDescription: Swap bytes\nLocal label under: itoa\nUnconditional Jump\n\ncmp esi, edi\njae .reversed\nmov al, [esi]\nmov bl, [edi]\nmov [edi], al\nmov [esi], bl\ninc esi\ndec edi\njmp .reverse_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.reversed", "label": ".reversed\n(Control Flow)\n\"Find end of st...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".reversed - Control Flow\n\nFile: parser.asm\nSection: .text\nDescription: Find end of string\nLocal label under: itoa\n\nmov edi, ebp\nsub edi, 4\nmov edi, [edi]\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#ffaa66", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.find_end", "label": ".find_end\n(End Block)\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".find_end - End Block\n\nFile: parser.asm\nSection: .text\nLocal label under: itoa\nUnconditional Jump\n\ncmp byte [edi], 0\nje .done\ninc edi\njmp .find_end\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:itoa.done", "label": ".done\n(Print Function)\n\"Extract identi...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".done - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Extract identifier from line_start position\nLocal label under: itoa\nReturns control to caller\n\nmov esp, ebp\npop ebp\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:execute_output", "label": "execute_output\n(Print Function)\n\"Print newline ...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "execute_output - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Print newline to separate AST output from function output\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\ncall find_symbol\ncmp eax, -1\nje .undefined_variable\npush eax\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_output\nmov edx, 8\nint 0x80\npop eax\nmov edi, number_buffer\ncall itoa\nmov eax, 4\nmov ebx, 1\nmov ecx, number_buffer\nmov edx, edi\nsub edx, number_buffer\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "parser.asm:execute_output.undefined_variable", "label": ".undefined_variable\n(Print Function)\n\"Print error me...\"\n[parser.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".undefined_variable - Print Function\n\nFile: parser.asm\nSection: .text\nDescription: Print error message\nLocal label under: execute_output\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_undefined\nmov edx, 18\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "green", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:_start", "label": "_start\n(Entry Point)\n\"Data section -...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "_start - Entry Point\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Data section - contains all game text and constant values for the adventure game\n\nmov byte [has_key], 0\nmov byte [in_bright_room], 0\nmov byte [in_forest], 0\nmov byte [in_castle], 0\nmov byte [in_dungeon], 0\nmov byte [in_mountain], 0\nmov byte [in_library], 0\nmov byte [in_garden], 0\nmov byte [has_sword], 0\nmov byte [has_map], 0\nmov byte [has_potion], 0\nmov byte [has_gem], 0\nmov byte [prisoner_freed], 0\nmov byte [dragon_defeated], 0\nmov byte [book_read], 0\nmov byte [flowers_picked], 0\nmov byte [riddle_solved], 0\nmov eax, 4\nmov ebx, 1\nmov ecx, prompt\nmov edx, prompt_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:game_loop", "label": "game_loop\n(Loop)\n\"Main game loop...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "game_loop - Loop\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Main game loop - handles player input and processes commands\nUnconditional Jump\n\nmov eax, 4\nmov ebx, 1\nmov ecx, input_msg\nmov edx, input_msg_len\nint 0x80\nmov eax, 3\nmov ebx, 0\nmov ecx, input_buffer\nmov edx, 100\nint 0x80\nmov eax, input_buffer\ncmp byte [eax], \u0027p\u0027\njne check_open_door\ncmp byte [eax+1], \u0027i\u0027\njne check_open_door\ncmp byte [eax+2], \u0027c\u0027\njne check_open_door\ncmp byte [eax+3], \u0027k\u0027\njne check_open_door\ncmp byte [eax+4], \u0027 \u0027\njne check_open_door\ncmp byte [eax+5], \u0027u\u0027\njne check_open_door\ncmp byte [eax+6], \u0027p\u0027\njne check_open_door\ncmp byte [eax+7], \u0027 \u0027\njne check_open_door\ncmp byte [eax+8], \u0027k\u0027\njne check_open_door\ncmp byte [eax+9], \u0027e\u0027\njne check_open_door\ncmp byte [eax+10], \u0027y\u0027\njne check_open_door\nmov byte [has_key], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg\nmov edx, output_msg_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_open_door", "label": "check_open_door\n(Control Flow)\n\"Handler for op...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_open_door - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for opening the door with the key\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027o\u0027\njne check_open_chest\ncmp byte [eax+1], \u0027p\u0027\njne check_open_chest\ncmp byte [eax+2], \u0027e\u0027\njne check_open_chest\ncmp byte [eax+3], \u0027n\u0027\njne check_open_chest\ncmp byte [eax+4], \u0027 \u0027\njne check_open_chest\ncmp byte [eax+5], \u0027d\u0027\njne check_open_chest\ncmp byte [eax+6], \u0027o\u0027\njne check_open_chest\ncmp byte [eax+7], \u0027o\u0027\njne check_open_chest\ncmp byte [eax+8], \u0027r\u0027\njne check_open_chest\ncmp byte [has_key], 1\njne game_loop\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg2\nmov edx, output_msg2_len\nint 0x80\nmov byte [in_bright_room], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg4\nmov edx, output_msg4_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_open_chest", "label": "check_open_chest\n(Bitwise Operation)\n\"Handler for op...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_open_chest - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for opening the treasure chest in bright room\nConditional branch\n\nmov eax, input_buffer\ncmp byte [eax], \u0027o\u0027\njne check_go_east\ncmp byte [eax+1], \u0027p\u0027\njne check_go_east\ncmp byte [eax+2], \u0027e\u0027\njne check_go_east\ncmp byte [eax+3], \u0027n\u0027\njne check_go_east\ncmp byte [eax+4], \u0027 \u0027\njne check_go_east\ncmp byte [eax+5], \u0027c\u0027\njne check_go_east\ncmp byte [eax+6], \u0027h\u0027\njne check_go_east\ncmp byte [eax+7], \u0027e\u0027\njne check_go_east\ncmp byte [eax+8], \u0027s\u0027\njne check_go_east\ncmp byte [eax+9], \u0027t\u0027\njne check_go_east\ncmp byte [in_bright_room], 1\njne game_loop\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg5\nmov edx, output_msg5_len\nint 0x80\nmov eax, 1\nxor ebx, ebx\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_east", "label": "check_go_east\n(Bitwise Operation)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_east - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going east in the forest\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_go_west\ncmp byte [eax+1], \u0027o\u0027\njne check_go_west\ncmp byte [eax+2], \u0027 \u0027\njne check_go_west\ncmp byte [eax+3], \u0027e\u0027\njne check_go_west\ncmp byte [eax+4], \u0027a\u0027\njne check_go_west\ncmp byte [eax+5], \u0027s\u0027\njne check_go_west\ncmp byte [eax+6], \u0027t\u0027\njne check_go_west\nmov byte [in_forest], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg6\nmov edx, output_msg6_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_west", "label": "check_go_west\n(Bitwise Operation)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_west - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going west in the forest to the dragon cave\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_go_castle\ncmp byte [eax+1], \u0027o\u0027\njne check_go_castle\ncmp byte [eax+2], \u0027 \u0027\njne check_go_castle\ncmp byte [eax+3], \u0027w\u0027\njne check_go_castle\ncmp byte [eax+4], \u0027e\u0027\njne check_go_castle\ncmp byte [eax+5], \u0027s\u0027\njne check_go_castle\ncmp byte [eax+6], \u0027t\u0027\njne check_go_castle\ncmp byte [in_forest], 1\njne game_loop\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg7\nmov edx, output_msg7_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_castle", "label": "check_go_castle\n(Bitwise Operation)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_castle - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going to the castle location\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_take_sword\ncmp byte [eax+1], \u0027o\u0027\njne check_take_sword\ncmp byte [eax+2], \u0027 \u0027\njne check_take_sword\ncmp byte [eax+3], \u0027c\u0027\njne check_take_sword\ncmp byte [eax+4], \u0027a\u0027\njne check_take_sword\ncmp byte [eax+5], \u0027s\u0027\njne check_take_sword\ncmp byte [eax+6], \u0027t\u0027\njne check_take_sword\ncmp byte [eax+7], \u0027l\u0027\njne check_take_sword\ncmp byte [eax+8], \u0027e\u0027\njne check_take_sword\nmov byte [in_castle], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg8\nmov edx, output_msg8_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_take_sword", "label": "check_take_sword\n(Bitwise Operation)\n\"Handler for ta...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_take_sword - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for taking the sword in the castle\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027t\u0027\njne check_go_dungeon\ncmp byte [eax+1], \u0027a\u0027\njne check_go_dungeon\ncmp byte [eax+2], \u0027k\u0027\njne check_go_dungeon\ncmp byte [eax+3], \u0027e\u0027\njne check_go_dungeon\ncmp byte [eax+4], \u0027 \u0027\njne check_go_dungeon\ncmp byte [eax+5], \u0027s\u0027\njne check_go_dungeon\ncmp byte [eax+6], \u0027w\u0027\njne check_go_dungeon\ncmp byte [eax+7], \u0027o\u0027\njne check_go_dungeon\ncmp byte [eax+8], \u0027r\u0027\njne check_go_dungeon\ncmp byte [eax+9], \u0027d\u0027\njne check_go_dungeon\ncmp byte [in_castle], 1\njne game_loop\nmov byte [has_sword], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg9\nmov edx, output_msg9_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_dungeon", "label": "check_go_dungeon\n(Floating-Point Operation)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_dungeon - Floating-Point Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going to the dungeon location\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_free_prisoner\ncmp byte [eax+1], \u0027o\u0027\njne check_free_prisoner\ncmp byte [eax+2], \u0027 \u0027\njne check_free_prisoner\ncmp byte [eax+3], \u0027d\u0027\njne check_free_prisoner\ncmp byte [eax+4], \u0027u\u0027\njne check_free_prisoner\ncmp byte [eax+5], \u0027n\u0027\njne check_free_prisoner\ncmp byte [eax+6], \u0027g\u0027\njne check_free_prisoner\ncmp byte [eax+7], \u0027e\u0027\njne check_free_prisoner\ncmp byte [eax+8], \u0027o\u0027\njne check_free_prisoner\ncmp byte [eax+9], \u0027n\u0027\njne check_free_prisoner\nmov byte [in_dungeon], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg10\nmov edx, output_msg10_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_free_prisoner", "label": "check_free_prisoner\n(Cleanup)\n\"Compare the in...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_free_prisoner - Cleanup\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Compare the input to \"free prisoner\"\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027f\u0027\njne check_go_mountain\ncmp byte [eax+1], \u0027r\u0027\njne check_go_mountain\ncmp byte [eax+2], \u0027e\u0027\njne check_go_mountain\ncmp byte [eax+3], \u0027e\u0027\njne check_go_mountain\ncmp byte [eax+4], \u0027 \u0027\njne check_go_mountain\ncmp byte [eax+5], \u0027p\u0027\njne check_go_mountain\ncmp byte [eax+6], \u0027r\u0027\njne check_go_mountain\ncmp byte [eax+7], \u0027i\u0027\njne check_go_mountain\ncmp byte [eax+8], \u0027s\u0027\njne check_go_mountain\ncmp byte [eax+9], \u0027o\u0027\njne check_go_mountain\ncmp byte [eax+10], \u0027n\u0027\njne check_go_mountain\ncmp byte [eax+11], \u0027e\u0027\njne check_go_mountain\ncmp byte [eax+12], \u0027r\u0027\njne check_go_mountain\ncmp byte [in_dungeon], 1\njne game_loop\nmov byte [prisoner_freed], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg11\nmov edx, output_msg11_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_mountain", "label": "check_go_mountain\n(Control Flow)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_mountain - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going to mountain cave location\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_solve_riddle\ncmp byte [eax+1], \u0027o\u0027\njne check_solve_riddle\ncmp byte [eax+2], \u0027 \u0027\njne check_solve_riddle\ncmp byte [eax+3], \u0027m\u0027\njne check_solve_riddle\ncmp byte [eax+4], \u0027o\u0027\njne check_solve_riddle\ncmp byte [eax+5], \u0027u\u0027\njne check_solve_riddle\ncmp byte [eax+6], \u0027n\u0027\njne check_solve_riddle\ncmp byte [eax+7], \u0027t\u0027\njne check_solve_riddle\ncmp byte [eax+8], \u0027a\u0027\njne check_solve_riddle\ncmp byte [eax+9], \u0027i\u0027\njne check_solve_riddle\ncmp byte [eax+10], \u0027n\u0027\njne check_solve_riddle\nmov byte [in_mountain], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg12\nmov edx, output_msg12_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_solve_riddle", "label": "check_solve_riddle\n(Control Flow)\n\"Handler for so...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_solve_riddle - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for solving the riddle in mountain cave\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027s\u0027\njne check_take_gem\ncmp byte [eax+1], \u0027o\u0027\njne check_take_gem\ncmp byte [eax+2], \u0027l\u0027\njne check_take_gem\ncmp byte [eax+3], \u0027v\u0027\njne check_take_gem\ncmp byte [eax+4], \u0027e\u0027\njne check_take_gem\ncmp byte [eax+5], \u0027 \u0027\njne check_take_gem\ncmp byte [eax+6], \u0027r\u0027\njne check_take_gem\ncmp byte [eax+7], \u0027i\u0027\njne check_take_gem\ncmp byte [eax+8], \u0027d\u0027\njne check_take_gem\ncmp byte [eax+9], \u0027d\u0027\njne check_take_gem\ncmp byte [eax+10], \u0027l\u0027\njne check_take_gem\ncmp byte [eax+11], \u0027e\u0027\njne check_take_gem\ncmp byte [in_mountain], 1\njne game_loop\nmov byte [riddle_solved], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg13\nmov edx, output_msg13_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_take_gem", "label": "check_take_gem\n(Control Flow)\n\"Handler for ta...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_take_gem - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for taking the magical gem\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027t\u0027\njne check_go_library\ncmp byte [eax+1], \u0027a\u0027\njne check_go_library\ncmp byte [eax+2], \u0027k\u0027\njne check_go_library\ncmp byte [eax+3], \u0027e\u0027\njne check_go_library\ncmp byte [eax+4], \u0027 \u0027\njne check_go_library\ncmp byte [eax+5], \u0027g\u0027\njne check_go_library\ncmp byte [eax+6], \u0027e\u0027\njne check_go_library\ncmp byte [eax+7], \u0027m\u0027\njne check_go_library\ncmp byte [riddle_solved], 1\njne game_loop\nmov byte [has_gem], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg14\nmov edx, output_msg14_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_library", "label": "check_go_library\n(Control Flow)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_library - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going to the library location\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_read_book\ncmp byte [eax+1], \u0027o\u0027\njne check_read_book\ncmp byte [eax+2], \u0027 \u0027\njne check_read_book\ncmp byte [eax+3], \u0027l\u0027\njne check_read_book\ncmp byte [eax+4], \u0027i\u0027\njne check_read_book\ncmp byte [eax+5], \u0027b\u0027\njne check_read_book\ncmp byte [eax+6], \u0027r\u0027\njne check_read_book\ncmp byte [eax+7], \u0027a\u0027\njne check_read_book\ncmp byte [eax+8], \u0027r\u0027\njne check_read_book\ncmp byte [eax+9], \u0027y\u0027\njne check_read_book\nmov byte [in_library], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg15\nmov edx, output_msg15_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_read_book", "label": "check_read_book\n(Control Flow)\n\"Handler for re...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_read_book - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for reading the magical book in library\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027r\u0027\njne check_fight_dragon\ncmp byte [eax+1], \u0027e\u0027\njne check_fight_dragon\ncmp byte [eax+2], \u0027a\u0027\njne check_fight_dragon\ncmp byte [eax+3], \u0027d\u0027\njne check_fight_dragon\ncmp byte [eax+4], \u0027 \u0027\njne check_fight_dragon\ncmp byte [eax+5], \u0027b\u0027\njne check_fight_dragon\ncmp byte [eax+6], \u0027o\u0027\njne check_fight_dragon\ncmp byte [eax+7], \u0027o\u0027\njne check_fight_dragon\ncmp byte [eax+8], \u0027k\u0027\njne check_fight_dragon\ncmp byte [in_library], 1\njne game_loop\nmov byte [book_read], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg16\nmov edx, output_msg16_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_fight_dragon", "label": "check_fight_dragon\n(Bitwise Operation)\n\"Handler for fi...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_fight_dragon - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for fighting the dragon with sword and book knowledge\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027f\u0027\njne check_go_garden\ncmp byte [eax+1], \u0027i\u0027\njne check_go_garden\ncmp byte [eax+2], \u0027g\u0027\njne check_go_garden\ncmp byte [eax+3], \u0027h\u0027\njne check_go_garden\ncmp byte [eax+4], \u0027t\u0027\njne check_go_garden\ncmp byte [eax+5], \u0027 \u0027\njne check_go_garden\ncmp byte [eax+6], \u0027d\u0027\njne check_go_garden\ncmp byte [eax+7], \u0027r\u0027\njne check_go_garden\ncmp byte [eax+8], \u0027a\u0027\njne check_go_garden\ncmp byte [eax+9], \u0027g\u0027\njne check_go_garden\ncmp byte [eax+10], \u0027o\u0027\njne check_go_garden\ncmp byte [eax+11], \u0027n\u0027\njne check_go_garden\ncmp byte [has_sword], 1\njne game_loop\ncmp byte [book_read], 1\njne game_loop\nmov byte [dragon_defeated], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg17\nmov edx, output_msg17_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_go_garden", "label": "check_go_garden\n(Control Flow)\n\"Handler for go...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_go_garden - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for going to the garden location\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027g\u0027\njne check_pick_flowers\ncmp byte [eax+1], \u0027o\u0027\njne check_pick_flowers\ncmp byte [eax+2], \u0027 \u0027\njne check_pick_flowers\ncmp byte [eax+3], \u0027g\u0027\njne check_pick_flowers\ncmp byte [eax+4], \u0027a\u0027\njne check_pick_flowers\ncmp byte [eax+5], \u0027r\u0027\njne check_pick_flowers\ncmp byte [eax+6], \u0027d\u0027\njne check_pick_flowers\ncmp byte [eax+7], \u0027e\u0027\njne check_pick_flowers\ncmp byte [eax+8], \u0027n\u0027\njne check_pick_flowers\nmov byte [in_garden], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg18\nmov edx, output_msg18_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_pick_flowers", "label": "check_pick_flowers\n(Control Flow)\n\"Handler for pi...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_pick_flowers - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for picking magical flowers in garden\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027p\u0027\njne check_find_map\ncmp byte [eax+1], \u0027i\u0027\njne check_find_map\ncmp byte [eax+2], \u0027c\u0027\njne check_find_map\ncmp byte [eax+3], \u0027k\u0027\njne check_find_map\ncmp byte [eax+4], \u0027 \u0027\njne check_find_map\ncmp byte [eax+5], \u0027f\u0027\njne check_find_map\ncmp byte [eax+6], \u0027l\u0027\njne check_find_map\ncmp byte [eax+7], \u0027o\u0027\njne check_find_map\ncmp byte [eax+8], \u0027w\u0027\njne check_find_map\ncmp byte [eax+9], \u0027e\u0027\njne check_find_map\ncmp byte [eax+10], \u0027r\u0027\njne check_find_map\ncmp byte [eax+11], \u0027s\u0027\njne check_find_map\ncmp byte [in_garden], 1\njne game_loop\nmov byte [flowers_picked], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg19\nmov edx, output_msg19_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_find_map", "label": "check_find_map\n(Control Flow)\n\"Handler for fi...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_find_map - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for finding the hidden map\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027f\u0027\njne check_brew_potion\ncmp byte [eax+1], \u0027i\u0027\njne check_brew_potion\ncmp byte [eax+2], \u0027n\u0027\njne check_brew_potion\ncmp byte [eax+3], \u0027d\u0027\njne check_brew_potion\ncmp byte [eax+4], \u0027 \u0027\njne check_brew_potion\ncmp byte [eax+5], \u0027m\u0027\njne check_brew_potion\ncmp byte [eax+6], \u0027a\u0027\njne check_brew_potion\ncmp byte [eax+7], \u0027p\u0027\njne check_brew_potion\nmov byte [has_map], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg20\nmov edx, output_msg20_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_brew_potion", "label": "check_brew_potion\n(Control Flow)\n\"Handler for br...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_brew_potion - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for brewing magical potion with flowers\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027b\u0027\njne check_quit\ncmp byte [eax+1], \u0027r\u0027\njne check_quit\ncmp byte [eax+2], \u0027e\u0027\njne check_quit\ncmp byte [eax+3], \u0027w\u0027\njne check_quit\ncmp byte [eax+4], \u0027 \u0027\njne check_quit\ncmp byte [eax+5], \u0027p\u0027\njne check_quit\ncmp byte [eax+6], \u0027o\u0027\njne check_quit\ncmp byte [eax+7], \u0027t\u0027\njne check_quit\ncmp byte [eax+8], \u0027i\u0027\njne check_quit\ncmp byte [eax+9], \u0027o\u0027\njne check_quit\ncmp byte [eax+10], \u0027n\u0027\njne check_quit\ncmp byte [flowers_picked], 1\njne game_loop\nmov byte [has_potion], 1\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg21\nmov edx, output_msg21_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "red", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_quit", "label": "check_quit\n(Exit Point)\n\"Handler for qu...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_quit - Exit Point\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for quitting the game\nConditional branch\n\nmov eax, input_buffer\ncmp byte [eax], \u0027q\u0027\njne check_help\ncmp byte [eax+1], \u0027u\u0027\njne check_help\ncmp byte [eax+2], \u0027i\u0027\njne check_help\ncmp byte [eax+3], \u0027t\u0027\njne check_help\nmov eax, 4\nmov ebx, 1\nmov ecx, quit_msg\nmov edx, quit_msg_len\nint 0x80\nmov eax, 1\nxor ebx, ebx\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_help", "label": "check_help\n(Bitwise Operation)\n\"Handler for di...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_help - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for displaying help and commands to the player\nUnconditional Jump\n\nmov eax, input_buffer\ncmp byte [eax], \u0027h\u0027\njne check_inventory\ncmp byte [eax+1], \u0027e\u0027\njne check_inventory\ncmp byte [eax+2], \u0027l\u0027\njne check_inventory\ncmp byte [eax+3], \u0027p\u0027\njne check_inventory\nmov eax, 4\nmov ebx, 1\nmov ecx, help_msg\nmov edx, help_msg_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_inventory", "label": "check_inventory\n(Bitwise Operation)\n\"Handler for ch...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_inventory - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for checking the player\u0027s inventory\nConditional branch\n\nmov eax, input_buffer\ncmp byte [eax], \u0027i\u0027\njne check_victory\ncmp byte [eax+1], \u0027n\u0027\njne check_victory\ncmp byte [eax+2], \u0027v\u0027\njne check_victory\ncmp byte [eax+3], \u0027e\u0027\njne check_victory\ncmp byte [eax+4], \u0027n\u0027\njne check_victory\ncmp byte [eax+5], \u0027t\u0027\njne check_victory\ncmp byte [eax+6], \u0027o\u0027\njne check_victory\ncmp byte [eax+7], \u0027r\u0027\njne check_victory\ncmp byte [eax+8], \u0027y\u0027\njne check_victory\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_msg\nmov edx, inventory_msg_len\nint 0x80\ncmp byte [has_key], 1\njne check_has_sword\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_key\nmov edx, inventory_key_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_sword", "label": "check_has_sword\n(Bitwise Operation)\n\"Check if sword...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_sword - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if sword is in inventory and display it\nConditional branch\n\ncmp byte [has_sword], 1\njne check_has_gem\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_sword\nmov edx, inventory_sword_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_gem", "label": "check_has_gem\n(Bitwise Operation)\n\"Check if magic...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_gem - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if magical gem is in inventory and display it\nConditional branch\n\ncmp byte [has_gem], 1\njne check_has_book\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_gem\nmov edx, inventory_gem_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_book", "label": "check_has_book\n(Bitwise Operation)\n\"Check if magic...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_book - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if magical book is in inventory and display it\nConditional branch\n\ncmp byte [book_read], 1\njne check_has_map\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_book\nmov edx, inventory_book_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_map", "label": "check_has_map\n(Bitwise Operation)\n\"Check if map i...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_map - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if map is in inventory and display it\nConditional branch\n\ncmp byte [has_map], 1\njne check_has_flowers\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_map\nmov edx, inventory_map_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_flowers", "label": "check_has_flowers\n(Bitwise Operation)\n\"Check if flowe...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_flowers - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if flowers are in inventory and display them\nConditional branch\n\ncmp byte [flowers_picked], 1\njne check_has_potion\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_flowers\nmov edx, inventory_flowers_len\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_has_potion", "label": "check_has_potion\n(Bitwise Operation)\n\"Check if potio...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_has_potion - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if potion is in inventory and display it\nUnconditional Jump\n\ncmp byte [has_potion], 1\njne check_empty_inventory\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_potion\nmov edx, inventory_potion_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_empty_inventory", "label": "check_empty_inventory\n(Bitwise Operation)\n\"Check if inven...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_empty_inventory - Bitwise Operation\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Check if inventory is empty and display appropriate message\nUnconditional Jump\n\ncmp byte [has_key], 1\nje game_loop\ncmp byte [has_sword], 1\nje game_loop\ncmp byte [has_gem], 1\nje game_loop\ncmp byte [book_read], 1\nje game_loop\ncmp byte [has_map], 1\nje game_loop\ncmp byte [flowers_picked], 1\nje game_loop\ncmp byte [has_potion], 1\nje game_loop\nmov eax, 4\nmov ebx, 1\nmov ecx, inventory_empty\nmov edx, inventory_empty_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#dddddd", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:check_victory", "label": "check_victory\n(Cleanup)\n\"Handler for ch...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_victory - Cleanup\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for checking victory conditions and ending the game\nConditional branch\n\ncmp byte [dragon_defeated], 1\njne unknown_command\ncmp byte [prisoner_freed], 1\njne unknown_command\ncmp byte [in_bright_room], 1\njne unknown_command\nmov eax, 4\nmov ebx, 1\nmov ecx, victory_msg\nmov edx, victory_msg_len\nint 0x80\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg22\nmov edx, output_msg22_len\nint 0x80\nmov eax, 1\nxor ebx, ebx\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "AdventureGame.asm:unknown_command", "label": "unknown_command\n(Control Flow)\n\"Handler for un...\"\n[AdventureGame.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "unknown_command - Control Flow\n\nFile: AdventureGame.asm\nSection: .text\nDescription: Handler for unrecognized commands - displays help message\nUnconditional Jump\n\nmov eax, 4\nmov ebx, 1\nmov ecx, output_msg3\nmov edx, output_msg3_len\nint 0x80\njmp game_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "green", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:_start", "label": "_start\n(Entry Point)\n\"Buffer to stor...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "_start - Entry Point\n\nFile: lexer.asm\nSection: .text\nDescription: Buffer to store tokens\n\nmov eax, 5\nmov ebx, filename\nmov ecx, 0\nint 0x80\nmov ebx, eax\nmov eax, 3\nmov ecx, buffer\nmov edx, 1024\nint 0x80\ntest eax, eax\njz done\nmov byte [buffer + eax], 0\nmov eax, 4\nmov ebx, 1\nmov ecx, lexer_banner\nmov edx, 17\nint 0x80\ncall lexer\nmov eax, 4\nmov ebx, 1\nmov ecx, parser_banner\nmov edx, 17\nint 0x80\ncall parser\nmov eax, 1\nxor ebx, ebx\nint 0x80\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:lexer", "label": "lexer\n(Bitwise Operation)\n\"Buffer index\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "lexer - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Buffer index\n\nxor esi, esi\nxor edi, edi\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:check_token", "label": "check_token\n(Bitwise Operation)\n\"stop lexer if ...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "check_token - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: stop lexer if all tokens processed\nUnconditional Jump\n\ncmp esi, 1024\njge done\nxor al, al\nmov al, [buffer + esi]\ntest edi, edi\njnz inside_identifier\ncmp al, 0\nje done\ncmp al, \u0027 \u0027\nje skip_char\ncmp al, 10\nje handle_newline\ncmp al, \u00270\u0027\njl not_digit\ncmp al, \u00279\u0027\njg not_digit\ncall process_number\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:not_digit", "label": "not_digit\n(Bitwise Operation)\n\"Set inside ide...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "not_digit - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Set inside identifier flag\nUnconditional Jump\n\ncmp al, \u0027a\u0027\njl not_identifier\ncmp al, \u0027z\u0027\njg not_identifier\nmov edi, 1\ncall process_identifier\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:not_identifier", "label": "not_identifier\n(Bitwise Operation)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "not_identifier - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nUnconditional Jump\n\ncmp al, \u0027=\u0027\njne not_assignment\ncall process_assignment\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:not_assignment", "label": "not_assignment\n(Bitwise Operation)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "not_assignment - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nUnconditional Jump\n\ncmp al, \u0027(\u0027\njne not_open_paren\ncall process_open_paren\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:not_open_paren", "label": "not_open_paren\n(Bitwise Operation)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "not_open_paren - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nUnconditional Jump\n\ncmp al, \u0027)\u0027\njne not_close_paren\ncall process_close_paren\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:not_close_paren", "label": "not_close_paren\n(Bitwise Operation)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "not_close_paren - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nUnconditional Jump\n\ncall handle_error\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:inside_identifier", "label": "inside_identifier\n(Control Flow)\n\"Continue readi...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "inside_identifier - Control Flow\n\nFile: lexer.asm\nSection: .text\nDescription: Continue reading identifier\nUnconditional Jump\n\ncmp al, \u0027 \u0027\nje end_identifier\ncmp al, \u0027=\u0027\nje end_identifier\ncmp al, \u0027(\u0027\nje end_identifier\ncmp al, \u0027)\u0027\nje end_identifier\ncmp al, 10\nje end_identifier\ncmp al, 0\nje end_identifier\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "red", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:end_identifier", "label": "end_identifier\n(Exit Point)\n\"Clear inside i...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "end_identifier - Exit Point\n\nFile: lexer.asm\nSection: .text\nDescription: Clear inside identifier flag\nUnconditional Jump\n\nxor edi, edi\ndec esi\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:handle_newline", "label": "handle_newline\n(Bitwise Operation)\n\"Reset identifi...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "handle_newline - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Reset identifier flag on new line\nUnconditional Jump\n\nxor edi, edi\njmp skip_char\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "#3333cc", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:skip_char", "label": "skip_char\n(Control Flow)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "skip_char - Control Flow\n\nFile: lexer.asm\nSection: .text\nUnconditional Jump\n\ninc esi\njmp check_token\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_number", "label": "process_number\n(Print Function)\n\"Load token ind...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "process_number - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Load token index value into eax\nReturns control to caller\n\nmov eax, [token_index]\nmov byte [token_buffer + eax], 2\ninc dword [token_index]\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_number\nmov edx, 6\nint 0x80\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier", "label": "process_identifier\n(Bitwise Operation)\n\"Save buffer po...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "process_identifier - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Save buffer position\nConditional branch\n\npush esi\nmov edi, func_output\nmov ecx, 6\nlea esi, [buffer + esi]\nrepe cmpsb\nje .is_function\npop esi\nmov eax, [token_index]\nmov byte [token_buffer + eax], 1\ninc dword [token_index]\npush ecx\npush edx\nmov ecx, msg_identifier\nxor edx, edx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier.strlen_loop", "label": ".strlen_loop\n(Loop)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_loop - Loop\n\nFile: lexer.asm\nSection: .text\nLocal label under: process_identifier\nUnconditional Jump\n\ncmp byte [ecx + edx], 0\nje .strlen_done\ninc edx\njmp .strlen_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier.strlen_done", "label": ".strlen_done\n(Print Function)\n\"Now print with...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_done - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Now print with correct length\nLocal label under: process_identifier\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_identifier\nint 0x80\npop edx\npop ecx\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier.is_function", "label": ".is_function\n(Bitwise Operation)\n\"Restore buffer...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".is_function - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Restore buffer position\nLocal label under: process_identifier\n\npop esi\nadd esi, 5\nmov eax, [token_index]\nmov byte [token_buffer + eax], 6\ninc dword [token_index]\npush ecx\npush edx\nmov ecx, msg_function\nxor edx, edx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier.func_strlen_loop", "label": ".func_strlen_loop\n(Loop)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".func_strlen_loop - Loop\n\nFile: lexer.asm\nSection: .text\nLocal label under: process_identifier\nUnconditional Jump\n\ncmp byte [ecx + edx], 0\nje .func_strlen_done\ninc edx\njmp .func_strlen_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_identifier.func_strlen_done", "label": ".func_strlen_done\n(Print Function)\n\"Print function...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".func_strlen_done - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Print function token\nLocal label under: process_identifier\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_function\nint 0x80\npop edx\npop ecx\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_assignment", "label": "process_assignment\n(Bitwise Operation)\n\"Load token ind...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "process_assignment - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Load token index value into eax\n\nmov eax, [token_index]\nmov byte [token_buffer + eax], 3\ninc dword [token_index]\npush ecx\npush edx\nmov ecx, msg_assignment\nxor edx, edx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_assignment.strlen_loop", "label": ".strlen_loop\n(Loop)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_loop - Loop\n\nFile: lexer.asm\nSection: .text\nLocal label under: process_assignment\nUnconditional Jump\n\ncmp byte [ecx + edx], 0\nje .strlen_done\ninc edx\njmp .strlen_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_assignment.strlen_done", "label": ".strlen_done\n(Print Function)\n\"Now print with...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_done - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Now print with correct length\nLocal label under: process_assignment\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_assignment\nint 0x80\npop edx\npop ecx\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_open_paren", "label": "process_open_paren\n(Bitwise Operation)\n\"Load token ind...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "process_open_paren - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Load token index value into eax\n\nmov eax, [token_index]\nmov byte [token_buffer + eax], 4\ninc dword [token_index]\npush ecx\npush edx\nmov ecx, msg_open_paren\nxor edx, edx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_open_paren.strlen_loop", "label": ".strlen_loop\n(Loop)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_loop - Loop\n\nFile: lexer.asm\nSection: .text\nLocal label under: process_open_paren\nUnconditional Jump\n\ncmp byte [ecx + edx], 0\nje .strlen_done\ninc edx\njmp .strlen_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_open_paren.strlen_done", "label": ".strlen_done\n(Print Function)\n\"Now print with...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_done - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Now print with correct length\nLocal label under: process_open_paren\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_open_paren\nint 0x80\npop edx\npop ecx\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "orange", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_close_paren", "label": "process_close_paren\n(Bitwise Operation)\n\"Load token ind...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "process_close_paren - Bitwise Operation\n\nFile: lexer.asm\nSection: .text\nDescription: Load token index value into eax\n\nmov eax, [token_index]\nmov byte [token_buffer + eax], 5\ninc dword [token_index]\npush ecx\npush edx\nmov ecx, msg_close_paren\nxor edx, edx\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "purple", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_close_paren.strlen_loop", "label": ".strlen_loop\n(Loop)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_loop - Loop\n\nFile: lexer.asm\nSection: .text\nLocal label under: process_close_paren\nUnconditional Jump\n\ncmp byte [ecx + edx], 0\nje .strlen_done\ninc edx\njmp .strlen_loop\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:process_close_paren.strlen_done", "label": ".strlen_done\n(Print Function)\n\"Now print with...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": ".strlen_done - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Now print with correct length\nLocal label under: process_close_paren\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_close_paren\nint 0x80\npop edx\npop ecx\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:handle_error", "label": "handle_error\n(Print Function)\n\"Print ERROR token\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "handle_error - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Print ERROR token\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, msg_error\nmov edx, 5\nint 0x80\ncall print_space\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:print_space", "label": "print_space\n(Print Function)\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "print_space - Print Function\n\nFile: lexer.asm\nSection: .text\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, space\nmov edx, 1\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "lightblue", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:print_newline", "label": "print_newline\n(Print Function)\n\"Outputs a newline\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "print_newline - Print Function\n\nFile: lexer.asm\nSection: .text\nDescription: Outputs a newline\nReturns control to caller\n\nmov eax, 4\nmov ebx, 1\nmov ecx, newline\nmov edx, 1\nint 0x80\nret\n"}, {"borderWidth": 2, "borderWidthSelected": 4, "color": "red", "font": {"background": "#ffffff90", "size": 14, "strokeColor": "white", "strokeWidth": 3}, "id": "lexer.asm:done", "label": "done\n(Exit Point)\n\"Function name ...\"\n[lexer.asm]", "shape": "dot", "shapeProperties": {"borderDashes": false}, "title": "done - Exit Point\n\nFile: lexer.asm\nSection: .text\nDescription: Function name to match\nReturns control to caller\n\ncall print_newline\nret\nfilename db \"test.emb\", 0\nlexer_banner db \"Lexer output:\", 10, 0\nparser_banner db 10, \"Parser output:\", 10, 0\nmsg_number db \"NUMBER\", 0\nmsg_identifier db \"IDENTIFIER\", 0\nmsg_assignment db \"ASSIGNMENT\", 0\nmsg_open_paren db \"OPEN_PAREN\", 0\nmsg_close_paren db \"CLOSE_PAREN\", 0\nmsg_function db \"FUNCTION\", 0\nmsg_error db \"ERROR\", 0\nspace db \" \", 0\nnewline db 10, 0\nfunc_output db \"output\", 0\n"}]);
edges = new vis.DataSet([{"arrows": "to", "color": "#00AA00", "from": "parser.asm:parser", "title": "Contains", "to": "parser.asm:parser.parse_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:parser", "title": "Contains", "to": "parser.asm:parser.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:parse_assignment", "title": "Contains", "to": "parser.asm:parse_assignment.not_assignment"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:parse_assignment", "title": "Contains", "to": "parser.asm:parse_assignment.not_valid_assignment"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:parse_assignment", "title": "Contains", "to": "parser.asm:parse_assignment.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_identifier", "title": "Contains", "to": "parser.asm:print_identifier.copy_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_identifier", "title": "Contains", "to": "parser.asm:print_identifier.done_id"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.find_equals"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.found_equals"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.skip_spaces"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.copy_number"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.print_result"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_value", "title": "Contains", "to": "parser.asm:print_value.not_found"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:get_next_token", "title": "Contains", "to": "parser.asm:get_next_token.end_of_tokens"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.find_paren"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.found_paren"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.skip_spaces"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.copy_arg"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:print_function_arg", "title": "Contains", "to": "parser.asm:print_function_arg.not_found"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:add_symbol", "title": "Contains", "to": "parser.asm:add_symbol.copy_name_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:add_symbol", "title": "Contains", "to": "parser.asm:add_symbol.name_copied"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:add_symbol", "title": "Contains", "to": "parser.asm:add_symbol.update_symbol"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:add_symbol", "title": "Contains", "to": "parser.asm:add_symbol.table_full"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:add_symbol", "title": "Contains", "to": "parser.asm:add_symbol.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.search_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.compare_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.no_match"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.match_found"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.not_found"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:find_symbol", "title": "Contains", "to": "parser.asm:find_symbol.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:atoi", "title": "Contains", "to": "parser.asm:atoi.convert_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:atoi", "title": "Contains", "to": "parser.asm:atoi.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.positive"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.convert_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.reverse"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.reverse_loop"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.reversed"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.find_end"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:itoa", "title": "Contains", "to": "parser.asm:itoa.done"}, {"arrows": "to", "color": "#00AA00", "from": "parser.asm:execute_output", "title": "Contains", "to": "parser.asm:execute_output.undefined_variable"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_identifier", "title": "Contains", "to": "lexer.asm:process_identifier.strlen_loop"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_identifier", "title": "Contains", "to": "lexer.asm:process_identifier.strlen_done"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_identifier", "title": "Contains", "to": "lexer.asm:process_identifier.is_function"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_identifier", "title": "Contains", "to": "lexer.asm:process_identifier.func_strlen_loop"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_identifier", "title": "Contains", "to": "lexer.asm:process_identifier.func_strlen_done"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_assignment", "title": "Contains", "to": "lexer.asm:process_assignment.strlen_loop"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_assignment", "title": "Contains", "to": "lexer.asm:process_assignment.strlen_done"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_open_paren", "title": "Contains", "to": "lexer.asm:process_open_paren.strlen_loop"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_open_paren", "title": "Contains", "to": "lexer.asm:process_open_paren.strlen_done"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_close_paren", "title": "Contains", "to": "lexer.asm:process_close_paren.strlen_loop"}, {"arrows": "to", "color": "#00AA00", "from": "lexer.asm:process_close_paren", "title": "Contains", "to": "lexer.asm:process_close_paren.strlen_done"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parser", "title": "Call", "to": "parser.asm:init_symbol_table"}, {"arrows": "to", "color": "green", "from": "parser.asm:parser", "title": "Next", "to": "parser.asm:parser.parse_loop"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parser.parse_loop", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parser.parse_loop", "title": "Conditional", "to": "parser.asm:parse_function_call"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parser.parse_loop", "title": "Conditional", "to": "parser.asm:parse_assignment_or_function"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parser.parse_loop", "title": "Call", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "green", "from": "parser.asm:parser.parse_loop", "title": "Next", "to": "parser.asm:parser.done"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment_or_function", "title": "Call", "to": "parser.asm:parse_assignment"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:print_identifier"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parse_assignment", "title": "Conditional", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:print_value"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment", "title": "Call", "to": "parser.asm:add_symbol"}, {"arrows": "to", "color": "red", "from": "parser.asm:parse_assignment", "title": "Jump to", "to": "parser.asm:parser"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_assignment.not_valid_assignment", "title": "Call", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_identifier", "title": "Next", "to": "parser.asm:print_identifier.copy_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_identifier.copy_loop", "title": "Next", "to": "parser.asm:print_identifier.done_id"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value", "title": "Next", "to": "parser.asm:print_value.find_equals"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value.find_equals", "title": "Next", "to": "parser.asm:print_value.found_equals"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value.found_equals", "title": "Next", "to": "parser.asm:print_value.skip_spaces"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value.skip_spaces", "title": "Next", "to": "parser.asm:print_value.copy_number"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value.copy_number", "title": "Next", "to": "parser.asm:print_value.done"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_value.done", "title": "Next", "to": "parser.asm:print_value.print_result"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_function_call", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parse_function_call", "title": "Conditional", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_function_call", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parse_function_call", "title": "Conditional", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_function_call", "title": "Call", "to": "parser.asm:print_function_arg"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_function_call", "title": "Call", "to": "parser.asm:execute_output"}, {"arrows": "to", "color": "blue", "from": "parser.asm:parse_function_call", "title": "Call", "to": "parser.asm:get_next_token"}, {"arrows": "to", "color": "orange", "from": "parser.asm:parse_function_call", "title": "Conditional", "to": "parser.asm:syntax_error"}, {"arrows": "to", "color": "red", "from": "parser.asm:parse_function_call", "title": "Jump to", "to": "parser.asm:parser"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_function_arg", "title": "Next", "to": "parser.asm:print_function_arg.find_paren"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_function_arg.find_paren", "title": "Next", "to": "parser.asm:print_function_arg.found_paren"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_function_arg.found_paren", "title": "Next", "to": "parser.asm:print_function_arg.skip_spaces"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_function_arg.skip_spaces", "title": "Next", "to": "parser.asm:print_function_arg.copy_arg"}, {"arrows": "to", "color": "green", "from": "parser.asm:print_function_arg.copy_arg", "title": "Next", "to": "parser.asm:print_function_arg.done"}, {"arrows": "to", "color": "blue", "from": "parser.asm:add_symbol", "title": "Call", "to": "parser.asm:find_symbol"}, {"arrows": "to", "color": "green", "from": "parser.asm:add_symbol", "title": "Next", "to": "parser.asm:add_symbol.copy_name_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:add_symbol.copy_name_loop", "title": "Next", "to": "parser.asm:add_symbol.name_copied"}, {"arrows": "to", "color": "blue", "from": "parser.asm:add_symbol.name_copied", "title": "Call", "to": "parser.asm:atoi"}, {"arrows": "to", "color": "green", "from": "parser.asm:add_symbol.name_copied", "title": "Next", "to": "parser.asm:add_symbol.update_symbol"}, {"arrows": "to", "color": "blue", "from": "parser.asm:add_symbol.update_symbol", "title": "Call", "to": "parser.asm:atoi"}, {"arrows": "to", "color": "green", "from": "parser.asm:add_symbol.update_symbol", "title": "Next", "to": "parser.asm:add_symbol.table_full"}, {"arrows": "to", "color": "green", "from": "parser.asm:add_symbol.table_full", "title": "Next", "to": "parser.asm:add_symbol.done"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol", "title": "Next", "to": "parser.asm:find_symbol.search_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol.search_loop", "title": "Next", "to": "parser.asm:find_symbol.compare_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol.compare_loop", "title": "Next", "to": "parser.asm:find_symbol.no_match"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol.no_match", "title": "Next", "to": "parser.asm:find_symbol.match_found"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol.match_found", "title": "Next", "to": "parser.asm:find_symbol.not_found"}, {"arrows": "to", "color": "green", "from": "parser.asm:find_symbol.not_found", "title": "Next", "to": "parser.asm:find_symbol.done"}, {"arrows": "to", "color": "green", "from": "parser.asm:atoi", "title": "Next", "to": "parser.asm:atoi.convert_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:atoi.convert_loop", "title": "Next", "to": "parser.asm:atoi.done"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa", "title": "Next", "to": "parser.asm:itoa.positive"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.positive", "title": "Next", "to": "parser.asm:itoa.convert_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.convert_loop", "title": "Next", "to": "parser.asm:itoa.reverse"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.reverse", "title": "Next", "to": "parser.asm:itoa.reverse_loop"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.reverse_loop", "title": "Next", "to": "parser.asm:itoa.reversed"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.reversed", "title": "Next", "to": "parser.asm:itoa.find_end"}, {"arrows": "to", "color": "green", "from": "parser.asm:itoa.find_end", "title": "Next", "to": "parser.asm:itoa.done"}, {"arrows": "to", "color": "blue", "from": "parser.asm:execute_output", "title": "Call", "to": "parser.asm:find_symbol"}, {"arrows": "to", "color": "blue", "from": "parser.asm:execute_output", "title": "Call", "to": "parser.asm:itoa"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:_start", "title": "Next", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:game_loop", "title": "Conditional", "to": "AdventureGame.asm:check_open_door"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:game_loop", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:check_open_chest"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_door", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_open_door", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_open_chest", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_open_chest", "title": "Next", "to": "AdventureGame.asm:check_go_east"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_east", "title": "Conditional", "to": "AdventureGame.asm:check_go_west"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_east", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:check_go_castle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_west", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_west", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_castle", "title": "Conditional", "to": "AdventureGame.asm:check_take_sword"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_castle", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:check_go_dungeon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_sword", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_take_sword", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_dungeon", "title": "Conditional", "to": "AdventureGame.asm:check_free_prisoner"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_dungeon", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:check_go_mountain"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_free_prisoner", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_free_prisoner", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_mountain", "title": "Conditional", "to": "AdventureGame.asm:check_solve_riddle"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_mountain", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:check_take_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_solve_riddle", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_solve_riddle", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:check_go_library"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_take_gem", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_take_gem", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_library", "title": "Conditional", "to": "AdventureGame.asm:check_read_book"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_library", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:check_fight_dragon"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_read_book", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_read_book", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:check_go_garden"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_fight_dragon", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_fight_dragon", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_go_garden", "title": "Conditional", "to": "AdventureGame.asm:check_pick_flowers"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_go_garden", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_find_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_pick_flowers", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_pick_flowers", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_find_map", "title": "Conditional", "to": "AdventureGame.asm:check_brew_potion"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_find_map", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:check_quit"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_brew_potion", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_brew_potion", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_quit", "title": "Conditional", "to": "AdventureGame.asm:check_help"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_quit", "title": "Conditional", "to": "AdventureGame.asm:check_help"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_quit", "title": "Conditional", "to": "AdventureGame.asm:check_help"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_quit", "title": "Conditional", "to": "AdventureGame.asm:check_help"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_quit", "title": "Next", "to": "AdventureGame.asm:check_help"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_help", "title": "Conditional", "to": "AdventureGame.asm:check_inventory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_help", "title": "Conditional", "to": "AdventureGame.asm:check_inventory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_help", "title": "Conditional", "to": "AdventureGame.asm:check_inventory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_help", "title": "Conditional", "to": "AdventureGame.asm:check_inventory"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_help", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_victory"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_inventory", "title": "Conditional", "to": "AdventureGame.asm:check_has_sword"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_inventory", "title": "Next", "to": "AdventureGame.asm:check_has_sword"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_sword", "title": "Conditional", "to": "AdventureGame.asm:check_has_gem"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_has_sword", "title": "Next", "to": "AdventureGame.asm:check_has_gem"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_gem", "title": "Conditional", "to": "AdventureGame.asm:check_has_book"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_has_gem", "title": "Next", "to": "AdventureGame.asm:check_has_book"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_book", "title": "Conditional", "to": "AdventureGame.asm:check_has_map"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_has_book", "title": "Next", "to": "AdventureGame.asm:check_has_map"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_map", "title": "Conditional", "to": "AdventureGame.asm:check_has_flowers"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_has_map", "title": "Next", "to": "AdventureGame.asm:check_has_flowers"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_flowers", "title": "Conditional", "to": "AdventureGame.asm:check_has_potion"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_has_flowers", "title": "Next", "to": "AdventureGame.asm:check_has_potion"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_has_potion", "title": "Conditional", "to": "AdventureGame.asm:check_empty_inventory"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_has_potion", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_empty_inventory", "title": "Conditional", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:check_empty_inventory", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_victory", "title": "Conditional", "to": "AdventureGame.asm:unknown_command"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_victory", "title": "Conditional", "to": "AdventureGame.asm:unknown_command"}, {"arrows": "to", "color": "orange", "from": "AdventureGame.asm:check_victory", "title": "Conditional", "to": "AdventureGame.asm:unknown_command"}, {"arrows": "to", "color": "green", "from": "AdventureGame.asm:check_victory", "title": "Next", "to": "AdventureGame.asm:unknown_command"}, {"arrows": "to", "color": "red", "from": "AdventureGame.asm:unknown_command", "title": "Jump to", "to": "AdventureGame.asm:game_loop"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:_start", "title": "Conditional", "to": "lexer.asm:done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:_start", "title": "Call", "to": "lexer.asm:lexer"}, {"arrows": "to", "color": "#AAAAAA", "from": "lexer.asm:_start", "style": "dashed", "title": "External Call (parser.asm)", "to": "parser.asm:parser"}, {"arrows": "to", "color": "green", "from": "lexer.asm:_start", "title": "Next", "to": "lexer.asm:lexer"}, {"arrows": "to", "color": "green", "from": "lexer.asm:lexer", "title": "Next", "to": "lexer.asm:check_token"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:done"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:inside_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:done"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:handle_newline"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:not_digit"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:check_token", "title": "Conditional", "to": "lexer.asm:not_digit"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:check_token", "title": "Call", "to": "lexer.asm:process_number"}, {"arrows": "to", "color": "red", "from": "lexer.asm:check_token", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:not_digit", "title": "Conditional", "to": "lexer.asm:not_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:not_digit", "title": "Conditional", "to": "lexer.asm:not_identifier"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:not_digit", "title": "Call", "to": "lexer.asm:process_identifier"}, {"arrows": "to", "color": "red", "from": "lexer.asm:not_digit", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:not_identifier", "title": "Conditional", "to": "lexer.asm:not_assignment"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:not_identifier", "title": "Call", "to": "lexer.asm:process_assignment"}, {"arrows": "to", "color": "red", "from": "lexer.asm:not_identifier", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:not_assignment", "title": "Conditional", "to": "lexer.asm:not_open_paren"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:not_assignment", "title": "Call", "to": "lexer.asm:process_open_paren"}, {"arrows": "to", "color": "red", "from": "lexer.asm:not_assignment", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:not_open_paren", "title": "Conditional", "to": "lexer.asm:not_close_paren"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:not_open_paren", "title": "Call", "to": "lexer.asm:process_close_paren"}, {"arrows": "to", "color": "red", "from": "lexer.asm:not_open_paren", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:not_close_paren", "title": "Call", "to": "lexer.asm:handle_error"}, {"arrows": "to", "color": "red", "from": "lexer.asm:not_close_paren", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "orange", "from": "lexer.asm:inside_identifier", "title": "Conditional", "to": "lexer.asm:end_identifier"}, {"arrows": "to", "color": "red", "from": "lexer.asm:inside_identifier", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "red", "from": "lexer.asm:end_identifier", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "red", "from": "lexer.asm:handle_newline", "title": "Jump to", "to": "lexer.asm:skip_char"}, {"arrows": "to", "color": "red", "from": "lexer.asm:skip_char", "title": "Jump to", "to": "lexer.asm:check_token"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_number", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_identifier", "title": "Next", "to": "lexer.asm:process_identifier.strlen_loop"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_identifier.strlen_loop", "title": "Next", "to": "lexer.asm:process_identifier.strlen_done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_identifier.strlen_done", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_identifier.is_function", "title": "Next", "to": "lexer.asm:process_identifier.func_strlen_loop"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_identifier.func_strlen_loop", "title": "Next", "to": "lexer.asm:process_identifier.func_strlen_done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_identifier.func_strlen_done", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_assignment", "title": "Next", "to": "lexer.asm:process_assignment.strlen_loop"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_assignment.strlen_loop", "title": "Next", "to": "lexer.asm:process_assignment.strlen_done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_assignment.strlen_done", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_open_paren", "title": "Next", "to": "lexer.asm:process_open_paren.strlen_loop"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_open_paren.strlen_loop", "title": "Next", "to": "lexer.asm:process_open_paren.strlen_done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_open_paren.strlen_done", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_close_paren", "title": "Next", "to": "lexer.asm:process_close_paren.strlen_loop"}, {"arrows": "to", "color": "green", "from": "lexer.asm:process_close_paren.strlen_loop", "title": "Next", "to": "lexer.asm:process_close_paren.strlen_done"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:process_close_paren.strlen_done", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:handle_error", "title": "Call", "to": "lexer.asm:print_space"}, {"arrows": "to", "color": "blue", "from": "lexer.asm:done", "title": "Call", "to": "lexer.asm:print_newline"}, {"arrows": "to", "color": "#AAAAAA", "from": "lexer.asm:_start", "style": "dashed", "title": "Uses parser", "to": "parser.asm:parser"}, {"arrows": "to", "color": "#AAAAAA", "from": "lexer.asm:_start", "style": "dashed", "title": "Uses parser", "to": "parser.asm:parser"}, {"arrows": "to", "color": "#AAAAAA", "from": "lexer.asm:done", "style": "dashed", "title": "Uses parser", "to": "parser.asm:parser"}]);
nodeColors = {};
allNodes = nodes.get({ returnType: "Object" });
for (nodeId in allNodes) {
nodeColors[nodeId] = allNodes[nodeId].color;
}
allEdges = edges.get({ returnType: "Object" });
// adding nodes and edges to the graph
data = {nodes: nodes, edges: edges};
var options = {"physics": {"enabled": true, "hierarchicalRepulsion": {"nodeDistance": 350, "centralGravity": 0.005, "springLength": 350, "springConstant": 0.005, "avoidOverlap": 1.0}, "stabilization": {"iterations": 2000}}, "layout": {"hierarchical": {"enabled": true, "direction": "UD", "sortMethod": "directed", "levelSeparation": 450, "nodeSpacing": 400, "treeSpacing": 500, "blockShifting": false, "edgeMinimization": false}}, "edges": {"smooth": {"enabled": true, "type": "straightCross", "roundness": 0}, "arrows": {"to": {"enabled": true, "scaleFactor": 0.7}}, "color": {"inherit": "from", "opacity": 0.7}, "width": 1.0, "selectionWidth": 2, "hoverWidth": 1.5}, "nodes": {"shape": "box", "margin": 10, "widthConstraint": {"maximum": 250}, "font": {"size": 14, "face": "arial", "background": "white", "strokeWidth": 3, "strokeColor": "white"}, "shadow": {"enabled": true, "size": 3, "x": 2, "y": 2}}, "interaction": {"hover": true, "multiselect": true, "keyboard": {"enabled": true}, "navigationButtons": true}};
network = new vis.Network(container, data, options);
network.on("stabilizationProgress", function(params) {
document.getElementById('loadingBar').removeAttribute("style");
var maxWidth = 496;
var minWidth = 20;
var widthFactor = params.iterations/params.total;
var width = Math.max(minWidth,maxWidth * widthFactor);
document.getElementById('bar').style.width = width + 'px';
document.getElementById('text').innerHTML = Math.round(widthFactor*100) + '%';
});
network.once("stabilizationIterationsDone", function() {
document.getElementById('text').innerHTML = '100%';
document.getElementById('bar').style.width = '496px';
document.getElementById('loadingBar').style.opacity = 0;
// really clean the dom element
setTimeout(function () {document.getElementById('loadingBar').style.display = 'none';}, 500);
});
return network;
}
drawGraph();
</script>
<div id="fixed-legend" style="
position: fixed;
top: 5px;
right: 10px;
background-color: rgba(255, 255, 255, 0.9);
border: 1px solid #ccc;
border-radius: 5px;
padding: 10px;
z-index: 1000;
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
max-height: 100vh;
overflow-y: auto;
width: 280px;
">
<div style="font-weight: bold; margin-bottom: 10px;">SEARCH</div>
<!-- Search controls remain unchanged -->
<div style="margin-bottom: 15px;">
<input type="text" id="node-search" placeholder="Search nodes..." style="width: 100%; padding: 5px; border: 1px solid #ccc; border-radius: 3px; margin-bottom: 5px;">
<div>
<select id="search-type" style="width: 100%; padding: 5px; border: 1px solid #ccc; border-radius: 3px;">
<option value="label">Label</option>
<option value="purpose">Purpose</option>
<option value="file">File</option>
<option value="all">All Fields</option>
</select>
</div>
<div style="margin-top: 5px;">
<button onclick="searchNodes()" style="padding: 5px 10px; background-color: #4CAF50; color: white; border: none; border-radius: 3px; cursor: pointer; margin-right: 5px;">Search</button>
<button onclick="resetSearch()" style="padding: 5px 10px; background-color: #f44336; color: white; border: none; border-radius: 3px; cursor: pointer;">Reset</button>
</div>
<div id="search-results" style="margin-top: 10px; max-height: 150px; overflow-y: auto; display: none;">
<div style="font-weight: bold; margin-bottom: 5px;">Results:</div>
<ul id="results-list" style="padding-left: 20px; margin: 0;"></ul>
</div>
</div>
<hr style="margin: 8px 0;">
<div style="font-weight: bold; margin-bottom: 10px;">NODE TYPES</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="The starting point of program execution (e.g., _start, main)">
<div style="width: 15px; height: 15px; background-color: green; margin-right: 10px;"></div>
<div>Entry Point</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="The starting point of program execution (e.g., _start, main)">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="The final termination point where the program exits completely">
<div style="width: 15px; height: 15px; background-color: red; margin-right: 10px;"></div>
<div>Exit Point</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="The final termination point where the program exits completely">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Marks the end of a logical block but not program termination">
<div style="width: 15px; height: 15px; background-color: #ffaa66; margin-right: 10px;"></div>
<div>Block End/Exit</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Marks the end of a logical block but not program termination">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="A reusable code block that can be called from multiple locations">
<div style="width: 15px; height: 15px; background-color: lightblue; margin-right: 10px;"></div>
<div>Function</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="A reusable code block that can be called from multiple locations">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Code that repeats execution multiple times (for/while/repeat)">
<div style="width: 15px; height: 15px; background-color: purple; margin-right: 10px;"></div>
<div>Loop</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Code that repeats execution multiple times (for/while/repeat)">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Blocks focused on data manipulation and operations">
<div style="width: 15px; height: 15px; background-color: orange; margin-right: 10px;"></div>
<div>Data Operation</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Blocks focused on data manipulation and operations">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Code that compares values and makes decisions">
<div style="width: 15px; height: 15px; background-color: yellow; margin-right: 10px;"></div>
<div>Comparison</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Code that compares values and makes decisions">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Code that handles error conditions and exceptions">
<div style="width: 15px; height: 15px; background-color: #ff9966; margin-right: 10px;"></div>
<div>Error Handling</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Code that handles error conditions and exceptions">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Code that signals successful completion of operations">
<div style="width: 15px; height: 15px; background-color: #66cc99; margin-right: 10px;"></div>
<div>Success/Completion</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Code that signals successful completion of operations">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Code that manages program flow and execution order">
<div style="width: 15px; height: 15px; background-color: #3333cc; margin-right: 10px;"></div>
<div>Control Flow</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Code that manages program flow and execution order">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Generic code blocks with no specific categorization">
<div style="width: 15px; height: 15px; background-color: #dddddd; margin-right: 10px;"></div>
<div>Other Code Block</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Generic code blocks with no specific categorization">ⓘ</div>
</div>
<hr style="margin: 8px 0;">
<div style="font-weight: bold; margin-bottom: 10px;">CONNECTION TYPES</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Unconditional transfer of control to another location">
<div style="width: 30px; height: 3px; background-color: red; margin-right: 10px;"></div>
<div>Jump</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Unconditional transfer of control to another location">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Transfer of control that depends on a condition being met">
<div style="width: 30px; height: 3px; background-color: orange; margin-right: 10px;"></div>
<div>Conditional Jump</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Transfer of control that depends on a condition being met">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Normal sequential execution to the next instruction">
<div style="width: 30px; height: 3px; background-color: green; margin-right: 10px;"></div>
<div>Next Instruction</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Normal sequential execution to the next instruction">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Hierarchical relationship showing one block is part of another">
<div style="width: 30px; height: 3px; background-color: #00AA00; margin-right: 10px;"></div>
<div>Contains (Parent-Child)</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Hierarchical relationship showing one block is part of another">ⓘ</div>
</div>
<div style="display: flex; align-items: center; margin: 5px 0;" title="Connection to code in another source file">
<div style="width: 30px; height: 3px; background-color: #AAAAAA; border-top: 1px dashed #444444; margin-right: 10px;"></div>
<div>External Reference</div>
<div style="margin-left: auto; font-size: 16px; cursor: help;" title="Connection to code in another source file">ⓘ</div>
</div>
</div>
<script>
// Search function code remains unchanged
function searchNodes() {
const searchTerm = document.getElementById('node-search').value.toLowerCase();
const searchType = document.getElementById('search-type').value;
const resultsList = document.getElementById('results-list');
const searchResultsDiv = document.getElementById('search-results');
// Clear previous results
resultsList.innerHTML = '';
if (!searchTerm) {
searchResultsDiv.style.display = 'none';
return;
}
// Get all nodes
const nodes = network.body.data.nodes.get();
const matches = [];
// Filter nodes based on search term
nodes.forEach(node => {
let searchText = '';
if (searchType === 'label' || searchType === 'all') {
searchText += node.label.toLowerCase();
}
if (searchType === 'purpose' || searchType === 'all') {
// Extract purpose from label (between parentheses)
const purposeMatch = node.label.match(/\(([^)]+)\)/);
if (purposeMatch && purposeMatch[1]) {
searchText += purposeMatch[1].toLowerCase();
}
}
if (searchType === 'file' || searchType === 'all') {
// Extract file from label (between square brackets)
const fileMatch = node.label.match(/\[([^\]]+)\]/);
if (fileMatch && fileMatch[1]) {
searchText += fileMatch[1].toLowerCase();
}
}
if (searchText.includes(searchTerm)) {
matches.push(node);
}
});
// Display results
if (matches.length > 0) {
matches.forEach(node => {
const li = document.createElement('li');
li.textContent = node.label.split('\n')[0]; // Just show the first line (function name)
li.style.cursor = 'pointer';
li.style.marginBottom = '3px';
li.onclick = function() {
// Focus on this node
network.focus(node.id, {
scale: 1.2,
animation: {
duration: 1000,
easingFunction: 'easeInOutQuad'
}
});
network.selectNodes([node.id]);
};
resultsList.appendChild(li);
});
searchResultsDiv.style.display = 'block';
} else {
const li = document.createElement('li');
li.textContent = 'No matches found';
resultsList.appendChild(li);
searchResultsDiv.style.display = 'block';
}
}
function resetSearch() {
document.getElementById('node-search').value = '';
document.getElementById('search-results').style.display = 'none';
network.unselectAll();
}
// Add keyboard shortcuts
document.addEventListener('keydown', function(event) {
// Ctrl+F or Cmd+F (Mac) to focus search input
if ((event.ctrlKey || event.metaKey) && event.key === 'f') {
event.preventDefault(); // Prevent browser's find dialog
document.getElementById('node-search').focus();
}
// Escape to clear search
if (event.key === 'Escape') {
resetSearch();
}
});
</script>
</body>
</html>