This repository has been archived by the owner on Jan 4, 2024. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathREADME
230 lines (161 loc) · 7.96 KB
/
README
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
DDDCPU16 - DeathlyDeep's DCPU16, a DCPU16 emulator.
=== SUMMARY ====================================================================
DDDCPU16 is a DCPU16 emulator written by Sylvain "DeathlyDeep" Boilard, student
at French IT engineer school EFREI, while he had way more urgent things to do.
The DCPU16 is an imaginary CPU designed by Markus "Notch" Personn for his
eventually-upcoming, nerd-friendly, space-exploration-and-stuff game "0x10c".
This software features efficient DCPU16 emulation, at arbitrary speed and
frequency, and a plugin system, mainly used for hardware emulation and
debugging. It runs on GNU/Linux and should be easy to port on any other
POSIX-friendly system.
Currently (and when I am not too lazy) development efforts are focused on
hardware support. See the TODO section of this file.
DDDCPU16 is hosted on GitHub at https://github.com/DeathlyDeep/DDDCPU16 .
=== USAGE ======================================================================
Synopsis:
dddcpu16 [options...] ram_image
ram_image
The content of this binary file will be loaded in the RAM on the DCPU16 at
the beginning of the emulation, and the execution will begin at address 0.
You can generate this file by running a DASM16 assembler on a DASM16 source
file, but DDDCPU16 does not provide such a tool.
Options:
The options are evaluated from left to right so, for example, if you set the
emulation speed twice, the second value will be recorded.
-s speed
Select the speed of the emulation. Default is 1. Do not confuse with
emulation frequency, which is a different value.
This value can be a decimal value with up to 3 digits in the decimal part.
For example, with a value of 0.125 , you will slow the emulation speed to
1/8 of the normal behaviour.
-f frequency
Select the frequency of the emulation. Default is 100kHz. Do not confuse
with emulation speed, which is a different value.
This value can be suffixed with Hz, kHz, MHz or GHz to indicate a value
expressed in Hertz, kilo-Hertz, mega-Hertz or giga-Hertz. If no suffix is
given, the value is considered to be in Hertz.
-p plugin [options...] [--]
Load a plugin. You can pass options to the plugin by adding them after the
plugin's name, and you can separate the plugin's options from the rest of
the command line with --. So, if you want to load multiple plugins, you will
go with something like this:
$ dddcpu16 ram_image.bin -p clock.so -- -p m35fd.so
-B, -L
Select desired endianness (Big or Little) for the ram image. Default is
little endian.
-G granularity
Select time granularity. The value can be suffixed with ms, us or ns to give
a value in milli, micro or nano-seconds. If no suffix is added, the value is
considered to be nanoseconds. This value must be lesser than 1 second.
Default is 1 millisecond.
This value represents the granularity of time for the emulation process. For
example, with default values of frequency and speed, a granularity of 1
millisecond means that, each millisecond,
* 100 emulation cycles are performed.
* If less than a millisecond passed, the emulator sleeps the time needed
to match this delay.
Doing this is necessary because the overhead of the sleep function is not
negligible, and sleeping between each instruction would simply not work.
(This does not mean that the emulation timing is imprecise. The overhead of
time spent to sleep and the overhead of cycles executed during a time chunk
are compensated in the next chunk, leading to correct behaviour
asymptotically.)
If for some reasons you need a smoother emulation, try to decrease this
value. If you want to run the emulator at a high speed and/or frequency but
end up using all of your computer's resources, you can enhance a bit the
performance of the emulator by increasing it.
Commands:
* quit
Exit gracefully from the emulator.
=== PLUGINS USAGE ==============================================================
====== CLOCK PLUGIN ============================================================
Synopsis:
clock.so [clock_number]
clock_number
Select the number of clocks to connect to the DCPU16. Default is 1.
====== M35FD PLUGIN ============================================================
Synopsis:
m35fd.so [options...]
Options:
-n m35fd_number
Select the number of m35fd to connect to the DCPU16. Default is 1.
-B,-L
Select default endianness (Big or Little) for the newly inserted floppies.
Default is little endian.
Commands:
* m35fd.insert [options...] floppy
Inserts a floppy in a drive.
floppy
This file will be used to read and possibly write the floppy. If it does not
exist, it will be created.
Options:
-n drive_number
Select drive in which to insert the floppy. Default is 0.
-p
Set write protection.
-B,-L
Select endianness (Big or Little) for the floppy to insert. If this option
is not present, the default endianness is selected.
* m35fd.eject [drive_number]
Ejects a floppy from a drive.
drive_number
Select drive from which to eject the floppy. Default is 0.
=== RETURN VALUES ==============================================================
0 : Everything went well.
1 : Wrong argument in command line.
2 : Run-time error.
=== KNOWN BUGS =================================================================
DCPU16 catching fire.
* The non-basic instruction 0x07 HCF (Hang Catch Fire) is not implemented.
* If the size of the interrupts queue grows longer than 256, the DCPU16
processor is supposed to catch fire. Practically, this would lead to random
words in the RAM getting randomly corrupted every once in a while, quickly
ending up with chaotic behaviour.
In DDDCPU16, instead of this, if the size of the queue reaches 256, the queue
is considered emptied, and subsequent interrupts are then queued normally.
=== TODO =======================================================================
Emulator
* Add firmware support.
* Implement a shared configuration system for the core emulator and plugins.
* Events system
* Allow arbitrary large number of simultaneous scheduled events.
* Optimize events canceling.
* Prevent drifting in emulation timing (none appears with default values, but
it would be a good idea to do it eventually).
* Console
* Allow arbitrary large command lines.
* Use '\n' as command line terminator instead of supposing the last read
character is.
* Add basic 'help' command to list available commands.
Plugins
* Make plugins get API entries with dlopen instead of via a context structure.
* Implement debug plugin.
* Hardware
* Finish to implement lem1802.
* Implement keyboard.
* Implement sped-3.
* m35fd
* Allow starting with floppies already inserted.
* Fix crashing when legitimately trying to access data at the end of a
floppy while the underlying file is smaller than an entire floppy.
General
* Check const-correctness.
* Write documentation.
=== AUTHOR =====================================================================
Sylvain "DeathlyDeep" Boilard
* e-mail : boilard@crans.org
* Twitter : @DeathlyDeep
* GitHub : https://github.com/DeathlyDeep/
=== LICENSE ====================================================================
DDDCPU16 - DeathlyDeep's DCPU16, a DCPU16 emulator.
Copyright (C) 2012-2013 Sylvain Boilard <boilard@crans.org>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.