Browse code

Add source code of the XiPC emulator

Pawel Jablonski authored on 17/03/2023 16:46:08
Showing 29 changed files
1 1
new file mode 100644
... ...
@@ -0,0 +1,30 @@
1
+QMAKE ?= qmake
2
+
3
+QT_PRO = emu.pro
4
+
5
+.PHONY: all
6
+all: src doc
7
+
8
+.PHONY: src
9
+src: qmake
10
+	$(MAKE) -C src
11
+
12
+.PHONY: doc
13
+doc:
14
+	$(MAKE) -C doc
15
+
16
+.PHONY: qmake
17
+qmake:
18
+	cd src; \
19
+	$(QMAKE) $(QT_PRO)
20
+
21
+.PHONY: clean
22
+clean: clean_src clean_doc
23
+	
24
+.PHONY: clean_src
25
+clean_src: qmake
26
+	$(MAKE) -C src clean
27
+
28
+.PHONY: clean_doc
29
+clean_doc:
30
+	$(MAKE) -C doc clean
0 31
new file mode 100644
... ...
@@ -0,0 +1,2671 @@
1
+# Doxyfile 1.9.5
2
+
3
+# This file describes the settings to be used by the documentation system
4
+# doxygen (www.doxygen.org) for a project.
5
+#
6
+# All text after a double hash (##) is considered a comment and is placed in
7
+# front of the TAG it is preceding.
8
+#
9
+# All text after a single hash (#) is considered a comment and will be ignored.
10
+# The format is:
11
+# TAG = value [value, ...]
12
+# For lists, items can also be appended using:
13
+# TAG += value [value, ...]
14
+# Values that contain spaces should be placed between quotes (\" \").
15
+#
16
+# Note:
17
+#
18
+# Use doxygen to compare the used configuration file with the template
19
+# configuration file:
20
+# doxygen -x [configFile]
21
+# Use doxygen to compare the used configuration file with the template
22
+# configuration file without replacing the environment variables or CMake type
23
+# replacement variables:
24
+# doxygen -x_noenv [configFile]
25
+
26
+#---------------------------------------------------------------------------
27
+# Project related configuration options
28
+#---------------------------------------------------------------------------
29
+
30
+# This tag specifies the encoding used for all characters in the configuration
31
+# file that follow. The default is UTF-8 which is also the encoding used for all
32
+# text before the first occurrence of this tag. Doxygen uses libiconv (or the
33
+# iconv built into libc) for the transcoding. See
34
+# https://www.gnu.org/software/libiconv/ for the list of possible encodings.
35
+# The default value is: UTF-8.
36
+
37
+DOXYFILE_ENCODING      = UTF-8
38
+
39
+# The PROJECT_NAME tag is a single word (or a sequence of words surrounded by
40
+# double-quotes, unless you are using Doxywizard) that should identify the
41
+# project for which the documentation is generated. This name is used in the
42
+# title of most generated pages and in a few other places.
43
+# The default value is: My Project.
44
+
45
+PROJECT_NAME           = "XiPU Computer Emulator"
46
+
47
+# The PROJECT_NUMBER tag can be used to enter a project or revision number. This
48
+# could be handy for archiving the generated documentation or if some version
49
+# control system is used.
50
+
51
+PROJECT_NUMBER         =
52
+
53
+# Using the PROJECT_BRIEF tag one can provide an optional one line description
54
+# for a project that appears at the top of each page and should give viewer a
55
+# quick idea about the purpose of the project. Keep the description short.
56
+
57
+PROJECT_BRIEF          =
58
+
59
+# With the PROJECT_LOGO tag one can specify a logo or an icon that is included
60
+# in the documentation. The maximum height of the logo should not exceed 55
61
+# pixels and the maximum width should not exceed 200 pixels. Doxygen will copy
62
+# the logo to the output directory.
63
+
64
+PROJECT_LOGO           =
65
+
66
+# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) path
67
+# into which the generated documentation will be written. If a relative path is
68
+# entered, it will be relative to the location where doxygen was started. If
69
+# left blank the current directory will be used.
70
+
71
+OUTPUT_DIRECTORY       =
72
+
73
+# If the CREATE_SUBDIRS tag is set to YES then doxygen will create up to 4096
74
+# sub-directories (in 2 levels) under the output directory of each output format
75
+# and will distribute the generated files over these directories. Enabling this
76
+# option can be useful when feeding doxygen a huge amount of source files, where
77
+# putting all generated files in the same directory would otherwise causes
78
+# performance problems for the file system. Adapt CREATE_SUBDIRS_LEVEL to
79
+# control the number of sub-directories.
80
+# The default value is: NO.
81
+
82
+CREATE_SUBDIRS         = NO
83
+
84
+# Controls the number of sub-directories that will be created when
85
+# CREATE_SUBDIRS tag is set to YES. Level 0 represents 16 directories, and every
86
+# level increment doubles the number of directories, resulting in 4096
87
+# directories at level 8 which is the default and also the maximum value. The
88
+# sub-directories are organized in 2 levels, the first level always has a fixed
89
+# numer of 16 directories.
90
+# Minimum value: 0, maximum value: 8, default value: 8.
91
+# This tag requires that the tag CREATE_SUBDIRS is set to YES.
92
+
93
+CREATE_SUBDIRS_LEVEL   = 8
94
+
95
+# If the ALLOW_UNICODE_NAMES tag is set to YES, doxygen will allow non-ASCII
96
+# characters to appear in the names of generated files. If set to NO, non-ASCII
97
+# characters will be escaped, for example _xE3_x81_x84 will be used for Unicode
98
+# U+3044.
99
+# The default value is: NO.
100
+
101
+ALLOW_UNICODE_NAMES    = NO
102
+
103
+# The OUTPUT_LANGUAGE tag is used to specify the language in which all
104
+# documentation generated by doxygen is written. Doxygen will use this
105
+# information to generate all constant output in the proper language.
106
+# Possible values are: Afrikaans, Arabic, Armenian, Brazilian, Bulgarian,
107
+# Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch, English
108
+# (United States), Esperanto, Farsi (Persian), Finnish, French, German, Greek,
109
+# Hindi, Hungarian, Indonesian, Italian, Japanese, Japanese-en (Japanese with
110
+# English messages), Korean, Korean-en (Korean with English messages), Latvian,
111
+# Lithuanian, Macedonian, Norwegian, Persian (Farsi), Polish, Portuguese,
112
+# Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, Slovene, Spanish,
113
+# Swedish, Turkish, Ukrainian and Vietnamese.
114
+# The default value is: English.
115
+
116
+OUTPUT_LANGUAGE        = English
117
+
118
+# If the BRIEF_MEMBER_DESC tag is set to YES, doxygen will include brief member
119
+# descriptions after the members that are listed in the file and class
120
+# documentation (similar to Javadoc). Set to NO to disable this.
121
+# The default value is: YES.
122
+
123
+BRIEF_MEMBER_DESC      = YES
124
+
125
+# If the REPEAT_BRIEF tag is set to YES, doxygen will prepend the brief
126
+# description of a member or function before the detailed description
127
+#
128
+# Note: If both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
129
+# brief descriptions will be completely suppressed.
130
+# The default value is: YES.
131
+
132
+REPEAT_BRIEF           = YES
133
+
134
+# This tag implements a quasi-intelligent brief description abbreviator that is
135
+# used to form the text in various listings. Each string in this list, if found
136
+# as the leading text of the brief description, will be stripped from the text
137
+# and the result, after processing the whole list, is used as the annotated
138
+# text. Otherwise, the brief description is used as-is. If left blank, the
139
+# following values are used ($name is automatically replaced with the name of
140
+# the entity):The $name class, The $name widget, The $name file, is, provides,
141
+# specifies, contains, represents, a, an and the.
142
+
143
+ABBREVIATE_BRIEF       =
144
+
145
+# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
146
+# doxygen will generate a detailed section even if there is only a brief
147
+# description.
148
+# The default value is: NO.
149
+
150
+ALWAYS_DETAILED_SEC    = NO
151
+
152
+# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all
153
+# inherited members of a class in the documentation of that class as if those
154
+# members were ordinary class members. Constructors, destructors and assignment
155
+# operators of the base classes will not be shown.
156
+# The default value is: NO.
157
+
158
+INLINE_INHERITED_MEMB  = NO
159
+
160
+# If the FULL_PATH_NAMES tag is set to YES, doxygen will prepend the full path
161
+# before files name in the file list and in the header files. If set to NO the
162
+# shortest path that makes the file name unique will be used
163
+# The default value is: YES.
164
+
165
+FULL_PATH_NAMES        = NO
166
+
167
+# The STRIP_FROM_PATH tag can be used to strip a user-defined part of the path.
168
+# Stripping is only done if one of the specified strings matches the left-hand
169
+# part of the path. The tag can be used to show relative paths in the file list.
170
+# If left blank the directory from which doxygen is run is used as the path to
171
+# strip.
172
+#
173
+# Note that you can specify absolute paths here, but also relative paths, which
174
+# will be relative from the directory where doxygen is started.
175
+# This tag requires that the tag FULL_PATH_NAMES is set to YES.
176
+
177
+STRIP_FROM_PATH        =
178
+
179
+# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of the
180
+# path mentioned in the documentation of a class, which tells the reader which
181
+# header file to include in order to use a class. If left blank only the name of
182
+# the header file containing the class definition is used. Otherwise one should
183
+# specify the list of include paths that are normally passed to the compiler
184
+# using the -I flag.
185
+
186
+STRIP_FROM_INC_PATH    =
187
+
188
+# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter (but
189
+# less readable) file names. This can be useful is your file systems doesn't
190
+# support long names like on DOS, Mac, or CD-ROM.
191
+# The default value is: NO.
192
+
193
+SHORT_NAMES            = NO
194
+
195
+# If the JAVADOC_AUTOBRIEF tag is set to YES then doxygen will interpret the
196
+# first line (until the first dot) of a Javadoc-style comment as the brief
197
+# description. If set to NO, the Javadoc-style will behave just like regular Qt-
198
+# style comments (thus requiring an explicit @brief command for a brief
199
+# description.)
200
+# The default value is: NO.
201
+
202
+JAVADOC_AUTOBRIEF      = NO
203
+
204
+# If the JAVADOC_BANNER tag is set to YES then doxygen will interpret a line
205
+# such as
206
+# /***************
207
+# as being the beginning of a Javadoc-style comment "banner". If set to NO, the
208
+# Javadoc-style will behave just like regular comments and it will not be
209
+# interpreted by doxygen.
210
+# The default value is: NO.
211
+
212
+JAVADOC_BANNER         = NO
213
+
214
+# If the QT_AUTOBRIEF tag is set to YES then doxygen will interpret the first
215
+# line (until the first dot) of a Qt-style comment as the brief description. If
216
+# set to NO, the Qt-style will behave just like regular Qt-style comments (thus
217
+# requiring an explicit \brief command for a brief description.)
218
+# The default value is: NO.
219
+
220
+QT_AUTOBRIEF           = NO
221
+
222
+# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make doxygen treat a
223
+# multi-line C++ special comment block (i.e. a block of //! or /// comments) as
224
+# a brief description. This used to be the default behavior. The new default is
225
+# to treat a multi-line C++ comment block as a detailed description. Set this
226
+# tag to YES if you prefer the old behavior instead.
227
+#
228
+# Note that setting this tag to YES also means that rational rose comments are
229
+# not recognized any more.
230
+# The default value is: NO.
231
+
232
+MULTILINE_CPP_IS_BRIEF = NO
233
+
234
+# By default Python docstrings are displayed as preformatted text and doxygen's
235
+# special commands cannot be used. By setting PYTHON_DOCSTRING to NO the
236
+# doxygen's special commands can be used and the contents of the docstring
237
+# documentation blocks is shown as doxygen documentation.
238
+# The default value is: YES.
239
+
240
+PYTHON_DOCSTRING       = YES
241
+
242
+# If the INHERIT_DOCS tag is set to YES then an undocumented member inherits the
243
+# documentation from any documented member that it re-implements.
244
+# The default value is: YES.
245
+
246
+INHERIT_DOCS           = YES
247
+
248
+# If the SEPARATE_MEMBER_PAGES tag is set to YES then doxygen will produce a new
249
+# page for each member. If set to NO, the documentation of a member will be part
250
+# of the file/class/namespace that contains it.
251
+# The default value is: NO.
252
+
253
+SEPARATE_MEMBER_PAGES  = NO
254
+
255
+# The TAB_SIZE tag can be used to set the number of spaces in a tab. Doxygen
256
+# uses this value to replace tabs by spaces in code fragments.
257
+# Minimum value: 1, maximum value: 16, default value: 4.
258
+
259
+TAB_SIZE               = 4
260
+
261
+# This tag can be used to specify a number of aliases that act as commands in
262
+# the documentation. An alias has the form:
263
+# name=value
264
+# For example adding
265
+# "sideeffect=@par Side Effects:^^"
266
+# will allow you to put the command \sideeffect (or @sideeffect) in the
267
+# documentation, which will result in a user-defined paragraph with heading
268
+# "Side Effects:". Note that you cannot put \n's in the value part of an alias
269
+# to insert newlines (in the resulting output). You can put ^^ in the value part
270
+# of an alias to insert a newline as if a physical newline was in the original
271
+# file. When you need a literal { or } or , in the value part of an alias you
272
+# have to escape them by means of a backslash (\), this can lead to conflicts
273
+# with the commands \{ and \} for these it is advised to use the version @{ and
274
+# @} or use a double escape (\\{ and \\})
275
+
276
+ALIASES                =
277
+
278
+# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
279
+# only. Doxygen will then generate output that is more tailored for C. For
280
+# instance, some of the names that are used will be different. The list of all
281
+# members will be omitted, etc.
282
+# The default value is: NO.
283
+
284
+OPTIMIZE_OUTPUT_FOR_C  = YES
285
+
286
+# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
287
+# Python sources only. Doxygen will then generate output that is more tailored
288
+# for that language. For instance, namespaces will be presented as packages,
289
+# qualified scopes will look different, etc.
290
+# The default value is: NO.
291
+
292
+OPTIMIZE_OUTPUT_JAVA   = NO
293
+
294
+# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran
295
+# sources. Doxygen will then generate output that is tailored for Fortran.
296
+# The default value is: NO.
297
+
298
+OPTIMIZE_FOR_FORTRAN   = NO
299
+
300
+# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL
301
+# sources. Doxygen will then generate output that is tailored for VHDL.
302
+# The default value is: NO.
303
+
304
+OPTIMIZE_OUTPUT_VHDL   = NO
305
+
306
+# Set the OPTIMIZE_OUTPUT_SLICE tag to YES if your project consists of Slice
307
+# sources only. Doxygen will then generate output that is more tailored for that
308
+# language. For instance, namespaces will be presented as modules, types will be
309
+# separated into more groups, etc.
310
+# The default value is: NO.
311
+
312
+OPTIMIZE_OUTPUT_SLICE  = NO
313
+
314
+# Doxygen selects the parser to use depending on the extension of the files it
315
+# parses. With this tag you can assign which parser to use for a given
316
+# extension. Doxygen has a built-in mapping, but you can override or extend it
317
+# using this tag. The format is ext=language, where ext is a file extension, and
318
+# language is one of the parsers supported by doxygen: IDL, Java, JavaScript,
319
+# Csharp (C#), C, C++, Lex, D, PHP, md (Markdown), Objective-C, Python, Slice,
320
+# VHDL, Fortran (fixed format Fortran: FortranFixed, free formatted Fortran:
321
+# FortranFree, unknown formatted Fortran: Fortran. In the later case the parser
322
+# tries to guess whether the code is fixed or free formatted code, this is the
323
+# default for Fortran type files). For instance to make doxygen treat .inc files
324
+# as Fortran files (default is PHP), and .f files as C (default is Fortran),
325
+# use: inc=Fortran f=C.
326
+#
327
+# Note: For files without extension you can use no_extension as a placeholder.
328
+#
329
+# Note that for custom extensions you also need to set FILE_PATTERNS otherwise
330
+# the files are not read by doxygen. When specifying no_extension you should add
331
+# * to the FILE_PATTERNS.
332
+#
333
+# Note see also the list of default file extension mappings.
334
+
335
+EXTENSION_MAPPING      =
336
+
337
+# If the MARKDOWN_SUPPORT tag is enabled then doxygen pre-processes all comments
338
+# according to the Markdown format, which allows for more readable
339
+# documentation. See https://daringfireball.net/projects/markdown/ for details.
340
+# The output of markdown processing is further processed by doxygen, so you can
341
+# mix doxygen, HTML, and XML commands with Markdown formatting. Disable only in
342
+# case of backward compatibilities issues.
343
+# The default value is: YES.
344
+
345
+MARKDOWN_SUPPORT       = NO
346
+
347
+# When the TOC_INCLUDE_HEADINGS tag is set to a non-zero value, all headings up
348
+# to that level are automatically included in the table of contents, even if
349
+# they do not have an id attribute.
350
+# Note: This feature currently applies only to Markdown headings.
351
+# Minimum value: 0, maximum value: 99, default value: 5.
352
+# This tag requires that the tag MARKDOWN_SUPPORT is set to YES.
353
+
354
+TOC_INCLUDE_HEADINGS   = 5
355
+
356
+# When enabled doxygen tries to link words that correspond to documented
357
+# classes, or namespaces to their corresponding documentation. Such a link can
358
+# be prevented in individual cases by putting a % sign in front of the word or
359
+# globally by setting AUTOLINK_SUPPORT to NO.
360
+# The default value is: YES.
361
+
362
+AUTOLINK_SUPPORT       = YES
363
+
364
+# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want
365
+# to include (a tag file for) the STL sources as input, then you should set this
366
+# tag to YES in order to let doxygen match functions declarations and
367
+# definitions whose arguments contain STL classes (e.g. func(std::string);
368
+# versus func(std::string) {}). This also make the inheritance and collaboration
369
+# diagrams that involve STL classes more complete and accurate.
370
+# The default value is: NO.
371
+
372
+BUILTIN_STL_SUPPORT    = YES
373
+
374
+# If you use Microsoft's C++/CLI language, you should set this option to YES to
375
+# enable parsing support.
376
+# The default value is: NO.
377
+
378
+CPP_CLI_SUPPORT        = NO
379
+
380
+# Set the SIP_SUPPORT tag to YES if your project consists of sip (see:
381
+# https://www.riverbankcomputing.com/software/sip/intro) sources only. Doxygen
382
+# will parse them like normal C++ but will assume all classes use public instead
383
+# of private inheritance when no explicit protection keyword is present.
384
+# The default value is: NO.
385
+
386
+SIP_SUPPORT            = NO
387
+
388
+# For Microsoft's IDL there are propget and propput attributes to indicate
389
+# getter and setter methods for a property. Setting this option to YES will make
390
+# doxygen to replace the get and set methods by a property in the documentation.
391
+# This will only work if the methods are indeed getting or setting a simple
392
+# type. If this is not the case, or you want to show the methods anyway, you
393
+# should set this option to NO.
394
+# The default value is: YES.
395
+
396
+IDL_PROPERTY_SUPPORT   = YES
397
+
398
+# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
399
+# tag is set to YES then doxygen will reuse the documentation of the first
400
+# member in the group (if any) for the other members of the group. By default
401
+# all members of a group must be documented explicitly.
402
+# The default value is: NO.
403
+
404
+DISTRIBUTE_GROUP_DOC   = NO
405
+
406
+# If one adds a struct or class to a group and this option is enabled, then also
407
+# any nested class or struct is added to the same group. By default this option
408
+# is disabled and one has to add nested compounds explicitly via \ingroup.
409
+# The default value is: NO.
410
+
411
+GROUP_NESTED_COMPOUNDS = NO
412
+
413
+# Set the SUBGROUPING tag to YES to allow class member groups of the same type
414
+# (for instance a group of public functions) to be put as a subgroup of that
415
+# type (e.g. under the Public Functions section). Set it to NO to prevent
416
+# subgrouping. Alternatively, this can be done per class using the
417
+# \nosubgrouping command.
418
+# The default value is: YES.
419
+
420
+SUBGROUPING            = YES
421
+
422
+# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and unions
423
+# are shown inside the group in which they are included (e.g. using \ingroup)
424
+# instead of on a separate page (for HTML and Man pages) or section (for LaTeX
425
+# and RTF).
426
+#
427
+# Note that this feature does not work in combination with
428
+# SEPARATE_MEMBER_PAGES.
429
+# The default value is: NO.
430
+
431
+INLINE_GROUPED_CLASSES = NO
432
+
433
+# When the INLINE_SIMPLE_STRUCTS tag is set to YES, structs, classes, and unions
434
+# with only public data fields or simple typedef fields will be shown inline in
435
+# the documentation of the scope in which they are defined (i.e. file,
436
+# namespace, or group documentation), provided this scope is documented. If set
437
+# to NO, structs, classes, and unions are shown on a separate page (for HTML and
438
+# Man pages) or section (for LaTeX and RTF).
439
+# The default value is: NO.
440
+
441
+INLINE_SIMPLE_STRUCTS  = NO
442
+
443
+# When TYPEDEF_HIDES_STRUCT tag is enabled, a typedef of a struct, union, or
444
+# enum is documented as struct, union, or enum with the name of the typedef. So
445
+# typedef struct TypeS {} TypeT, will appear in the documentation as a struct
446
+# with name TypeT. When disabled the typedef will appear as a member of a file,
447
+# namespace, or class. And the struct will be named TypeS. This can typically be
448
+# useful for C code in case the coding convention dictates that all compound
449
+# types are typedef'ed and only the typedef is referenced, never the tag name.
450
+# The default value is: NO.
451
+
452
+TYPEDEF_HIDES_STRUCT   = NO
453
+
454
+# The size of the symbol lookup cache can be set using LOOKUP_CACHE_SIZE. This
455
+# cache is used to resolve symbols given their name and scope. Since this can be
456
+# an expensive process and often the same symbol appears multiple times in the
457
+# code, doxygen keeps a cache of pre-resolved symbols. If the cache is too small
458
+# doxygen will become slower. If the cache is too large, memory is wasted. The
459
+# cache size is given by this formula: 2^(16+LOOKUP_CACHE_SIZE). The valid range
460
+# is 0..9, the default is 0, corresponding to a cache size of 2^16=65536
461
+# symbols. At the end of a run doxygen will report the cache usage and suggest
462
+# the optimal cache size from a speed point of view.
463
+# Minimum value: 0, maximum value: 9, default value: 0.
464
+
465
+LOOKUP_CACHE_SIZE      = 0
466
+
467
+# The NUM_PROC_THREADS specifies the number of threads doxygen is allowed to use
468
+# during processing. When set to 0 doxygen will based this on the number of
469
+# cores available in the system. You can set it explicitly to a value larger
470
+# than 0 to get more control over the balance between CPU load and processing
471
+# speed. At this moment only the input processing can be done using multiple
472
+# threads. Since this is still an experimental feature the default is set to 1,
473
+# which effectively disables parallel processing. Please report any issues you
474
+# encounter. Generating dot graphs in parallel is controlled by the
475
+# DOT_NUM_THREADS setting.
476
+# Minimum value: 0, maximum value: 32, default value: 1.
477
+
478
+NUM_PROC_THREADS       = 1
479
+
480
+#---------------------------------------------------------------------------
481
+# Build related configuration options
482
+#---------------------------------------------------------------------------
483
+
484
+# If the EXTRACT_ALL tag is set to YES, doxygen will assume all entities in
485
+# documentation are documented, even if no documentation was available. Private
486
+# class members and static file members will be hidden unless the
487
+# EXTRACT_PRIVATE respectively EXTRACT_STATIC tags are set to YES.
488
+# Note: This will also disable the warnings about undocumented members that are
489
+# normally produced when WARNINGS is set to YES.
490
+# The default value is: NO.
491
+
492
+EXTRACT_ALL            = YES
493
+
494
+# If the EXTRACT_PRIVATE tag is set to YES, all private members of a class will
495
+# be included in the documentation.
496
+# The default value is: NO.
497
+
498
+EXTRACT_PRIVATE        = YES
499
+
500
+# If the EXTRACT_PRIV_VIRTUAL tag is set to YES, documented private virtual
501
+# methods of a class will be included in the documentation.
502
+# The default value is: NO.
503
+
504
+EXTRACT_PRIV_VIRTUAL   = NO
505
+
506
+# If the EXTRACT_PACKAGE tag is set to YES, all members with package or internal
507
+# scope will be included in the documentation.
508
+# The default value is: NO.
509
+
510
+EXTRACT_PACKAGE        = NO
511
+
512
+# If the EXTRACT_STATIC tag is set to YES, all static members of a file will be
513
+# included in the documentation.
514
+# The default value is: NO.
515
+
516
+EXTRACT_STATIC         = YES
517
+
518
+# If the EXTRACT_LOCAL_CLASSES tag is set to YES, classes (and structs) defined
519
+# locally in source files will be included in the documentation. If set to NO,
520
+# only classes defined in header files are included. Does not have any effect
521
+# for Java sources.
522
+# The default value is: YES.
523
+
524
+EXTRACT_LOCAL_CLASSES  = YES
525
+
526
+# This flag is only useful for Objective-C code. If set to YES, local methods,
527
+# which are defined in the implementation section but not in the interface are
528
+# included in the documentation. If set to NO, only methods in the interface are
529
+# included.
530
+# The default value is: NO.
531
+
532
+EXTRACT_LOCAL_METHODS  = NO
533
+
534
+# If this flag is set to YES, the members of anonymous namespaces will be
535
+# extracted and appear in the documentation as a namespace called
536
+# 'anonymous_namespace{file}', where file will be replaced with the base name of
537
+# the file that contains the anonymous namespace. By default anonymous namespace
538
+# are hidden.
539
+# The default value is: NO.
540
+
541
+EXTRACT_ANON_NSPACES   = YES
542
+
543
+# If this flag is set to YES, the name of an unnamed parameter in a declaration
544
+# will be determined by the corresponding definition. By default unnamed
545
+# parameters remain unnamed in the output.
546
+# The default value is: YES.
547
+
548
+RESOLVE_UNNAMED_PARAMS = YES
549
+
550
+# If the HIDE_UNDOC_MEMBERS tag is set to YES, doxygen will hide all
551
+# undocumented members inside documented classes or files. If set to NO these
552
+# members will be included in the various overviews, but no documentation
553
+# section is generated. This option has no effect if EXTRACT_ALL is enabled.
554
+# The default value is: NO.
555
+
556
+HIDE_UNDOC_MEMBERS     = NO
557
+
558
+# If the HIDE_UNDOC_CLASSES tag is set to YES, doxygen will hide all
559
+# undocumented classes that are normally visible in the class hierarchy. If set
560
+# to NO, these classes will be included in the various overviews. This option
561
+# has no effect if EXTRACT_ALL is enabled.
562
+# The default value is: NO.
563
+
564
+HIDE_UNDOC_CLASSES     = NO
565
+
566
+# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, doxygen will hide all friend
567
+# declarations. If set to NO, these declarations will be included in the
568
+# documentation.
569
+# The default value is: NO.
570
+
571
+HIDE_FRIEND_COMPOUNDS  = NO
572
+
573
+# If the HIDE_IN_BODY_DOCS tag is set to YES, doxygen will hide any
574
+# documentation blocks found inside the body of a function. If set to NO, these
575
+# blocks will be appended to the function's detailed documentation block.
576
+# The default value is: NO.
577
+
578
+HIDE_IN_BODY_DOCS      = NO
579
+
580
+# The INTERNAL_DOCS tag determines if documentation that is typed after a
581
+# \internal command is included. If the tag is set to NO then the documentation
582
+# will be excluded. Set it to YES to include the internal documentation.
583
+# The default value is: NO.
584
+
585
+INTERNAL_DOCS          = NO
586
+
587
+# With the correct setting of option CASE_SENSE_NAMES doxygen will better be
588
+# able to match the capabilities of the underlying filesystem. In case the
589
+# filesystem is case sensitive (i.e. it supports files in the same directory
590
+# whose names only differ in casing), the option must be set to YES to properly
591
+# deal with such files in case they appear in the input. For filesystems that
592
+# are not case sensitive the option should be set to NO to properly deal with
593
+# output files written for symbols that only differ in casing, such as for two
594
+# classes, one named CLASS and the other named Class, and to also support
595
+# references to files without having to specify the exact matching casing. On
596
+# Windows (including Cygwin) and MacOS, users should typically set this option
597
+# to NO, whereas on Linux or other Unix flavors it should typically be set to
598
+# YES.
599
+# Possible values are: SYSTEM, NO and YES.
600
+# The default value is: SYSTEM.
601
+
602
+CASE_SENSE_NAMES       = NO
603
+
604
+# If the HIDE_SCOPE_NAMES tag is set to NO then doxygen will show members with
605
+# their full class and namespace scopes in the documentation. If set to YES, the
606
+# scope will be hidden.
607
+# The default value is: NO.
608
+
609
+HIDE_SCOPE_NAMES       = NO
610
+
611
+# If the HIDE_COMPOUND_REFERENCE tag is set to NO (default) then doxygen will
612
+# append additional text to a page's title, such as Class Reference. If set to
613
+# YES the compound reference will be hidden.
614
+# The default value is: NO.
615
+
616
+HIDE_COMPOUND_REFERENCE= NO
617
+
618
+# If the SHOW_HEADERFILE tag is set to YES then the documentation for a class
619
+# will show which file needs to be included to use the class.
620
+# The default value is: YES.
621
+
622
+SHOW_HEADERFILE        = YES
623
+
624
+# If the SHOW_INCLUDE_FILES tag is set to YES then doxygen will put a list of
625
+# the files that are included by a file in the documentation of that file.
626
+# The default value is: YES.
627
+
628
+SHOW_INCLUDE_FILES     = YES
629
+
630
+# If the SHOW_GROUPED_MEMB_INC tag is set to YES then Doxygen will add for each
631
+# grouped member an include statement to the documentation, telling the reader
632
+# which file to include in order to use the member.
633
+# The default value is: NO.
634
+
635
+SHOW_GROUPED_MEMB_INC  = YES
636
+
637
+# If the FORCE_LOCAL_INCLUDES tag is set to YES then doxygen will list include
638
+# files with double quotes in the documentation rather than with sharp brackets.
639
+# The default value is: NO.
640
+
641
+FORCE_LOCAL_INCLUDES   = NO
642
+
643
+# If the INLINE_INFO tag is set to YES then a tag [inline] is inserted in the
644
+# documentation for inline members.
645
+# The default value is: YES.
646
+
647
+INLINE_INFO            = YES
648
+
649
+# If the SORT_MEMBER_DOCS tag is set to YES then doxygen will sort the
650
+# (detailed) documentation of file and class members alphabetically by member
651
+# name. If set to NO, the members will appear in declaration order.
652
+# The default value is: YES.
653
+
654
+SORT_MEMBER_DOCS       = YES
655
+
656
+# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the brief
657
+# descriptions of file, namespace and class members alphabetically by member
658
+# name. If set to NO, the members will appear in declaration order. Note that
659
+# this will also influence the order of the classes in the class list.
660
+# The default value is: NO.
661
+
662
+SORT_BRIEF_DOCS        = NO
663
+
664
+# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen will sort the
665
+# (brief and detailed) documentation of class members so that constructors and
666
+# destructors are listed first. If set to NO the constructors will appear in the
667
+# respective orders defined by SORT_BRIEF_DOCS and SORT_MEMBER_DOCS.
668
+# Note: If SORT_BRIEF_DOCS is set to NO this option is ignored for sorting brief
669
+# member documentation.
670
+# Note: If SORT_MEMBER_DOCS is set to NO this option is ignored for sorting
671
+# detailed member documentation.
672
+# The default value is: NO.
673
+
674
+SORT_MEMBERS_CTORS_1ST = NO
675
+
676
+# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the hierarchy
677
+# of group names into alphabetical order. If set to NO the group names will
678
+# appear in their defined order.
679
+# The default value is: NO.
680
+
681
+SORT_GROUP_NAMES       = NO
682
+
683
+# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be sorted by
684
+# fully-qualified names, including namespaces. If set to NO, the class list will
685
+# be sorted only by class name, not including the namespace part.
686
+# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
687
+# Note: This option applies only to the class list, not to the alphabetical
688
+# list.
689
+# The default value is: NO.
690
+
691
+SORT_BY_SCOPE_NAME     = NO
692
+
693
+# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper
694
+# type resolution of all parameters of a function it will reject a match between
695
+# the prototype and the implementation of a member function even if there is
696
+# only one candidate or it is obvious which candidate to choose by doing a
697
+# simple string match. By disabling STRICT_PROTO_MATCHING doxygen will still
698
+# accept a match between prototype and implementation in such cases.
699
+# The default value is: NO.
700
+
701
+STRICT_PROTO_MATCHING  = NO
702
+
703
+# The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo
704
+# list. This list is created by putting \todo commands in the documentation.
705
+# The default value is: YES.
706
+
707
+GENERATE_TODOLIST      = YES
708
+
709
+# The GENERATE_TESTLIST tag can be used to enable (YES) or disable (NO) the test
710
+# list. This list is created by putting \test commands in the documentation.
711
+# The default value is: YES.
712
+
713
+GENERATE_TESTLIST      = YES
714
+
715
+# The GENERATE_BUGLIST tag can be used to enable (YES) or disable (NO) the bug
716
+# list. This list is created by putting \bug commands in the documentation.
717
+# The default value is: YES.
718
+
719
+GENERATE_BUGLIST       = YES
720
+
721
+# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or disable (NO)
722
+# the deprecated list. This list is created by putting \deprecated commands in
723
+# the documentation.
724
+# The default value is: YES.
725
+
726
+GENERATE_DEPRECATEDLIST= YES
727
+
728
+# The ENABLED_SECTIONS tag can be used to enable conditional documentation
729
+# sections, marked by \if <section_label> ... \endif and \cond <section_label>
730
+# ... \endcond blocks.
731
+
732
+ENABLED_SECTIONS       =
733
+
734
+# The MAX_INITIALIZER_LINES tag determines the maximum number of lines that the
735
+# initial value of a variable or macro / define can have for it to appear in the
736
+# documentation. If the initializer consists of more lines than specified here
737
+# it will be hidden. Use a value of 0 to hide initializers completely. The
738
+# appearance of the value of individual variables and macros / defines can be
739
+# controlled using \showinitializer or \hideinitializer command in the
740
+# documentation regardless of this setting.
741
+# Minimum value: 0, maximum value: 10000, default value: 30.
742
+
743
+MAX_INITIALIZER_LINES  = 30
744
+
745
+# Set the SHOW_USED_FILES tag to NO to disable the list of files generated at
746
+# the bottom of the documentation of classes and structs. If set to YES, the
747
+# list will mention the files that were used to generate the documentation.
748
+# The default value is: YES.
749
+
750
+SHOW_USED_FILES        = YES
751
+
752
+# Set the SHOW_FILES tag to NO to disable the generation of the Files page. This
753
+# will remove the Files entry from the Quick Index and from the Folder Tree View
754
+# (if specified).
755
+# The default value is: YES.
756
+
757
+SHOW_FILES             = YES
758
+
759
+# Set the SHOW_NAMESPACES tag to NO to disable the generation of the Namespaces
760
+# page. This will remove the Namespaces entry from the Quick Index and from the
761
+# Folder Tree View (if specified).
762
+# The default value is: YES.
763
+
764
+SHOW_NAMESPACES        = YES
765
+
766
+# The FILE_VERSION_FILTER tag can be used to specify a program or script that
767
+# doxygen should invoke to get the current version for each file (typically from
768
+# the version control system). Doxygen will invoke the program by executing (via
769
+# popen()) the command command input-file, where command is the value of the
770
+# FILE_VERSION_FILTER tag, and input-file is the name of an input file provided
771
+# by doxygen. Whatever the program writes to standard output is used as the file
772
+# version. For an example see the documentation.
773
+
774
+FILE_VERSION_FILTER    =
775
+
776
+# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed
777
+# by doxygen. The layout file controls the global structure of the generated
778
+# output files in an output format independent way. To create the layout file
779
+# that represents doxygen's defaults, run doxygen with the -l option. You can
780
+# optionally specify a file name after the option, if omitted DoxygenLayout.xml
781
+# will be used as the name of the layout file. See also section "Changing the
782
+# layout of pages" for information.
783
+#
784
+# Note that if you run doxygen from a directory containing a file called
785
+# DoxygenLayout.xml, doxygen will parse it automatically even if the LAYOUT_FILE
786
+# tag is left empty.
787
+
788
+LAYOUT_FILE            =
789
+
790
+# The CITE_BIB_FILES tag can be used to specify one or more bib files containing
791
+# the reference definitions. This must be a list of .bib files. The .bib
792
+# extension is automatically appended if omitted. This requires the bibtex tool
793
+# to be installed. See also https://en.wikipedia.org/wiki/BibTeX for more info.
794
+# For LaTeX the style of the bibliography can be controlled using
795
+# LATEX_BIB_STYLE. To use this feature you need bibtex and perl available in the
796
+# search path. See also \cite for info how to create references.
797
+
798
+CITE_BIB_FILES         =
799
+
800
+#---------------------------------------------------------------------------
801
+# Configuration options related to warning and progress messages
802
+#---------------------------------------------------------------------------
803
+
804
+# The QUIET tag can be used to turn on/off the messages that are generated to
805
+# standard output by doxygen. If QUIET is set to YES this implies that the
806
+# messages are off.
807
+# The default value is: NO.
808
+
809
+QUIET                  = NO
810
+
811
+# The WARNINGS tag can be used to turn on/off the warning messages that are
812
+# generated to standard error (stderr) by doxygen. If WARNINGS is set to YES
813
+# this implies that the warnings are on.
814
+#
815
+# Tip: Turn warnings on while writing the documentation.
816
+# The default value is: YES.
817
+
818
+WARNINGS               = YES
819
+
820
+# If the WARN_IF_UNDOCUMENTED tag is set to YES then doxygen will generate
821
+# warnings for undocumented members. If EXTRACT_ALL is set to YES then this flag
822
+# will automatically be disabled.
823
+# The default value is: YES.
824
+
825
+WARN_IF_UNDOCUMENTED   = YES
826
+
827
+# If the WARN_IF_DOC_ERROR tag is set to YES, doxygen will generate warnings for
828
+# potential errors in the documentation, such as documenting some parameters in
829
+# a documented function twice, or documenting parameters that don't exist or
830
+# using markup commands wrongly.
831
+# The default value is: YES.
832
+
833
+WARN_IF_DOC_ERROR      = YES
834
+
835
+# If WARN_IF_INCOMPLETE_DOC is set to YES, doxygen will warn about incomplete
836
+# function parameter documentation. If set to NO, doxygen will accept that some
837
+# parameters have no documentation without warning.
838
+# The default value is: YES.
839
+
840
+WARN_IF_INCOMPLETE_DOC = YES
841
+
842
+# This WARN_NO_PARAMDOC option can be enabled to get warnings for functions that
843
+# are documented, but have no documentation for their parameters or return
844
+# value. If set to NO, doxygen will only warn about wrong parameter
845
+# documentation, but not about the absence of documentation. If EXTRACT_ALL is
846
+# set to YES then this flag will automatically be disabled. See also
847
+# WARN_IF_INCOMPLETE_DOC
848
+# The default value is: NO.
849
+
850
+WARN_NO_PARAMDOC       = YES
851
+
852
+# If the WARN_AS_ERROR tag is set to YES then doxygen will immediately stop when
853
+# a warning is encountered. If the WARN_AS_ERROR tag is set to FAIL_ON_WARNINGS
854
+# then doxygen will continue running as if WARN_AS_ERROR tag is set to NO, but
855
+# at the end of the doxygen process doxygen will return with a non-zero status.
856
+# Possible values are: NO, YES and FAIL_ON_WARNINGS.
857
+# The default value is: NO.
858
+
859
+WARN_AS_ERROR          = YES
860
+
861
+# The WARN_FORMAT tag determines the format of the warning messages that doxygen
862
+# can produce. The string should contain the $file, $line, and $text tags, which
863
+# will be replaced by the file and line number from which the warning originated
864
+# and the warning text. Optionally the format may contain $version, which will
865
+# be replaced by the version of the file (if it could be obtained via
866
+# FILE_VERSION_FILTER)
867
+# See also: WARN_LINE_FORMAT
868
+# The default value is: $file:$line: $text.
869
+
870
+WARN_FORMAT            = "$file:$line: $text"
871
+
872
+# In the $text part of the WARN_FORMAT command it is possible that a reference
873
+# to a more specific place is given. To make it easier to jump to this place
874
+# (outside of doxygen) the user can define a custom "cut" / "paste" string.
875
+# Example:
876
+# WARN_LINE_FORMAT = "'vi $file +$line'"
877
+# See also: WARN_FORMAT
878
+# The default value is: at line $line of file $file.
879
+
880
+WARN_LINE_FORMAT       = "at line $line of file $file"
881
+
882
+# The WARN_LOGFILE tag can be used to specify a file to which warning and error
883
+# messages should be written. If left blank the output is written to standard
884
+# error (stderr). In case the file specified cannot be opened for writing the
885
+# warning and error messages are written to standard error. When as file - is
886
+# specified the warning and error messages are written to standard output
887
+# (stdout).
888
+
889
+WARN_LOGFILE           = warnings.log
890
+
891
+#---------------------------------------------------------------------------
892
+# Configuration options related to the input files
893
+#---------------------------------------------------------------------------
894
+
895
+# The INPUT tag is used to specify the files and/or directories that contain
896
+# documented source files. You may enter file names like myfile.cpp or
897
+# directories like /usr/src/myproject. Separate the files or directories with
898
+# spaces. See also FILE_PATTERNS and EXTENSION_MAPPING
899
+# Note: If this tag is empty the current directory is searched.
900
+
901
+INPUT                  = ../src
902
+
903
+# This tag can be used to specify the character encoding of the source files
904
+# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
905
+# libiconv (or the iconv built into libc) for the transcoding. See the libiconv
906
+# documentation (see:
907
+# https://www.gnu.org/software/libiconv/) for the list of possible encodings.
908
+# See also: INPUT_FILE_ENCODING
909
+# The default value is: UTF-8.
910
+
911
+INPUT_ENCODING         = UTF-8
912
+
913
+# This tag can be used to specify the character encoding of the source files
914
+# that doxygen parses The INPUT_FILE_ENCODING tag can be used to specify
915
+# character encoding on a per file pattern basis. Doxygen will compare the file
916
+# name with each pattern and apply the encoding instead of the default
917
+# INPUT_ENCODING) if there is a match. The character encodings are a list of the
918
+# form: pattern=encoding (like *.php=ISO-8859-1). See cfg_input_encoding
919
+# "INPUT_ENCODING" for further information on supported encodings.
920
+
921
+INPUT_FILE_ENCODING    =
922
+
923
+# If the value of the INPUT tag contains directories, you can use the
924
+# FILE_PATTERNS tag to specify one or more wildcard patterns (like *.cpp and
925
+# *.h) to filter out the source-files in the directories.
926
+#
927
+# Note that for custom extensions or not directly supported extensions you also
928
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
929
+# read by doxygen.
930
+#
931
+# Note the list of default checked file patterns might differ from the list of
932
+# default file extension mappings.
933
+#
934
+# If left blank the following patterns are tested:*.c, *.cc, *.cxx, *.cpp,
935
+# *.c++, *.java, *.ii, *.ixx, *.ipp, *.i++, *.inl, *.idl, *.ddl, *.odl, *.h,
936
+# *.hh, *.hxx, *.hpp, *.h++, *.l, *.cs, *.d, *.php, *.php4, *.php5, *.phtml,
937
+# *.inc, *.m, *.markdown, *.md, *.mm, *.dox (to be provided as doxygen C
938
+# comment), *.py, *.pyw, *.f90, *.f95, *.f03, *.f08, *.f18, *.f, *.for, *.vhd,
939
+# *.vhdl, *.ucf, *.qsf and *.ice.
940
+
941
+FILE_PATTERNS          = *.h \
942
+                         *.cpp
943
+
944
+# The RECURSIVE tag can be used to specify whether or not subdirectories should
945
+# be searched for input files as well.
946
+# The default value is: NO.
947
+
948
+RECURSIVE              = NO
949
+
950
+# The EXCLUDE tag can be used to specify files and/or directories that should be
951
+# excluded from the INPUT source files. This way you can easily exclude a
952
+# subdirectory from a directory tree whose root is specified with the INPUT tag.
953
+#
954
+# Note that relative paths are relative to the directory from which doxygen is
955
+# run.
956
+
957
+EXCLUDE                =
958
+
959
+# The EXCLUDE_SYMLINKS tag can be used to select whether or not files or
960
+# directories that are symbolic links (a Unix file system feature) are excluded
961
+# from the input.
962
+# The default value is: NO.
963
+
964
+EXCLUDE_SYMLINKS       = NO
965
+
966
+# If the value of the INPUT tag contains directories, you can use the
967
+# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
968
+# certain files from those directories.
969
+#
970
+# Note that the wildcards are matched against the file with absolute path, so to
971
+# exclude all test directories for example use the pattern */test/*
972
+
973
+EXCLUDE_PATTERNS       = moc_*.cpp
974
+
975
+# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names
976
+# (namespaces, classes, functions, etc.) that should be excluded from the
977
+# output. The symbol name can be a fully qualified name, a word, or if the
978
+# wildcard * is used, a substring. Examples: ANamespace, AClass,
979
+# ANamespace::AClass, ANamespace::*Test
980
+#
981
+# Note that the wildcards are matched against the file with absolute path, so to
982
+# exclude all test directories use the pattern */test/*
983
+
984
+EXCLUDE_SYMBOLS        =
985
+
986
+# The EXAMPLE_PATH tag can be used to specify one or more files or directories
987
+# that contain example code fragments that are included (see the \include
988
+# command).
989
+
990
+EXAMPLE_PATH           =
991
+
992
+# If the value of the EXAMPLE_PATH tag contains directories, you can use the
993
+# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp and
994
+# *.h) to filter out the source-files in the directories. If left blank all
995
+# files are included.
996
+
997
+EXAMPLE_PATTERNS       =
998
+
999
+# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
1000
+# searched for input files to be used with the \include or \dontinclude commands
1001
+# irrespective of the value of the RECURSIVE tag.
1002
+# The default value is: NO.
1003
+
1004
+EXAMPLE_RECURSIVE      = NO
1005
+
1006
+# The IMAGE_PATH tag can be used to specify one or more files or directories
1007
+# that contain images that are to be included in the documentation (see the
1008
+# \image command).
1009
+
1010
+IMAGE_PATH             =
1011
+
1012
+# The INPUT_FILTER tag can be used to specify a program that doxygen should
1013
+# invoke to filter for each input file. Doxygen will invoke the filter program
1014
+# by executing (via popen()) the command:
1015
+#
1016
+# <filter> <input-file>
1017
+#
1018
+# where <filter> is the value of the INPUT_FILTER tag, and <input-file> is the
1019
+# name of an input file. Doxygen will then use the output that the filter
1020
+# program writes to standard output. If FILTER_PATTERNS is specified, this tag
1021
+# will be ignored.
1022
+#
1023
+# Note that the filter must not add or remove lines; it is applied before the
1024
+# code is scanned, but not when the output code is generated. If lines are added
1025
+# or removed, the anchors will not be placed correctly.
1026
+#
1027
+# Note that doxygen will use the data processed and written to standard output
1028
+# for further processing, therefore nothing else, like debug statements or used
1029
+# commands (so in case of a Windows batch file always use @echo OFF), should be
1030
+# written to standard output.
1031
+#
1032
+# Note that for custom extensions or not directly supported extensions you also
1033
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1034
+# properly processed by doxygen.
1035
+
1036
+INPUT_FILTER           =
1037
+
1038
+# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern
1039
+# basis. Doxygen will compare the file name with each pattern and apply the
1040
+# filter if there is a match. The filters are a list of the form: pattern=filter
1041
+# (like *.cpp=my_cpp_filter). See INPUT_FILTER for further information on how
1042
+# filters are used. If the FILTER_PATTERNS tag is empty or if none of the
1043
+# patterns match the file name, INPUT_FILTER is applied.
1044
+#
1045
+# Note that for custom extensions or not directly supported extensions you also
1046
+# need to set EXTENSION_MAPPING for the extension otherwise the files are not
1047
+# properly processed by doxygen.
1048
+
1049
+FILTER_PATTERNS        =
1050
+
1051
+# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
1052
+# INPUT_FILTER) will also be used to filter the input files that are used for
1053
+# producing the source files to browse (i.e. when SOURCE_BROWSER is set to YES).
1054
+# The default value is: NO.
1055
+
1056
+FILTER_SOURCE_FILES    = NO
1057
+
1058
+# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file
1059
+# pattern. A pattern will override the setting for FILTER_PATTERN (if any) and
1060
+# it is also possible to disable source filtering for a specific pattern using
1061
+# *.ext= (so without naming a filter).
1062
+# This tag requires that the tag FILTER_SOURCE_FILES is set to YES.
1063
+
1064
+FILTER_SOURCE_PATTERNS =
1065
+
1066
+# If the USE_MDFILE_AS_MAINPAGE tag refers to the name of a markdown file that
1067
+# is part of the input, its contents will be placed on the main page
1068
+# (index.html). This can be useful if you have a project on for instance GitHub
1069
+# and want to reuse the introduction page also for the doxygen output.
1070
+
1071
+USE_MDFILE_AS_MAINPAGE =
1072
+
1073
+# The Fortran standard specifies that for fixed formatted Fortran code all
1074
+# characters from position 72 are to be considered as comment. A common
1075
+# extension is to allow longer lines before the automatic comment starts. The
1076
+# setting FORTRAN_COMMENT_AFTER will also make it possible that longer lines can
1077
+# be processed before the automatic comment starts.
1078
+# Minimum value: 7, maximum value: 10000, default value: 72.
1079
+
1080
+FORTRAN_COMMENT_AFTER  = 72
1081
+
1082
+#---------------------------------------------------------------------------
1083
+# Configuration options related to source browsing
1084
+#---------------------------------------------------------------------------
1085
+
1086
+# If the SOURCE_BROWSER tag is set to YES then a list of source files will be
1087
+# generated. Documented entities will be cross-referenced with these sources.
1088
+#
1089
+# Note: To get rid of all source code in the generated output, make sure that
1090
+# also VERBATIM_HEADERS is set to NO.
1091
+# The default value is: NO.
1092
+
1093
+SOURCE_BROWSER         = YES
1094
+
1095
+# Setting the INLINE_SOURCES tag to YES will include the body of functions,
1096
+# classes and enums directly into the documentation.
1097
+# The default value is: NO.
1098
+
1099
+INLINE_SOURCES         = YES
1100
+
1101
+# Setting the STRIP_CODE_COMMENTS tag to YES will instruct doxygen to hide any
1102
+# special comment blocks from generated source code fragments. Normal C, C++ and
1103
+# Fortran comments will always remain visible.
1104
+# The default value is: YES.
1105
+
1106
+STRIP_CODE_COMMENTS    = NO
1107
+
1108
+# If the REFERENCED_BY_RELATION tag is set to YES then for each documented
1109
+# entity all documented functions referencing it will be listed.
1110
+# The default value is: NO.
1111
+
1112
+REFERENCED_BY_RELATION = YES
1113
+
1114
+# If the REFERENCES_RELATION tag is set to YES then for each documented function
1115
+# all documented entities called/used by that function will be listed.
1116
+# The default value is: NO.
1117
+
1118
+REFERENCES_RELATION    = YES
1119
+
1120
+# If the REFERENCES_LINK_SOURCE tag is set to YES and SOURCE_BROWSER tag is set
1121
+# to YES then the hyperlinks from functions in REFERENCES_RELATION and
1122
+# REFERENCED_BY_RELATION lists will link to the source code. Otherwise they will
1123
+# link to the documentation.
1124
+# The default value is: YES.
1125
+
1126
+REFERENCES_LINK_SOURCE = YES
1127
+
1128
+# If SOURCE_TOOLTIPS is enabled (the default) then hovering a hyperlink in the
1129
+# source code will show a tooltip with additional information such as prototype,
1130
+# brief description and links to the definition and documentation. Since this
1131
+# will make the HTML file larger and loading of large files a bit slower, you
1132
+# can opt to disable this feature.
1133
+# The default value is: YES.
1134
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
1135
+
1136
+SOURCE_TOOLTIPS        = YES
1137
+
1138
+# If the USE_HTAGS tag is set to YES then the references to source code will
1139
+# point to the HTML generated by the htags(1) tool instead of doxygen built-in
1140
+# source browser. The htags tool is part of GNU's global source tagging system
1141
+# (see https://www.gnu.org/software/global/global.html). You will need version
1142
+# 4.8.6 or higher.
1143
+#
1144
+# To use it do the following:
1145
+# - Install the latest version of global
1146
+# - Enable SOURCE_BROWSER and USE_HTAGS in the configuration file
1147
+# - Make sure the INPUT points to the root of the source tree
1148
+# - Run doxygen as normal
1149
+#
1150
+# Doxygen will invoke htags (and that will in turn invoke gtags), so these
1151
+# tools must be available from the command line (i.e. in the search path).
1152
+#
1153
+# The result: instead of the source browser generated by doxygen, the links to
1154
+# source code will now point to the output of htags.
1155
+# The default value is: NO.
1156
+# This tag requires that the tag SOURCE_BROWSER is set to YES.
1157
+
1158
+USE_HTAGS              = NO
1159
+
1160
+# If the VERBATIM_HEADERS tag is set the YES then doxygen will generate a
1161
+# verbatim copy of the header file for each class for which an include is
1162
+# specified. Set to NO to disable this.
1163
+# See also: Section \class.
1164
+# The default value is: YES.
1165
+
1166
+VERBATIM_HEADERS       = YES
1167
+
1168
+#---------------------------------------------------------------------------
1169
+# Configuration options related to the alphabetical class index
1170
+#---------------------------------------------------------------------------
1171
+
1172
+# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index of all
1173
+# compounds will be generated. Enable this if the project contains a lot of
1174
+# classes, structs, unions or interfaces.
1175
+# The default value is: YES.
1176
+
1177
+ALPHABETICAL_INDEX     = YES
1178
+
1179
+# In case all classes in a project start with a common prefix, all classes will
1180
+# be put under the same header in the alphabetical index. The IGNORE_PREFIX tag
1181
+# can be used to specify a prefix (or a list of prefixes) that should be ignored
1182
+# while generating the index headers.
1183
+# This tag requires that the tag ALPHABETICAL_INDEX is set to YES.
1184
+
1185
+IGNORE_PREFIX          =
1186
+
1187
+#---------------------------------------------------------------------------
1188
+# Configuration options related to the HTML output
1189
+#---------------------------------------------------------------------------
1190
+
1191
+# If the GENERATE_HTML tag is set to YES, doxygen will generate HTML output
1192
+# The default value is: YES.
1193
+
1194
+GENERATE_HTML          = YES
1195
+
1196
+# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. If a
1197
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1198
+# it.
1199
+# The default directory is: html.
1200
+# This tag requires that the tag GENERATE_HTML is set to YES.
1201
+
1202
+HTML_OUTPUT            =
1203
+
1204
+# The HTML_FILE_EXTENSION tag can be used to specify the file extension for each
1205
+# generated HTML page (for example: .htm, .php, .asp).
1206
+# The default value is: .html.
1207
+# This tag requires that the tag GENERATE_HTML is set to YES.
1208
+
1209
+HTML_FILE_EXTENSION    = .html
1210
+
1211
+# The HTML_HEADER tag can be used to specify a user-defined HTML header file for
1212
+# each generated HTML page. If the tag is left blank doxygen will generate a
1213
+# standard header.
1214
+#
1215
+# To get valid HTML the header file that includes any scripts and style sheets
1216
+# that doxygen needs, which is dependent on the configuration options used (e.g.
1217
+# the setting GENERATE_TREEVIEW). It is highly recommended to start with a
1218
+# default header using
1219
+# doxygen -w html new_header.html new_footer.html new_stylesheet.css
1220
+# YourConfigFile
1221
+# and then modify the file new_header.html. See also section "Doxygen usage"
1222
+# for information on how to generate the default header that doxygen normally
1223
+# uses.
1224
+# Note: The header is subject to change so you typically have to regenerate the
1225
+# default header when upgrading to a newer version of doxygen. For a description
1226
+# of the possible markers and block names see the documentation.
1227
+# This tag requires that the tag GENERATE_HTML is set to YES.
1228
+
1229
+HTML_HEADER            =
1230
+
1231
+# The HTML_FOOTER tag can be used to specify a user-defined HTML footer for each
1232
+# generated HTML page. If the tag is left blank doxygen will generate a standard
1233
+# footer. See HTML_HEADER for more information on how to generate a default
1234
+# footer and what special commands can be used inside the footer. See also
1235
+# section "Doxygen usage" for information on how to generate the default footer
1236
+# that doxygen normally uses.
1237
+# This tag requires that the tag GENERATE_HTML is set to YES.
1238
+
1239
+HTML_FOOTER            =
1240
+
1241
+# The HTML_STYLESHEET tag can be used to specify a user-defined cascading style
1242
+# sheet that is used by each HTML page. It can be used to fine-tune the look of
1243
+# the HTML output. If left blank doxygen will generate a default style sheet.
1244
+# See also section "Doxygen usage" for information on how to generate the style
1245
+# sheet that doxygen normally uses.
1246
+# Note: It is recommended to use HTML_EXTRA_STYLESHEET instead of this tag, as
1247
+# it is more robust and this tag (HTML_STYLESHEET) will in the future become
1248
+# obsolete.
1249
+# This tag requires that the tag GENERATE_HTML is set to YES.
1250
+
1251
+HTML_STYLESHEET        =
1252
+
1253
+# The HTML_EXTRA_STYLESHEET tag can be used to specify additional user-defined
1254
+# cascading style sheets that are included after the standard style sheets
1255
+# created by doxygen. Using this option one can overrule certain style aspects.
1256
+# This is preferred over using HTML_STYLESHEET since it does not replace the
1257
+# standard style sheet and is therefore more robust against future updates.
1258
+# Doxygen will copy the style sheet files to the output directory.
1259
+# Note: The order of the extra style sheet files is of importance (e.g. the last
1260
+# style sheet in the list overrules the setting of the previous ones in the
1261
+# list). For an example see the documentation.
1262
+# This tag requires that the tag GENERATE_HTML is set to YES.
1263
+
1264
+HTML_EXTRA_STYLESHEET  =
1265
+
1266
+# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or
1267
+# other source files which should be copied to the HTML output directory. Note
1268
+# that these files will be copied to the base HTML output directory. Use the
1269
+# $relpath^ marker in the HTML_HEADER and/or HTML_FOOTER files to load these
1270
+# files. In the HTML_STYLESHEET file, use the file name only. Also note that the
1271
+# files will be copied as-is; there are no commands or markers available.
1272
+# This tag requires that the tag GENERATE_HTML is set to YES.
1273
+
1274
+HTML_EXTRA_FILES       =
1275
+
1276
+# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
1277
+# should be rendered with a dark or light theme. Default setting AUTO_LIGHT
1278
+# enables light output unless the user preference is dark output. Other options
1279
+# are DARK to always use dark mode, LIGHT to always use light mode, AUTO_DARK to
1280
+# default to dark mode unless the user prefers light mode, and TOGGLE to let the
1281
+# user toggle between dark and light mode via a button.
1282
+# Possible values are: LIGHT Always generate light output., DARK Always generate
1283
+# dark output., AUTO_LIGHT Automatically set the mode according to the user
1284
+# preference, use light mode if no preference is set (the default)., AUTO_DARK
1285
+# Automatically set the mode according to the user preference, use dark mode if
1286
+# no preference is set. and TOGGLE Allow to user to switch between light and
1287
+# dark mode via a button..
1288
+# The default value is: AUTO_LIGHT.
1289
+# This tag requires that the tag GENERATE_HTML is set to YES.
1290
+
1291
+HTML_COLORSTYLE        = AUTO_LIGHT
1292
+
1293
+# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. Doxygen
1294
+# will adjust the colors in the style sheet and background images according to
1295
+# this color. Hue is specified as an angle on a color-wheel, see
1296
+# https://en.wikipedia.org/wiki/Hue for more information. For instance the value
1297
+# 0 represents red, 60 is yellow, 120 is green, 180 is cyan, 240 is blue, 300
1298
+# purple, and 360 is red again.
1299
+# Minimum value: 0, maximum value: 359, default value: 220.
1300
+# This tag requires that the tag GENERATE_HTML is set to YES.
1301
+
1302
+HTML_COLORSTYLE_HUE    = 220
1303
+
1304
+# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of the colors
1305
+# in the HTML output. For a value of 0 the output will use gray-scales only. A
1306
+# value of 255 will produce the most vivid colors.
1307
+# Minimum value: 0, maximum value: 255, default value: 100.
1308
+# This tag requires that the tag GENERATE_HTML is set to YES.
1309
+
1310
+HTML_COLORSTYLE_SAT    = 100
1311
+
1312
+# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to the
1313
+# luminance component of the colors in the HTML output. Values below 100
1314
+# gradually make the output lighter, whereas values above 100 make the output
1315
+# darker. The value divided by 100 is the actual gamma applied, so 80 represents
1316
+# a gamma of 0.8, The value 220 represents a gamma of 2.2, and 100 does not
1317
+# change the gamma.
1318
+# Minimum value: 40, maximum value: 240, default value: 80.
1319
+# This tag requires that the tag GENERATE_HTML is set to YES.
1320
+
1321
+HTML_COLORSTYLE_GAMMA  = 80
1322
+
1323
+# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML
1324
+# page will contain the date and time when the page was generated. Setting this
1325
+# to YES can help to show when doxygen was last run and thus if the
1326
+# documentation is up to date.
1327
+# The default value is: NO.
1328
+# This tag requires that the tag GENERATE_HTML is set to YES.
1329
+
1330
+HTML_TIMESTAMP         = YES
1331
+
1332
+# If the HTML_DYNAMIC_MENUS tag is set to YES then the generated HTML
1333
+# documentation will contain a main index with vertical navigation menus that
1334
+# are dynamically created via JavaScript. If disabled, the navigation index will
1335
+# consists of multiple levels of tabs that are statically embedded in every HTML
1336
+# page. Disable this option to support browsers that do not have JavaScript,
1337
+# like the Qt help browser.
1338
+# The default value is: YES.
1339
+# This tag requires that the tag GENERATE_HTML is set to YES.
1340
+
1341
+HTML_DYNAMIC_MENUS     = NO
1342
+
1343
+# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML
1344
+# documentation will contain sections that can be hidden and shown after the
1345
+# page has loaded.
1346
+# The default value is: NO.
1347
+# This tag requires that the tag GENERATE_HTML is set to YES.
1348
+
1349
+HTML_DYNAMIC_SECTIONS  = NO
1350
+
1351
+# With HTML_INDEX_NUM_ENTRIES one can control the preferred number of entries
1352
+# shown in the various tree structured indices initially; the user can expand
1353
+# and collapse entries dynamically later on. Doxygen will expand the tree to
1354
+# such a level that at most the specified number of entries are visible (unless
1355
+# a fully collapsed tree already exceeds this amount). So setting the number of
1356
+# entries 1 will produce a full collapsed tree by default. 0 is a special value
1357
+# representing an infinite number of entries and will result in a full expanded
1358
+# tree by default.
1359
+# Minimum value: 0, maximum value: 9999, default value: 100.
1360
+# This tag requires that the tag GENERATE_HTML is set to YES.
1361
+
1362
+HTML_INDEX_NUM_ENTRIES = 100
1363
+
1364
+# If the GENERATE_DOCSET tag is set to YES, additional index files will be
1365
+# generated that can be used as input for Apple's Xcode 3 integrated development
1366
+# environment (see:
1367
+# https://developer.apple.com/xcode/), introduced with OSX 10.5 (Leopard). To
1368
+# create a documentation set, doxygen will generate a Makefile in the HTML
1369
+# output directory. Running make will produce the docset in that directory and
1370
+# running make install will install the docset in
1371
+# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find it at
1372
+# startup. See https://developer.apple.com/library/archive/featuredarticles/Doxy
1373
+# genXcode/_index.html for more information.
1374
+# The default value is: NO.
1375
+# This tag requires that the tag GENERATE_HTML is set to YES.
1376
+
1377
+GENERATE_DOCSET        = NO
1378
+
1379
+# This tag determines the name of the docset feed. A documentation feed provides
1380
+# an umbrella under which multiple documentation sets from a single provider
1381
+# (such as a company or product suite) can be grouped.
1382
+# The default value is: Doxygen generated docs.
1383
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1384
+
1385
+DOCSET_FEEDNAME        = "Doxygen docs"
1386
+
1387
+# This tag determines the URL of the docset feed. A documentation feed provides
1388
+# an umbrella under which multiple documentation sets from a single provider
1389
+# (such as a company or product suite) can be grouped.
1390
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1391
+
1392
+DOCSET_FEEDURL         =
1393
+
1394
+# This tag specifies a string that should uniquely identify the documentation
1395
+# set bundle. This should be a reverse domain-name style string, e.g.
1396
+# com.mycompany.MyDocSet. Doxygen will append .docset to the name.
1397
+# The default value is: org.doxygen.Project.
1398
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1399
+
1400
+DOCSET_BUNDLE_ID       = org.doxygen.Doxygen
1401
+
1402
+# The DOCSET_PUBLISHER_ID tag specifies a string that should uniquely identify
1403
+# the documentation publisher. This should be a reverse domain-name style
1404
+# string, e.g. com.mycompany.MyDocSet.documentation.
1405
+# The default value is: org.doxygen.Publisher.
1406
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1407
+
1408
+DOCSET_PUBLISHER_ID    = org.doxygen.Publisher
1409
+
1410
+# The DOCSET_PUBLISHER_NAME tag identifies the documentation publisher.
1411
+# The default value is: Publisher.
1412
+# This tag requires that the tag GENERATE_DOCSET is set to YES.
1413
+
1414
+DOCSET_PUBLISHER_NAME  = Publisher
1415
+
1416
+# If the GENERATE_HTMLHELP tag is set to YES then doxygen generates three
1417
+# additional HTML index files: index.hhp, index.hhc, and index.hhk. The
1418
+# index.hhp is a project file that can be read by Microsoft's HTML Help Workshop
1419
+# on Windows. In the beginning of 2021 Microsoft took the original page, with
1420
+# a.o. the download links, offline the HTML help workshop was already many years
1421
+# in maintenance mode). You can download the HTML help workshop from the web
1422
+# archives at Installation executable (see:
1423
+# http://web.archive.org/web/20160201063255/http://download.microsoft.com/downlo
1424
+# ad/0/A/9/0A939EF6-E31C-430F-A3DF-DFAE7960D564/htmlhelp.exe).
1425
+#
1426
+# The HTML Help Workshop contains a compiler that can convert all HTML output
1427
+# generated by doxygen into a single compiled HTML file (.chm). Compiled HTML
1428
+# files are now used as the Windows 98 help format, and will replace the old
1429
+# Windows help format (.hlp) on all Windows platforms in the future. Compressed
1430
+# HTML files also contain an index, a table of contents, and you can search for
1431
+# words in the documentation. The HTML workshop also contains a viewer for
1432
+# compressed HTML files.
1433
+# The default value is: NO.
1434
+# This tag requires that the tag GENERATE_HTML is set to YES.
1435
+
1436
+GENERATE_HTMLHELP      = NO
1437
+
1438
+# The CHM_FILE tag can be used to specify the file name of the resulting .chm
1439
+# file. You can add a path in front of the file if the result should not be
1440
+# written to the html output directory.
1441
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1442
+
1443
+CHM_FILE               =
1444
+
1445
+# The HHC_LOCATION tag can be used to specify the location (absolute path
1446
+# including file name) of the HTML help compiler (hhc.exe). If non-empty,
1447
+# doxygen will try to run the HTML help compiler on the generated index.hhp.
1448
+# The file has to be specified with full path.
1449
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1450
+
1451
+HHC_LOCATION           =
1452
+
1453
+# The GENERATE_CHI flag controls if a separate .chi index file is generated
1454
+# (YES) or that it should be included in the main .chm file (NO).
1455
+# The default value is: NO.
1456
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1457
+
1458
+GENERATE_CHI           = NO
1459
+
1460
+# The CHM_INDEX_ENCODING is used to encode HtmlHelp index (hhk), content (hhc)
1461
+# and project file content.
1462
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1463
+
1464
+CHM_INDEX_ENCODING     =
1465
+
1466
+# The BINARY_TOC flag controls whether a binary table of contents is generated
1467
+# (YES) or a normal table of contents (NO) in the .chm file. Furthermore it
1468
+# enables the Previous and Next buttons.
1469
+# The default value is: NO.
1470
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1471
+
1472
+BINARY_TOC             = NO
1473
+
1474
+# The TOC_EXPAND flag can be set to YES to add extra items for group members to
1475
+# the table of contents of the HTML help documentation and to the tree view.
1476
+# The default value is: NO.
1477
+# This tag requires that the tag GENERATE_HTMLHELP is set to YES.
1478
+
1479
+TOC_EXPAND             = NO
1480
+
1481
+# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and
1482
+# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated that
1483
+# can be used as input for Qt's qhelpgenerator to generate a Qt Compressed Help
1484
+# (.qch) of the generated HTML documentation.
1485
+# The default value is: NO.
1486
+# This tag requires that the tag GENERATE_HTML is set to YES.
1487
+
1488
+GENERATE_QHP           = NO
1489
+
1490
+# If the QHG_LOCATION tag is specified, the QCH_FILE tag can be used to specify
1491
+# the file name of the resulting .qch file. The path specified is relative to
1492
+# the HTML output folder.
1493
+# This tag requires that the tag GENERATE_QHP is set to YES.
1494
+
1495
+QCH_FILE               =
1496
+
1497
+# The QHP_NAMESPACE tag specifies the namespace to use when generating Qt Help
1498
+# Project output. For more information please see Qt Help Project / Namespace
1499
+# (see:
1500
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#namespace).
1501
+# The default value is: org.doxygen.Project.
1502
+# This tag requires that the tag GENERATE_QHP is set to YES.
1503
+
1504
+QHP_NAMESPACE          = org.doxygen.Project
1505
+
1506
+# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating Qt
1507
+# Help Project output. For more information please see Qt Help Project / Virtual
1508
+# Folders (see:
1509
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#virtual-folders).
1510
+# The default value is: doc.
1511
+# This tag requires that the tag GENERATE_QHP is set to YES.
1512
+
1513
+QHP_VIRTUAL_FOLDER     = doc
1514
+
1515
+# If the QHP_CUST_FILTER_NAME tag is set, it specifies the name of a custom
1516
+# filter to add. For more information please see Qt Help Project / Custom
1517
+# Filters (see:
1518
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1519
+# This tag requires that the tag GENERATE_QHP is set to YES.
1520
+
1521
+QHP_CUST_FILTER_NAME   =
1522
+
1523
+# The QHP_CUST_FILTER_ATTRS tag specifies the list of the attributes of the
1524
+# custom filter to add. For more information please see Qt Help Project / Custom
1525
+# Filters (see:
1526
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#custom-filters).
1527
+# This tag requires that the tag GENERATE_QHP is set to YES.
1528
+
1529
+QHP_CUST_FILTER_ATTRS  =
1530
+
1531
+# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this
1532
+# project's filter section matches. Qt Help Project / Filter Attributes (see:
1533
+# https://doc.qt.io/archives/qt-4.8/qthelpproject.html#filter-attributes).
1534
+# This tag requires that the tag GENERATE_QHP is set to YES.
1535
+
1536
+QHP_SECT_FILTER_ATTRS  =
1537
+
1538
+# The QHG_LOCATION tag can be used to specify the location (absolute path
1539
+# including file name) of Qt's qhelpgenerator. If non-empty doxygen will try to
1540
+# run qhelpgenerator on the generated .qhp file.
1541
+# This tag requires that the tag GENERATE_QHP is set to YES.
1542
+
1543
+QHG_LOCATION           =
1544
+
1545
+# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files will be
1546
+# generated, together with the HTML files, they form an Eclipse help plugin. To
1547
+# install this plugin and make it available under the help contents menu in
1548
+# Eclipse, the contents of the directory containing the HTML and XML files needs
1549
+# to be copied into the plugins directory of eclipse. The name of the directory
1550
+# within the plugins directory should be the same as the ECLIPSE_DOC_ID value.
1551
+# After copying Eclipse needs to be restarted before the help appears.
1552
+# The default value is: NO.
1553
+# This tag requires that the tag GENERATE_HTML is set to YES.
1554
+
1555
+GENERATE_ECLIPSEHELP   = NO
1556
+
1557
+# A unique identifier for the Eclipse help plugin. When installing the plugin
1558
+# the directory name containing the HTML and XML files should also have this
1559
+# name. Each documentation set should have its own identifier.
1560
+# The default value is: org.doxygen.Project.
1561
+# This tag requires that the tag GENERATE_ECLIPSEHELP is set to YES.
1562
+
1563
+ECLIPSE_DOC_ID         = org.doxygen.Project
1564
+
1565
+# If you want full control over the layout of the generated HTML pages it might
1566
+# be necessary to disable the index and replace it with your own. The
1567
+# DISABLE_INDEX tag can be used to turn on/off the condensed index (tabs) at top
1568
+# of each HTML page. A value of NO enables the index and the value YES disables
1569
+# it. Since the tabs in the index contain the same information as the navigation
1570
+# tree, you can set this option to YES if you also set GENERATE_TREEVIEW to YES.
1571
+# The default value is: NO.
1572
+# This tag requires that the tag GENERATE_HTML is set to YES.
1573
+
1574
+DISABLE_INDEX          = NO
1575
+
1576
+# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index
1577
+# structure should be generated to display hierarchical information. If the tag
1578
+# value is set to YES, a side panel will be generated containing a tree-like
1579
+# index structure (just like the one that is generated for HTML Help). For this
1580
+# to work a browser that supports JavaScript, DHTML, CSS and frames is required
1581
+# (i.e. any modern browser). Windows users are probably better off using the
1582
+# HTML help feature. Via custom style sheets (see HTML_EXTRA_STYLESHEET) one can
1583
+# further fine tune the look of the index (see "Fine-tuning the output"). As an
1584
+# example, the default style sheet generated by doxygen has an example that
1585
+# shows how to put an image at the root of the tree instead of the PROJECT_NAME.
1586
+# Since the tree basically has the same information as the tab index, you could
1587
+# consider setting DISABLE_INDEX to YES when enabling this option.
1588
+# The default value is: NO.
1589
+# This tag requires that the tag GENERATE_HTML is set to YES.
1590
+
1591
+GENERATE_TREEVIEW      = YES
1592
+
1593
+# When both GENERATE_TREEVIEW and DISABLE_INDEX are set to YES, then the
1594
+# FULL_SIDEBAR option determines if the side bar is limited to only the treeview
1595
+# area (value NO) or if it should extend to the full height of the window (value
1596
+# YES). Setting this to YES gives a layout similar to
1597
+# https://docs.readthedocs.io with more room for contents, but less room for the
1598
+# project logo, title, and description. If either GENERATE_TREEVIEW or
1599
+# DISABLE_INDEX is set to NO, this option has no effect.
1600
+# The default value is: NO.
1601
+# This tag requires that the tag GENERATE_HTML is set to YES.
1602
+
1603
+FULL_SIDEBAR           = NO
1604
+
1605
+# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values that
1606
+# doxygen will group on one line in the generated HTML documentation.
1607
+#
1608
+# Note that a value of 0 will completely suppress the enum values from appearing
1609
+# in the overview section.
1610
+# Minimum value: 0, maximum value: 20, default value: 4.
1611
+# This tag requires that the tag GENERATE_HTML is set to YES.
1612
+
1613
+ENUM_VALUES_PER_LINE   = 4
1614
+
1615
+# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be used
1616
+# to set the initial width (in pixels) of the frame in which the tree is shown.
1617
+# Minimum value: 0, maximum value: 1500, default value: 250.
1618
+# This tag requires that the tag GENERATE_HTML is set to YES.
1619
+
1620
+TREEVIEW_WIDTH         = 250
1621
+
1622
+# If the EXT_LINKS_IN_WINDOW option is set to YES, doxygen will open links to
1623
+# external symbols imported via tag files in a separate window.
1624
+# The default value is: NO.
1625
+# This tag requires that the tag GENERATE_HTML is set to YES.
1626
+
1627
+EXT_LINKS_IN_WINDOW    = NO
1628
+
1629
+# If the OBFUSCATE_EMAILS tag is set to YES, doxygen will obfuscate email
1630
+# addresses.
1631
+# The default value is: YES.
1632
+# This tag requires that the tag GENERATE_HTML is set to YES.
1633
+
1634
+OBFUSCATE_EMAILS       = YES
1635
+
1636
+# If the HTML_FORMULA_FORMAT option is set to svg, doxygen will use the pdf2svg
1637
+# tool (see https://github.com/dawbarton/pdf2svg) or inkscape (see
1638
+# https://inkscape.org) to generate formulas as SVG images instead of PNGs for
1639
+# the HTML output. These images will generally look nicer at scaled resolutions.
1640
+# Possible values are: png (the default) and svg (looks nicer but requires the
1641
+# pdf2svg or inkscape tool).
1642
+# The default value is: png.
1643
+# This tag requires that the tag GENERATE_HTML is set to YES.
1644
+
1645
+HTML_FORMULA_FORMAT    = png
1646
+
1647
+# Use this tag to change the font size of LaTeX formulas included as images in
1648
+# the HTML documentation. When you change the font size after a successful
1649
+# doxygen run you need to manually remove any form_*.png images from the HTML
1650
+# output directory to force them to be regenerated.
1651
+# Minimum value: 8, maximum value: 50, default value: 10.
1652
+# This tag requires that the tag GENERATE_HTML is set to YES.
1653
+
1654
+FORMULA_FONTSIZE       = 10
1655
+
1656
+# The FORMULA_MACROFILE can contain LaTeX \newcommand and \renewcommand commands
1657
+# to create new LaTeX commands to be used in formulas as building blocks. See
1658
+# the section "Including formulas" for details.
1659
+
1660
+FORMULA_MACROFILE      =
1661
+
1662
+# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax (see
1663
+# https://www.mathjax.org) which uses client side JavaScript for the rendering
1664
+# instead of using pre-rendered bitmaps. Use this if you do not have LaTeX
1665
+# installed or if you want to formulas look prettier in the HTML output. When
1666
+# enabled you may also need to install MathJax separately and configure the path
1667
+# to it using the MATHJAX_RELPATH option.
1668
+# The default value is: NO.
1669
+# This tag requires that the tag GENERATE_HTML is set to YES.
1670
+
1671
+USE_MATHJAX            = NO
1672
+
1673
+# With MATHJAX_VERSION it is possible to specify the MathJax version to be used.
1674
+# Note that the different versions of MathJax have different requirements with
1675
+# regards to the different settings, so it is possible that also other MathJax
1676
+# settings have to be changed when switching between the different MathJax
1677
+# versions.
1678
+# Possible values are: MathJax_2 and MathJax_3.
1679
+# The default value is: MathJax_2.
1680
+# This tag requires that the tag USE_MATHJAX is set to YES.
1681
+
1682
+MATHJAX_VERSION        = MathJax_2
1683
+
1684
+# When MathJax is enabled you can set the default output format to be used for
1685
+# the MathJax output. For more details about the output format see MathJax
1686
+# version 2 (see:
1687
+# http://docs.mathjax.org/en/v2.7-latest/output.html) and MathJax version 3
1688
+# (see:
1689
+# http://docs.mathjax.org/en/latest/web/components/output.html).
1690
+# Possible values are: HTML-CSS (which is slower, but has the best
1691
+# compatibility. This is the name for Mathjax version 2, for MathJax version 3
1692
+# this will be translated into chtml), NativeMML (i.e. MathML. Only supported
1693
+# for NathJax 2. For MathJax version 3 chtml will be used instead.), chtml (This
1694
+# is the name for Mathjax version 3, for MathJax version 2 this will be
1695
+# translated into HTML-CSS) and SVG.
1696
+# The default value is: HTML-CSS.
1697
+# This tag requires that the tag USE_MATHJAX is set to YES.
1698
+
1699
+MATHJAX_FORMAT         = HTML-CSS
1700
+
1701
+# When MathJax is enabled you need to specify the location relative to the HTML
1702
+# output directory using the MATHJAX_RELPATH option. The destination directory
1703
+# should contain the MathJax.js script. For instance, if the mathjax directory
1704
+# is located at the same level as the HTML output directory, then
1705
+# MATHJAX_RELPATH should be ../mathjax. The default value points to the MathJax
1706
+# Content Delivery Network so you can quickly see the result without installing
1707
+# MathJax. However, it is strongly recommended to install a local copy of
1708
+# MathJax from https://www.mathjax.org before deployment. The default value is:
1709
+# - in case of MathJax version 2: https://cdn.jsdelivr.net/npm/mathjax@2
1710
+# - in case of MathJax version 3: https://cdn.jsdelivr.net/npm/mathjax@3
1711
+# This tag requires that the tag USE_MATHJAX is set to YES.
1712
+
1713
+MATHJAX_RELPATH        =
1714
+
1715
+# The MATHJAX_EXTENSIONS tag can be used to specify one or more MathJax
1716
+# extension names that should be enabled during MathJax rendering. For example
1717
+# for MathJax version 2 (see
1718
+# https://docs.mathjax.org/en/v2.7-latest/tex.html#tex-and-latex-extensions):
1719
+# MATHJAX_EXTENSIONS = TeX/AMSmath TeX/AMSsymbols
1720
+# For example for MathJax version 3 (see
1721
+# http://docs.mathjax.org/en/latest/input/tex/extensions/index.html):
1722
+# MATHJAX_EXTENSIONS = ams
1723
+# This tag requires that the tag USE_MATHJAX is set to YES.
1724
+
1725
+MATHJAX_EXTENSIONS     =
1726
+
1727
+# The MATHJAX_CODEFILE tag can be used to specify a file with javascript pieces
1728
+# of code that will be used on startup of the MathJax code. See the MathJax site
1729
+# (see:
1730
+# http://docs.mathjax.org/en/v2.7-latest/output.html) for more details. For an
1731
+# example see the documentation.
1732
+# This tag requires that the tag USE_MATHJAX is set to YES.
1733
+
1734
+MATHJAX_CODEFILE       =
1735
+
1736
+# When the SEARCHENGINE tag is enabled doxygen will generate a search box for
1737
+# the HTML output. The underlying search engine uses javascript and DHTML and
1738
+# should work on any modern browser. Note that when using HTML help
1739
+# (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets (GENERATE_DOCSET)
1740
+# there is already a search function so this one should typically be disabled.
1741
+# For large projects the javascript based search engine can be slow, then
1742
+# enabling SERVER_BASED_SEARCH may provide a better solution. It is possible to
1743
+# search using the keyboard; to jump to the search box use <access key> + S
1744
+# (what the <access key> is depends on the OS and browser, but it is typically
1745
+# <CTRL>, <ALT>/<option>, or both). Inside the search box use the <cursor down
1746
+# key> to jump into the search results window, the results can be navigated
1747
+# using the <cursor keys>. Press <Enter> to select an item or <escape> to cancel
1748
+# the search. The filter options can be selected when the cursor is inside the
1749
+# search box by pressing <Shift>+<cursor down>. Also here use the <cursor keys>
1750
+# to select a filter and <Enter> or <escape> to activate or cancel the filter
1751
+# option.
1752
+# The default value is: YES.
1753
+# This tag requires that the tag GENERATE_HTML is set to YES.
1754
+
1755
+SEARCHENGINE           = NO
1756
+
1757
+# When the SERVER_BASED_SEARCH tag is enabled the search engine will be
1758
+# implemented using a web server instead of a web client using JavaScript. There
1759
+# are two flavors of web server based searching depending on the EXTERNAL_SEARCH
1760
+# setting. When disabled, doxygen will generate a PHP script for searching and
1761
+# an index file used by the script. When EXTERNAL_SEARCH is enabled the indexing
1762
+# and searching needs to be provided by external tools. See the section
1763
+# "External Indexing and Searching" for details.
1764
+# The default value is: NO.
1765
+# This tag requires that the tag SEARCHENGINE is set to YES.
1766
+
1767
+SERVER_BASED_SEARCH    = NO
1768
+
1769
+# When EXTERNAL_SEARCH tag is enabled doxygen will no longer generate the PHP
1770
+# script for searching. Instead the search results are written to an XML file
1771
+# which needs to be processed by an external indexer. Doxygen will invoke an
1772
+# external search engine pointed to by the SEARCHENGINE_URL option to obtain the
1773
+# search results.
1774
+#
1775
+# Doxygen ships with an example indexer (doxyindexer) and search engine
1776
+# (doxysearch.cgi) which are based on the open source search engine library
1777
+# Xapian (see:
1778
+# https://xapian.org/).
1779
+#
1780
+# See the section "External Indexing and Searching" for details.
1781
+# The default value is: NO.
1782
+# This tag requires that the tag SEARCHENGINE is set to YES.
1783
+
1784
+EXTERNAL_SEARCH        = NO
1785
+
1786
+# The SEARCHENGINE_URL should point to a search engine hosted by a web server
1787
+# which will return the search results when EXTERNAL_SEARCH is enabled.
1788
+#
1789
+# Doxygen ships with an example indexer (doxyindexer) and search engine
1790
+# (doxysearch.cgi) which are based on the open source search engine library
1791
+# Xapian (see:
1792
+# https://xapian.org/). See the section "External Indexing and Searching" for
1793
+# details.
1794
+# This tag requires that the tag SEARCHENGINE is set to YES.
1795
+
1796
+SEARCHENGINE_URL       =
1797
+
1798
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the unindexed
1799
+# search data is written to a file for indexing by an external tool. With the
1800
+# SEARCHDATA_FILE tag the name of this file can be specified.
1801
+# The default file is: searchdata.xml.
1802
+# This tag requires that the tag SEARCHENGINE is set to YES.
1803
+
1804
+SEARCHDATA_FILE        = searchdata.xml
1805
+
1806
+# When SERVER_BASED_SEARCH and EXTERNAL_SEARCH are both enabled the
1807
+# EXTERNAL_SEARCH_ID tag can be used as an identifier for the project. This is
1808
+# useful in combination with EXTRA_SEARCH_MAPPINGS to search through multiple
1809
+# projects and redirect the results back to the right project.
1810
+# This tag requires that the tag SEARCHENGINE is set to YES.
1811
+
1812
+EXTERNAL_SEARCH_ID     =
1813
+
1814
+# The EXTRA_SEARCH_MAPPINGS tag can be used to enable searching through doxygen
1815
+# projects other than the one defined by this configuration file, but that are
1816
+# all added to the same external search index. Each project needs to have a
1817
+# unique id set via EXTERNAL_SEARCH_ID. The search mapping then maps the id of
1818
+# to a relative location where the documentation can be found. The format is:
1819
+# EXTRA_SEARCH_MAPPINGS = tagname1=loc1 tagname2=loc2 ...
1820
+# This tag requires that the tag SEARCHENGINE is set to YES.
1821
+
1822
+EXTRA_SEARCH_MAPPINGS  =
1823
+
1824
+#---------------------------------------------------------------------------
1825
+# Configuration options related to the LaTeX output
1826
+#---------------------------------------------------------------------------
1827
+
1828
+# If the GENERATE_LATEX tag is set to YES, doxygen will generate LaTeX output.
1829
+# The default value is: YES.
1830
+
1831
+GENERATE_LATEX         = NO
1832
+
1833
+# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. If a
1834
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
1835
+# it.
1836
+# The default directory is: latex.
1837
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1838
+
1839
+LATEX_OUTPUT           = latex
1840
+
1841
+# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
1842
+# invoked.
1843
+#
1844
+# Note that when not enabling USE_PDFLATEX the default is latex when enabling
1845
+# USE_PDFLATEX the default is pdflatex and when in the later case latex is
1846
+# chosen this is overwritten by pdflatex. For specific output languages the
1847
+# default can have been set differently, this depends on the implementation of
1848
+# the output language.
1849
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1850
+
1851
+LATEX_CMD_NAME         =
1852
+
1853
+# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to generate
1854
+# index for LaTeX.
1855
+# Note: This tag is used in the Makefile / make.bat.
1856
+# See also: LATEX_MAKEINDEX_CMD for the part in the generated output file
1857
+# (.tex).
1858
+# The default file is: makeindex.
1859
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1860
+
1861
+MAKEINDEX_CMD_NAME     = makeindex
1862
+
1863
+# The LATEX_MAKEINDEX_CMD tag can be used to specify the command name to
1864
+# generate index for LaTeX. In case there is no backslash (\) as first character
1865
+# it will be automatically added in the LaTeX code.
1866
+# Note: This tag is used in the generated output file (.tex).
1867
+# See also: MAKEINDEX_CMD_NAME for the part in the Makefile / make.bat.
1868
+# The default value is: makeindex.
1869
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1870
+
1871
+LATEX_MAKEINDEX_CMD    = makeindex
1872
+
1873
+# If the COMPACT_LATEX tag is set to YES, doxygen generates more compact LaTeX
1874
+# documents. This may be useful for small projects and may help to save some
1875
+# trees in general.
1876
+# The default value is: NO.
1877
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1878
+
1879
+COMPACT_LATEX          = NO
1880
+
1881
+# The PAPER_TYPE tag can be used to set the paper type that is used by the
1882
+# printer.
1883
+# Possible values are: a4 (210 x 297 mm), letter (8.5 x 11 inches), legal (8.5 x
1884
+# 14 inches) and executive (7.25 x 10.5 inches).
1885
+# The default value is: a4.
1886
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1887
+
1888
+PAPER_TYPE             = a4
1889
+
1890
+# The EXTRA_PACKAGES tag can be used to specify one or more LaTeX package names
1891
+# that should be included in the LaTeX output. The package can be specified just
1892
+# by its name or with the correct syntax as to be used with the LaTeX
1893
+# \usepackage command. To get the times font for instance you can specify :
1894
+# EXTRA_PACKAGES=times or EXTRA_PACKAGES={times}
1895
+# To use the option intlimits with the amsmath package you can specify:
1896
+# EXTRA_PACKAGES=[intlimits]{amsmath}
1897
+# If left blank no extra packages will be included.
1898
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1899
+
1900
+EXTRA_PACKAGES         =
1901
+
1902
+# The LATEX_HEADER tag can be used to specify a user-defined LaTeX header for
1903
+# the generated LaTeX document. The header should contain everything until the
1904
+# first chapter. If it is left blank doxygen will generate a standard header. It
1905
+# is highly recommended to start with a default header using
1906
+# doxygen -w latex new_header.tex new_footer.tex new_stylesheet.sty
1907
+# and then modify the file new_header.tex. See also section "Doxygen usage" for
1908
+# information on how to generate the default header that doxygen normally uses.
1909
+#
1910
+# Note: Only use a user-defined header if you know what you are doing!
1911
+# Note: The header is subject to change so you typically have to regenerate the
1912
+# default header when upgrading to a newer version of doxygen. The following
1913
+# commands have a special meaning inside the header (and footer): For a
1914
+# description of the possible markers and block names see the documentation.
1915
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1916
+
1917
+LATEX_HEADER           =
1918
+
1919
+# The LATEX_FOOTER tag can be used to specify a user-defined LaTeX footer for
1920
+# the generated LaTeX document. The footer should contain everything after the
1921
+# last chapter. If it is left blank doxygen will generate a standard footer. See
1922
+# LATEX_HEADER for more information on how to generate a default footer and what
1923
+# special commands can be used inside the footer. See also section "Doxygen
1924
+# usage" for information on how to generate the default footer that doxygen
1925
+# normally uses. Note: Only use a user-defined footer if you know what you are
1926
+# doing!
1927
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1928
+
1929
+LATEX_FOOTER           =
1930
+
1931
+# The LATEX_EXTRA_STYLESHEET tag can be used to specify additional user-defined
1932
+# LaTeX style sheets that are included after the standard style sheets created
1933
+# by doxygen. Using this option one can overrule certain style aspects. Doxygen
1934
+# will copy the style sheet files to the output directory.
1935
+# Note: The order of the extra style sheet files is of importance (e.g. the last
1936
+# style sheet in the list overrules the setting of the previous ones in the
1937
+# list).
1938
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1939
+
1940
+LATEX_EXTRA_STYLESHEET =
1941
+
1942
+# The LATEX_EXTRA_FILES tag can be used to specify one or more extra images or
1943
+# other source files which should be copied to the LATEX_OUTPUT output
1944
+# directory. Note that the files will be copied as-is; there are no commands or
1945
+# markers available.
1946
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1947
+
1948
+LATEX_EXTRA_FILES      =
1949
+
1950
+# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated is
1951
+# prepared for conversion to PDF (using ps2pdf or pdflatex). The PDF file will
1952
+# contain links (just like the HTML output) instead of page references. This
1953
+# makes the output suitable for online browsing using a PDF viewer.
1954
+# The default value is: YES.
1955
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1956
+
1957
+PDF_HYPERLINKS         = YES
1958
+
1959
+# If the USE_PDFLATEX tag is set to YES, doxygen will use the engine as
1960
+# specified with LATEX_CMD_NAME to generate the PDF file directly from the LaTeX
1961
+# files. Set this option to YES, to get a higher quality PDF documentation.
1962
+#
1963
+# See also section LATEX_CMD_NAME for selecting the engine.
1964
+# The default value is: YES.
1965
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1966
+
1967
+USE_PDFLATEX           = YES
1968
+
1969
+# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \batchmode
1970
+# command to the generated LaTeX files. This will instruct LaTeX to keep running
1971
+# if errors occur, instead of asking the user for help.
1972
+# The default value is: NO.
1973
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1974
+
1975
+LATEX_BATCHMODE        = NO
1976
+
1977
+# If the LATEX_HIDE_INDICES tag is set to YES then doxygen will not include the
1978
+# index chapters (such as File Index, Compound Index, etc.) in the output.
1979
+# The default value is: NO.
1980
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1981
+
1982
+LATEX_HIDE_INDICES     = NO
1983
+
1984
+# The LATEX_BIB_STYLE tag can be used to specify the style to use for the
1985
+# bibliography, e.g. plainnat, or ieeetr. See
1986
+# https://en.wikipedia.org/wiki/BibTeX and \cite for more info.
1987
+# The default value is: plain.
1988
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1989
+
1990
+LATEX_BIB_STYLE        = plain
1991
+
1992
+# If the LATEX_TIMESTAMP tag is set to YES then the footer of each generated
1993
+# page will contain the date and time when the page was generated. Setting this
1994
+# to NO can help when comparing the output of multiple runs.
1995
+# The default value is: NO.
1996
+# This tag requires that the tag GENERATE_LATEX is set to YES.
1997
+
1998
+LATEX_TIMESTAMP        = NO
1999
+
2000
+# The LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute)
2001
+# path from which the emoji images will be read. If a relative path is entered,
2002
+# it will be relative to the LATEX_OUTPUT directory. If left blank the
2003
+# LATEX_OUTPUT directory will be used.
2004
+# This tag requires that the tag GENERATE_LATEX is set to YES.
2005
+
2006
+LATEX_EMOJI_DIRECTORY  =
2007
+
2008
+#---------------------------------------------------------------------------
2009
+# Configuration options related to the RTF output
2010
+#---------------------------------------------------------------------------
2011
+
2012
+# If the GENERATE_RTF tag is set to YES, doxygen will generate RTF output. The
2013
+# RTF output is optimized for Word 97 and may not look too pretty with other RTF
2014
+# readers/editors.
2015
+# The default value is: NO.
2016
+
2017
+GENERATE_RTF           = NO
2018
+
2019
+# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. If a
2020
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2021
+# it.
2022
+# The default directory is: rtf.
2023
+# This tag requires that the tag GENERATE_RTF is set to YES.
2024
+
2025
+RTF_OUTPUT             =
2026
+
2027
+# If the COMPACT_RTF tag is set to YES, doxygen generates more compact RTF
2028
+# documents. This may be useful for small projects and may help to save some
2029
+# trees in general.
2030
+# The default value is: NO.
2031
+# This tag requires that the tag GENERATE_RTF is set to YES.
2032
+
2033
+COMPACT_RTF            = NO
2034
+
2035
+# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated will
2036
+# contain hyperlink fields. The RTF file will contain links (just like the HTML
2037
+# output) instead of page references. This makes the output suitable for online
2038
+# browsing using Word or some other Word compatible readers that support those
2039
+# fields.
2040
+#
2041
+# Note: WordPad (write) and others do not support links.
2042
+# The default value is: NO.
2043
+# This tag requires that the tag GENERATE_RTF is set to YES.
2044
+
2045
+RTF_HYPERLINKS         = NO
2046
+
2047
+# Load stylesheet definitions from file. Syntax is similar to doxygen's
2048
+# configuration file, i.e. a series of assignments. You only have to provide
2049
+# replacements, missing definitions are set to their default value.
2050
+#
2051
+# See also section "Doxygen usage" for information on how to generate the
2052
+# default style sheet that doxygen normally uses.
2053
+# This tag requires that the tag GENERATE_RTF is set to YES.
2054
+
2055
+RTF_STYLESHEET_FILE    =
2056
+
2057
+# Set optional variables used in the generation of an RTF document. Syntax is
2058
+# similar to doxygen's configuration file. A template extensions file can be
2059
+# generated using doxygen -e rtf extensionFile.
2060
+# This tag requires that the tag GENERATE_RTF is set to YES.
2061
+
2062
+RTF_EXTENSIONS_FILE    =
2063
+
2064
+#---------------------------------------------------------------------------
2065
+# Configuration options related to the man page output
2066
+#---------------------------------------------------------------------------
2067
+
2068
+# If the GENERATE_MAN tag is set to YES, doxygen will generate man pages for
2069
+# classes and files.
2070
+# The default value is: NO.
2071
+
2072
+GENERATE_MAN           = NO
2073
+
2074
+# The MAN_OUTPUT tag is used to specify where the man pages will be put. If a
2075
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2076
+# it. A directory man3 will be created inside the directory specified by
2077
+# MAN_OUTPUT.
2078
+# The default directory is: man.
2079
+# This tag requires that the tag GENERATE_MAN is set to YES.
2080
+
2081
+MAN_OUTPUT             =
2082
+
2083
+# The MAN_EXTENSION tag determines the extension that is added to the generated
2084
+# man pages. In case the manual section does not start with a number, the number
2085
+# 3 is prepended. The dot (.) at the beginning of the MAN_EXTENSION tag is
2086
+# optional.
2087
+# The default value is: .3.
2088
+# This tag requires that the tag GENERATE_MAN is set to YES.
2089
+
2090
+MAN_EXTENSION          = .3
2091
+
2092
+# The MAN_SUBDIR tag determines the name of the directory created within
2093
+# MAN_OUTPUT in which the man pages are placed. If defaults to man followed by
2094
+# MAN_EXTENSION with the initial . removed.
2095
+# This tag requires that the tag GENERATE_MAN is set to YES.
2096
+
2097
+MAN_SUBDIR             =
2098
+
2099
+# If the MAN_LINKS tag is set to YES and doxygen generates man output, then it
2100
+# will generate one additional man file for each entity documented in the real
2101
+# man page(s). These additional files only source the real man page, but without
2102
+# them the man command would be unable to find the correct page.
2103
+# The default value is: NO.
2104
+# This tag requires that the tag GENERATE_MAN is set to YES.
2105
+
2106
+MAN_LINKS              = NO
2107
+
2108
+#---------------------------------------------------------------------------
2109
+# Configuration options related to the XML output
2110
+#---------------------------------------------------------------------------
2111
+
2112
+# If the GENERATE_XML tag is set to YES, doxygen will generate an XML file that
2113
+# captures the structure of the code including all documentation.
2114
+# The default value is: NO.
2115
+
2116
+GENERATE_XML           = NO
2117
+
2118
+# The XML_OUTPUT tag is used to specify where the XML pages will be put. If a
2119
+# relative path is entered the value of OUTPUT_DIRECTORY will be put in front of
2120
+# it.
2121
+# The default directory is: xml.
2122
+# This tag requires that the tag GENERATE_XML is set to YES.
2123
+
2124
+XML_OUTPUT             = xml
2125
+
2126
+# If the XML_PROGRAMLISTING tag is set to YES, doxygen will dump the program
2127
+# listings (including syntax highlighting and cross-referencing information) to
2128
+# the XML output. Note that enabling this will significantly increase the size
2129
+# of the XML output.
2130
+# The default value is: YES.
2131
+# This tag requires that the tag GENERATE_XML is set to YES.
2132
+
2133
+XML_PROGRAMLISTING     = YES
2134
+
2135
+# If the XML_NS_MEMB_FILE_SCOPE tag is set to YES, doxygen will include
2136
+# namespace members in file scope as well, matching the HTML output.
2137
+# The default value is: NO.
2138
+# This tag requires that the tag GENERATE_XML is set to YES.
2139
+
2140
+XML_NS_MEMB_FILE_SCOPE = NO
2141
+
2142
+#---------------------------------------------------------------------------
2143
+# Configuration options related to the DOCBOOK output
2144
+#---------------------------------------------------------------------------
2145
+
2146
+# If the GENERATE_DOCBOOK tag is set to YES, doxygen will generate Docbook files
2147
+# that can be used to generate PDF.
2148
+# The default value is: NO.
2149
+
2150
+GENERATE_DOCBOOK       = NO
2151
+
2152
+# The DOCBOOK_OUTPUT tag is used to specify where the Docbook pages will be put.
2153
+# If a relative path is entered the value of OUTPUT_DIRECTORY will be put in
2154
+# front of it.
2155
+# The default directory is: docbook.
2156
+# This tag requires that the tag GENERATE_DOCBOOK is set to YES.
2157
+
2158
+DOCBOOK_OUTPUT         = docbook
2159
+
2160
+#---------------------------------------------------------------------------
2161
+# Configuration options for the AutoGen Definitions output
2162
+#---------------------------------------------------------------------------
2163
+
2164
+# If the GENERATE_AUTOGEN_DEF tag is set to YES, doxygen will generate an
2165
+# AutoGen Definitions (see http://autogen.sourceforge.net/) file that captures
2166
+# the structure of the code including all documentation. Note that this feature
2167
+# is still experimental and incomplete at the moment.
2168
+# The default value is: NO.
2169
+
2170
+GENERATE_AUTOGEN_DEF   = NO
2171
+
2172
+#---------------------------------------------------------------------------
2173
+# Configuration options related to the Perl module output
2174
+#---------------------------------------------------------------------------
2175
+
2176
+# If the GENERATE_PERLMOD tag is set to YES, doxygen will generate a Perl module
2177
+# file that captures the structure of the code including all documentation.
2178
+#
2179
+# Note that this feature is still experimental and incomplete at the moment.
2180
+# The default value is: NO.
2181
+
2182
+GENERATE_PERLMOD       = NO
2183
+
2184
+# If the PERLMOD_LATEX tag is set to YES, doxygen will generate the necessary
2185
+# Makefile rules, Perl scripts and LaTeX code to be able to generate PDF and DVI
2186
+# output from the Perl module output.
2187
+# The default value is: NO.
2188
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2189
+
2190
+PERLMOD_LATEX          = NO
2191
+
2192
+# If the PERLMOD_PRETTY tag is set to YES, the Perl module output will be nicely
2193
+# formatted so it can be parsed by a human reader. This is useful if you want to
2194
+# understand what is going on. On the other hand, if this tag is set to NO, the
2195
+# size of the Perl module output will be much smaller and Perl will parse it
2196
+# just the same.
2197
+# The default value is: YES.
2198
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2199
+
2200
+PERLMOD_PRETTY         = YES
2201
+
2202
+# The names of the make variables in the generated doxyrules.make file are
2203
+# prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. This is useful
2204
+# so different doxyrules.make files included by the same Makefile don't
2205
+# overwrite each other's variables.
2206
+# This tag requires that the tag GENERATE_PERLMOD is set to YES.
2207
+
2208
+PERLMOD_MAKEVAR_PREFIX =
2209
+
2210
+#---------------------------------------------------------------------------
2211
+# Configuration options related to the preprocessor
2212
+#---------------------------------------------------------------------------
2213
+
2214
+# If the ENABLE_PREPROCESSING tag is set to YES, doxygen will evaluate all
2215
+# C-preprocessor directives found in the sources and include files.
2216
+# The default value is: YES.
2217
+
2218
+ENABLE_PREPROCESSING   = YES
2219
+
2220
+# If the MACRO_EXPANSION tag is set to YES, doxygen will expand all macro names
2221
+# in the source code. If set to NO, only conditional compilation will be
2222
+# performed. Macro expansion can be done in a controlled way by setting
2223
+# EXPAND_ONLY_PREDEF to YES.
2224
+# The default value is: NO.
2225
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2226
+
2227
+MACRO_EXPANSION        = YES
2228
+
2229
+# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then
2230
+# the macro expansion is limited to the macros specified with the PREDEFINED and
2231
+# EXPAND_AS_DEFINED tags.
2232
+# The default value is: NO.
2233
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2234
+
2235
+EXPAND_ONLY_PREDEF     = YES
2236
+
2237
+# If the SEARCH_INCLUDES tag is set to YES, the include files in the
2238
+# INCLUDE_PATH will be searched if a #include is found.
2239
+# The default value is: YES.
2240
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2241
+
2242
+SEARCH_INCLUDES        = NO
2243
+
2244
+# The INCLUDE_PATH tag can be used to specify one or more directories that
2245
+# contain include files that are not input files but should be processed by the
2246
+# preprocessor. Note that the INCLUDE_PATH is not recursive, so the setting of
2247
+# RECURSIVE has no effect here.
2248
+# This tag requires that the tag SEARCH_INCLUDES is set to YES.
2249
+
2250
+INCLUDE_PATH           =
2251
+
2252
+# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
2253
+# patterns (like *.h and *.hpp) to filter out the header-files in the
2254
+# directories. If left blank, the patterns specified with FILE_PATTERNS will be
2255
+# used.
2256
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2257
+
2258
+INCLUDE_FILE_PATTERNS  =
2259
+
2260
+# The PREDEFINED tag can be used to specify one or more macro names that are
2261
+# defined before the preprocessor is started (similar to the -D option of e.g.
2262
+# gcc). The argument of the tag is a list of macros of the form: name or
2263
+# name=definition (no spaces). If the definition and the "=" are omitted, "=1"
2264
+# is assumed. To prevent a macro definition from being undefined via #undef or
2265
+# recursively expanded use the := operator instead of the = operator.
2266
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2267
+
2268
+PREDEFINED             =
2269
+
2270
+# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this
2271
+# tag can be used to specify a list of macro names that should be expanded. The
2272
+# macro definition that is found in the sources will be used. Use the PREDEFINED
2273
+# tag if you want to use a different macro definition that overrules the
2274
+# definition found in the source code.
2275
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2276
+
2277
+EXPAND_AS_DEFINED      =
2278
+
2279
+# If the SKIP_FUNCTION_MACROS tag is set to YES then doxygen's preprocessor will
2280
+# remove all references to function-like macros that are alone on a line, have
2281
+# an all uppercase name, and do not end with a semicolon. Such function macros
2282
+# are typically used for boiler-plate code, and will confuse the parser if not
2283
+# removed.
2284
+# The default value is: YES.
2285
+# This tag requires that the tag ENABLE_PREPROCESSING is set to YES.
2286
+
2287
+SKIP_FUNCTION_MACROS   = YES
2288
+
2289
+#---------------------------------------------------------------------------
2290
+# Configuration options related to external references
2291
+#---------------------------------------------------------------------------
2292
+
2293
+# The TAGFILES tag can be used to specify one or more tag files. For each tag
2294
+# file the location of the external documentation should be added. The format of
2295
+# a tag file without this location is as follows:
2296
+# TAGFILES = file1 file2 ...
2297
+# Adding location for the tag files is done as follows:
2298
+# TAGFILES = file1=loc1 "file2 = loc2" ...
2299
+# where loc1 and loc2 can be relative or absolute paths or URLs. See the
2300
+# section "Linking to external documentation" for more information about the use
2301
+# of tag files.
2302
+# Note: Each tag file must have a unique name (where the name does NOT include
2303
+# the path). If a tag file is not located in the directory in which doxygen is
2304
+# run, you must also specify the path to the tagfile here.
2305
+
2306
+TAGFILES               =
2307
+
2308
+# When a file name is specified after GENERATE_TAGFILE, doxygen will create a
2309
+# tag file that is based on the input files it reads. See section "Linking to
2310
+# external documentation" for more information about the usage of tag files.
2311
+
2312
+GENERATE_TAGFILE       = doxygen.tag
2313
+
2314
+# If the ALLEXTERNALS tag is set to YES, all external class will be listed in
2315
+# the class index. If set to NO, only the inherited external classes will be
2316
+# listed.
2317
+# The default value is: NO.
2318
+
2319
+ALLEXTERNALS           = NO
2320
+
2321
+# If the EXTERNAL_GROUPS tag is set to YES, all external groups will be listed
2322
+# in the modules index. If set to NO, only the current project's groups will be
2323
+# listed.
2324
+# The default value is: YES.
2325
+
2326
+EXTERNAL_GROUPS        = YES
2327
+
2328
+# If the EXTERNAL_PAGES tag is set to YES, all external pages will be listed in
2329
+# the related pages index. If set to NO, only the current project's pages will
2330
+# be listed.
2331
+# The default value is: YES.
2332
+
2333
+EXTERNAL_PAGES         = YES
2334
+
2335
+#---------------------------------------------------------------------------
2336
+# Configuration options related to the dot tool
2337
+#---------------------------------------------------------------------------
2338
+
2339
+# You can include diagrams made with dia in doxygen documentation. Doxygen will
2340
+# then run dia to produce the diagram and insert it in the documentation. The
2341
+# DIA_PATH tag allows you to specify the directory where the dia binary resides.
2342
+# If left empty dia is assumed to be found in the default search path.
2343
+
2344
+DIA_PATH               =
2345
+
2346
+# If set to YES the inheritance and collaboration graphs will hide inheritance
2347
+# and usage relations if the target is undocumented or is not a class.
2348
+# The default value is: YES.
2349
+
2350
+HIDE_UNDOC_RELATIONS   = NO
2351
+
2352
+# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
2353
+# available from the path. This tool is part of Graphviz (see:
2354
+# http://www.graphviz.org/), a graph visualization toolkit from AT&T and Lucent
2355
+# Bell Labs. The other options in this section have no effect if this option is
2356
+# set to NO
2357
+# The default value is: NO.
2358
+
2359
+HAVE_DOT               = YES
2360
+
2361
+# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is allowed
2362
+# to run in parallel. When set to 0 doxygen will base this on the number of
2363
+# processors available in the system. You can set it explicitly to a value
2364
+# larger than 0 to get control over the balance between CPU load and processing
2365
+# speed.
2366
+# Minimum value: 0, maximum value: 32, default value: 0.
2367
+# This tag requires that the tag HAVE_DOT is set to YES.
2368
+
2369
+DOT_NUM_THREADS        = 1
2370
+
2371
+# DOT_COMMON_ATTR is common attributes for nodes, edges and labels of
2372
+# subgraphs. When you want a differently looking font in the dot files that
2373
+# doxygen generates you can specify fontname, fontcolor and fontsize attributes.
2374
+# For details please see <a href=https://graphviz.org/doc/info/attrs.html>Node,
2375
+# Edge and Graph Attributes specification</a> You need to make sure dot is able
2376
+# to find the font, which can be done by putting it in a standard location or by
2377
+# setting the DOTFONTPATH environment variable or by setting DOT_FONTPATH to the
2378
+# directory containing the font. Default graphviz fontsize is 14.
2379
+# The default value is: fontname=Helvetica,fontsize=10.
2380
+# This tag requires that the tag HAVE_DOT is set to YES.
2381
+
2382
+DOT_COMMON_ATTR        = "fontname=Helvetica,fontsize=10"
2383
+
2384
+# DOT_EDGE_ATTR is concatenated with DOT_COMMON_ATTR. For elegant style you can
2385
+# add 'arrowhead=open, arrowtail=open, arrowsize=0.5'. <a
2386
+# href=https://graphviz.org/doc/info/arrows.html>Complete documentation about
2387
+# arrows shapes.</a>
2388
+# The default value is: labelfontname=Helvetica,labelfontsize=10.
2389
+# This tag requires that the tag HAVE_DOT is set to YES.
2390
+
2391
+DOT_EDGE_ATTR          = "labelfontname=Helvetica,labelfontsize=10"
2392
+
2393
+# DOT_NODE_ATTR is concatenated with DOT_COMMON_ATTR. For view without boxes
2394
+# around nodes set 'shape=plain' or 'shape=plaintext' <a
2395
+# href=https://www.graphviz.org/doc/info/shapes.html>Shapes specification</a>
2396
+# The default value is: shape=box,height=0.2,width=0.4.
2397
+# This tag requires that the tag HAVE_DOT is set to YES.
2398
+
2399
+DOT_NODE_ATTR          = "shape=box,height=0.2,width=0.4"
2400
+
2401
+# You can set the path where dot can find font specified with fontname in
2402
+# DOT_COMMON_ATTR and others dot attributes.
2403
+# This tag requires that the tag HAVE_DOT is set to YES.
2404
+
2405
+DOT_FONTPATH           =
2406
+
2407
+# If the CLASS_GRAPH tag is set to YES (or GRAPH) then doxygen will generate a
2408
+# graph for each documented class showing the direct and indirect inheritance
2409
+# relations. In case HAVE_DOT is set as well dot will be used to draw the graph,
2410
+# otherwise the built-in generator will be used. If the CLASS_GRAPH tag is set
2411
+# to TEXT the direct and indirect inheritance relations will be shown as texts /
2412
+# links.
2413
+# Possible values are: NO, YES, TEXT and GRAPH.
2414
+# The default value is: YES.
2415
+
2416
+CLASS_GRAPH            = YES
2417
+
2418
+# If the COLLABORATION_GRAPH tag is set to YES then doxygen will generate a
2419
+# graph for each documented class showing the direct and indirect implementation
2420
+# dependencies (inheritance, containment, and class references variables) of the
2421
+# class with other documented classes.
2422
+# The default value is: YES.
2423
+# This tag requires that the tag HAVE_DOT is set to YES.
2424
+
2425
+COLLABORATION_GRAPH    = YES
2426
+
2427
+# If the GROUP_GRAPHS tag is set to YES then doxygen will generate a graph for
2428
+# groups, showing the direct groups dependencies. See also the chapter Grouping
2429
+# in the manual.
2430
+# The default value is: YES.
2431
+# This tag requires that the tag HAVE_DOT is set to YES.
2432
+
2433
+GROUP_GRAPHS           = YES
2434
+
2435
+# If the UML_LOOK tag is set to YES, doxygen will generate inheritance and
2436
+# collaboration diagrams in a style similar to the OMG's Unified Modeling
2437
+# Language.
2438
+# The default value is: NO.
2439
+# This tag requires that the tag HAVE_DOT is set to YES.
2440
+
2441
+UML_LOOK               = NO
2442
+
2443
+# If the UML_LOOK tag is enabled, the fields and methods are shown inside the
2444
+# class node. If there are many fields or methods and many nodes the graph may
2445
+# become too big to be useful. The UML_LIMIT_NUM_FIELDS threshold limits the
2446
+# number of items for each type to make the size more manageable. Set this to 0
2447
+# for no limit. Note that the threshold may be exceeded by 50% before the limit
2448
+# is enforced. So when you set the threshold to 10, up to 15 fields may appear,
2449
+# but if the number exceeds 15, the total amount of fields shown is limited to
2450
+# 10.
2451
+# Minimum value: 0, maximum value: 100, default value: 10.
2452
+# This tag requires that the tag UML_LOOK is set to YES.
2453
+
2454
+UML_LIMIT_NUM_FIELDS   = 10
2455
+
2456
+# If the DOT_UML_DETAILS tag is set to NO, doxygen will show attributes and
2457
+# methods without types and arguments in the UML graphs. If the DOT_UML_DETAILS
2458
+# tag is set to YES, doxygen will add type and arguments for attributes and
2459
+# methods in the UML graphs. If the DOT_UML_DETAILS tag is set to NONE, doxygen
2460
+# will not generate fields with class member information in the UML graphs. The
2461
+# class diagrams will look similar to the default class diagrams but using UML
2462
+# notation for the relationships.
2463
+# Possible values are: NO, YES and NONE.
2464
+# The default value is: NO.
2465
+# This tag requires that the tag UML_LOOK is set to YES.
2466
+
2467
+DOT_UML_DETAILS        = NO
2468
+
2469
+# The DOT_WRAP_THRESHOLD tag can be used to set the maximum number of characters
2470
+# to display on a single line. If the actual line length exceeds this threshold
2471
+# significantly it will wrapped across multiple lines. Some heuristics are apply
2472
+# to avoid ugly line breaks.
2473
+# Minimum value: 0, maximum value: 1000, default value: 17.
2474
+# This tag requires that the tag HAVE_DOT is set to YES.
2475
+
2476
+DOT_WRAP_THRESHOLD     = 17
2477
+
2478
+# If the TEMPLATE_RELATIONS tag is set to YES then the inheritance and
2479
+# collaboration graphs will show the relations between templates and their
2480
+# instances.
2481
+# The default value is: NO.
2482
+# This tag requires that the tag HAVE_DOT is set to YES.
2483
+
2484
+TEMPLATE_RELATIONS     = YES
2485
+
2486
+# If the INCLUDE_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are set to
2487
+# YES then doxygen will generate a graph for each documented file showing the
2488
+# direct and indirect include dependencies of the file with other documented
2489
+# files.
2490
+# The default value is: YES.
2491
+# This tag requires that the tag HAVE_DOT is set to YES.
2492
+
2493
+INCLUDE_GRAPH          = YES
2494
+
2495
+# If the INCLUDED_BY_GRAPH, ENABLE_PREPROCESSING and SEARCH_INCLUDES tags are
2496
+# set to YES then doxygen will generate a graph for each documented file showing
2497
+# the direct and indirect include dependencies of the file with other documented
2498
+# files.
2499
+# The default value is: YES.
2500
+# This tag requires that the tag HAVE_DOT is set to YES.
2501
+
2502
+INCLUDED_BY_GRAPH      = YES
2503
+
2504
+# If the CALL_GRAPH tag is set to YES then doxygen will generate a call
2505
+# dependency graph for every global function or class method.
2506
+#
2507
+# Note that enabling this option will significantly increase the time of a run.
2508
+# So in most cases it will be better to enable call graphs for selected
2509
+# functions only using the \callgraph command. Disabling a call graph can be
2510
+# accomplished by means of the command \hidecallgraph.
2511
+# The default value is: NO.
2512
+# This tag requires that the tag HAVE_DOT is set to YES.
2513
+
2514
+CALL_GRAPH             = YES
2515
+
2516
+# If the CALLER_GRAPH tag is set to YES then doxygen will generate a caller
2517
+# dependency graph for every global function or class method.
2518
+#
2519
+# Note that enabling this option will significantly increase the time of a run.
2520
+# So in most cases it will be better to enable caller graphs for selected
2521
+# functions only using the \callergraph command. Disabling a caller graph can be
2522
+# accomplished by means of the command \hidecallergraph.
2523
+# The default value is: NO.
2524
+# This tag requires that the tag HAVE_DOT is set to YES.
2525
+
2526
+CALLER_GRAPH           = YES
2527
+
2528
+# If the GRAPHICAL_HIERARCHY tag is set to YES then doxygen will graphical
2529
+# hierarchy of all classes instead of a textual one.
2530
+# The default value is: YES.
2531
+# This tag requires that the tag HAVE_DOT is set to YES.
2532
+
2533
+GRAPHICAL_HIERARCHY    = YES
2534
+
2535
+# If the DIRECTORY_GRAPH tag is set to YES then doxygen will show the
2536
+# dependencies a directory has on other directories in a graphical way. The
2537
+# dependency relations are determined by the #include relations between the
2538
+# files in the directories.
2539
+# The default value is: YES.
2540
+# This tag requires that the tag HAVE_DOT is set to YES.
2541
+
2542
+DIRECTORY_GRAPH        = YES
2543
+
2544
+# The DIR_GRAPH_MAX_DEPTH tag can be used to limit the maximum number of levels
2545
+# of child directories generated in directory dependency graphs by dot.
2546
+# Minimum value: 1, maximum value: 25, default value: 1.
2547
+# This tag requires that the tag DIRECTORY_GRAPH is set to YES.
2548
+
2549
+DIR_GRAPH_MAX_DEPTH    = 1
2550
+
2551
+# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
2552
+# generated by dot. For an explanation of the image formats see the section
2553
+# output formats in the documentation of the dot tool (Graphviz (see:
2554
+# http://www.graphviz.org/)).
2555
+# Note: If you choose svg you need to set HTML_FILE_EXTENSION to xhtml in order
2556
+# to make the SVG files visible in IE 9+ (other browsers do not have this
2557
+# requirement).
2558
+# Possible values are: png, jpg, gif, svg, png:gd, png:gd:gd, png:cairo,
2559
+# png:cairo:gd, png:cairo:cairo, png:cairo:gdiplus, png:gdiplus and
2560
+# png:gdiplus:gdiplus.
2561
+# The default value is: png.
2562
+# This tag requires that the tag HAVE_DOT is set to YES.
2563
+
2564
+DOT_IMAGE_FORMAT       = svg
2565
+
2566
+# If DOT_IMAGE_FORMAT is set to svg, then this option can be set to YES to
2567
+# enable generation of interactive SVG images that allow zooming and panning.
2568
+#
2569
+# Note that this requires a modern browser other than Internet Explorer. Tested
2570
+# and working are Firefox, Chrome, Safari, and Opera.
2571
+# Note: For IE 9+ you need to set HTML_FILE_EXTENSION to xhtml in order to make
2572
+# the SVG files visible. Older versions of IE do not have SVG support.
2573
+# The default value is: NO.
2574
+# This tag requires that the tag HAVE_DOT is set to YES.
2575
+
2576
+INTERACTIVE_SVG        = YES
2577
+
2578
+# The DOT_PATH tag can be used to specify the path where the dot tool can be
2579
+# found. If left blank, it is assumed the dot tool can be found in the path.
2580
+# This tag requires that the tag HAVE_DOT is set to YES.
2581
+
2582
+DOT_PATH               =
2583
+
2584
+# The DOTFILE_DIRS tag can be used to specify one or more directories that
2585
+# contain dot files that are included in the documentation (see the \dotfile
2586
+# command).
2587
+# This tag requires that the tag HAVE_DOT is set to YES.
2588
+
2589
+DOTFILE_DIRS           =
2590
+
2591
+# The MSCFILE_DIRS tag can be used to specify one or more directories that
2592
+# contain msc files that are included in the documentation (see the \mscfile
2593
+# command).
2594
+
2595
+MSCFILE_DIRS           =
2596
+
2597
+# The DIAFILE_DIRS tag can be used to specify one or more directories that
2598
+# contain dia files that are included in the documentation (see the \diafile
2599
+# command).
2600
+
2601
+DIAFILE_DIRS           =
2602
+
2603
+# When using plantuml, the PLANTUML_JAR_PATH tag should be used to specify the
2604
+# path where java can find the plantuml.jar file or to the filename of jar file
2605
+# to be used. If left blank, it is assumed PlantUML is not used or called during
2606
+# a preprocessing step. Doxygen will generate a warning when it encounters a
2607
+# \startuml command in this case and will not generate output for the diagram.
2608
+
2609
+PLANTUML_JAR_PATH      =
2610
+
2611
+# When using plantuml, the PLANTUML_CFG_FILE tag can be used to specify a
2612
+# configuration file for plantuml.
2613
+
2614
+PLANTUML_CFG_FILE      =
2615
+
2616
+# When using plantuml, the specified paths are searched for files specified by
2617
+# the !include statement in a plantuml block.
2618
+
2619
+PLANTUML_INCLUDE_PATH  =
2620
+
2621
+# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of nodes
2622
+# that will be shown in the graph. If the number of nodes in a graph becomes
2623
+# larger than this value, doxygen will truncate the graph, which is visualized
2624
+# by representing a node as a red box. Note that doxygen if the number of direct
2625
+# children of the root node in a graph is already larger than
2626
+# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note that
2627
+# the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.
2628
+# Minimum value: 0, maximum value: 10000, default value: 50.
2629
+# This tag requires that the tag HAVE_DOT is set to YES.
2630
+
2631
+DOT_GRAPH_MAX_NODES    = 100
2632
+
2633
+# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the graphs
2634
+# generated by dot. A depth value of 3 means that only nodes reachable from the
2635
+# root by following a path via at most 3 edges will be shown. Nodes that lay
2636
+# further from the root node will be omitted. Note that setting this option to 1
2637
+# or 2 may greatly reduce the computation time needed for large code bases. Also
2638
+# note that the size of a graph can be further restricted by
2639
+# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.
2640
+# Minimum value: 0, maximum value: 1000, default value: 0.
2641
+# This tag requires that the tag HAVE_DOT is set to YES.
2642
+
2643
+MAX_DOT_GRAPH_DEPTH    = 0
2644
+
2645
+# Set the DOT_MULTI_TARGETS tag to YES to allow dot to generate multiple output
2646
+# files in one run (i.e. multiple -o and -T options on the command line). This
2647
+# makes dot run faster, but since only newer versions of dot (>1.8.10) support
2648
+# this, this feature is disabled by default.
2649
+# The default value is: NO.
2650
+# This tag requires that the tag HAVE_DOT is set to YES.
2651
+
2652
+DOT_MULTI_TARGETS      = NO
2653
+
2654
+# If the GENERATE_LEGEND tag is set to YES doxygen will generate a legend page
2655
+# explaining the meaning of the various boxes and arrows in the dot generated
2656
+# graphs.
2657
+# Note: This tag requires that UML_LOOK isn't set, i.e. the doxygen internal
2658
+# graphical representation for inheritance and collaboration diagrams is used.
2659
+# The default value is: YES.
2660
+# This tag requires that the tag HAVE_DOT is set to YES.
2661
+
2662
+GENERATE_LEGEND        = YES
2663
+
2664
+# If the DOT_CLEANUP tag is set to YES, doxygen will remove the intermediate
2665
+# files that are used to generate the various graphs.
2666
+#
2667
+# Note: This setting is not only used for dot files but also for msc temporary
2668
+# files.
2669
+# The default value is: YES.
2670
+
2671
+DOT_CLEANUP            = NO
0 2672
new file mode 100644
... ...
@@ -0,0 +1,22 @@
1
+DOXYGEN = doxygen
2
+
3
+DOC_DIR = html
4
+DOC_TAG = doxygen.tag
5
+DOC_LOG = warnings.log
6
+
7
+SRC_FILES := $(wildcard ../src/*.cpp ../src/*.h)
8
+SRC_FILES := $(filter-out $(wildcard ../src/moc_*.cpp), $(SRC_FILES))
9
+
10
+.PHONY: all
11
+all: html
12
+
13
+html: $(SRC_FILES)
14
+	rm -rf html
15
+	$(DOXYGEN) Doxyfile
16
+
17
+.PHONY: clean
18
+clean:
19
+	rm -rf $(DOC_DIR)
20
+	rm -f $(DOC_TAG)
21
+	rm -f $(DOC_LOG)
22
+
0 23
new file mode 100644
... ...
@@ -0,0 +1,604 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#include "cpu.h"
13
+
14
+/**
15
+ * Constructor for the CPU class
16
+ *
17
+ * @param parent Parent object
18
+ */
19
+CPU::CPU(QObject *parent) : QObject(parent)
20
+{
21
+	this->urom0.data.fill(0);
22
+	this->urom1.data.fill(0);
23
+	this->rom.data.fill(0);
24
+
25
+	this->reset();
26
+
27
+	QObject::connect(&this->timer, SIGNAL(timeout()), this, SLOT(emulation()));
28
+}
29
+
30
+/**
31
+ * Set first uROM memory data
32
+ *
33
+ * @param urom uROM data
34
+ */
35
+void CPU::setUrom0(const CPU::Memory &urom)
36
+{
37
+	this->urom0 = urom;
38
+}
39
+
40
+/**
41
+ * Set second uROM memory data
42
+ *
43
+ * @param urom uROM data
44
+ */
45
+void CPU::setUrom1(const CPU::Memory &urom)
46
+{
47
+	this->urom1 = urom;
48
+}
49
+
50
+/**
51
+ * Set ROM memory data
52
+ *
53
+ * @param rom ROM data
54
+ */
55
+void CPU::setRom(const CPU::Memory &rom)
56
+{
57
+	this->rom = rom;
58
+}
59
+
60
+//! Run executing emulation
61
+void CPU::run()
62
+{
63
+	this->stepMode = false;
64
+
65
+	this->timer.setSingleShot(false);
66
+	this->timer.setInterval(INTERVAL);
67
+	this->timer.start();
68
+}
69
+
70
+//! Run only one CPU step of emulation
71
+void CPU::step()
72
+{
73
+	this->stepMode = true;
74
+
75
+	this->timer.setSingleShot(true);
76
+	this->timer.start(0);
77
+}
78
+
79
+//! Pause executing emulation
80
+void CPU::pause()
81
+{
82
+	this->timer.stop();
83
+}
84
+
85
+//! Stop executing emulation
86
+void CPU::stop()
87
+{
88
+	this->timer.stop();
89
+
90
+	this->reset();
91
+}
92
+
93
+/**
94
+ * Get register buffer
95
+ *
96
+ * @return Register buffer
97
+ */
98
+const CPU::Reg &CPU::getReg() const
99
+{
100
+	return(this->reg);
101
+}
102
+
103
+/**
104
+ * Get ticks counter value
105
+ *
106
+ * @return Tick counter value
107
+ */
108
+unsigned long long CPU::getTicks() const
109
+{
110
+	return(this->ticks);
111
+}
112
+
113
+/**
114
+ * Get ROM buffer
115
+ *
116
+ * @return ROM buffer
117
+ */
118
+const CPU::Memory &CPU::getRom() const
119
+{
120
+	return(this->rom);
121
+}
122
+
123
+/**
124
+ * Get lower RAM buffer
125
+ *
126
+ * @return Lower RAM buffer
127
+ */
128
+const CPU::Memory &CPU::getRamLow() const
129
+{
130
+	return(this->ramLow);
131
+}
132
+
133
+/**
134
+ * Get higher RAM buffer
135
+ *
136
+ * @return Higher RAM buffer
137
+ */
138
+const CPU::Memory &CPU::getRamHigh() const
139
+{
140
+	return(this->ramHigh);
141
+}
142
+
143
+//! Stop executing and reset data of emulation
144
+void CPU::reset()
145
+{
146
+	this->stepMode = false;
147
+	this->ticks = 0;
148
+
149
+	this->timer.stop();
150
+
151
+	this->ramLow.data.fill(0);
152
+	this->ramHigh.data.fill(0);
153
+
154
+	this->reg.i = 0;
155
+	this->reg.c = false;
156
+	this->reg.z = false;
157
+	this->reg.pch = 0;
158
+	this->reg.pcl = 0;
159
+	this->reg.sph = STACK_PAGE;
160
+	this->reg.spl = 0;
161
+	this->reg.maxSpl = 0;
162
+	this->reg.a = 0;
163
+	this->reg.b = 0;
164
+	this->reg.x = 0;
165
+	this->reg.y = 0;
166
+	this->reg.in = 0;
167
+	this->reg.out = 0;
168
+	this->reg.d = 0;
169
+	this->reg.t = 0;
170
+	this->reg.mah = 0;
171
+	this->reg.mal = 0;
172
+}
173
+
174
+/**
175
+ * Compute logic or arithmetic using ALU. It emulates functions of the 74181 chip.
176
+ *
177
+ * @param a First operant
178
+ * @param b Second operant
179
+ * @param s Operation type selector in range 0-15
180
+ * @param m Operatiom mode selector. "0" for arithmetic and "1" for logic mode.
181
+ * @param c Carry flag
182
+ * @param z Zero flag
183
+ *
184
+ * @return Computed value
185
+ */
186
+unsigned char CPU::alu(unsigned char a, unsigned char b, unsigned char s, bool m, bool &c, bool &z)
187
+{
188
+	QVector<bool> inA(4);
189
+	QVector<bool> inB(4);
190
+	QVector<bool> inS(4);
191
+
192
+	inA[0] = ((a & (1 << 0)) != 0);
193
+	inA[1] = ((a & (1 << 1)) != 0);
194
+	inA[2] = ((a & (1 << 2)) != 0);
195
+	inA[3] = ((a & (1 << 3)) != 0);
196
+
197
+	inB[0] = ((b & (1 << 0)) != 0);
198
+	inB[1] = ((b & (1 << 1)) != 0);
199
+	inB[2] = ((b & (1 << 2)) != 0);
200
+	inB[3] = ((b & (1 << 3)) != 0);
201
+
202
+	inS[0] = ((s & (1 << 0)) != 0);
203
+	inS[1] = ((s & (1 << 1)) != 0);
204
+	inS[2] = ((s & (1 << 2)) != 0);
205
+	inS[3] = ((s & (1 << 3)) != 0);
206
+
207
+	QVector<QVector<bool>> l1(4, QVector<bool>(5));
208
+
209
+	for(int i = 0; i < 4; i++)
210
+	{
211
+		l1[i][0] = inA[i];
212
+		l1[i][1] = (inB[i] & inS[0]);
213
+		l1[i][2] = ((!inB[i]) & inS[1]);
214
+		l1[i][3] = ((!inB[i]) & inA[i] & inS[2]);
215
+		l1[i][4] = (inA[i] & inB[i] & inS[3]);
216
+	}
217
+
218
+	QVector<QVector<bool>> l2(4, QVector<bool>(2));
219
+
220
+	for(int i = 0; i < 4; i++)
221
+	{
222
+		l2[i][0] = !(l1[i][0] | l1[i][1] | l1[i][2]);
223
+		l2[i][1] = !(l1[i][3] | l1[i][4]);
224
+	}
225
+
226
+	QVector<bool> l3(20);
227
+
228
+	l3[0] = !(c & (!m));
229
+
230
+	l3[1] = !(l2[0][0]);
231
+	l3[2] = ((!m) & l2[0][0]);
232
+	l3[3] = ((!m) & l2[0][1] & c);
233
+
234
+	l3[4] = !(l2[1][0]);
235
+	l3[5] = ((!m) & l2[1][0]);
236
+	l3[6] = ((!m) & l2[0][0] & l2[1][1]);
237
+	l3[7] = ((!m) & l2[0][1] & l2[1][1] & c);
238
+
239
+	l3[8] = !(l2[2][0]);
240
+	l3[9] = ((!m) & l2[2][0]);
241
+	l3[10] = ((!m) & l2[1][0] & l2[2][1]);
242
+	l3[11] = ((!m) & l2[0][0] & l2[1][1] & l2[2][1]);
243
+	l3[12] = ((!m) & l2[0][1] & l2[1][1] & l2[2][1] & c);
244
+
245
+	l3[13] = !(l2[3][0]);
246
+	l3[14] = !(l2[0][1] & l2[1][1] & l2[2][1] & l2[3][1]);
247
+	l3[15] = !(l2[0][1] & l2[1][1] & l2[2][1] & l2[3][1] & c);
248
+
249
+	l3[16] = (l2[0][0] & l2[1][1] & l2[2][1] & l2[3][1]);
250
+	l3[17] = (l2[1][0] & l2[2][1] & l2[3][1]);
251
+	l3[18] = (l2[2][0] & l2[3][1]);
252
+	l3[19] = (l2[3][0]);
253
+
254
+	QVector<bool> l4(8);
255
+
256
+	l4[0] = (l3[1] & l2[0][1]);
257
+	l4[1] = !(l3[2] | l3[3]);
258
+
259
+	l4[2] = (l3[4] & l2[1][1]);
260
+	l4[3] = !(l3[5] | l3[6] | l3[7]);
261
+
262
+	l4[4] = (l3[8] & l2[2][1]);
263
+	l4[5] = !(l3[9] | l3[10] | l3[11] | l3[12]);
264
+
265
+	l4[6] = (l3[13] & l2[3][1]);
266
+	l4[7] = !(l3[16] | l3[17] | l3[18] | l3[19]);
267
+
268
+	QVector<bool> f(4);
269
+
270
+	f[0] = (l3[0] ^ l4[0]);
271
+	f[1] = (l4[1] ^ l4[2]);
272
+	f[2] = (l4[3] ^ l4[4]);
273
+	f[3] = (l4[5] ^ l4[6]);
274
+
275
+	z = (f[0] & f[1] & f[2] & f[3]);
276
+	c = ((!l3[15]) | (!l4[7]));
277
+
278
+	unsigned char out = 0;
279
+
280
+	out += (f[0] ? 1 : 0);
281
+	out += (f[1] ? 2 : 0);
282
+	out += (f[2] ? 4 : 0);
283
+	out += (f[3] ? 8 : 0);
284
+
285
+	return(out);
286
+}
287
+
288
+/**
289
+ * Set Input register value
290
+ *
291
+ * @param in Input register value
292
+ */
293
+void CPU::inSlot(unsigned char in)
294
+{
295
+	if(this->ticks > 0)
296
+	{
297
+		this->reg.in = ((this->reg.in & (1 << 4)) | (in & ~(1 << 4)));
298
+	}
299
+}
300
+
301
+//! Process one step of the emulation
302
+void CPU::emulation()
303
+{
304
+	unsigned long long tick = 0;
305
+
306
+	unsigned char uromCycle = 0;
307
+	int uromAddress;
308
+	unsigned char urom0;
309
+	unsigned char urom1;
310
+
311
+	BusAR busAR;
312
+	BusAW busAW;
313
+	BusB busB;
314
+	BusC busC;
315
+
316
+	int address;
317
+
318
+	unsigned char aluS;
319
+	bool aluM;
320
+	bool aluC;
321
+
322
+	unsigned char busARregABXY;
323
+	unsigned char busAWregABXY;
324
+	unsigned char busBregAB;
325
+
326
+	unsigned char valueAR = 0;
327
+	unsigned char valueB = 0;
328
+
329
+	while(tick < TICKS_PER_INTERVAL)
330
+	{
331
+		do
332
+		{
333
+			uromAddress = (static_cast<int>(this->reg.i) << UROM_ADDRESS_INSTRUCTION_POSITION);
334
+			uromAddress += (static_cast<int>(uromCycle & UROM_ADDRESS_CYCLE_MASK) << UROM_ADDRESS_CYCLE_POSITION);
335
+			uromAddress += (static_cast<int>(this->reg.c ? 1 : 0) << UROM_ADDRESS_FLAG_C_POSITION);
336
+			uromAddress += (static_cast<int>(this->reg.z ? 1 : 0) << UROM_ADDRESS_FLAG_Z_POSITION);
337
+
338
+			urom0 = this->urom0.data[uromAddress];
339
+			urom1 = this->urom1.data[uromAddress];
340
+
341
+			uromCycle++;
342
+
343
+			busAR = static_cast<BusAR>((urom0 & UROM_0_BUS_AR_MASK) >> UROM_0_BUS_AR_POSITION);
344
+			busAW = static_cast<BusAW>((urom0 & UROM_0_BUS_AW_MASK) >> UROM_0_BUS_AW_POSITION);
345
+			busB = static_cast<BusB>((urom0 & UROM_0_BUS_B_MASK) >> UROM_0_BUS_B_POSITION);
346
+			busC = static_cast<BusC>((urom1 & UROM_1_BUS_C_MASK) >> UROM_1_BUS_C_POSITION);
347
+
348
+			aluS = ((urom1 & UROM_1_ALU_S_MASK) >> 2);
349
+			aluM = ((urom1 & UROM_1_ALU_M_MASK) != 0);
350
+			aluC = ((urom1 & UROM_1_ALU_C_MASK) != 0);
351
+
352
+			if((busAR == BusAR::ABXY) && (busAW == BusAW::ABXY))
353
+			{
354
+				busARregABXY = ((this->reg.i & INSTRUCTION_REG_ABXY_SECOND_MASK) >> INSTRUCTION_REG_ABXY_SECOND_OFFSET);
355
+			}
356
+			else
357
+			{
358
+				busARregABXY = ((this->reg.i & INSTRUCTION_REG_ABXY_FIRST_MASK) >> INSTRUCTION_REG_ABXY_FIRST_OFFSET);
359
+			}
360
+
361
+			busAWregABXY = (this->reg.i & INSTRUCTION_REG_ABXY_FIRST_MASK);
362
+			busBregAB = ((this->reg.i & INSTRUCTION_REG_AB_MASK) >> INSTRUCTION_REG_AB_OFFSET);
363
+
364
+			switch(busC)
365
+			{
366
+				case BusC::PC :
367
+					address = ((static_cast<int>(this->reg.pch) << 8) + static_cast<int>(this->reg.pcl));
368
+					break;
369
+
370
+				case BusC::MA :
371
+					address = ((static_cast<int>(this->reg.mah) << 8) + static_cast<int>(this->reg.mal));
372
+					break;
373
+
374
+				case BusC::SP :
375
+					address = ((static_cast<int>(this->reg.sph) << 8) + static_cast<int>(this->reg.spl));
376
+					break;
377
+
378
+				case BusC::XY :
379
+					address = ((static_cast<int>(this->reg.y) << 8) + static_cast<int>(this->reg.x));
380
+					break;
381
+			}
382
+
383
+			switch(busAR)
384
+			{
385
+				case BusAR::ABXY :
386
+					switch(busARregABXY)
387
+					{
388
+						case 0 :
389
+							valueAR = this->reg.a;
390
+							break;
391
+
392
+						case 1 :
393
+							valueAR = this->reg.b;
394
+							break;
395
+
396
+						case 2 :
397
+							valueAR = this->reg.x;
398
+							break;
399
+
400
+						case 3 :
401
+							valueAR = this->reg.y;
402
+							break;
403
+					}
404
+					break;
405
+
406
+				case BusAR::D :
407
+					valueAR = this->reg.d;
408
+					break;
409
+
410
+				case BusAR::IN :
411
+					valueAR = this->reg.in;
412
+					break;
413
+
414
+				case BusAR::T :
415
+					valueAR = this->reg.t;
416
+					break;
417
+
418
+				case BusAR::Ram :
419
+					if(address < MEMORY_SIZE)
420
+					{
421
+						valueAR = this->ramLow.data[address];
422
+					}
423
+					else
424
+					{
425
+						valueAR = this->ramHigh.data[address - MEMORY_SIZE];
426
+					}
427
+					break;
428
+
429
+				case BusAR::Flash :
430
+					if(address < MEMORY_SIZE)
431
+					{
432
+						valueAR = this->rom.data[address];
433
+					}
434
+					else
435
+					{
436
+						valueAR = this->ramHigh.data[address - MEMORY_SIZE];
437
+					}
438
+					break;
439
+
440
+				case BusAR::PCL :
441
+					valueAR = this->reg.pcl;
442
+					break;
443
+
444
+				case BusAR::PCH :
445
+					valueAR = this->reg.pch;
446
+					break;
447
+			}
448
+
449
+			switch(busB)
450
+			{
451
+				case BusB::AB :
452
+					switch(busBregAB)
453
+					{
454
+						case 0 :
455
+							valueB = this->reg.a;
456
+							break;
457
+
458
+						case 1 :
459
+							valueB = this->reg.b;
460
+							break;
461
+					}
462
+					break;
463
+
464
+				case BusB::D :
465
+					valueB = this->reg.d;
466
+					break;
467
+			}
468
+
469
+			switch(busAW)
470
+			{
471
+				case BusAW::None :
472
+					break;
473
+
474
+				case BusAW::ABXY :
475
+					switch(busAWregABXY)
476
+					{
477
+						case 0 :
478
+							this->reg.a = valueAR;
479
+							break;
480
+
481
+						case 1 :
482
+							this->reg.b = valueAR;
483
+							break;
484
+
485
+						case 2 :
486
+							this->reg.x = valueAR;
487
+							break;
488
+
489
+						case 3 :
490
+							this->reg.y = valueAR;
491
+							break;
492
+					}
493
+					break;
494
+
495
+				case BusAW::D :
496
+					this->reg.d = valueAR;
497
+					break;
498
+
499
+				case BusAW::OUT :
500
+					{
501
+						this->reg.out = valueAR;
502
+
503
+						emit outSignal(this->reg.out);
504
+					}
505
+					break;
506
+
507
+				case BusAW::ALU_T :
508
+					{
509
+						QVector<bool> z(2);
510
+						bool c = aluC;
511
+						unsigned char value = 0;
512
+
513
+						value = this->alu((valueAR & ALU_4BIT_MASK), (valueB & ALU_4BIT_MASK), aluS, aluM, c, z[0]);
514
+						value += (this->alu((valueAR >> ALU_4BIT_OFFSET), (valueB >> ALU_4BIT_OFFSET), aluS, aluM, c, z[1]) << ALU_4BIT_OFFSET);
515
+
516
+						this->reg.t = value;
517
+						this->reg.c = c;
518
+						this->reg.z = (z[0] & z[1]);
519
+					}
520
+					break;
521
+
522
+				case BusAW::RPC :
523
+					uromCycle = 0;
524
+					break;
525
+
526
+				case BusAW::I :
527
+					this->reg.i = valueAR;
528
+					break;
529
+
530
+				case BusAW::Ram :
531
+					if(address < MEMORY_SIZE)
532
+					{
533
+						this->ramLow.data[address] = valueAR;
534
+					}
535
+					else
536
+					{
537
+						this->ramHigh.data[address - MEMORY_SIZE] = valueAR;
538
+					}
539
+					break;
540
+
541
+				case BusAW::PCL :
542
+					this->reg.pcl = valueAR;
543
+					break;
544
+
545
+				case BusAW::PCH :
546
+					this->reg.pch = valueAR;
547
+					break;
548
+
549
+				case BusAW::MAL :
550
+					this->reg.mal = valueAR;
551
+					break;
552
+
553
+				case BusAW::MAH :
554
+					this->reg.mah = valueAR;
555
+					break;
556
+
557
+				case BusAW::PC_PLUS :
558
+					{
559
+						unsigned int pcAddress = ((static_cast<unsigned int>(this->reg.pch) << 8) + static_cast<unsigned int>(this->reg.pcl) + 1);
560
+
561
+						this->reg.pch = static_cast<unsigned char>(pcAddress >> 8);
562
+						this->reg.pcl = static_cast<unsigned char>(pcAddress & 0xff);
563
+					}
564
+					break;
565
+
566
+				case BusAW::SP_PLUS :
567
+					this->reg.spl++;
568
+					this->reg.maxSpl = qMax(this->reg.maxSpl, this->reg.spl);
569
+					break;
570
+
571
+				case BusAW::SP_MINUS :
572
+					this->reg.spl--;
573
+					break;
574
+
575
+				case BusAW::RPC_PLUS :
576
+					{
577
+						unsigned int pcAddress = ((static_cast<unsigned int>(this->reg.pch) << 8) + static_cast<unsigned int>(this->reg.pcl) + 1);
578
+
579
+						this->reg.pch = static_cast<unsigned char>(pcAddress >> 8);
580
+						this->reg.pcl = static_cast<unsigned char>(pcAddress & 0xff);
581
+
582
+						uromCycle = 0;
583
+					}
584
+					break;
585
+			}
586
+
587
+			tick++;
588
+			this->ticks++;
589
+
590
+			if((this->ticks % CLOCK_TICKS_PER_INTERVAL) == 0)
591
+			{
592
+				this->reg.in ^= IO::IN_CLOCK_BIT;
593
+			}
594
+		}
595
+		while(uromCycle > 0);
596
+
597
+		if(this->stepMode)
598
+		{
599
+			break;
600
+		}
601
+	}
602
+
603
+	emit updateSignal();
604
+}
0 605
new file mode 100644
... ...
@@ -0,0 +1,208 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#ifndef CPU_H
13
+#define CPU_H
14
+
15
+#include <QObject>
16
+#include <QVector>
17
+#include <QTimer>
18
+
19
+#include "io.h"
20
+
21
+//! This class contains CPU contex and functions
22
+class CPU : public QObject
23
+{
24
+	Q_OBJECT
25
+
26
+	public:
27
+		static const int FREQUENCY = 1000000; //!< Base frequency of CPU
28
+
29
+		static const int INTERVAL = 125; //!< Time in milliseconds between every step of the emulation
30
+		static const int TICKS_PER_INTERVAL = ((FREQUENCY * INTERVAL) / 1000); //!< How many clock ticks of CPU will be processed in a single step of the emulation
31
+
32
+		static const int CLOCK_INTERVAL = 125; //!< How many milliseconds is needed to toggle the clock pin status on the IO BUS. Default frequency is 8 Hz
33
+		static const int CLOCK_TICKS_PER_INTERVAL = ((FREQUENCY * CLOCK_INTERVAL) / 1000); //!< How many clock ticks of CPU is needed to toggle the clock pin status on the IO BUS.
34
+
35
+		static const int MEMORY_PAGE_SIZE = 256; //!< Memory page size
36
+		static const int MEMORY_PAGE_QUANTITY = 128; //!< Quantity of pages in one memory block
37
+		static const int MEMORY_SIZE = (MEMORY_PAGE_SIZE * MEMORY_PAGE_QUANTITY); //!< Size of the memory block
38
+
39
+		static const int ROM_OS_ADDRESS = 0x0000; //!< Start of ROM OS address space
40
+		static const int ROM_APP_ADDRESS = 0x8000; //!< Start of ROM Application address space
41
+
42
+		static const int RAM_OS_ADDRESS = 0x0000; //!< Start of RAM OS address space
43
+		static const int RAM_SP_ADDRESS = 0x0f00; //!< Start of RAM Stack Pointer address space
44
+		static const int RAM_APP_ADDRESS = 0x1000; //!< Start of RAM Application address space
45
+
46
+		static const int STACK_PAGE = 0x0f; //!< Page number of the stack
47
+
48
+		static const int UROM_ADDRESS_CYCLE_MASK = 0x0f; //!< Micro-step mask of the CPU step for uROM
49
+
50
+		static const int UROM_ADDRESS_INSTRUCTION_POSITION = 0; //!< Offset of instruction for uROM
51
+		static const int UROM_ADDRESS_CYCLE_POSITION = 8; //!< Offset of micro-step for uROM
52
+		static const int UROM_ADDRESS_FLAG_C_POSITION = 12; //!< Offset of C Flag for uROM
53
+		static const int UROM_ADDRESS_FLAG_Z_POSITION = 13; //!< Offset of Z Flag for uROM
54
+
55
+		static const int UROM_0_BUS_AR_MASK = 0b00000111; //!< BUS A Read mask for first uROM bank
56
+		static const int UROM_0_BUS_AW_MASK = 0b01111000; //!< BUS A Write mask for first uROM bank
57
+		static const int UROM_0_BUS_B_MASK = 0b10000000; //!< BUS B mask for first uROM bank
58
+
59
+		static const int UROM_0_BUS_AR_POSITION = 0; //!< BUS A Read offset for first uROM bank
60
+		static const int UROM_0_BUS_AW_POSITION = 3; //!< BUS A Write offset for first uROM bank
61
+		static const int UROM_0_BUS_B_POSITION = 7; //!< BUS B offset for first uROM bank
62
+
63
+		static const int UROM_1_BUS_C_MASK = 0b00000011; //!< BUS C mask for second uROM bank
64
+		static const int UROM_1_ALU_S_MASK = 0b00111100; //!< ALU S Flags mask for second uROM bank
65
+		static const int UROM_1_ALU_M_MASK = 0b01000000; //!< ALU M Flag mask for second uROM bank
66
+		static const int UROM_1_ALU_C_MASK = 0b10000000; //!< ALU C Flag mask for second uROM bank
67
+
68
+		static const int UROM_1_BUS_C_POSITION = 0; //!< BUS C offset for second uROM bank
69
+		static const int UROM_1_ALU_S_POSITION = 2; //!< ALU S Flags offset for second uROM bank
70
+
71
+		static const int INSTRUCTION_REG_ABXY_FIRST_MASK = 0b00000011; //!< First argument ABXY Register mask for opcode
72
+		static const int INSTRUCTION_REG_ABXY_SECOND_MASK = 0b00001100; //!< Second argument ABXY Register mask for opcode
73
+		static const int INSTRUCTION_REG_AB_MASK = 0b00000100; //!< Second argument AB Register mask for opcode
74
+
75
+		static const int INSTRUCTION_REG_ABXY_FIRST_OFFSET = 0; //!< First argument ABXY Register offset for opcode
76
+		static const int INSTRUCTION_REG_ABXY_SECOND_OFFSET = 2; //!< Second argument ABXY Register offset for opcode
77
+		static const int INSTRUCTION_REG_AB_OFFSET = 2; //!< Second argument AB Register offset for opcode
78
+
79
+		static const int ALU_4BIT_MASK = 0x0f; //!< ALU Input/Output mask for lower and higher part of byte
80
+		static const int ALU_4BIT_OFFSET = 4; //!< ALU Input/Output offset for lower and higher part of byte
81
+
82
+		//! Memory buffer
83
+		struct Memory
84
+		{
85
+			QVector<unsigned char> data = QVector<unsigned char>(MEMORY_SIZE); //!< Memory data
86
+		};
87
+
88
+		//! Register buffer
89
+		struct Reg
90
+		{
91
+			unsigned char i; //!< Instruction register
92
+			bool c; //!< Carry Flag register
93
+			bool z; //!< Zero Flag register
94
+			unsigned char pch; //!< Program Counter High register
95
+			unsigned char pcl; //!< Program Counter Low register
96
+			unsigned char sph; //!< Stack Pointer High register
97
+			unsigned char spl; //!< Stack Pointer Low register
98
+			unsigned char maxSpl; //!< Maximum reached value of Stack Pointer
99
+			unsigned char a; //!< A register
100
+			unsigned char b; //!< B register
101
+			unsigned char x; //!< X register
102
+			unsigned char y; //!< Y rRegister
103
+			unsigned char in; //!< Input register
104
+			unsigned char out; //!< Output register
105
+			unsigned char d; //!< Hidden Data register
106
+			unsigned char t; //!< ALU Output register
107
+			unsigned char mah; //!< Memory Address High register
108
+			unsigned char mal; //!<Memory Address Low register
109
+		};
110
+
111
+		CPU(QObject *parent = nullptr);
112
+
113
+		void setUrom0(const CPU::Memory &urom);
114
+		void setUrom1(const CPU::Memory &urom);
115
+		void setRom(const CPU::Memory &rom);
116
+
117
+		void run();
118
+		void step();
119
+		void pause();
120
+		void stop();
121
+
122
+		const CPU::Reg &getReg() const;
123
+		unsigned long long getTicks() const;
124
+
125
+		const CPU::Memory &getRom() const;
126
+		const CPU::Memory &getRamLow() const;
127
+		const CPU::Memory &getRamHigh() const;
128
+
129
+	private:
130
+		//! Line select defines for the main reading data bus
131
+		enum class BusAR
132
+		{
133
+			ABXY = 0, //!< Main and auxiliary registers
134
+			D, //!< Hidden data register
135
+			IN, //!< Input register
136
+			T, //!< ALU temp register
137
+			Ram, //!< RAM access
138
+			Flash, //!< FLASH access
139
+			PCL, //!< Program Counter Low register
140
+			PCH //!< Program Counter High register
141
+		};
142
+
143
+		//! Line select defines for the main writing data bus
144
+		enum class BusAW
145
+		{
146
+			None = 0, //!< Not selected
147
+			ABXY, //!< Main and auxiliary registers
148
+			D, //!< Hidden data register
149
+			OUT, //!< Output register
150
+			ALU_T, //!< ALU operation
151
+			RPC, //!< Reset Program Counter
152
+			I, //!< Instruction register
153
+			Ram, //!< RAM access
154
+			PCL, //!< Program Counter Low register
155
+			PCH, //!< Program Counter High register
156
+			MAL, //!< Memory Address Low register
157
+			MAH, //!< Memory Address High register
158
+			PC_PLUS, //!< Increse Program Counter
159
+			SP_PLUS, //!< Increse Stack Pointer
160
+			SP_MINUS, //!< Decrese Stack Pointer
161
+			RPC_PLUS //!< Reset the step counter and increse Program Counter
162
+		};
163
+
164
+		//! Line select defines for the secondary reading data bus
165
+		enum class BusB
166
+		{
167
+			AB = 0, //!< Main registers
168
+			D //!< Hidden data register
169
+		};
170
+
171
+		//! Line select defines for the addressing data bus
172
+		enum class BusC
173
+		{
174
+			PC = 0, //!< Full 16 bit Program Counter register
175
+			MA, //!< Full 16 bit Memory Address register
176
+			SP, //!< Full 16 bit Stack Pointer register
177
+			XY //!< Full 16 bit auxiliary register
178
+		};
179
+
180
+		void reset();
181
+
182
+		unsigned char alu(unsigned char a, unsigned char b, unsigned char s, bool m, bool &c, bool &z);
183
+
184
+		bool stepMode; //!< Step mode enabler for emulation
185
+		unsigned long long ticks; //!< Counter of clock ticks of CPU
186
+		QTimer timer; //!< Timer for executing emulation steps
187
+
188
+		Memory urom0; //!< First uROM memory buffer
189
+		Memory urom1; //!< Second uROM memory buffer
190
+		Memory rom; //!< ROM memory buffer
191
+
192
+		Memory ramLow; //!< Lower 32 kB of RAM buffer
193
+		Memory ramHigh; //!< Higher 32 kB of RAM buffer
194
+
195
+		Reg reg; //!< Register buffer
196
+
197
+	signals:
198
+		void outSignal(unsigned char out);
199
+		void updateSignal();
200
+
201
+	public slots:
202
+		void inSlot(unsigned char in);
203
+
204
+	private slots:
205
+		void emulation();
206
+};
207
+
208
+#endif
0 209
new file mode 100644
... ...
@@ -0,0 +1,789 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#include "emu.h"
13
+#include "ui_emu.h"
14
+
15
+/**
16
+ * Constructor for the emulator class
17
+ *
18
+ * @param parent Parent object
19
+ */
20
+Emu::Emu(QWidget *parent) : QMainWindow(parent), ui(new Ui::Emu)
21
+{
22
+	ui->setupUi(this);
23
+
24
+	this->loaded = false;
25
+	this->started = false;
26
+	this->running = false;
27
+
28
+	this->ui->fileUrom0PathLabel->setText("");
29
+	this->ui->fileUrom1PathLabel->setText("");
30
+	this->ui->fileRomPathLabel->setText("");
31
+	this->ui->fileFSDirPathLabel->setText("");
32
+
33
+	this->reset();
34
+	this->update();
35
+
36
+	this->ui->speakerVolumeSlider->setValue(50);
37
+	this->ui->speakerVolumeValueLabel->setText("50%");
38
+
39
+	this->setFocus();
40
+
41
+	QObject::connect(&this->cpu, SIGNAL(updateSignal()), this, SLOT(updateSlot()));
42
+
43
+	QObject::connect(&this->io, SIGNAL(updateLCDBufferSignal(LCD::Buffer)), ui->lcdBufferView, SLOT(drawSlot(LCD::Buffer)));
44
+
45
+	QObject::connect(&this->io, SIGNAL(updateLEDRunSignal(bool)), this, SLOT(updateLEDRunSlot(bool)));
46
+	QObject::connect(&this->io, SIGNAL(updateLEDErrorSignal(bool)), this, SLOT(updateLEDErrorSlot(bool)));
47
+
48
+	QObject::connect(&this->io, SIGNAL(updateRS232TxSignal(unsigned char)), this, SLOT(updateRS232TxSlot(unsigned char)));
49
+	QObject::connect(&this->io, SIGNAL(updateRS232RxSignal(unsigned char)), this, SLOT(updateRS232RxSlot(unsigned char)));
50
+
51
+	QObject::connect(&this->io, SIGNAL(updateRTCDateTimeSignal(QDateTime)), this, SLOT(updateRTCDateTimeSlot(QDateTime)));
52
+
53
+	QObject::connect(&this->io, SIGNAL(updateSpeakerStatusSignal(int)), this, SLOT(updateSpeakerStatusSlot(int)));
54
+
55
+	QObject::connect(&this->cpu, SIGNAL(outSignal(unsigned char)), &this->io, SLOT(outSlot(unsigned char)));
56
+	QObject::connect(&this->io, SIGNAL(inSignal(unsigned char)), &this->cpu, SLOT(inSlot(unsigned char)));
57
+}
58
+
59
+//! Destructor for the emulator class
60
+Emu::~Emu()
61
+{
62
+	QObject::disconnect(&this->io);
63
+	QObject::disconnect(&this->cpu);
64
+
65
+	QObject::disconnect(this);
66
+
67
+	delete ui;
68
+}
69
+
70
+//! Reset the UI elements
71
+void Emu::reset()
72
+{
73
+	this->ui->regAValueHexLabel->setText("");
74
+	this->ui->regAValueDecLabel->setText("");
75
+	this->ui->regAValueBinLabel->setText("");
76
+
77
+	this->ui->regBValueHexLabel->setText("");
78
+	this->ui->regBValueDecLabel->setText("");
79
+	this->ui->regBValueBinLabel->setText("");
80
+
81
+	this->ui->regXValueHexLabel->setText("");
82
+	this->ui->regXValueDecLabel->setText("");
83
+	this->ui->regXValueBinLabel->setText("");
84
+
85
+	this->ui->regYValueHexLabel->setText("");
86
+	this->ui->regYValueDecLabel->setText("");
87
+	this->ui->regYValueBinLabel->setText("");
88
+
89
+	this->ui->regINValueHexLabel->setText("");
90
+	this->ui->regINValueDecLabel->setText("");
91
+	this->ui->regINValueBinLabel->setText("");
92
+
93
+	this->ui->regOUTValueHexLabel->setText("");
94
+	this->ui->regOUTValueDecLabel->setText("");
95
+	this->ui->regOUTValueBinLabel->setText("");
96
+
97
+	this->ui->regIValueHexLabel->setText("");
98
+	this->ui->regIValueBinLabel->setText("");
99
+
100
+	this->ui->regPCHValueLabel->setText("");
101
+	this->ui->regPCLValueLabel->setText("");
102
+
103
+	this->ui->regCValueLabel->setText("");
104
+	this->ui->regZValueLabel->setText("");
105
+
106
+	this->ui->regSPHValueLabel->setText("");
107
+	this->ui->regSPLValueLabel->setText("");
108
+	this->ui->regSPLMaxValueLabel->setText("");
109
+
110
+	this->ui->emuTimeValueLabel->setText("");
111
+
112
+	this->ui->lcdBufferView->reset();
113
+
114
+	this->ui->ledRunValueLabel->setText("");
115
+	this->ui->ledRunValueLabel->setStyleSheet("");
116
+
117
+	this->ui->ledErrorValueLabel->setText("");
118
+	this->ui->ledErrorValueLabel->setStyleSheet("");
119
+
120
+	this->romSetPage(0);
121
+	this->ramSetPage(0);
122
+
123
+	this->ui->rs232RxText->clear();
124
+	this->ui->rs232TxText->clear();
125
+	this->ui->rs232RxEdit->clear();
126
+
127
+	QDateTime dateTime;
128
+	dateTime.setDate(QDate(2000, 1, 1));
129
+
130
+	this->ui->rtcValueLabel->setText(dateTime.toString("yyyy.MM.dd hh:mm:ss"));
131
+
132
+	this->ui->speakerBufferValueLabel->setText("0");
133
+}
134
+
135
+//! Update internal statuses and UI elements
136
+void Emu::update()
137
+{
138
+	if(!this->started)
139
+	{
140
+		if((!this->ui->fileUrom0PathLabel->text().isEmpty()) && (!this->ui->fileUrom1PathLabel->text().isEmpty()) && (!this->ui->fileRomPathLabel->text().isEmpty()) && (!this->ui->fileFSDirPathLabel->text().isEmpty()))
141
+		{
142
+			this->loaded = true;
143
+		}
144
+		else
145
+		{
146
+			this->loaded = false;
147
+		}
148
+	}
149
+
150
+	this->ui->fileUrom0OpenButton->setEnabled(!this->started);
151
+	this->ui->fileUrom1OpenButton->setEnabled(!this->started);
152
+	this->ui->fileRomOpenButton->setEnabled(!this->started);
153
+	this->ui->fileFSDirOpenButton->setEnabled(!this->started);
154
+
155
+	this->ui->fileUrom0ReloadButton->setEnabled((!this->started) && (!this->ui->fileUrom0PathLabel->text().isEmpty()));
156
+	this->ui->fileUrom1ReloadButton->setEnabled((!this->started) && (!this->ui->fileUrom1PathLabel->text().isEmpty()));
157
+	this->ui->fileRomReloadButton->setEnabled((!this->started) && (!this->ui->fileRomPathLabel->text().isEmpty()));
158
+
159
+	if(this->loaded)
160
+	{
161
+		if(this->running)
162
+		{
163
+			this->ui->emuStatusValueLabel->setText("Running");
164
+		}
165
+		else
166
+		{
167
+			if(this->started)
168
+			{
169
+				this->ui->emuStatusValueLabel->setText("Paused");
170
+			}
171
+			else
172
+			{
173
+				this->ui->emuStatusValueLabel->setText("Stopped");
174
+			}
175
+		}
176
+	}
177
+	else
178
+	{
179
+		this->ui->emuStatusValueLabel->setText("");
180
+	}
181
+
182
+	this->ui->emuControlRunButton->setEnabled(this->loaded && (!this->running));
183
+	this->ui->emuControlStepButton->setEnabled(this->loaded && (!this->running));
184
+	this->ui->emuControlPauseButton->setEnabled(this->running);
185
+	this->ui->emuControlStopButton->setEnabled(this->started);
186
+
187
+	this->ui->romGoToOSButton->setEnabled(this->started);
188
+	this->ui->romGoToAppButton->setEnabled(this->started);
189
+
190
+	this->ui->ramGoToOSButton->setEnabled(this->started);
191
+	this->ui->ramGoToSPButton->setEnabled(this->started);
192
+	this->ui->ramGoToAppButton->setEnabled(this->started);
193
+
194
+	this->ui->rs232RxSendButton->setEnabled(this->started);
195
+	this->ui->rtcSetCurrentButton->setEnabled(this->started);
196
+	this->ui->speakerVolumeSlider->setEnabled(this->started);
197
+}
198
+
199
+/**
200
+ * Set ROM page to show
201
+ *
202
+ * @param page Page number
203
+ */
204
+void Emu::romSetPage(int page)
205
+{
206
+	if((page >= 0) && (((CPU::MEMORY_SIZE * 2) / CPU::MEMORY_PAGE_SIZE) > page))
207
+	{
208
+		this->romPage = page;
209
+
210
+		this->ui->romText->clear();
211
+
212
+		if(this->started)
213
+		{
214
+			const CPU::Memory &rom = (((CPU::MEMORY_SIZE / CPU::MEMORY_PAGE_SIZE) > page) ? this->cpu.getRom() : this->cpu.getRamHigh());
215
+
216
+			QString text = "";
217
+
218
+			for(int i = 0; i < CPU::MEMORY_PAGE_SIZE; i++)
219
+			{
220
+				if(((i % 16) == 0) && (i != 0))
221
+				{
222
+					text.append("\n");
223
+				}
224
+				else if((i % 16) != 0)
225
+				{
226
+					text.append(" ");
227
+				}
228
+
229
+				if((CPU::MEMORY_SIZE / CPU::MEMORY_PAGE_SIZE) > page)
230
+				{
231
+					text.append(QString("%1").arg(rom.data[(this->romPage * CPU::MEMORY_PAGE_SIZE) + i], 2, 16, QChar('0')));
232
+				}
233
+				else
234
+				{
235
+					text.append(QString("%1").arg(rom.data[((this->romPage - (CPU::MEMORY_SIZE / CPU::MEMORY_PAGE_SIZE)) * CPU::MEMORY_PAGE_SIZE) + i], 2, 16, QChar('0')));
236
+				}
237
+			}
238
+
239
+			this->ui->romText->setPlainText(text);
240
+
241
+			this->ui->romMinusButton->setEnabled(page != 0);
242
+			this->ui->romPlusButton->setEnabled(page < (((CPU::MEMORY_SIZE * 2) / CPU::MEMORY_PAGE_SIZE) - 1));
243
+		}
244
+		else
245
+		{
246
+			this->ui->romMinusButton->setEnabled(false);
247
+			this->ui->romPlusButton->setEnabled(false);
248
+		}
249
+	}
250
+
251
+	QString addressPrefix = QString("%1").arg(this->romPage, 2, 16, QChar('0')).toUpper();
252
+	QString address = "";
253
+
254
+	address.append(addressPrefix);
255
+	address.append("00 - ");
256
+	address.append(addressPrefix);
257
+	address.append("FF");
258
+
259
+	this->ui->romAddressLabel->setText(QString().append(address));
260
+}
261
+
262
+/**
263
+ * Set RAM page to show
264
+ *
265
+ * @param page Page number
266
+ */
267
+void Emu::ramSetPage(int page)
268
+{
269
+	if((page >= 0) && ((CPU::MEMORY_SIZE / CPU::MEMORY_PAGE_SIZE) > page))
270
+	{
271
+		this->ramPage = page;
272
+
273
+		this->ui->ramText->clear();
274
+
275
+		if(this->started)
276
+		{
277
+			const CPU::Memory &ram = this->cpu.getRamLow();
278
+
279
+			QString text = "";
280
+
281
+			for(int i = 0; i < CPU::MEMORY_PAGE_SIZE; i++)
282
+			{
283
+				if(((i % 16) == 0) && (i != 0))
284
+				{
285
+					text.append("\n");
286
+				}
287
+				else if((i % 16) != 0)
288
+				{
289
+					text.append(" ");
290
+				}
291
+
292
+				text.append(QString("%1").arg(ram.data[(this->ramPage * CPU::MEMORY_PAGE_SIZE) + i], 2, 16, QChar('0')));
293
+			}
294
+
295
+			this->ui->ramText->setPlainText(text);
296
+
297
+			this->ui->ramMinusButton->setEnabled(page != 0);
298
+			this->ui->ramPlusButton->setEnabled(page < ((CPU::MEMORY_SIZE / CPU::MEMORY_PAGE_SIZE) - 1));
299
+		}
300
+		else
301
+		{
302
+			this->ui->ramMinusButton->setEnabled(false);
303
+			this->ui->ramPlusButton->setEnabled(false);
304
+		}
305
+	}
306
+
307
+	QString addressPrefix = QString("%1").arg(this->ramPage, 2, 16, QChar('0')).toUpper();
308
+	QString address = "";
309
+
310
+	address.append(addressPrefix);
311
+	address.append("00 - ");
312
+	address.append(addressPrefix);
313
+	address.append("FF");
314
+
315
+	this->ui->ramAddressLabel->setText(QString().append(address));
316
+}
317
+
318
+/**
319
+ * Load data from file to the memory buffer
320
+ *
321
+ * @param path Path to the file to load
322
+ * @param memory Buffer of the memory to fill
323
+ *
324
+ * @return Status of loading data to the memory buffer
325
+ */
326
+bool Emu::loadMemoryFile(const QString &path, CPU::Memory &memory)
327
+{
328
+	QFile file(path);
329
+
330
+	if(!file.open(QIODevice::ReadOnly))
331
+	{
332
+		QMessageBox::critical(this, "Error", "Unable to open file");
333
+		return(false);
334
+	}
335
+
336
+	if(CPU::MEMORY_SIZE != file.read(reinterpret_cast<char *>(memory.data.data()), CPU::MEMORY_SIZE))
337
+	{
338
+		QMessageBox::critical(this, "Error", "Bad size of file");
339
+		return(false);
340
+	}
341
+
342
+	file.close();
343
+
344
+	return(true);
345
+}
346
+
347
+/**
348
+ * Process the mouse press event
349
+ *
350
+ * @param event Mouse event
351
+ */
352
+void Emu::mousePressEvent(QMouseEvent *)
353
+{
354
+	this->setFocus();
355
+}
356
+
357
+/**
358
+ * Process the focus selector event
359
+ *
360
+ * @param next Search direction of the focus
361
+ *
362
+ * @return Status of finding next/previous widget to give the keyboard focus to
363
+ */
364
+bool Emu::focusNextPrevChild(bool)
365
+{
366
+	return(false);
367
+}
368
+
369
+/**
370
+ * Process the key press event
371
+ *
372
+ * @param event Key event
373
+ */
374
+void Emu::keyPressEvent(QKeyEvent *event)
375
+{
376
+	if(this->running)
377
+	{
378
+		this->io.keyboardKeyPress(event->key(), event->modifiers());
379
+	}
380
+}
381
+
382
+//! Update time, registers, memory view UI elements
383
+void Emu::updateSlot()
384
+{
385
+	unsigned long long ticks = this->cpu.getTicks();
386
+
387
+	QString timeMs = QString("%1").arg(((ticks / (CPU::FREQUENCY / 1000)) % 1000), 3, 10, QChar('0'));
388
+	QString timeSec = QString("%1").arg(((ticks / CPU::FREQUENCY) % 60), 2, 10, QChar('0'));
389
+	QString timeMin = QString("%1").arg(((ticks / (60 * CPU::FREQUENCY)) % 60), 2, 10, QChar('0'));
390
+	QString timeHour = QString("%1").arg(((ticks / (60 * CPU::FREQUENCY) / 60)), 2, 10, QChar('0'));
391
+
392
+	this->ui->emuTimeValueLabel->setText(QString("%1:%2:%3.%4").arg(timeHour, timeMin, timeSec, timeMs));
393
+
394
+	const CPU::Reg &reg = this->cpu.getReg();
395
+
396
+	this->ui->regAValueHexLabel->setText(QString("%1").arg(reg.a, 2, 16, QChar('0')));
397
+	this->ui->regAValueDecLabel->setText(QString("%1").arg(reg.a));
398
+	this->ui->regAValueBinLabel->setText(QString("%1").arg(reg.a, 8, 2, QChar('0')));
399
+
400
+	this->ui->regBValueHexLabel->setText(QString("%1").arg(reg.b, 2, 16, QChar('0')));
401
+	this->ui->regBValueDecLabel->setText(QString("%1").arg(reg.b));
402
+	this->ui->regBValueBinLabel->setText(QString("%1").arg(reg.b, 8, 2, QChar('0')));
403
+
404
+	this->ui->regXValueHexLabel->setText(QString("%1").arg(reg.x, 2, 16, QChar('0')));
405
+	this->ui->regXValueDecLabel->setText(QString("%1").arg(reg.x));
406
+	this->ui->regXValueBinLabel->setText(QString("%1").arg(reg.x, 8, 2, QChar('0')));
407
+
408
+	this->ui->regYValueHexLabel->setText(QString("%1").arg(reg.y, 2, 16, QChar('0')));
409
+	this->ui->regYValueDecLabel->setText(QString("%1").arg(reg.y));
410
+	this->ui->regYValueBinLabel->setText(QString("%1").arg(reg.y, 8, 2, QChar('0')));
411
+
412
+	this->ui->regINValueHexLabel->setText(QString("%1").arg(reg.in, 2, 16, QChar('0')));
413
+	this->ui->regINValueDecLabel->setText(QString("%1").arg(reg.in));
414
+	this->ui->regINValueBinLabel->setText(QString("%1").arg(reg.in, 8, 2, QChar('0')));
415
+
416
+	this->ui->regOUTValueHexLabel->setText(QString("%1").arg(reg.out, 2, 16, QChar('0')));
417
+	this->ui->regOUTValueDecLabel->setText(QString("%1").arg(reg.out));
418
+	this->ui->regOUTValueBinLabel->setText(QString("%1").arg(reg.out, 8, 2, QChar('0')));
419
+
420
+	this->ui->regIValueHexLabel->setText(QString("%1").arg(reg.i, 2, 16, QChar('0')));
421
+	this->ui->regIValueBinLabel->setText(QString("%1").arg(reg.i, 8, 2, QChar('0')));
422
+
423
+	this->ui->regPCHValueLabel->setText(QString("%1").arg(reg.pch, 2, 16, QChar('0')));
424
+	this->ui->regPCLValueLabel->setText(QString("%1").arg(reg.pcl, 2, 16, QChar('0')));
425
+
426
+	this->ui->regCValueLabel->setText(reg.c ? QString("1") : QString("0"));
427
+	this->ui->regZValueLabel->setText(reg.z ? QString("1") : QString("0"));
428
+
429
+	this->ui->regSPHValueLabel->setText(QString("%1").arg(reg.sph, 2, 16, QChar('0')));
430
+	this->ui->regSPLValueLabel->setText(QString("%1").arg(reg.spl, 2, 16, QChar('0')));
431
+	this->ui->regSPLMaxValueLabel->setText(QString("%1").arg(reg.maxSpl, 2, 16, QChar('0')));
432
+
433
+	this->romSetPage(this->romPage);
434
+	this->ramSetPage(this->ramPage);
435
+}
436
+
437
+/**
438
+ * Update status of run LED
439
+ *
440
+ * @param enable LED enable
441
+ */
442
+void Emu::updateLEDRunSlot(bool enable)
443
+{
444
+	this->ui->ledRunValueLabel->setText(enable ? "ON" : "");
445
+	this->ui->ledRunValueLabel->setStyleSheet(enable ? "QLabel { color : blue; }" : "");
446
+}
447
+
448
+/**
449
+ * Update status of error LED
450
+ *
451
+ * @param enable LED enable
452
+ */
453
+void Emu::updateLEDErrorSlot(bool enable)
454
+{
455
+	this->ui->ledErrorValueLabel->setText(enable ? "ON" : "");
456
+	this->ui->ledErrorValueLabel->setStyleSheet(enable ? "QLabel { color : red; }" : "");
457
+}
458
+
459
+/**
460
+ * Update status of transmited data via RS232
461
+ *
462
+ * @param c Transmited char
463
+ */
464
+void Emu::updateRS232TxSlot(unsigned char c)
465
+{
466
+	this->ui->rs232TxText->moveCursor(QTextCursor::End);
467
+
468
+	if(c != 0)
469
+	{
470
+		this->ui->rs232TxText->insertPlainText(QString(c));
471
+	}
472
+	else
473
+	{
474
+		this->ui->rs232TxText->insertPlainText("\n");
475
+	}
476
+
477
+	QScrollBar *scrollBar = this->ui->rs232TxText->verticalScrollBar();
478
+
479
+	scrollBar->setValue(scrollBar->maximum());
480
+}
481
+
482
+/**
483
+ * Update status of received data via RS232
484
+ *
485
+ * @param c Received char
486
+ */
487
+void Emu::updateRS232RxSlot(unsigned char c)
488
+{
489
+	this->ui->rs232RxText->moveCursor(QTextCursor::End);
490
+
491
+	if(c != 0)
492
+	{
493
+		this->ui->rs232RxText->insertPlainText(QString(c));
494
+	}
495
+	else
496
+	{
497
+		this->ui->rs232RxText->insertPlainText("\n");
498
+	}
499
+
500
+	QScrollBar *scrollBar = this->ui->rs232RxText->verticalScrollBar();
501
+
502
+	scrollBar->setValue(scrollBar->maximum());
503
+}
504
+
505
+/**
506
+ * Update status of date and time
507
+ *
508
+ * @param dateTime Date and time
509
+ */
510
+void Emu::updateRTCDateTimeSlot(const QDateTime &dateTime)
511
+{
512
+	this->ui->rtcValueLabel->setText(dateTime.toString("yyyy.MM.dd hh:mm:ss"));
513
+}
514
+
515
+/**
516
+ * Update status of the speaker buffer usage
517
+ *
518
+ * @param bufferUsed Buffer usage
519
+ */
520
+void Emu::updateSpeakerStatusSlot(int bufferUsed)
521
+{
522
+	this->ui->speakerBufferValueLabel->setText(QString("%1").arg(bufferUsed));
523
+}
524
+
525
+//! Process first uROM open event
526
+void Emu::on_fileUrom0OpenButton_clicked()
527
+{
528
+	QString path = QFileDialog::getOpenFileName(this, "", "", "UROM 0 (*.bin)");
529
+
530
+	if(!path.isEmpty())
531
+	{
532
+		CPU::Memory urom0;
533
+
534
+		if(this->loadMemoryFile(path, urom0))
535
+		{
536
+			this->ui->fileUrom0PathLabel->setText(path);
537
+
538
+			this->cpu.setUrom0(urom0);
539
+		}
540
+		else
541
+		{
542
+			this->ui->fileUrom0PathLabel->setText("");
543
+		}
544
+
545
+		this->update();
546
+	}
547
+}
548
+
549
+//! Process second uROM open event
550
+void Emu::on_fileUrom1OpenButton_clicked()
551
+{
552
+	QString path = QFileDialog::getOpenFileName(this, "", "", "UROM 1 (*.bin)");
553
+
554
+	if(!path.isEmpty())
555
+	{
556
+		CPU::Memory urom1;
557
+
558
+		if(this->loadMemoryFile(path, urom1))
559
+		{
560
+			this->ui->fileUrom1PathLabel->setText(path);
561
+
562
+			this->cpu.setUrom1(urom1);
563
+		}
564
+		else
565
+		{
566
+			this->ui->fileUrom1PathLabel->setText("");
567
+		}
568
+
569
+		this->update();
570
+	}
571
+}
572
+
573
+//! Process ROM open event
574
+void Emu::on_fileRomOpenButton_clicked()
575
+{
576
+	QString path = QFileDialog::getOpenFileName(this, "", "", "ROM (*.bin)");
577
+
578
+	if(!path.isEmpty())
579
+	{
580
+		CPU::Memory rom;
581
+
582
+		if(this->loadMemoryFile(path, rom))
583
+		{
584
+			this->ui->fileRomPathLabel->setText(path);
585
+
586
+			this->cpu.setRom(rom);
587
+		}
588
+		else
589
+		{
590
+			this->ui->fileRomPathLabel->setText("");
591
+		}
592
+
593
+		this->update();
594
+	}
595
+}
596
+
597
+//! Process file system open event
598
+void Emu::on_fileFSDirOpenButton_clicked()
599
+{
600
+	QString path = QFileDialog::getExistingDirectory(this, "", "");
601
+
602
+	if(!path.isEmpty())
603
+	{
604
+		this->ui->fileFSDirPathLabel->setText(path);
605
+
606
+		this->io.fsSetPath(path);
607
+
608
+		this->update();
609
+	}
610
+}
611
+
612
+//! Process first uROM reload event
613
+void Emu::on_fileUrom0ReloadButton_clicked()
614
+{
615
+	CPU::Memory urom0;
616
+
617
+	if(this->loadMemoryFile(this->ui->fileUrom0PathLabel->text(), urom0))
618
+	{
619
+		this->cpu.setUrom0(urom0);
620
+	}
621
+	else
622
+	{
623
+		this->ui->fileUrom0PathLabel->setText("");
624
+	}
625
+
626
+	this->update();
627
+}
628
+
629
+//! Process second uROM reload event
630
+void Emu::on_fileUrom1ReloadButton_clicked()
631
+{
632
+	CPU::Memory urom1;
633
+
634
+	if(this->loadMemoryFile(this->ui->fileUrom1PathLabel->text(), urom1))
635
+	{
636
+		this->cpu.setUrom1(urom1);
637
+	}
638
+	else
639
+	{
640
+		this->ui->fileUrom1PathLabel->setText("");
641
+	}
642
+
643
+	this->update();
644
+}
645
+
646
+//! Process ROM reload event
647
+void Emu::on_fileRomReloadButton_clicked()
648
+{
649
+	CPU::Memory rom;
650
+
651
+	if(this->loadMemoryFile(this->ui->fileRomPathLabel->text(), rom))
652
+	{
653
+		this->cpu.setRom(rom);
654
+	}
655
+	else
656
+	{
657
+		this->ui->fileRomPathLabel->setText("");
658
+	}
659
+
660
+	this->update();
661
+}
662
+
663
+//! Process run emulation event
664
+void Emu::on_emuControlRunButton_clicked()
665
+{
666
+	this->started = true;
667
+	this->running = true;
668
+
669
+	this->update();
670
+
671
+	this->cpu.run();
672
+}
673
+
674
+//! Process a make step emulation event
675
+void Emu::on_emuControlStepButton_clicked()
676
+{
677
+	this->started = true;
678
+
679
+	this->update();
680
+
681
+	this->cpu.step();
682
+}
683
+
684
+//! Process pause emulation event
685
+void Emu::on_emuControlPauseButton_clicked()
686
+{
687
+	this->running = false;
688
+
689
+	this->update();
690
+
691
+	this->cpu.pause();
692
+}
693
+
694
+//! Process stop emulation event
695
+void Emu::on_emuControlStopButton_clicked()
696
+{
697
+	this->started = false;
698
+	this->running = false;
699
+
700
+	this->cpu.stop();
701
+	this->io.reset();
702
+
703
+	this->reset();
704
+	this->update();
705
+}
706
+
707
+/**
708
+ * Process set volume level event
709
+ *
710
+ * @param value Volume level
711
+ */
712
+void Emu::on_speakerVolumeSlider_valueChanged(int value)
713
+{
714
+	this->io.speakerSetVolume(static_cast<unsigned int>(value));
715
+
716
+	this->ui->speakerVolumeValueLabel->setText(QString("%1%").arg(value));
717
+}
718
+
719
+//! Process set current time event
720
+void Emu::on_rtcSetCurrentButton_clicked()
721
+{
722
+	QDateTime dateTime = QDateTime::currentDateTime();
723
+
724
+	this->io.rtcSetDateTime(dateTime);
725
+}
726
+
727
+//! Process go to the OS section for ROM event
728
+void Emu::on_romGoToOSButton_clicked()
729
+{
730
+	this->romSetPage(CPU::ROM_OS_ADDRESS / CPU::MEMORY_PAGE_SIZE);
731
+}
732
+
733
+//! Process go to the application section for ROM event
734
+void Emu::on_romGoToAppButton_clicked()
735
+{
736
+	this->romSetPage(CPU::ROM_APP_ADDRESS / CPU::MEMORY_PAGE_SIZE);
737
+}
738
+
739
+//! Process go to the previous page for ROM event
740
+void Emu::on_romMinusButton_clicked()
741
+{
742
+	this->romSetPage(this->romPage - 1);
743
+}
744
+
745
+//! Process go to the next page for ROM event
746
+void Emu::on_romPlusButton_clicked()
747
+{
748
+	this->romSetPage(this->romPage + 1);
749
+}
750
+
751
+//! Process go to the OS section for RAM event
752
+void Emu::on_ramGoToOSButton_clicked()
753
+{
754
+	this->ramSetPage(CPU::RAM_OS_ADDRESS / CPU::MEMORY_PAGE_SIZE);
755
+}
756
+
757
+//! Process go to the Stack section for RAM event
758
+void Emu::on_ramGoToSPButton_clicked()
759
+{
760
+	this->ramSetPage(CPU::RAM_SP_ADDRESS / CPU::MEMORY_PAGE_SIZE);
761
+}
762
+
763
+//! Process go to the application section for RAM event
764
+void Emu::on_ramGoToAppButton_clicked()
765
+{
766
+	this->ramSetPage(CPU::RAM_APP_ADDRESS / CPU::MEMORY_PAGE_SIZE);
767
+}
768
+
769
+//! Process go to the previous page for RAM event
770
+void Emu::on_ramMinusButton_clicked()
771
+{
772
+	this->ramSetPage(this->ramPage - 1);
773
+}
774
+
775
+//! Process go to the next page for RAM event
776
+void Emu::on_ramPlusButton_clicked()
777
+{
778
+	this->ramSetPage(this->ramPage + 1);
779
+}
780
+
781
+//! Process send the transmit buffer data via RS232 event
782
+void Emu::on_rs232RxSendButton_clicked()
783
+{
784
+	QString text = this->ui->rs232RxEdit->text();
785
+
786
+	this->ui->rs232RxEdit->clear();
787
+
788
+	this->io.rs232Receive(text);
789
+}
0 790
new file mode 100644
... ...
@@ -0,0 +1,116 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#ifndef EMU_H
13
+#define EMU_H
14
+
15
+#include <QMainWindow>
16
+#include <QFileDialog>
17
+#include <QFile>
18
+#include <QMessageBox>
19
+#include <QMouseEvent>
20
+#include <QKeyEvent>
21
+#include <QScrollBar>
22
+
23
+#include "cpu.h"
24
+#include "io.h"
25
+
26
+//! User Interface namespace
27
+namespace Ui
28
+{
29
+	class Emu; //!< Form class for the emulator window
30
+}
31
+
32
+class Emu : public QMainWindow
33
+{
34
+	Q_OBJECT
35
+
36
+	public:
37
+		Emu(QWidget *parent = nullptr);
38
+		~Emu() override;
39
+
40
+		Emu(const Emu &) = delete;
41
+		Emu &operator=(const Emu &) = delete;
42
+		Emu(Emu &&) = delete;
43
+		Emu &operator=(Emu &&) = delete;
44
+
45
+	private:
46
+		void reset();
47
+		void update();
48
+
49
+		bool loadMemoryFile(const QString &path, CPU::Memory &memory);
50
+
51
+		void romSetPage(int page);
52
+		void ramSetPage(int page);
53
+
54
+		void mousePressEvent(QMouseEvent *event) override;
55
+		bool focusNextPrevChild(bool next) override;
56
+
57
+		void keyPressEvent(QKeyEvent *event) override;
58
+
59
+		Ui::Emu *ui; //!< Form for the emulator window
60
+
61
+		bool loaded; //!< Status of loading all necessary files for emulation
62
+		bool started; //!< Status of started the emulation process. It is "1" when the start button was clicked.
63
+		bool running; //!< Status of running the emulation process. It is "1" when the emulation is active executing.
64
+
65
+		CPU cpu; //!< CPU instance for emulating the processor
66
+		IO io; //!< IO instance for emulating the motherboard
67
+
68
+		int romPage; //!< Number of the ROM page to show
69
+		int ramPage; //!< Number of the RAM page to show
70
+
71
+	private slots:
72
+		void updateSlot();
73
+
74
+		void updateLEDRunSlot(bool enable);
75
+		void updateLEDErrorSlot(bool enable);
76
+
77
+		void updateRS232TxSlot(unsigned char c);
78
+		void updateRS232RxSlot(unsigned char c);
79
+
80
+		void updateRTCDateTimeSlot(const QDateTime &dateTime);
81
+
82
+		void updateSpeakerStatusSlot(int bufferUsed);
83
+
84
+		void on_fileUrom0OpenButton_clicked();
85
+		void on_fileUrom1OpenButton_clicked();
86
+		void on_fileRomOpenButton_clicked();
87
+		void on_fileFSDirOpenButton_clicked();
88
+
89
+		void on_fileUrom0ReloadButton_clicked();
90
+		void on_fileUrom1ReloadButton_clicked();
91
+		void on_fileRomReloadButton_clicked();
92
+
93
+		void on_emuControlRunButton_clicked();
94
+		void on_emuControlStepButton_clicked();
95
+		void on_emuControlPauseButton_clicked();
96
+		void on_emuControlStopButton_clicked();
97
+
98
+		void on_speakerVolumeSlider_valueChanged(int value);
99
+
100
+		void on_rtcSetCurrentButton_clicked();
101
+
102
+		void on_romGoToOSButton_clicked();
103
+		void on_romGoToAppButton_clicked();
104
+		void on_romMinusButton_clicked();
105
+		void on_romPlusButton_clicked();
106
+
107
+		void on_ramGoToOSButton_clicked();
108
+		void on_ramGoToSPButton_clicked();
109
+		void on_ramGoToAppButton_clicked();
110
+		void on_ramMinusButton_clicked();
111
+		void on_ramPlusButton_clicked();
112
+
113
+		void on_rs232RxSendButton_clicked();
114
+};
115
+
116
+#endif
0 117
new file mode 100644
... ...
@@ -0,0 +1,37 @@
1
+QT += core gui widgets multimedia
2
+
3
+CONFIG += c++14
4
+
5
+DEFINES += QT_DEPRECATED_WARNINGS
6
+CONFIG -= debug_and_release debug_and_release_target
7
+
8
+SOURCES += \
9
+    cpu.cpp \
10
+    fs.cpp \
11
+    io.cpp \
12
+    keyboard.cpp \
13
+    lcd.cpp \
14
+    lcdview.cpp \
15
+    led.cpp \
16
+    main.cpp \
17
+    emu.cpp \
18
+    rs232.cpp \
19
+    rtc.cpp \
20
+    speaker.cpp
21
+
22
+HEADERS += \
23
+    cpu.h \
24
+    emu.h \
25
+    font.h \
26
+    fs.h \
27
+    io.h \
28
+    keyboard.h \
29
+    lcd.h \
30
+    lcdview.h \
31
+    led.h \
32
+    rs232.h \
33
+    rtc.h \
34
+    speaker.h
35
+
36
+FORMS += \
37
+    emu.ui
0 38
new file mode 100644
... ...
@@ -0,0 +1,1817 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<ui version="4.0">
3
+ <class>Emu</class>
4
+ <widget class="QMainWindow" name="Emu">
5
+  <property name="geometry">
6
+   <rect>
7
+    <x>0</x>
8
+    <y>0</y>
9
+    <width>1410</width>
10
+    <height>850</height>
11
+   </rect>
12
+  </property>
13
+  <property name="minimumSize">
14
+   <size>
15
+    <width>1410</width>
16
+    <height>850</height>
17
+   </size>
18
+  </property>
19
+  <property name="maximumSize">
20
+   <size>
21
+    <width>1410</width>
22
+    <height>850</height>
23
+   </size>
24
+  </property>
25
+  <property name="font">
26
+   <font>
27
+    <family>DejaVu Sans Mono</family>
28
+    <pointsize>8</pointsize>
29
+    <weight>75</weight>
30
+    <bold>true</bold>
31
+   </font>
32
+  </property>
33
+  <property name="windowTitle">
34
+   <string>XiPU Emulator</string>
35
+  </property>
36
+  <property name="locale">
37
+   <locale language="English" country="UnitedStates"/>
38
+  </property>
39
+  <widget class="QWidget" name="centralwidget">
40
+   <widget class="LCDView" name="lcdBufferView">
41
+    <property name="geometry">
42
+     <rect>
43
+      <x>10</x>
44
+      <y>30</y>
45
+      <width>690</width>
46
+      <height>530</height>
47
+     </rect>
48
+    </property>
49
+   </widget>
50
+   <widget class="QLabel" name="regAValueHexLabel">
51
+    <property name="geometry">
52
+     <rect>
53
+      <x>770</x>
54
+      <y>180</y>
55
+      <width>30</width>
56
+      <height>20</height>
57
+     </rect>
58
+    </property>
59
+    <property name="frameShape">
60
+     <enum>QFrame::Box</enum>
61
+    </property>
62
+    <property name="text">
63
+     <string>FF</string>
64
+    </property>
65
+    <property name="alignment">
66
+     <set>Qt::AlignCenter</set>
67
+    </property>
68
+   </widget>
69
+   <widget class="QLabel" name="regALabel">
70
+    <property name="geometry">
71
+     <rect>
72
+      <x>710</x>
73
+      <y>180</y>
74
+      <width>50</width>
75
+      <height>20</height>
76
+     </rect>
77
+    </property>
78
+    <property name="text">
79
+     <string>A</string>
80
+    </property>
81
+    <property name="alignment">
82
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
83
+    </property>
84
+   </widget>
85
+   <widget class="QLabel" name="regAValueDecLabel">
86
+    <property name="geometry">
87
+     <rect>
88
+      <x>810</x>
89
+      <y>180</y>
90
+      <width>30</width>
91
+      <height>20</height>
92
+     </rect>
93
+    </property>
94
+    <property name="frameShape">
95
+     <enum>QFrame::Box</enum>
96
+    </property>
97
+    <property name="text">
98
+     <string>255</string>
99
+    </property>
100
+    <property name="alignment">
101
+     <set>Qt::AlignCenter</set>
102
+    </property>
103
+   </widget>
104
+   <widget class="QLabel" name="regAValueBinLabel">
105
+    <property name="geometry">
106
+     <rect>
107
+      <x>850</x>
108
+      <y>180</y>
109
+      <width>70</width>
110
+      <height>20</height>
111
+     </rect>
112
+    </property>
113
+    <property name="frameShape">
114
+     <enum>QFrame::Box</enum>
115
+    </property>
116
+    <property name="text">
117
+     <string>11111111</string>
118
+    </property>
119
+    <property name="alignment">
120
+     <set>Qt::AlignCenter</set>
121
+    </property>
122
+   </widget>
123
+   <widget class="QLabel" name="regHexLabel">
124
+    <property name="geometry">
125
+     <rect>
126
+      <x>770</x>
127
+      <y>160</y>
128
+      <width>30</width>
129
+      <height>20</height>
130
+     </rect>
131
+    </property>
132
+    <property name="text">
133
+     <string>HEX</string>
134
+    </property>
135
+    <property name="alignment">
136
+     <set>Qt::AlignCenter</set>
137
+    </property>
138
+   </widget>
139
+   <widget class="QLabel" name="regDecLabel">
140
+    <property name="geometry">
141
+     <rect>
142
+      <x>810</x>
143
+      <y>160</y>
144
+      <width>30</width>
145
+      <height>20</height>
146
+     </rect>
147
+    </property>
148
+    <property name="text">
149
+     <string>DEC</string>
150
+    </property>
151
+    <property name="alignment">
152
+     <set>Qt::AlignCenter</set>
153
+    </property>
154
+   </widget>
155
+   <widget class="QLabel" name="regBinLabel">
156
+    <property name="geometry">
157
+     <rect>
158
+      <x>850</x>
159
+      <y>160</y>
160
+      <width>70</width>
161
+      <height>20</height>
162
+     </rect>
163
+    </property>
164
+    <property name="text">
165
+     <string>BIN</string>
166
+    </property>
167
+    <property name="alignment">
168
+     <set>Qt::AlignCenter</set>
169
+    </property>
170
+   </widget>
171
+   <widget class="QLabel" name="regBLabel">
172
+    <property name="geometry">
173
+     <rect>
174
+      <x>710</x>
175
+      <y>210</y>
176
+      <width>50</width>
177
+      <height>20</height>
178
+     </rect>
179
+    </property>
180
+    <property name="text">
181
+     <string>B</string>
182
+    </property>
183
+    <property name="alignment">
184
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
185
+    </property>
186
+   </widget>
187
+   <widget class="QLabel" name="regBValueHexLabel">
188
+    <property name="geometry">
189
+     <rect>
190
+      <x>770</x>
191
+      <y>210</y>
192
+      <width>30</width>
193
+      <height>20</height>
194
+     </rect>
195
+    </property>
196
+    <property name="frameShape">
197
+     <enum>QFrame::Box</enum>
198
+    </property>
199
+    <property name="text">
200
+     <string>FF</string>
201
+    </property>
202
+    <property name="alignment">
203
+     <set>Qt::AlignCenter</set>
204
+    </property>
205
+   </widget>
206
+   <widget class="QLabel" name="regBValueDecLabel">
207
+    <property name="geometry">
208
+     <rect>
209
+      <x>810</x>
210
+      <y>210</y>
211
+      <width>30</width>
212
+      <height>20</height>
213
+     </rect>
214
+    </property>
215
+    <property name="frameShape">
216
+     <enum>QFrame::Box</enum>
217
+    </property>
218
+    <property name="text">
219
+     <string>255</string>
220
+    </property>
221
+    <property name="alignment">
222
+     <set>Qt::AlignCenter</set>
223
+    </property>
224
+   </widget>
225
+   <widget class="QLabel" name="regBValueBinLabel">
226
+    <property name="geometry">
227
+     <rect>
228
+      <x>850</x>
229
+      <y>210</y>
230
+      <width>70</width>
231
+      <height>20</height>
232
+     </rect>
233
+    </property>
234
+    <property name="frameShape">
235
+     <enum>QFrame::Box</enum>
236
+    </property>
237
+    <property name="text">
238
+     <string>11111111</string>
239
+    </property>
240
+    <property name="alignment">
241
+     <set>Qt::AlignCenter</set>
242
+    </property>
243
+   </widget>
244
+   <widget class="QLabel" name="regXLabel">
245
+    <property name="geometry">
246
+     <rect>
247
+      <x>710</x>
248
+      <y>240</y>
249
+      <width>50</width>
250
+      <height>20</height>
251
+     </rect>
252
+    </property>
253
+    <property name="text">
254
+     <string>X</string>
255
+    </property>
256
+    <property name="alignment">
257
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
258
+    </property>
259
+   </widget>
260
+   <widget class="QLabel" name="regXValueHexLabel">
261
+    <property name="geometry">
262
+     <rect>
263
+      <x>770</x>
264
+      <y>240</y>
265
+      <width>30</width>
266
+      <height>20</height>
267
+     </rect>
268
+    </property>
269
+    <property name="frameShape">
270
+     <enum>QFrame::Box</enum>
271
+    </property>
272
+    <property name="text">
273
+     <string>FF</string>
274
+    </property>
275
+    <property name="alignment">
276
+     <set>Qt::AlignCenter</set>
277
+    </property>
278
+   </widget>
279
+   <widget class="QLabel" name="regXValueDecLabel">
280
+    <property name="geometry">
281
+     <rect>
282
+      <x>810</x>
283
+      <y>240</y>
284
+      <width>30</width>
285
+      <height>20</height>
286
+     </rect>
287
+    </property>
288
+    <property name="frameShape">
289
+     <enum>QFrame::Box</enum>
290
+    </property>
291
+    <property name="text">
292
+     <string>255</string>
293
+    </property>
294
+    <property name="alignment">
295
+     <set>Qt::AlignCenter</set>
296
+    </property>
297
+   </widget>
298
+   <widget class="QLabel" name="regXValueBinLabel">
299
+    <property name="geometry">
300
+     <rect>
301
+      <x>850</x>
302
+      <y>240</y>
303
+      <width>70</width>
304
+      <height>20</height>
305
+     </rect>
306
+    </property>
307
+    <property name="frameShape">
308
+     <enum>QFrame::Box</enum>
309
+    </property>
310
+    <property name="text">
311
+     <string>11111111</string>
312
+    </property>
313
+    <property name="alignment">
314
+     <set>Qt::AlignCenter</set>
315
+    </property>
316
+   </widget>
317
+   <widget class="QLabel" name="regYLabel">
318
+    <property name="geometry">
319
+     <rect>
320
+      <x>710</x>
321
+      <y>270</y>
322
+      <width>50</width>
323
+      <height>20</height>
324
+     </rect>
325
+    </property>
326
+    <property name="text">
327
+     <string>Y</string>
328
+    </property>
329
+    <property name="alignment">
330
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
331
+    </property>
332
+   </widget>
333
+   <widget class="QLabel" name="regYValueHexLabel">
334
+    <property name="geometry">
335
+     <rect>
336
+      <x>770</x>
337
+      <y>270</y>
338
+      <width>30</width>
339
+      <height>20</height>
340
+     </rect>
341
+    </property>
342
+    <property name="frameShape">
343
+     <enum>QFrame::Box</enum>
344
+    </property>
345
+    <property name="text">
346
+     <string>FF</string>
347
+    </property>
348
+    <property name="alignment">
349
+     <set>Qt::AlignCenter</set>
350
+    </property>
351
+   </widget>
352
+   <widget class="QLabel" name="regYValueDecLabel">
353
+    <property name="geometry">
354
+     <rect>
355
+      <x>810</x>
356
+      <y>270</y>
357
+      <width>30</width>
358
+      <height>20</height>
359
+     </rect>
360
+    </property>
361
+    <property name="frameShape">
362
+     <enum>QFrame::Box</enum>
363
+    </property>
364
+    <property name="text">
365
+     <string>255</string>
366
+    </property>
367
+    <property name="alignment">
368
+     <set>Qt::AlignCenter</set>
369
+    </property>
370
+   </widget>
371
+   <widget class="QLabel" name="regYValueBinLabel">
372
+    <property name="geometry">
373
+     <rect>
374
+      <x>850</x>
375
+      <y>270</y>
376
+      <width>70</width>
377
+      <height>20</height>
378
+     </rect>
379
+    </property>
380
+    <property name="frameShape">
381
+     <enum>QFrame::Box</enum>
382
+    </property>
383
+    <property name="text">
384
+     <string>11111111</string>
385
+    </property>
386
+    <property name="alignment">
387
+     <set>Qt::AlignCenter</set>
388
+    </property>
389
+   </widget>
390
+   <widget class="QLabel" name="regINLabel">
391
+    <property name="geometry">
392
+     <rect>
393
+      <x>710</x>
394
+      <y>300</y>
395
+      <width>50</width>
396
+      <height>20</height>
397
+     </rect>
398
+    </property>
399
+    <property name="text">
400
+     <string>IN</string>
401
+    </property>
402
+    <property name="alignment">
403
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
404
+    </property>
405
+   </widget>
406
+   <widget class="QLabel" name="regINValueHexLabel">
407
+    <property name="geometry">
408
+     <rect>
409
+      <x>770</x>
410
+      <y>300</y>
411
+      <width>30</width>
412
+      <height>20</height>
413
+     </rect>
414
+    </property>
415
+    <property name="frameShape">
416
+     <enum>QFrame::Box</enum>
417
+    </property>
418
+    <property name="text">
419
+     <string>FF</string>
420
+    </property>
421
+    <property name="alignment">
422
+     <set>Qt::AlignCenter</set>
423
+    </property>
424
+   </widget>
425
+   <widget class="QLabel" name="regINValueDecLabel">
426
+    <property name="geometry">
427
+     <rect>
428
+      <x>810</x>
429
+      <y>300</y>
430
+      <width>30</width>
431
+      <height>20</height>
432
+     </rect>
433
+    </property>
434
+    <property name="frameShape">
435
+     <enum>QFrame::Box</enum>
436
+    </property>
437
+    <property name="text">
438
+     <string>255</string>
439
+    </property>
440
+    <property name="alignment">
441
+     <set>Qt::AlignCenter</set>
442
+    </property>
443
+   </widget>
444
+   <widget class="QLabel" name="regINValueBinLabel">
445
+    <property name="geometry">
446
+     <rect>
447
+      <x>850</x>
448
+      <y>300</y>
449
+      <width>70</width>
450
+      <height>20</height>
451
+     </rect>
452
+    </property>
453
+    <property name="frameShape">
454
+     <enum>QFrame::Box</enum>
455
+    </property>
456
+    <property name="text">
457
+     <string>11111111</string>
458
+    </property>
459
+    <property name="alignment">
460
+     <set>Qt::AlignCenter</set>
461
+    </property>
462
+   </widget>
463
+   <widget class="QLabel" name="regOUTLabel">
464
+    <property name="geometry">
465
+     <rect>
466
+      <x>710</x>
467
+      <y>330</y>
468
+      <width>50</width>
469
+      <height>20</height>
470
+     </rect>
471
+    </property>
472
+    <property name="text">
473
+     <string>OUT</string>
474
+    </property>
475
+    <property name="alignment">
476
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
477
+    </property>
478
+   </widget>
479
+   <widget class="QLabel" name="regOUTValueHexLabel">
480
+    <property name="geometry">
481
+     <rect>
482
+      <x>770</x>
483
+      <y>330</y>
484
+      <width>30</width>
485
+      <height>20</height>
486
+     </rect>
487
+    </property>
488
+    <property name="frameShape">
489
+     <enum>QFrame::Box</enum>
490
+    </property>
491
+    <property name="text">
492
+     <string>FF</string>
493
+    </property>
494
+    <property name="alignment">
495
+     <set>Qt::AlignCenter</set>
496
+    </property>
497
+   </widget>
498
+   <widget class="QLabel" name="regOUTValueDecLabel">
499
+    <property name="geometry">
500
+     <rect>
501
+      <x>810</x>
502
+      <y>330</y>
503
+      <width>30</width>
504
+      <height>20</height>
505
+     </rect>
506
+    </property>
507
+    <property name="frameShape">
508
+     <enum>QFrame::Box</enum>
509
+    </property>
510
+    <property name="text">
511
+     <string>255</string>
512
+    </property>
513
+    <property name="alignment">
514
+     <set>Qt::AlignCenter</set>
515
+    </property>
516
+   </widget>
517
+   <widget class="QLabel" name="regOUTValueBinLabel">
518
+    <property name="geometry">
519
+     <rect>
520
+      <x>850</x>
521
+      <y>330</y>
522
+      <width>70</width>
523
+      <height>20</height>
524
+     </rect>
525
+    </property>
526
+    <property name="frameShape">
527
+     <enum>QFrame::Box</enum>
528
+    </property>
529
+    <property name="text">
530
+     <string>11111111</string>
531
+    </property>
532
+    <property name="alignment">
533
+     <set>Qt::AlignCenter</set>
534
+    </property>
535
+   </widget>
536
+   <widget class="QLabel" name="regPCHLabel">
537
+    <property name="geometry">
538
+     <rect>
539
+      <x>920</x>
540
+      <y>240</y>
541
+      <width>50</width>
542
+      <height>20</height>
543
+     </rect>
544
+    </property>
545
+    <property name="text">
546
+     <string>PCH</string>
547
+    </property>
548
+    <property name="alignment">
549
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
550
+    </property>
551
+   </widget>
552
+   <widget class="QLabel" name="regPCHValueLabel">
553
+    <property name="geometry">
554
+     <rect>
555
+      <x>980</x>
556
+      <y>240</y>
557
+      <width>30</width>
558
+      <height>20</height>
559
+     </rect>
560
+    </property>
561
+    <property name="frameShape">
562
+     <enum>QFrame::Box</enum>
563
+    </property>
564
+    <property name="text">
565
+     <string>FF</string>
566
+    </property>
567
+    <property name="alignment">
568
+     <set>Qt::AlignCenter</set>
569
+    </property>
570
+   </widget>
571
+   <widget class="QLabel" name="regPCLLabel">
572
+    <property name="geometry">
573
+     <rect>
574
+      <x>1010</x>
575
+      <y>240</y>
576
+      <width>40</width>
577
+      <height>20</height>
578
+     </rect>
579
+    </property>
580
+    <property name="text">
581
+     <string>PCL</string>
582
+    </property>
583
+    <property name="alignment">
584
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
585
+    </property>
586
+   </widget>
587
+   <widget class="QLabel" name="regPCLValueLabel">
588
+    <property name="geometry">
589
+     <rect>
590
+      <x>1060</x>
591
+      <y>240</y>
592
+      <width>30</width>
593
+      <height>20</height>
594
+     </rect>
595
+    </property>
596
+    <property name="frameShape">
597
+     <enum>QFrame::Box</enum>
598
+    </property>
599
+    <property name="text">
600
+     <string>FF</string>
601
+    </property>
602
+    <property name="alignment">
603
+     <set>Qt::AlignCenter</set>
604
+    </property>
605
+   </widget>
606
+   <widget class="QLabel" name="regSPHLabel">
607
+    <property name="geometry">
608
+     <rect>
609
+      <x>920</x>
610
+      <y>270</y>
611
+      <width>50</width>
612
+      <height>20</height>
613
+     </rect>
614
+    </property>
615
+    <property name="text">
616
+     <string>SPH</string>
617
+    </property>
618
+    <property name="alignment">
619
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
620
+    </property>
621
+   </widget>
622
+   <widget class="QLabel" name="regSPHValueLabel">
623
+    <property name="geometry">
624
+     <rect>
625
+      <x>980</x>
626
+      <y>270</y>
627
+      <width>30</width>
628
+      <height>20</height>
629
+     </rect>
630
+    </property>
631
+    <property name="frameShape">
632
+     <enum>QFrame::Box</enum>
633
+    </property>
634
+    <property name="text">
635
+     <string>0F</string>
636
+    </property>
637
+    <property name="alignment">
638
+     <set>Qt::AlignCenter</set>
639
+    </property>
640
+   </widget>
641
+   <widget class="QLabel" name="regSPLLabel">
642
+    <property name="geometry">
643
+     <rect>
644
+      <x>1010</x>
645
+      <y>270</y>
646
+      <width>40</width>
647
+      <height>20</height>
648
+     </rect>
649
+    </property>
650
+    <property name="text">
651
+     <string>SPL</string>
652
+    </property>
653
+    <property name="alignment">
654
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
655
+    </property>
656
+   </widget>
657
+   <widget class="QLabel" name="regSPLValueLabel">
658
+    <property name="geometry">
659
+     <rect>
660
+      <x>1060</x>
661
+      <y>270</y>
662
+      <width>30</width>
663
+      <height>20</height>
664
+     </rect>
665
+    </property>
666
+    <property name="frameShape">
667
+     <enum>QFrame::Box</enum>
668
+    </property>
669
+    <property name="text">
670
+     <string>FF</string>
671
+    </property>
672
+    <property name="alignment">
673
+     <set>Qt::AlignCenter</set>
674
+    </property>
675
+   </widget>
676
+   <widget class="QLabel" name="regILabel">
677
+    <property name="geometry">
678
+     <rect>
679
+      <x>920</x>
680
+      <y>180</y>
681
+      <width>50</width>
682
+      <height>20</height>
683
+     </rect>
684
+    </property>
685
+    <property name="text">
686
+     <string>I</string>
687
+    </property>
688
+    <property name="alignment">
689
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
690
+    </property>
691
+   </widget>
692
+   <widget class="QLabel" name="regIValueHexLabel">
693
+    <property name="geometry">
694
+     <rect>
695
+      <x>980</x>
696
+      <y>180</y>
697
+      <width>30</width>
698
+      <height>20</height>
699
+     </rect>
700
+    </property>
701
+    <property name="frameShape">
702
+     <enum>QFrame::Box</enum>
703
+    </property>
704
+    <property name="text">
705
+     <string>FF</string>
706
+    </property>
707
+    <property name="alignment">
708
+     <set>Qt::AlignCenter</set>
709
+    </property>
710
+   </widget>
711
+   <widget class="QPlainTextEdit" name="romText">
712
+    <property name="enabled">
713
+     <bool>true</bool>
714
+    </property>
715
+    <property name="geometry">
716
+     <rect>
717
+      <x>710</x>
718
+      <y>420</y>
719
+      <width>340</width>
720
+      <height>220</height>
721
+     </rect>
722
+    </property>
723
+    <property name="verticalScrollBarPolicy">
724
+     <enum>Qt::ScrollBarAlwaysOff</enum>
725
+    </property>
726
+    <property name="horizontalScrollBarPolicy">
727
+     <enum>Qt::ScrollBarAlwaysOff</enum>
728
+    </property>
729
+    <property name="readOnly">
730
+     <bool>true</bool>
731
+    </property>
732
+    <property name="plainText">
733
+     <string>00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
734
+01 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
735
+02 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
736
+03 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
737
+04 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
738
+05 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
739
+06 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
740
+07 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
741
+08 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
742
+09 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
743
+0A 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
744
+0B 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
745
+0C 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
746
+0D 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
747
+0E 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
748
+0F 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF</string>
749
+    </property>
750
+   </widget>
751
+   <widget class="QLabel" name="lcdBufferLabel">
752
+    <property name="geometry">
753
+     <rect>
754
+      <x>20</x>
755
+      <y>10</y>
756
+      <width>180</width>
757
+      <height>20</height>
758
+     </rect>
759
+    </property>
760
+    <property name="text">
761
+     <string>LCD - 40 x 30</string>
762
+    </property>
763
+    <property name="alignment">
764
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
765
+    </property>
766
+   </widget>
767
+   <widget class="QLabel" name="romLabel">
768
+    <property name="geometry">
769
+     <rect>
770
+      <x>720</x>
771
+      <y>400</y>
772
+      <width>120</width>
773
+      <height>20</height>
774
+     </rect>
775
+    </property>
776
+    <property name="text">
777
+     <string>ROM - 64K</string>
778
+    </property>
779
+    <property name="alignment">
780
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
781
+    </property>
782
+   </widget>
783
+   <widget class="QLabel" name="ramLabel">
784
+    <property name="geometry">
785
+     <rect>
786
+      <x>1070</x>
787
+      <y>400</y>
788
+      <width>120</width>
789
+      <height>20</height>
790
+     </rect>
791
+    </property>
792
+    <property name="text">
793
+     <string>RAM - 32K</string>
794
+    </property>
795
+    <property name="alignment">
796
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
797
+    </property>
798
+   </widget>
799
+   <widget class="QLabel" name="regSPLMaxValueLabel">
800
+    <property name="geometry">
801
+     <rect>
802
+      <x>1060</x>
803
+      <y>300</y>
804
+      <width>30</width>
805
+      <height>20</height>
806
+     </rect>
807
+    </property>
808
+    <property name="frameShape">
809
+     <enum>QFrame::Box</enum>
810
+    </property>
811
+    <property name="text">
812
+     <string>1F</string>
813
+    </property>
814
+    <property name="alignment">
815
+     <set>Qt::AlignCenter</set>
816
+    </property>
817
+   </widget>
818
+   <widget class="QLabel" name="regSPLMaxLabel">
819
+    <property name="geometry">
820
+     <rect>
821
+      <x>980</x>
822
+      <y>300</y>
823
+      <width>70</width>
824
+      <height>20</height>
825
+     </rect>
826
+    </property>
827
+    <property name="text">
828
+     <string>MAX SPL</string>
829
+    </property>
830
+    <property name="alignment">
831
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
832
+    </property>
833
+   </widget>
834
+   <widget class="QPlainTextEdit" name="ramText">
835
+    <property name="geometry">
836
+     <rect>
837
+      <x>1060</x>
838
+      <y>420</y>
839
+      <width>340</width>
840
+      <height>220</height>
841
+     </rect>
842
+    </property>
843
+    <property name="verticalScrollBarPolicy">
844
+     <enum>Qt::ScrollBarAlwaysOff</enum>
845
+    </property>
846
+    <property name="horizontalScrollBarPolicy">
847
+     <enum>Qt::ScrollBarAlwaysOff</enum>
848
+    </property>
849
+    <property name="readOnly">
850
+     <bool>true</bool>
851
+    </property>
852
+    <property name="plainText">
853
+     <string>00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
854
+01 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
855
+02 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
856
+03 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
857
+04 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
858
+05 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
859
+06 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
860
+07 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
861
+08 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
862
+09 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
863
+0A 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
864
+0B 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
865
+0C 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
866
+0D 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
867
+0E 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
868
+0F 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF</string>
869
+    </property>
870
+   </widget>
871
+   <widget class="QLabel" name="romAddressLabel">
872
+    <property name="geometry">
873
+     <rect>
874
+      <x>900</x>
875
+      <y>640</y>
876
+      <width>100</width>
877
+      <height>30</height>
878
+     </rect>
879
+    </property>
880
+    <property name="text">
881
+     <string>0000 - 00FF</string>
882
+    </property>
883
+    <property name="alignment">
884
+     <set>Qt::AlignCenter</set>
885
+    </property>
886
+   </widget>
887
+   <widget class="QPushButton" name="romMinusButton">
888
+    <property name="geometry">
889
+     <rect>
890
+      <x>850</x>
891
+      <y>640</y>
892
+      <width>50</width>
893
+      <height>30</height>
894
+     </rect>
895
+    </property>
896
+    <property name="text">
897
+     <string>&lt;&lt;</string>
898
+    </property>
899
+   </widget>
900
+   <widget class="QPushButton" name="romPlusButton">
901
+    <property name="geometry">
902
+     <rect>
903
+      <x>1000</x>
904
+      <y>640</y>
905
+      <width>50</width>
906
+      <height>30</height>
907
+     </rect>
908
+    </property>
909
+    <property name="text">
910
+     <string>&gt;&gt;</string>
911
+    </property>
912
+   </widget>
913
+   <widget class="QPushButton" name="ramMinusButton">
914
+    <property name="geometry">
915
+     <rect>
916
+      <x>1200</x>
917
+      <y>640</y>
918
+      <width>50</width>
919
+      <height>30</height>
920
+     </rect>
921
+    </property>
922
+    <property name="text">
923
+     <string>&lt;&lt;</string>
924
+    </property>
925
+   </widget>
926
+   <widget class="QPushButton" name="ramPlusButton">
927
+    <property name="geometry">
928
+     <rect>
929
+      <x>1350</x>
930
+      <y>640</y>
931
+      <width>50</width>
932
+      <height>30</height>
933
+     </rect>
934
+    </property>
935
+    <property name="text">
936
+     <string>&gt;&gt;</string>
937
+    </property>
938
+   </widget>
939
+   <widget class="QLabel" name="ramAddressLabel">
940
+    <property name="geometry">
941
+     <rect>
942
+      <x>1250</x>
943
+      <y>640</y>
944
+      <width>100</width>
945
+      <height>30</height>
946
+     </rect>
947
+    </property>
948
+    <property name="text">
949
+     <string>0000 - 00FF</string>
950
+    </property>
951
+    <property name="alignment">
952
+     <set>Qt::AlignCenter</set>
953
+    </property>
954
+   </widget>
955
+   <widget class="QPushButton" name="emuControlRunButton">
956
+    <property name="geometry">
957
+     <rect>
958
+      <x>1170</x>
959
+      <y>240</y>
960
+      <width>50</width>
961
+      <height>30</height>
962
+     </rect>
963
+    </property>
964
+    <property name="text">
965
+     <string>Run</string>
966
+    </property>
967
+   </widget>
968
+   <widget class="QPushButton" name="emuControlStepButton">
969
+    <property name="geometry">
970
+     <rect>
971
+      <x>1230</x>
972
+      <y>240</y>
973
+      <width>50</width>
974
+      <height>30</height>
975
+     </rect>
976
+    </property>
977
+    <property name="text">
978
+     <string>Step</string>
979
+    </property>
980
+   </widget>
981
+   <widget class="QPushButton" name="emuControlPauseButton">
982
+    <property name="geometry">
983
+     <rect>
984
+      <x>1290</x>
985
+      <y>240</y>
986
+      <width>50</width>
987
+      <height>30</height>
988
+     </rect>
989
+    </property>
990
+    <property name="text">
991
+     <string>Pause</string>
992
+    </property>
993
+   </widget>
994
+   <widget class="QPushButton" name="emuControlStopButton">
995
+    <property name="geometry">
996
+     <rect>
997
+      <x>1350</x>
998
+      <y>240</y>
999
+      <width>50</width>
1000
+      <height>30</height>
1001
+     </rect>
1002
+    </property>
1003
+    <property name="text">
1004
+     <string>Stop</string>
1005
+    </property>
1006
+   </widget>
1007
+   <widget class="QLabel" name="emuStatusLabel">
1008
+    <property name="geometry">
1009
+     <rect>
1010
+      <x>1170</x>
1011
+      <y>180</y>
1012
+      <width>50</width>
1013
+      <height>20</height>
1014
+     </rect>
1015
+    </property>
1016
+    <property name="text">
1017
+     <string>Status</string>
1018
+    </property>
1019
+    <property name="alignment">
1020
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1021
+    </property>
1022
+   </widget>
1023
+   <widget class="QLabel" name="emuStatusValueLabel">
1024
+    <property name="geometry">
1025
+     <rect>
1026
+      <x>1230</x>
1027
+      <y>180</y>
1028
+      <width>170</width>
1029
+      <height>20</height>
1030
+     </rect>
1031
+    </property>
1032
+    <property name="frameShape">
1033
+     <enum>QFrame::Box</enum>
1034
+    </property>
1035
+    <property name="text">
1036
+     <string>Running</string>
1037
+    </property>
1038
+    <property name="alignment">
1039
+     <set>Qt::AlignCenter</set>
1040
+    </property>
1041
+   </widget>
1042
+   <widget class="QLabel" name="emuTimeValueLabel">
1043
+    <property name="geometry">
1044
+     <rect>
1045
+      <x>1230</x>
1046
+      <y>210</y>
1047
+      <width>170</width>
1048
+      <height>20</height>
1049
+     </rect>
1050
+    </property>
1051
+    <property name="frameShape">
1052
+     <enum>QFrame::Box</enum>
1053
+    </property>
1054
+    <property name="text">
1055
+     <string>00:01:23.012</string>
1056
+    </property>
1057
+    <property name="alignment">
1058
+     <set>Qt::AlignCenter</set>
1059
+    </property>
1060
+   </widget>
1061
+   <widget class="QLabel" name="emuTimeLabel">
1062
+    <property name="geometry">
1063
+     <rect>
1064
+      <x>1170</x>
1065
+      <y>210</y>
1066
+      <width>50</width>
1067
+      <height>20</height>
1068
+     </rect>
1069
+    </property>
1070
+    <property name="text">
1071
+     <string>Time</string>
1072
+    </property>
1073
+    <property name="alignment">
1074
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1075
+    </property>
1076
+   </widget>
1077
+   <widget class="QLabel" name="ledRunLabel">
1078
+    <property name="geometry">
1079
+     <rect>
1080
+      <x>730</x>
1081
+      <y>700</y>
1082
+      <width>70</width>
1083
+      <height>20</height>
1084
+     </rect>
1085
+    </property>
1086
+    <property name="text">
1087
+     <string>LED Run</string>
1088
+    </property>
1089
+    <property name="alignment">
1090
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1091
+    </property>
1092
+   </widget>
1093
+   <widget class="QLabel" name="ledErrorLabel">
1094
+    <property name="geometry">
1095
+     <rect>
1096
+      <x>730</x>
1097
+      <y>730</y>
1098
+      <width>70</width>
1099
+      <height>20</height>
1100
+     </rect>
1101
+    </property>
1102
+    <property name="text">
1103
+     <string>LED Error</string>
1104
+    </property>
1105
+    <property name="alignment">
1106
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1107
+    </property>
1108
+   </widget>
1109
+   <widget class="QLabel" name="ledRunValueLabel">
1110
+    <property name="geometry">
1111
+     <rect>
1112
+      <x>810</x>
1113
+      <y>700</y>
1114
+      <width>40</width>
1115
+      <height>20</height>
1116
+     </rect>
1117
+    </property>
1118
+    <property name="font">
1119
+     <font>
1120
+      <family>DejaVu Sans Mono</family>
1121
+      <pointsize>8</pointsize>
1122
+      <weight>75</weight>
1123
+      <bold>true</bold>
1124
+     </font>
1125
+    </property>
1126
+    <property name="frameShape">
1127
+     <enum>QFrame::Box</enum>
1128
+    </property>
1129
+    <property name="text">
1130
+     <string/>
1131
+    </property>
1132
+    <property name="alignment">
1133
+     <set>Qt::AlignCenter</set>
1134
+    </property>
1135
+   </widget>
1136
+   <widget class="QLabel" name="ledErrorValueLabel">
1137
+    <property name="geometry">
1138
+     <rect>
1139
+      <x>810</x>
1140
+      <y>730</y>
1141
+      <width>40</width>
1142
+      <height>20</height>
1143
+     </rect>
1144
+    </property>
1145
+    <property name="frameShape">
1146
+     <enum>QFrame::Box</enum>
1147
+    </property>
1148
+    <property name="text">
1149
+     <string/>
1150
+    </property>
1151
+    <property name="alignment">
1152
+     <set>Qt::AlignCenter</set>
1153
+    </property>
1154
+   </widget>
1155
+   <widget class="QPlainTextEdit" name="rs232TxText">
1156
+    <property name="geometry">
1157
+     <rect>
1158
+      <x>10</x>
1159
+      <y>590</y>
1160
+      <width>340</width>
1161
+      <height>220</height>
1162
+     </rect>
1163
+    </property>
1164
+    <property name="verticalScrollBarPolicy">
1165
+     <enum>Qt::ScrollBarAlwaysOn</enum>
1166
+    </property>
1167
+    <property name="horizontalScrollBarPolicy">
1168
+     <enum>Qt::ScrollBarAlwaysOff</enum>
1169
+    </property>
1170
+    <property name="readOnly">
1171
+     <bool>true</bool>
1172
+    </property>
1173
+    <property name="plainText">
1174
+     <string>00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1175
+01 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1176
+02 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1177
+03 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1178
+04 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1179
+05 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1180
+06 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1181
+07 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1182
+08 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1183
+09 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1184
+0A 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1185
+0B 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1186
+0C 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1187
+0D 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1188
+0E 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1189
+0F 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF</string>
1190
+    </property>
1191
+   </widget>
1192
+   <widget class="QPlainTextEdit" name="rs232RxText">
1193
+    <property name="geometry">
1194
+     <rect>
1195
+      <x>360</x>
1196
+      <y>590</y>
1197
+      <width>340</width>
1198
+      <height>220</height>
1199
+     </rect>
1200
+    </property>
1201
+    <property name="verticalScrollBarPolicy">
1202
+     <enum>Qt::ScrollBarAlwaysOn</enum>
1203
+    </property>
1204
+    <property name="horizontalScrollBarPolicy">
1205
+     <enum>Qt::ScrollBarAlwaysOff</enum>
1206
+    </property>
1207
+    <property name="readOnly">
1208
+     <bool>true</bool>
1209
+    </property>
1210
+    <property name="plainText">
1211
+     <string>00 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1212
+01 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1213
+02 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1214
+03 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1215
+04 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1216
+05 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1217
+06 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1218
+07 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1219
+08 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1220
+09 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1221
+0A 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1222
+0B 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1223
+0C 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1224
+0D 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1225
+0E 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF
1226
+0F 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF</string>
1227
+    </property>
1228
+   </widget>
1229
+   <widget class="QLineEdit" name="rs232RxEdit">
1230
+    <property name="geometry">
1231
+     <rect>
1232
+      <x>360</x>
1233
+      <y>810</y>
1234
+      <width>290</width>
1235
+      <height>30</height>
1236
+     </rect>
1237
+    </property>
1238
+    <property name="maxLength">
1239
+     <number>38</number>
1240
+    </property>
1241
+   </widget>
1242
+   <widget class="QPushButton" name="rs232RxSendButton">
1243
+    <property name="geometry">
1244
+     <rect>
1245
+      <x>650</x>
1246
+      <y>810</y>
1247
+      <width>50</width>
1248
+      <height>30</height>
1249
+     </rect>
1250
+    </property>
1251
+    <property name="text">
1252
+     <string>SEND</string>
1253
+    </property>
1254
+   </widget>
1255
+   <widget class="QLabel" name="rs232TxLabel">
1256
+    <property name="geometry">
1257
+     <rect>
1258
+      <x>20</x>
1259
+      <y>570</y>
1260
+      <width>180</width>
1261
+      <height>20</height>
1262
+     </rect>
1263
+    </property>
1264
+    <property name="text">
1265
+     <string>RS232 - TX</string>
1266
+    </property>
1267
+    <property name="alignment">
1268
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
1269
+    </property>
1270
+   </widget>
1271
+   <widget class="QLabel" name="rs232RxLabel">
1272
+    <property name="geometry">
1273
+     <rect>
1274
+      <x>370</x>
1275
+      <y>570</y>
1276
+      <width>180</width>
1277
+      <height>20</height>
1278
+     </rect>
1279
+    </property>
1280
+    <property name="text">
1281
+     <string>RS232 - RX</string>
1282
+    </property>
1283
+    <property name="alignment">
1284
+     <set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignVCenter</set>
1285
+    </property>
1286
+   </widget>
1287
+   <widget class="QSlider" name="speakerVolumeSlider">
1288
+    <property name="geometry">
1289
+     <rect>
1290
+      <x>1180</x>
1291
+      <y>720</y>
1292
+      <width>120</width>
1293
+      <height>30</height>
1294
+     </rect>
1295
+    </property>
1296
+    <property name="maximum">
1297
+     <number>100</number>
1298
+    </property>
1299
+    <property name="singleStep">
1300
+     <number>10</number>
1301
+    </property>
1302
+    <property name="value">
1303
+     <number>100</number>
1304
+    </property>
1305
+    <property name="orientation">
1306
+     <enum>Qt::Horizontal</enum>
1307
+    </property>
1308
+    <property name="tickPosition">
1309
+     <enum>QSlider::TicksBothSides</enum>
1310
+    </property>
1311
+    <property name="tickInterval">
1312
+     <number>10</number>
1313
+    </property>
1314
+   </widget>
1315
+   <widget class="QLabel" name="speakerVolumeValueLabel">
1316
+    <property name="geometry">
1317
+     <rect>
1318
+      <x>1310</x>
1319
+      <y>720</y>
1320
+      <width>50</width>
1321
+      <height>30</height>
1322
+     </rect>
1323
+    </property>
1324
+    <property name="frameShape">
1325
+     <enum>QFrame::Box</enum>
1326
+    </property>
1327
+    <property name="text">
1328
+     <string>100%</string>
1329
+    </property>
1330
+    <property name="alignment">
1331
+     <set>Qt::AlignCenter</set>
1332
+    </property>
1333
+   </widget>
1334
+   <widget class="QLabel" name="speakerVolumeLabel">
1335
+    <property name="geometry">
1336
+     <rect>
1337
+      <x>1070</x>
1338
+      <y>720</y>
1339
+      <width>100</width>
1340
+      <height>30</height>
1341
+     </rect>
1342
+    </property>
1343
+    <property name="text">
1344
+     <string>Volume</string>
1345
+    </property>
1346
+    <property name="alignment">
1347
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1348
+    </property>
1349
+   </widget>
1350
+   <widget class="QLabel" name="speakerBufferLabel">
1351
+    <property name="geometry">
1352
+     <rect>
1353
+      <x>1070</x>
1354
+      <y>760</y>
1355
+      <width>100</width>
1356
+      <height>20</height>
1357
+     </rect>
1358
+    </property>
1359
+    <property name="text">
1360
+     <string>Speaker Buffer</string>
1361
+    </property>
1362
+    <property name="alignment">
1363
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1364
+    </property>
1365
+   </widget>
1366
+   <widget class="QLabel" name="speakerBufferValueLabel">
1367
+    <property name="geometry">
1368
+     <rect>
1369
+      <x>1180</x>
1370
+      <y>760</y>
1371
+      <width>50</width>
1372
+      <height>20</height>
1373
+     </rect>
1374
+    </property>
1375
+    <property name="frameShape">
1376
+     <enum>QFrame::Box</enum>
1377
+    </property>
1378
+    <property name="text">
1379
+     <string>100%</string>
1380
+    </property>
1381
+    <property name="alignment">
1382
+     <set>Qt::AlignCenter</set>
1383
+    </property>
1384
+   </widget>
1385
+   <widget class="QLabel" name="rtcValueLabel">
1386
+    <property name="geometry">
1387
+     <rect>
1388
+      <x>810</x>
1389
+      <y>810</y>
1390
+      <width>161</width>
1391
+      <height>20</height>
1392
+     </rect>
1393
+    </property>
1394
+    <property name="frameShape">
1395
+     <enum>QFrame::Box</enum>
1396
+    </property>
1397
+    <property name="text">
1398
+     <string>19:23:56 01.12.2020</string>
1399
+    </property>
1400
+    <property name="alignment">
1401
+     <set>Qt::AlignCenter</set>
1402
+    </property>
1403
+   </widget>
1404
+   <widget class="QLabel" name="rtcLabel">
1405
+    <property name="geometry">
1406
+     <rect>
1407
+      <x>730</x>
1408
+      <y>810</y>
1409
+      <width>70</width>
1410
+      <height>20</height>
1411
+     </rect>
1412
+    </property>
1413
+    <property name="text">
1414
+     <string>RTC</string>
1415
+    </property>
1416
+    <property name="alignment">
1417
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1418
+    </property>
1419
+   </widget>
1420
+   <widget class="QPushButton" name="rtcSetCurrentButton">
1421
+    <property name="geometry">
1422
+     <rect>
1423
+      <x>970</x>
1424
+      <y>810</y>
1425
+      <width>90</width>
1426
+      <height>20</height>
1427
+     </rect>
1428
+    </property>
1429
+    <property name="text">
1430
+     <string>Set Current</string>
1431
+    </property>
1432
+   </widget>
1433
+   <widget class="QLabel" name="regCValueLabel">
1434
+    <property name="geometry">
1435
+     <rect>
1436
+      <x>980</x>
1437
+      <y>210</y>
1438
+      <width>30</width>
1439
+      <height>20</height>
1440
+     </rect>
1441
+    </property>
1442
+    <property name="frameShape">
1443
+     <enum>QFrame::Box</enum>
1444
+    </property>
1445
+    <property name="text">
1446
+     <string>1</string>
1447
+    </property>
1448
+    <property name="alignment">
1449
+     <set>Qt::AlignCenter</set>
1450
+    </property>
1451
+   </widget>
1452
+   <widget class="QLabel" name="regCLabel">
1453
+    <property name="geometry">
1454
+     <rect>
1455
+      <x>920</x>
1456
+      <y>210</y>
1457
+      <width>50</width>
1458
+      <height>20</height>
1459
+     </rect>
1460
+    </property>
1461
+    <property name="text">
1462
+     <string>C</string>
1463
+    </property>
1464
+    <property name="alignment">
1465
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1466
+    </property>
1467
+   </widget>
1468
+   <widget class="QLabel" name="fileUrom0Label">
1469
+    <property name="geometry">
1470
+     <rect>
1471
+      <x>710</x>
1472
+      <y>30</y>
1473
+      <width>70</width>
1474
+      <height>20</height>
1475
+     </rect>
1476
+    </property>
1477
+    <property name="text">
1478
+     <string>UROM 0</string>
1479
+    </property>
1480
+    <property name="alignment">
1481
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1482
+    </property>
1483
+   </widget>
1484
+   <widget class="QLabel" name="fileFSDirLabel">
1485
+    <property name="geometry">
1486
+     <rect>
1487
+      <x>710</x>
1488
+      <y>120</y>
1489
+      <width>70</width>
1490
+      <height>20</height>
1491
+     </rect>
1492
+    </property>
1493
+    <property name="text">
1494
+     <string>FS DIR</string>
1495
+    </property>
1496
+    <property name="alignment">
1497
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1498
+    </property>
1499
+   </widget>
1500
+   <widget class="QPushButton" name="fileFSDirOpenButton">
1501
+    <property name="geometry">
1502
+     <rect>
1503
+      <x>1300</x>
1504
+      <y>120</y>
1505
+      <width>50</width>
1506
+      <height>20</height>
1507
+     </rect>
1508
+    </property>
1509
+    <property name="text">
1510
+     <string>Open</string>
1511
+    </property>
1512
+   </widget>
1513
+   <widget class="QLabel" name="fileRomPathLabel">
1514
+    <property name="geometry">
1515
+     <rect>
1516
+      <x>790</x>
1517
+      <y>90</y>
1518
+      <width>510</width>
1519
+      <height>20</height>
1520
+     </rect>
1521
+    </property>
1522
+    <property name="frameShape">
1523
+     <enum>QFrame::Box</enum>
1524
+    </property>
1525
+    <property name="text">
1526
+     <string>C:/plik/plik.a</string>
1527
+    </property>
1528
+   </widget>
1529
+   <widget class="QPushButton" name="fileUrom0OpenButton">
1530
+    <property name="geometry">
1531
+     <rect>
1532
+      <x>1300</x>
1533
+      <y>30</y>
1534
+      <width>50</width>
1535
+      <height>20</height>
1536
+     </rect>
1537
+    </property>
1538
+    <property name="text">
1539
+     <string>Open</string>
1540
+    </property>
1541
+   </widget>
1542
+   <widget class="QPushButton" name="fileUrom1OpenButton">
1543
+    <property name="geometry">
1544
+     <rect>
1545
+      <x>1300</x>
1546
+      <y>60</y>
1547
+      <width>50</width>
1548
+      <height>20</height>
1549
+     </rect>
1550
+    </property>
1551
+    <property name="text">
1552
+     <string>Open</string>
1553
+    </property>
1554
+   </widget>
1555
+   <widget class="QPushButton" name="fileRomOpenButton">
1556
+    <property name="geometry">
1557
+     <rect>
1558
+      <x>1300</x>
1559
+      <y>90</y>
1560
+      <width>50</width>
1561
+      <height>20</height>
1562
+     </rect>
1563
+    </property>
1564
+    <property name="text">
1565
+     <string>Open</string>
1566
+    </property>
1567
+   </widget>
1568
+   <widget class="QLabel" name="fileRomLabel">
1569
+    <property name="geometry">
1570
+     <rect>
1571
+      <x>710</x>
1572
+      <y>90</y>
1573
+      <width>70</width>
1574
+      <height>20</height>
1575
+     </rect>
1576
+    </property>
1577
+    <property name="text">
1578
+     <string>ROM</string>
1579
+    </property>
1580
+    <property name="alignment">
1581
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1582
+    </property>
1583
+   </widget>
1584
+   <widget class="QLabel" name="fileUrom1PathLabel">
1585
+    <property name="geometry">
1586
+     <rect>
1587
+      <x>790</x>
1588
+      <y>60</y>
1589
+      <width>510</width>
1590
+      <height>20</height>
1591
+     </rect>
1592
+    </property>
1593
+    <property name="frameShape">
1594
+     <enum>QFrame::Box</enum>
1595
+    </property>
1596
+    <property name="text">
1597
+     <string>C:/plik/plik.a</string>
1598
+    </property>
1599
+   </widget>
1600
+   <widget class="QLabel" name="fileFSDirPathLabel">
1601
+    <property name="geometry">
1602
+     <rect>
1603
+      <x>790</x>
1604
+      <y>120</y>
1605
+      <width>510</width>
1606
+      <height>20</height>
1607
+     </rect>
1608
+    </property>
1609
+    <property name="frameShape">
1610
+     <enum>QFrame::Box</enum>
1611
+    </property>
1612
+    <property name="text">
1613
+     <string>C:/plik/plik.a</string>
1614
+    </property>
1615
+   </widget>
1616
+   <widget class="QLabel" name="fileUrom0PathLabel">
1617
+    <property name="geometry">
1618
+     <rect>
1619
+      <x>790</x>
1620
+      <y>30</y>
1621
+      <width>510</width>
1622
+      <height>20</height>
1623
+     </rect>
1624
+    </property>
1625
+    <property name="frameShape">
1626
+     <enum>QFrame::Box</enum>
1627
+    </property>
1628
+    <property name="text">
1629
+     <string>C:/plik/plik.a</string>
1630
+    </property>
1631
+   </widget>
1632
+   <widget class="QLabel" name="fileUrom1Label">
1633
+    <property name="geometry">
1634
+     <rect>
1635
+      <x>710</x>
1636
+      <y>60</y>
1637
+      <width>70</width>
1638
+      <height>20</height>
1639
+     </rect>
1640
+    </property>
1641
+    <property name="text">
1642
+     <string>UROM 1</string>
1643
+    </property>
1644
+    <property name="alignment">
1645
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1646
+    </property>
1647
+   </widget>
1648
+   <widget class="QPushButton" name="fileUrom0ReloadButton">
1649
+    <property name="geometry">
1650
+     <rect>
1651
+      <x>1350</x>
1652
+      <y>30</y>
1653
+      <width>50</width>
1654
+      <height>20</height>
1655
+     </rect>
1656
+    </property>
1657
+    <property name="text">
1658
+     <string>Reload</string>
1659
+    </property>
1660
+   </widget>
1661
+   <widget class="QPushButton" name="fileUrom1ReloadButton">
1662
+    <property name="geometry">
1663
+     <rect>
1664
+      <x>1350</x>
1665
+      <y>60</y>
1666
+      <width>50</width>
1667
+      <height>20</height>
1668
+     </rect>
1669
+    </property>
1670
+    <property name="text">
1671
+     <string>Reload</string>
1672
+    </property>
1673
+   </widget>
1674
+   <widget class="QPushButton" name="fileRomReloadButton">
1675
+    <property name="geometry">
1676
+     <rect>
1677
+      <x>1350</x>
1678
+      <y>90</y>
1679
+      <width>50</width>
1680
+      <height>20</height>
1681
+     </rect>
1682
+    </property>
1683
+    <property name="text">
1684
+     <string>Reload</string>
1685
+    </property>
1686
+   </widget>
1687
+   <widget class="QLabel" name="regZValueLabel">
1688
+    <property name="geometry">
1689
+     <rect>
1690
+      <x>1060</x>
1691
+      <y>210</y>
1692
+      <width>30</width>
1693
+      <height>20</height>
1694
+     </rect>
1695
+    </property>
1696
+    <property name="frameShape">
1697
+     <enum>QFrame::Box</enum>
1698
+    </property>
1699
+    <property name="text">
1700
+     <string>1</string>
1701
+    </property>
1702
+    <property name="alignment">
1703
+     <set>Qt::AlignCenter</set>
1704
+    </property>
1705
+   </widget>
1706
+   <widget class="QLabel" name="regZLabel">
1707
+    <property name="geometry">
1708
+     <rect>
1709
+      <x>1010</x>
1710
+      <y>210</y>
1711
+      <width>40</width>
1712
+      <height>20</height>
1713
+     </rect>
1714
+    </property>
1715
+    <property name="text">
1716
+     <string>Z</string>
1717
+    </property>
1718
+    <property name="alignment">
1719
+     <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
1720
+    </property>
1721
+   </widget>
1722
+   <widget class="QLabel" name="regIValueBinLabel">
1723
+    <property name="geometry">
1724
+     <rect>
1725
+      <x>1020</x>
1726
+      <y>180</y>
1727
+      <width>70</width>
1728
+      <height>20</height>
1729
+     </rect>
1730
+    </property>
1731
+    <property name="frameShape">
1732
+     <enum>QFrame::Box</enum>
1733
+    </property>
1734
+    <property name="text">
1735
+     <string>11111111</string>
1736
+    </property>
1737
+    <property name="alignment">
1738
+     <set>Qt::AlignCenter</set>
1739
+    </property>
1740
+   </widget>
1741
+   <widget class="QPushButton" name="romGoToOSButton">
1742
+    <property name="geometry">
1743
+     <rect>
1744
+      <x>710</x>
1745
+      <y>640</y>
1746
+      <width>50</width>
1747
+      <height>30</height>
1748
+     </rect>
1749
+    </property>
1750
+    <property name="text">
1751
+     <string>OS</string>
1752
+    </property>
1753
+   </widget>
1754
+   <widget class="QPushButton" name="romGoToAppButton">
1755
+    <property name="geometry">
1756
+     <rect>
1757
+      <x>760</x>
1758
+      <y>640</y>
1759
+      <width>50</width>
1760
+      <height>30</height>
1761
+     </rect>
1762
+    </property>
1763
+    <property name="text">
1764
+     <string>APP</string>
1765
+    </property>
1766
+   </widget>
1767
+   <widget class="QPushButton" name="ramGoToOSButton">
1768
+    <property name="geometry">
1769
+     <rect>
1770
+      <x>1060</x>
1771
+      <y>640</y>
1772
+      <width>50</width>
1773
+      <height>30</height>
1774
+     </rect>
1775
+    </property>
1776
+    <property name="text">
1777
+     <string>OS</string>
1778
+    </property>
1779
+   </widget>
1780
+   <widget class="QPushButton" name="ramGoToSPButton">
1781
+    <property name="geometry">
1782
+     <rect>
1783
+      <x>1110</x>
1784
+      <y>640</y>
1785
+      <width>50</width>
1786
+      <height>30</height>
1787
+     </rect>
1788
+    </property>
1789
+    <property name="text">
1790
+     <string>SP</string>
1791
+    </property>
1792
+   </widget>
1793
+   <widget class="QPushButton" name="ramGoToAppButton">
1794
+    <property name="geometry">
1795
+     <rect>
1796
+      <x>1060</x>
1797
+      <y>670</y>
1798
+      <width>50</width>
1799
+      <height>30</height>
1800
+     </rect>
1801
+    </property>
1802
+    <property name="text">
1803
+     <string>APP</string>
1804
+    </property>
1805
+   </widget>
1806
+  </widget>
1807
+ </widget>
1808
+ <customwidgets>
1809
+  <customwidget>
1810
+   <class>LCDView</class>
1811
+   <extends>QGraphicsView</extends>
1812
+   <header location="global">lcdview.h</header>
1813
+  </customwidget>
1814
+ </customwidgets>
1815
+ <resources/>
1816
+ <connections/>
1817
+</ui>
0 1818
new file mode 100644
... ...
@@ -0,0 +1,277 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#ifndef FONT_H
13
+#define FONT_H
14
+
15
+#include <QVector>
16
+
17
+//! 8x8 ASCII font definition
18
+static const QVector<QVector<unsigned char>> fontTable = QVector<QVector<unsigned char>>({
19
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
20
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
21
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
22
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
23
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
24
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
25
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
26
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
27
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
28
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
29
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
30
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
31
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
32
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
33
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
34
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
35
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
36
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
37
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
38
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
39
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
40
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
41
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
42
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
43
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
44
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
45
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
46
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
47
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
48
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
49
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
50
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
51
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
52
+	{ 0x18, 0x3C, 0x3C, 0x18, 0x18, 0x00, 0x18, 0x00 },
53
+	{ 0x36, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
54
+	{ 0x36, 0x36, 0x7F, 0x36, 0x7F, 0x36, 0x36, 0x00 },
55
+	{ 0x0C, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x0C, 0x00 },
56
+	{ 0x00, 0x63, 0x33, 0x18, 0x0C, 0x66, 0x63, 0x00 },
57
+	{ 0x1C, 0x36, 0x1C, 0x6E, 0x3B, 0x33, 0x6E, 0x00 },
58
+	{ 0x06, 0x06, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 },
59
+	{ 0x18, 0x0C, 0x06, 0x06, 0x06, 0x0C, 0x18, 0x00 },
60
+	{ 0x06, 0x0C, 0x18, 0x18, 0x18, 0x0C, 0x06, 0x00 },
61
+	{ 0x00, 0x66, 0x3C, 0xFF, 0x3C, 0x66, 0x00, 0x00 },
62
+	{ 0x00, 0x0C, 0x0C, 0x3F, 0x0C, 0x0C, 0x00, 0x00 },
63
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x06 },
64
+	{ 0x00, 0x00, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00 },
65
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x0C, 0x00 },
66
+	{ 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01, 0x00 },
67
+	{ 0x3E, 0x63, 0x73, 0x7B, 0x6F, 0x67, 0x3E, 0x00 },
68
+	{ 0x0C, 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x3F, 0x00 },
69
+	{ 0x1E, 0x33, 0x30, 0x1C, 0x06, 0x33, 0x3F, 0x00 },
70
+	{ 0x1E, 0x33, 0x30, 0x1C, 0x30, 0x33, 0x1E, 0x00 },
71
+	{ 0x38, 0x3C, 0x36, 0x33, 0x7F, 0x30, 0x78, 0x00 },
72
+	{ 0x3F, 0x03, 0x1F, 0x30, 0x30, 0x33, 0x1E, 0x00 },
73
+	{ 0x1C, 0x06, 0x03, 0x1F, 0x33, 0x33, 0x1E, 0x00 },
74
+	{ 0x3F, 0x33, 0x30, 0x18, 0x0C, 0x0C, 0x0C, 0x00 },
75
+	{ 0x1E, 0x33, 0x33, 0x1E, 0x33, 0x33, 0x1E, 0x00 },
76
+	{ 0x1E, 0x33, 0x33, 0x3E, 0x30, 0x18, 0x0E, 0x00 },
77
+	{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x00 },
78
+	{ 0x00, 0x0C, 0x0C, 0x00, 0x00, 0x0C, 0x0C, 0x06 },
79
+	{ 0x18, 0x0C, 0x06, 0x03, 0x06, 0x0C, 0x18, 0x00 },
80
+	{ 0x00, 0x00, 0x3F, 0x00, 0x00, 0x3F, 0x00, 0x00 },
81
+	{ 0x06, 0x0C, 0x18, 0x30, 0x18, 0x0C, 0x06, 0x00 },
82
+	{ 0x1E, 0x33, 0x30, 0x18, 0x0C, 0x00, 0x0C, 0x00 },
83
+	{ 0x3E, 0x63, 0x7B, 0x7B, 0x7B, 0x03, 0x1E, 0x00 },
84
+	{ 0x0C, 0x1E, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x00 },
85
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x66, 0x66, 0x3F, 0x00 },
86
+	{ 0x3C, 0x66, 0x03, 0x03, 0x03, 0x66, 0x3C, 0x00 },
87
+	{ 0x1F, 0x36, 0x66, 0x66, 0x66, 0x36, 0x1F, 0x00 },
88
+	{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x46, 0x7F, 0x00 },
89
+	{ 0x7F, 0x46, 0x16, 0x1E, 0x16, 0x06, 0x0F, 0x00 },
90
+	{ 0x3C, 0x66, 0x03, 0x03, 0x73, 0x66, 0x7C, 0x00 },
91
+	{ 0x33, 0x33, 0x33, 0x3F, 0x33, 0x33, 0x33, 0x00 },
92
+	{ 0x1E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },
93
+	{ 0x78, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E, 0x00 },
94
+	{ 0x67, 0x66, 0x36, 0x1E, 0x36, 0x66, 0x67, 0x00 },
95
+	{ 0x0F, 0x06, 0x06, 0x06, 0x46, 0x66, 0x7F, 0x00 },
96
+	{ 0x63, 0x77, 0x7F, 0x7F, 0x6B, 0x63, 0x63, 0x00 },
97
+	{ 0x63, 0x67, 0x6F, 0x7B, 0x73, 0x63, 0x63, 0x00 },
98
+	{ 0x1C, 0x36, 0x63, 0x63, 0x63, 0x36, 0x1C, 0x00 },
99
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x06, 0x06, 0x0F, 0x00 },
100
+	{ 0x1E, 0x33, 0x33, 0x33, 0x3B, 0x1E, 0x38, 0x00 },
101
+	{ 0x3F, 0x66, 0x66, 0x3E, 0x36, 0x66, 0x67, 0x00 },
102
+	{ 0x1E, 0x33, 0x07, 0x0E, 0x38, 0x33, 0x1E, 0x00 },
103
+	{ 0x3F, 0x2D, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },
104
+	{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x3F, 0x00 },
105
+	{ 0x33, 0x33, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00 },
106
+	{ 0x63, 0x63, 0x63, 0x6B, 0x7F, 0x77, 0x63, 0x00 },
107
+	{ 0x63, 0x63, 0x36, 0x1C, 0x1C, 0x36, 0x63, 0x00 },
108
+	{ 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x0C, 0x1E, 0x00 },
109
+	{ 0x7F, 0x63, 0x31, 0x18, 0x4C, 0x66, 0x7F, 0x00 },
110
+	{ 0x1E, 0x06, 0x06, 0x06, 0x06, 0x06, 0x1E, 0x00 },
111
+	{ 0x03, 0x06, 0x0C, 0x18, 0x30, 0x60, 0x40, 0x00 },
112
+	{ 0x1E, 0x18, 0x18, 0x18, 0x18, 0x18, 0x1E, 0x00 },
113
+	{ 0x08, 0x1C, 0x36, 0x63, 0x00, 0x00, 0x00, 0x00 },
114
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF },
115
+	{ 0x0C, 0x0C, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00 },
116
+	{ 0x00, 0x00, 0x1E, 0x30, 0x3E, 0x33, 0x6E, 0x00 },
117
+	{ 0x07, 0x06, 0x06, 0x3E, 0x66, 0x66, 0x3B, 0x00 },
118
+	{ 0x00, 0x00, 0x1E, 0x33, 0x03, 0x33, 0x1E, 0x00 },
119
+	{ 0x38, 0x30, 0x30, 0x3e, 0x33, 0x33, 0x6E, 0x00 },
120
+	{ 0x00, 0x00, 0x1E, 0x33, 0x3f, 0x03, 0x1E, 0x00 },
121
+	{ 0x1C, 0x36, 0x06, 0x0f, 0x06, 0x06, 0x0F, 0x00 },
122
+	{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x1F },
123
+	{ 0x07, 0x06, 0x36, 0x6E, 0x66, 0x66, 0x67, 0x00 },
124
+	{ 0x0C, 0x00, 0x0E, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },
125
+	{ 0x30, 0x00, 0x30, 0x30, 0x30, 0x33, 0x33, 0x1E },
126
+	{ 0x07, 0x06, 0x66, 0x36, 0x1E, 0x36, 0x67, 0x00 },
127
+	{ 0x0E, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x1E, 0x00 },
128
+	{ 0x00, 0x00, 0x33, 0x7F, 0x7F, 0x6B, 0x63, 0x00 },
129
+	{ 0x00, 0x00, 0x1F, 0x33, 0x33, 0x33, 0x33, 0x00 },
130
+	{ 0x00, 0x00, 0x1E, 0x33, 0x33, 0x33, 0x1E, 0x00 },
131
+	{ 0x00, 0x00, 0x3B, 0x66, 0x66, 0x3E, 0x06, 0x0F },
132
+	{ 0x00, 0x00, 0x6E, 0x33, 0x33, 0x3E, 0x30, 0x78 },
133
+	{ 0x00, 0x00, 0x3B, 0x6E, 0x66, 0x06, 0x0F, 0x00 },
134
+	{ 0x00, 0x00, 0x3E, 0x03, 0x1E, 0x30, 0x1F, 0x00 },
135
+	{ 0x08, 0x0C, 0x3E, 0x0C, 0x0C, 0x2C, 0x18, 0x00 },
136
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x33, 0x6E, 0x00 },
137
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x1E, 0x0C, 0x00 },
138
+	{ 0x00, 0x00, 0x63, 0x6B, 0x7F, 0x7F, 0x36, 0x00 },
139
+	{ 0x00, 0x00, 0x63, 0x36, 0x1C, 0x36, 0x63, 0x00 },
140
+	{ 0x00, 0x00, 0x33, 0x33, 0x33, 0x3E, 0x30, 0x1F },
141
+	{ 0x00, 0x00, 0x3F, 0x19, 0x0C, 0x26, 0x3F, 0x00 },
142
+	{ 0x38, 0x0C, 0x0C, 0x07, 0x0C, 0x0C, 0x38, 0x00 },
143
+	{ 0x18, 0x18, 0x18, 0x00, 0x18, 0x18, 0x18, 0x00 },
144
+	{ 0x07, 0x0C, 0x0C, 0x38, 0x0C, 0x0C, 0x07, 0x00 },
145
+	{ 0x6E, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
146
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
147
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
148
+	{ 0x7E, 0x81, 0xA5, 0x81, 0xB9, 0x9D, 0x81, 0x7E },
149
+	{ 0x7E, 0xFF, 0xDB, 0xFF, 0xC7, 0xE3, 0xFF, 0x7E },
150
+	{ 0x36, 0x7F, 0x7F, 0x7F, 0x3E, 0x1C, 0x08, 0x00 },
151
+	{ 0x08, 0x1C, 0x3E, 0x7F, 0x3E, 0x1C, 0x08, 0x00 },
152
+	{ 0x1C, 0x3E, 0x1C, 0x7F, 0x7F, 0x08, 0x08, 0x3E },
153
+	{ 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0x7E, 0x18, 0x7E },
154
+	{ 0x00, 0x00, 0x18, 0x3C, 0x3C, 0x18, 0x00, 0x00 },
155
+	{ 0xFF, 0xFF, 0xE7, 0xC3, 0xC3, 0xE7, 0xFF, 0xFF },
156
+	{ 0x00, 0x3C, 0x66, 0x42, 0x42, 0x66, 0x3C, 0x00 },
157
+	{ 0xFF, 0xC3, 0x99, 0xBD, 0xBD, 0x99, 0xC3, 0xFF },
158
+	{ 0xF0, 0xE0, 0xF0, 0xBE, 0x33, 0x33, 0x33, 0x1E },
159
+	{ 0x3C, 0x66, 0x66, 0x66, 0x3C, 0x18, 0x7E, 0x18 },
160
+	{ 0xFC, 0xCC, 0xFC, 0x0C, 0x0C, 0x0E, 0x0F, 0x07 },
161
+	{ 0xFE, 0xC6, 0xFE, 0xC6, 0xC6, 0xE6, 0x67, 0x03 },
162
+	{ 0x99, 0x5A, 0x3C, 0xE7, 0xE7, 0x3C, 0x5A, 0x99 },
163
+	{ 0x01, 0x07, 0x1F, 0x7F, 0x1F, 0x07, 0x01, 0x00 },
164
+	{ 0x40, 0x70, 0x7C, 0x7F, 0x7C, 0x70, 0x40, 0x00 },
165
+	{ 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x7E, 0x3C, 0x18 },
166
+	{ 0x66, 0x66, 0x66, 0x66, 0x66, 0x00, 0x66, 0x00 },
167
+	{ 0xFE, 0xDB, 0xDB, 0xDE, 0xD8, 0xD8, 0xD8, 0x00 },
168
+	{ 0xFC, 0x06, 0x3E, 0x66, 0x66, 0x7C, 0x60, 0x3F },
169
+	{ 0x00, 0x00, 0x00, 0x00, 0x7E, 0x7E, 0x7E, 0x00 },
170
+	{ 0x18, 0x3C, 0x7E, 0x18, 0x7E, 0x3C, 0x18, 0xFF },
171
+	{ 0x18, 0x3C, 0x7E, 0x18, 0x18, 0x18, 0x18, 0x00 },
172
+	{ 0x18, 0x18, 0x18, 0x18, 0x7E, 0x3C, 0x18, 0x00 },
173
+	{ 0x00, 0x18, 0x30, 0x7F, 0x30, 0x18, 0x00, 0x00 },
174
+	{ 0x00, 0x0C, 0x06, 0x7F, 0x06, 0x0C, 0x00, 0x00 },
175
+	{ 0x00, 0x00, 0x03, 0x03, 0x03, 0x7F, 0x00, 0x00 },
176
+	{ 0x00, 0x24, 0x66, 0xFF, 0x66, 0x24, 0x00, 0x00 },
177
+	{ 0x00, 0x18, 0x3C, 0x7E, 0xFF, 0xFF, 0x00, 0x00 },
178
+	{ 0x00, 0xFF, 0xFF, 0x7E, 0x3C, 0x18, 0x00, 0x00 },
179
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
180
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
181
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
182
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
183
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
184
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
185
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
186
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
187
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 },
188
+	{ 0x00, 0x00, 0x00, 0x3F, 0x03, 0x03, 0x00, 0x00 },
189
+	{ 0x00, 0x00, 0x00, 0x3F, 0x30, 0x30, 0x00, 0x00 },
190
+	{ 0x63, 0x33, 0x1B, 0xFC, 0xC6, 0xF3, 0x31, 0xF0 },
191
+	{ 0xC3, 0x63, 0x33, 0xDB, 0xEC, 0xB6, 0xF3, 0xC0 },
192
+	{ 0x18, 0x00, 0x18, 0x18, 0x18, 0x18, 0x18, 0x00 },
193
+	{ 0x00, 0xCC, 0x66, 0x33, 0x66, 0xCC, 0x00, 0x00 },
194
+	{ 0x00, 0x33, 0x66, 0xCC, 0x66, 0x33, 0x00, 0x00 },
195
+	{ 0x44, 0x11, 0x44, 0x11, 0x44, 0x11, 0x44, 0x11 },
196
+	{ 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55, 0xAA, 0x55 },
197
+	{ 0xBB, 0xEE, 0xBB, 0xEE, 0xBB, 0xEE, 0xBB, 0xEE },
198
+	{ 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18, 0x18 },
199
+	{ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x18, 0x18, 0x18 },
200
+	{ 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18 },
201
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0x6F, 0x6C, 0x6C, 0x6C },
202
+	{ 0x00, 0x00, 0x00, 0x00, 0x7F, 0x6C, 0x6C, 0x6C },
203
+	{ 0x00, 0x00, 0x1F, 0x18, 0x1F, 0x18, 0x18, 0x18 },
204
+	{ 0x6C, 0x6C, 0x6F, 0x60, 0x6F, 0x6C, 0x6C, 0x6C },
205
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C, 0x6C },
206
+	{ 0x00, 0x00, 0x7F, 0x60, 0x6F, 0x6C, 0x6C, 0x6C },
207
+	{ 0x6C, 0x6C, 0x6F, 0x60, 0x7F, 0x00, 0x00, 0x00 },
208
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0x7F, 0x00, 0x00, 0x00 },
209
+	{ 0x18, 0x18, 0x1F, 0x18, 0x1F, 0x00, 0x00, 0x00 },
210
+	{ 0x00, 0x00, 0x00, 0x00, 0x1F, 0x18, 0x18, 0x18 },
211
+	{ 0x18, 0x18, 0x18, 0x18, 0xF8, 0x00, 0x00, 0x00 },
212
+	{ 0x18, 0x18, 0x18, 0x18, 0xFF, 0x00, 0x00, 0x00 },
213
+	{ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x18, 0x18, 0x18 },
214
+	{ 0x18, 0x18, 0x18, 0x18, 0xF8, 0x18, 0x18, 0x18 },
215
+	{ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00 },
216
+	{ 0x18, 0x18, 0x18, 0x18, 0xFF, 0x18, 0x18, 0x18 },
217
+	{ 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18 },
218
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0xEC, 0x6C, 0x6C, 0x6C },
219
+	{ 0x6C, 0x6C, 0xEC, 0x0C, 0xFC, 0x00, 0x00, 0x00 },
220
+	{ 0x00, 0x00, 0xFC, 0x0C, 0xEC, 0x6C, 0x6C, 0x6C },
221
+	{ 0x6C, 0x6C, 0xEF, 0x00, 0xFF, 0x00, 0x00, 0x00 },
222
+	{ 0x00, 0x00, 0xFF, 0x00, 0xEF, 0x6C, 0x6C, 0x6C },
223
+	{ 0x6C, 0x6C, 0xEC, 0x0C, 0xEC, 0x6C, 0x6C, 0x6C },
224
+	{ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00 },
225
+	{ 0x6C, 0x6C, 0xEF, 0x00, 0xEF, 0x6C, 0x6C, 0x6C },
226
+	{ 0x18, 0x18, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x00 },
227
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0xFF, 0x00, 0x00, 0x00 },
228
+	{ 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x18, 0x18, 0x18 },
229
+	{ 0x00, 0x00, 0x00, 0x00, 0xFF, 0x6C, 0x6C, 0x6C },
230
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0xFC, 0x00, 0x00, 0x00 },
231
+	{ 0x18, 0x18, 0xF8, 0x18, 0xF8, 0x00, 0x00, 0x00 },
232
+	{ 0x00, 0x00, 0xF8, 0x18, 0xF8, 0x18, 0x18, 0x18 },
233
+	{ 0x00, 0x00, 0x00, 0x00, 0xFC, 0x6C, 0x6C, 0x6C },
234
+	{ 0x6C, 0x6C, 0x6C, 0x6C, 0xFF, 0x6C, 0x6C, 0x6C },
235
+	{ 0x18, 0x18, 0xFF, 0x18, 0xFF, 0x18, 0x18, 0x18 },
236
+	{ 0x18, 0x18, 0x18, 0x18, 0x1F, 0x00, 0x00, 0x00 },
237
+	{ 0x00, 0x00, 0x00, 0x00, 0xF8, 0x18, 0x18, 0x18 },
238
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
239
+	{ 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF },
240
+	{ 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F },
241
+	{ 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0, 0xF0 },
242
+	{ 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00 },
243
+	{ 0x00, 0x00, 0x6E, 0x3B, 0x13, 0x3B, 0x6E, 0x00 },
244
+	{ 0x1C, 0x36, 0x36, 0x1E, 0x36, 0x66, 0x36, 0x06 },
245
+	{ 0x00, 0x7F, 0x63, 0x03, 0x03, 0x03, 0x03, 0x00 },
246
+	{ 0x00, 0x00, 0x7F, 0x36, 0x36, 0x36, 0x36, 0x00 },
247
+	{ 0x7F, 0x06, 0x0C, 0x18, 0x0C, 0x06, 0x7F, 0x00 },
248
+	{ 0x00, 0x00, 0x7E, 0x1B, 0x1B, 0x1B, 0x0E, 0x00 },
249
+	{ 0x00, 0x66, 0x66, 0x66, 0x66, 0x3E, 0x06, 0x03 },
250
+	{ 0x00, 0x6E, 0x3B, 0x18, 0x18, 0x18, 0x18, 0x00 },
251
+	{ 0x7E, 0x18, 0x3C, 0x66, 0x66, 0x3C, 0x18, 0x7E },
252
+	{ 0x3C, 0x66, 0xC3, 0xFF, 0xC3, 0x66, 0x3C, 0x00 },
253
+	{ 0x3C, 0x66, 0xC3, 0xC3, 0x66, 0x66, 0xE7, 0x00 },
254
+	{ 0x70, 0x18, 0x30, 0x7E, 0x63, 0x63, 0x3E, 0x00 },
255
+	{ 0x00, 0x00, 0x7E, 0xDB, 0xDB, 0x7E, 0x00, 0x00 },
256
+	{ 0x60, 0x30, 0x7E, 0xDB, 0xDB, 0x7E, 0x06, 0x03 },
257
+	{ 0x1C, 0x06, 0x03, 0x1F, 0x03, 0x06, 0x1C, 0x00 },
258
+	{ 0x1E, 0x33, 0x33, 0x33, 0x33, 0x33, 0x33, 0x00 },
259
+	{ 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00 },
260
+	{ 0x18, 0x18, 0x7E, 0x18, 0x18, 0x00, 0x7E, 0x00 },
261
+	{ 0x06, 0x0C, 0x18, 0x0C, 0x06, 0x00, 0x3F, 0x00 },
262
+	{ 0x18, 0x0C, 0x06, 0x0C, 0x18, 0x00, 0x3F, 0x00 },
263
+	{ 0x70, 0xD8, 0xD8, 0x18, 0x18, 0x18, 0x18, 0x18 },
264
+	{ 0x18, 0x18, 0x18, 0x18, 0x18, 0x1B, 0x1B, 0x0E },
265
+	{ 0x18, 0x18, 0x00, 0x7E, 0x00, 0x18, 0x18, 0x00 },
266
+	{ 0x00, 0x6E, 0x3B, 0x00, 0x6E, 0x3B, 0x00, 0x00 },
267
+	{ 0x1C, 0x36, 0x36, 0x1C, 0x00, 0x00, 0x00, 0x00 },
268
+	{ 0x00, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00, 0x00 },
269
+	{ 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00 },
270
+	{ 0xF0, 0x30, 0x30, 0x30, 0x37, 0x36, 0x3C, 0x38 },
271
+	{ 0x1E, 0x36, 0x36, 0x36, 0x36, 0x00, 0x00, 0x00 },
272
+	{ 0x3E, 0x30, 0x3E, 0x06, 0x3E, 0x00, 0x00, 0x00 },
273
+	{ 0x00, 0x00, 0x3C, 0x3C, 0x3C, 0x3C, 0x00, 0x00 },
274
+	{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
275
+});
276
+
277
+#endif
0 278
new file mode 100644
... ...
@@ -0,0 +1,194 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#include "fs.h"
13
+
14
+/**
15
+ * Constructor for the file system class
16
+ *
17
+ * @param parent Parent object
18
+ */
19
+FS::FS(QObject *parent) : QObject(parent)
20
+{
21
+	this->path = "";
22
+
23
+	this->reset();
24
+}
25
+
26
+//! Reset the file system buffers and path
27
+void FS::reset()
28
+{
29
+	this->buffer.clear();
30
+}
31
+
32
+/**
33
+ * Set path to the emulated file system on the local disk
34
+ *
35
+ * @param path Path to emulated file system
36
+ */
37
+void FS::setPath(const QString &path)
38
+{
39
+	this->path = path;
40
+}
41
+
42
+/**
43
+ * Open and load to buffer a file from the emulated file system
44
+ *
45
+ * @param dirName Name of the directory. "app" or "file".
46
+ * @param fileName Name of the file to open
47
+ * @param size Struct where size of the file will be written
48
+ *
49
+ * @return Status of the open operation
50
+ */
51
+bool FS::open(const QString &dirName, const FS::Name &fileName, FS::Size &size)
52
+{
53
+	size.low = 0;
54
+	size.high = 0;
55
+
56
+	if(!dirName.contains(QRegularExpression("^([0-9a-zA-Z_-]{1,8})$")))
57
+	{
58
+		return(false);
59
+	}
60
+
61
+	QString name(reinterpret_cast<const char *>(fileName.data.constData()));
62
+
63
+	if(!name.contains(QRegularExpression("^([0-9a-zA-Z_-]{1,8})(([\\\\.])([0-9a-zA-Z_-]{1,3}))?$")))
64
+	{
65
+		return(false);
66
+	}
67
+
68
+	QString filePath = QString(this->path).append("/").append(dirName).append("/").append(name);
69
+	QFile file(filePath);
70
+
71
+	if(!file.open(QIODevice::ReadOnly))
72
+	{
73
+		return(false);
74
+	}
75
+
76
+	if(file.size() > FILE_MAX_SIZE)
77
+	{
78
+		file.close();
79
+
80
+		return(false);
81
+	}
82
+
83
+	this->buffer = file.readAll();
84
+
85
+	file.close();
86
+
87
+	size.low = static_cast<unsigned char>(this->buffer.size() % 256);
88
+	size.high = static_cast<unsigned char>((this->buffer.size() / 256) & 0xff);
89
+
90
+	return(true);
91
+}
92
+
93
+/**
94
+ * Create a list of files in the directory from the emulated file system
95
+ *
96
+ * @param dirName Name of the directory. "app" or "file".
97
+ * @param size Struct where size of the buffer with description of the files will be written
98
+ *
99
+ * @return Status of the list operation
100
+ */
101
+bool FS::list(const QString &dirName, FS::Size &size)
102
+{
103
+	size.low = 0;
104
+	size.high = 0;
105
+
106
+	if(!dirName.contains(QRegularExpression("^([0-9a-zA-Z_-]{1,8})$")))
107
+	{
108
+		return(false);
109
+	}
110
+
111
+	QString dirPath = QString(this->path).append("/").append(dirName);
112
+	QDir dir;
113
+
114
+	dir.setFilter(QDir::Files | QDir::NoDotAndDotDot);
115
+	dir.setSorting(QDir::Name);
116
+
117
+	if(!dir.cd(dirPath))
118
+	{
119
+		return(false);
120
+	}
121
+
122
+	QFileInfoList fileInfoList = dir.entryInfoList();
123
+
124
+	this->buffer.clear();
125
+
126
+	for(const QFileInfo &fileInfo : fileInfoList)
127
+	{
128
+		QString fileName = fileInfo.fileName();
129
+		qint64 fileSize = fileInfo.size();
130
+
131
+		if(fileSize > FILE_MAX_SIZE)
132
+		{
133
+			continue;
134
+		}
135
+
136
+		if(!fileName.contains(QRegularExpression(R"(^([0-9a-zA-Z_-]{1,8})(([\\.])([0-9a-zA-Z_-]{1,3}))?$)")))
137
+		{
138
+			continue;
139
+		}
140
+
141
+		int j = 0;
142
+
143
+		for(; ((j < NAME_MAX_LENGTH) && (j < fileName.length())); j++)
144
+		{
145
+			this->buffer.append(fileName.at(j).toLatin1());
146
+		}
147
+
148
+		for(; j < (DIR_ENTRY_SIZE - DIR_SIZE_FIELD_SIZE); j++)
149
+		{
150
+			this->buffer.append(static_cast<char>(0));
151
+		}
152
+
153
+		QVector<unsigned char> size(2);
154
+
155
+		size[0] = static_cast<unsigned char>(fileSize % 256);
156
+		size[1] = static_cast<unsigned char>((fileSize / 256) & 0xff);
157
+
158
+		this->buffer.append(static_cast<char>(size[0]));
159
+		this->buffer.append(static_cast<char>(size[1]));
160
+
161
+		if(this->buffer.size() >= (DIR_MAX_QUANTITY * DIR_ENTRY_SIZE))
162
+		{
163
+			break;
164
+		}
165
+	}
166
+
167
+	size.low = static_cast<unsigned char>(this->buffer.size() % 256);
168
+	size.high = static_cast<unsigned char>((this->buffer.size() / 256) & 0xff);
169
+
170
+	return(true);
171
+}
172
+
173
+/**
174
+ * Read data from buffer to block based on offset
175
+ *
176
+ * @param block Struct where the data from the buffer will be written
177
+ * @param number Number of the selected virtual block selected to read
178
+ */
179
+void FS::readBlock(FS::Block &block, int number)
180
+{
181
+	for(int i = 0; i < BLOCK_SIZE; i++)
182
+	{
183
+		int j = ((number * BLOCK_SIZE) + i);
184
+
185
+		if(j < this->buffer.size())
186
+		{
187
+			block.data[i] = static_cast<unsigned char>(this->buffer.at(j));
188
+		}
189
+		else
190
+		{
191
+			block.data[i] = 0;
192
+		}
193
+	}
194
+}
0 195
new file mode 100644
... ...
@@ -0,0 +1,75 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#ifndef FS_H
13
+#define FS_H
14
+
15
+#include <QObject>
16
+#include <QString>
17
+#include <QByteArray>
18
+#include <QVector>
19
+#include <QFile>
20
+#include <QDir>
21
+#include <QFileInfoList>
22
+#include <QRegularExpression>
23
+
24
+//! This class contains file system functions
25
+class FS : public QObject
26
+{
27
+	Q_OBJECT
28
+
29
+	public:
30
+		static const int NAME_MAX_LENGTH = 12; //!< Maximum name length of the file
31
+
32
+		static const int BLOCK_SIZE = 256; //!<  Virtual block size available to address by communication bus between motherboard and CPU
33
+
34
+		static const int DIR_ENTRY_SIZE = 16; //!< Size of the header with information about file
35
+		static const int DIR_SIZE_FIELD_SIZE = 2; //!< Size of the size field in the header
36
+		static const int DIR_MAX_QUANTITY = 64; //!< Maximum quantity of files in directory
37
+
38
+		static const int FILE_MAX_SIZE = 32768; //!< Maximum size of the file
39
+
40
+		//! This struct contains a name of the file
41
+		struct Name
42
+		{
43
+			QVector<unsigned char> data = QVector<unsigned char>(NAME_MAX_LENGTH + 1); //!< Name of the file
44
+		};
45
+
46
+		//! This struct contains a size of the file
47
+		struct Size
48
+		{
49
+			unsigned char low; //!< Lower byte of the size
50
+			unsigned char high; //!< Higher byte of the size
51
+		};
52
+
53
+		//! This struct contains virtual block data
54
+		struct Block
55
+		{
56
+			QVector<unsigned char> data = QVector<unsigned char>(BLOCK_SIZE); //!< Virtual block data
57
+		};
58
+
59
+		FS(QObject *parent = nullptr);
60
+
61
+		void reset();
62
+
63
+		void setPath(const QString &path);
64
+
65
+		bool open(const QString &dirName, const FS::Name &fileName, FS::Size &size);
66
+		bool list(const QString &dirName, FS::Size &size);
67
+
68
+		void readBlock(FS::Block &block, int number);
69
+
70
+	private:
71
+		QString path; //!< Path to the emulated file system on the local disk
72
+		QByteArray buffer; //!< Buffer used to loading whole file or a list with description of the files
73
+};
74
+
75
+#endif
0 76
new file mode 100644
... ...
@@ -0,0 +1,558 @@
1
+/*
2
+ * Author: Pawel Jablonski
3
+ * E-mail: pj@xirx.net
4
+ * WWW: xirx.net
5
+ * GIT: git.xirx.net
6
+ *
7
+ * License: You can use this code however you like
8
+ * but leave information about the original author.
9
+ * Code is free for non-commercial and commercial use.
10
+ */
11
+
12
+#include "io.h"
13
+
14
+/**
15
+ * Constructor for the IO class. It connects all communication classes for IO operations.
16
+ *
17
+ * @param parent Parent object
18
+ */
19
+IO::IO(QObject *parent) : QObject(parent)
20
+{
21
+	this->reset();
22
+
23
+	QObject::connect(&this->led, SIGNAL(updateRunSignal(bool)), this, SIGNAL(updateLEDRunSignal(bool)));
24
+	QObject::connect(&this->led, SIGNAL(updateErrorSignal(bool)), this, SIGNAL(updateLEDErrorSignal(bool)));
25
+
26
+	QObject::connect(&this->lcd, SIGNAL(updateBufferSignal(LCD::Buffer)), this, SIGNAL(updateLCDBufferSignal(LCD::Buffer)));
27
+
28
+	QObject::connect(&this->rs232, SIGNAL(updateTxSignal(unsigned char)), this, SIGNAL(updateRS232TxSignal(unsigned char)));
29
+	QObject::connect(&this->rs232, SIGNAL(updateRxSignal(unsigned char)), this, SIGNAL(updateRS232RxSignal(unsigned char)));
30
+
31
+	QObject::connect(&this->rtc, SIGNAL(updateDateTimeSignal(QDateTime)), this, SIGNAL(updateRTCDateTimeSignal(QDateTime)));
32
+
33
+	QObject::connect(&this->speaker, SIGNAL(updateStatusSignal(int)), this, SIGNAL(updateSpeakerStatusSignal(int)));
34
+
35
+	QObject::connect(&this->keyboard, SIGNAL(dataReadySignal(bool)), this, SLOT(keyboardDataReadySlot(bool)));
36
+	QObject::connect(&this->rs232, SIGNAL(dataReadySignal(bool)), this, SLOT(rs232DataReadySlot(bool)));
37
+}
38
+
39
+//! Destructor for the IO class
40
+IO::~IO()
41
+{
42
+	QObject::disconnect(this);
43
+}
44
+
45
+//! Reset the IO buffers and trigger reset for all connected communication classes
46
+void IO::reset()
47
+{
48
+	this->regSelected = 0;
49
+	this->reg = {};
50
+	this->in = 0;
51
+
52
+	this->keyboard.reset();
53
+	this->led.reset();
54
+	this->lcd.reset();
55
+	this->rs232.reset();
56
+	this->rtc.reset();
57
+	this->speaker.reset();
58
+	this->fs.reset();
59
+}
60
+
61
+/**
62
+ * Process a key press event
63
+ *
64
+ * @param key Pressed key code
65
+ * @param modifiers Optional modifiers to pressed key
66
+ */
67
+void IO::keyboardKeyPress(int key, Qt::KeyboardModifiers modifiers)
68
+{
69
+	this->keyboard.keyPress(key, modifiers);
70
+}
71
+
72
+/**
73
+ * Set enable status of the run LED
74
+ *
75
+ * @param enable Enable status
76
+ */
77
+void IO::ledSetRun(bool enable)
78
+{
79
+	this->led.setRun(enable);
80
+}
81
+
82
+/**
83
+ * Set enable status of the error LED
84
+ *
85
+ * @param enable Enable status
86
+ */
87
+void IO::ledSetError(bool enable)
88
+{
89
+	this->led.setError(enable);
90
+}
91
+
92
+/**
93
+ * Process a received text event
94
+ *
95
+ * @param text Received text
96
+ */
97
+void IO::rs232Receive(const QString &text)
98
+{
99
+	this->rs232.rx(text);
100
+}
101
+
102
+/**
103
+ * Set date and time
104
+ *
105
+ * @param dateTime Date and time to set in own RTC format
106
+ */
107
+void IO::rtcSetDateTime(const QDateTime &dateTime)
108
+{
109
+	this->rtc.setDateTime(dateTime);
110
+}
111
+
112
+/**
113
+ * Set volume
114
+ *
115
+ * @param volume Volume level in range 0-100
116
+ */
117
+void IO::speakerSetVolume(unsigned int volume)
118
+{
119
+	this->speaker.setVolume(volume);
120
+}
121
+
122
+/**
123
+ * Set path to the emulated file system on the local disk
124
+ *
125
+ * @param path Path to emulated file system
126
+ */
127
+void IO::fsSetPath(const QString &path)
128
+{
129
+	this->fs.setPath(path);
130
+}
131
+
132
+/**
133
+ * Process "keyboard data is ready to get" event
134
+ *