forked from joncampbell123/dosbox-x
-
Notifications
You must be signed in to change notification settings - Fork 0
/
General TODO.txt
221 lines (201 loc) · 12.9 KB
/
General TODO.txt
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
Some plans for future DOSBox-X developments
===========================================
* Clock domains
- Current DOSBox-X emulation is CPU-centric, which is OK, I guess,
but not ideal for much of the emulation.
- Many delays and timing are based on floating point values in milliseconds.
If clock domains were implemented, devices could count very accurately
in clocks at a rate of their choosing and better maintain timing that way.
- Clock domains could be coded to cascade as well. The obvious example is
original PC hardware where the ISA 14.31818MHz clock is divided by 12 to
produce the 1.193182MHz clock used to drive the 8253 PIT and other system
components.
- One part of the emulation that would definitely benefit from clock domain
based timing would be the VGA emulation. Pixel and scanline counting would
become very accurate if counted with integers according to pixel clocks
instead of using the floating math it does now.
- Another part of the emulation that would benefit would be the I/O delay
emulation. Instead of bumping a fixed number of CPU cycles, the code could
more accurately delay CPU timing according to, say, an ISA bus clock
domain set to 8.3333MHz and knowledge of a typical ISA bus cycle. Or, if
the I/O cycle is directed at the PCI bus (clock domain set to 33.3333Mhz)
delays emulated according to PCI bus cycle or PCI burst I/O cycle counting.
* Runtime hooks for patching
- If told to do so, DOSBox-X can look for an IPS file (or DOSBox-X equivalent)
and when a particular EXE is loaded into memory, patch the executable image
before executing it. The idea being that DOS gamers can use this mechanism
to fix bugs in a game or demo without modifying the original EXE. It can also
be a fun way to cheat :)
- We could assist this mechanism with the ability for the user to force an EXE
file to be loaded at a specific segment, in case the patch is sensitive to
segment values. Loading must fail of course if we cannot put the EXE at that
location.
- We could also add the ability for DOSBox-X to patch data files when the game
reads them from disk, to hack textures, sounds, etc. Again the data file
remains unmodified on disk.
- On a related note, it would be cool if we could implement something like
Bochs volatile mode where data is read from the file, but writes to the file
are directed to a temporary file which is thrown away on exit, keeping your
files unmodified.
- If executable unpacking is involved, some additional tools could be provided
where the patch does not modify the loaded EXE, but can be instructed to
patch an area of memory when the instruction pointer hits a specific location
in the EXE (usually when the EXE has finished unpacking and checking it's
integrity).
* Support for loading BIOS images and mapping them into adapter ROM
- We could test various VGA BIOSes in DOSBox-X that way
- We could also run old motherboard BIOSes in DOSBox-X that way
* Convert I/O and memory handler callback system to on-demand bus mapping and
tracing design
- Instead of statically assigning I/O and memory handlers, all handlers are
initialized to a lookup function.
- The DOSBox motherboard emulator at this point would also maintain its own
setup of a system bus hierarchy (system resources and RAM vs forwarding to
the ISA bus, or a PCI-based system that forwards to PCI which can forward
via PCI-ISA bridge to ISA, etc.).
- When the lookup function is called, the function goes through the "slow"
path where it asks the motherboard what function to call, and the
motherboard returns a function pointer according to its designation of
routing, which is then written into the I/O handler. In other words, once
an I/O port has been accessed, further access is a direct call to the
I/O callback.
- If resources or mappings change on the bus, then all I/O ports affected
have the I/O handler changed back to the slow path lookup function, so
that changes take effect when the lookup function returns the new
result according to changed routing.
- If the memory access involves resources that don't overlap but are too
small for DOSBox's 4KB granularity, then the "slow path" function will
always be invoked for that memory I/O because it is impossible to write
both callbacks to that memory page callback.
- Once all I/O and memory resources are routed this way, it becomes easy
for DOSBox to emulate devices that can change I/O ports such as ISA PnP
type devices that allow you to change the base I/O port of a resource.
Sound Blaster ISA PnP emulation will no longer emit a warning when
Windows or any DOS program attempts to reprogram the base address.
It would also allow DOS or Windows to change, relocate, enable/disable
PCI resources. The only performance penalty is that every time a mapping
changes, the emulator has to invalidate all I/O and memory callbacks
to allow the "slow" path to do its work again.
- The reason we don't do bus lookup every time is one of performance.
DOSBox-X already has an array of IO handlers and memory page handlers,
so why not make use of it as a cache for callbacks once the slow path
has been taken? Doing it this way should have almost no impact on
emulator performance.
* Motherboard & BIOS oriented system construction
- Rather than the one way the DOSBox kernel does it, the user could instead
specify that DOSBox-X emulate a particular motherboard with a particular
BIOS. The code could then construct I/O and memory management to emulate
the known chipsets on that board.
Example: If instructed to, it would emulate the system board on an old
laptop of mine with a Chips & Tech 386 AT ASIC, or it could emulate an
old AST motherboard and instruct PIC emulation to act like a Unicorn
Microelectronics UM8259A-2. The default of course would carefully
mimic for backwards compatibility the DOSBox mainline "motherboard" and
"bios" configuration.
- Such construction may include (if on original hardware), VGA emulation
tuned to mimic the onboard VGA of the original hardware if user says it
should be enabled.
* CD audio
- Refactor the code to ensure we feed out CD audio in a way the guest
can track its time accurately.
- IDE/ATAPI emulation needs to support the mode select or whatever commands
used by DOS programs to change CD audio volume.
* Full Intellimouse scrollwheel emulation
- Apparently it's possible to respond to scrollwheel events via SDL, so
add code to receive them.
- Add code to store scroll wheel deltas in mouse event queue.
- Add code to take overall scrollwheel delta and transmit as 4th byte
in Intellimouse mouse on AUX.
- And toughest of them all: Figure out how the hell Windows 98 is able
to use scrollwheel data when it is still reliant on the INT 15h
device callback that's documented only to carry the X, Y, and button
state data. If VirtualBox can do it, so can I! The ONLY documentation
I have on this are snippets of code from CuteMouse that is apparently
able to turn on PS/2 BIOS scroll wheel capture for DOS. In any case
perhaps the best course of action is to write a program in DOSLIB that
hooks the device callback and records the values on the stack during
the call, with and without the Intellimouse knock sequence in effect.
* Multiple DOS kernel emulation
- Instead of only emulating a general mishmash of MS-DOS 5.0 to 6.x syscalls,
allow dosbox-x.conf setting (and command line at runtime) to choose that
a particular brand and version is emulated. For example, if you say that
you want DOSBox-X to emulate MS-DOS 3.3, then it will return values and act
like MS-DOS 3.3 (including the shorter form of the disk parameter table
prior to MS-DOS 4.0). With the current code, if you say that you want
DOSBox-X to emulate MS-DOS 7.1, then it tries to return values and act
like MS-DOS 7.1 (including support for FAT32 drives and long filenames).
* Misc
- If PCI emulation is enabled, then byte-sized writes to port 0xCF9
should follow Intel PIIX chipset documentation: if bit 1 changes from
0 to 1 the system undergoes a "soft reset", and if bit 2 changes from
0 to 1 the system undergoes a "hard reset". Reset method confirmed
working on an old Pentium system of mine, and it complements the
keyboard and port 0x92 methods well.
- So what exotic method are older demos using the clear the screen anyway?
Can you figure it out? Their failure to clear the screen properly is
causing graphic anomalies during certain parts.
- Memory and I/O resource management code. Rather than just pick regions
of memory and I/O space, the emulation code should have a way to mark
that such and such region has been taken for e.g. "VGA BIOS" and
"ROM BIOS". It would make it possible for adapter emulation to know
if the region it is trying to take is already occupied, and provide
a way for said adapter (unless instructed by user) to automatically
pick a location that it can claim. It would also make for good
debugging information.
- Peripherals should assign themselves to a bus if possible. Sound Blaster
emulation for example would register itself to the I/O ports on the
ISA bus. Voodoo 3dfx emulation would register itself to the PCI bus.
- Support not just for declaring an ISA bus and its frequency, but also
for ISA devices that you would declare "attached" to the bus (same with
PCI). Instead of DOSBox's design where peripherals are static and only
one at a time is possible, we would allow you to declare peripherals
and declare them attached to the ISA bus slots. If you want to emulate
a DOS machine with three Sound Blaster cards, you could declare three
of them (with different resources of course) and have them attached to
the ISA bus.
- If I wanted DOSBox-X to emulate a VESA local bus peripheral, would I
have to do anything extra to do it?
- CMOS emulation. The current code sucks. Why exactly are all values
hard-coded? That's not how the RTC/CMOS works! The real deal has
clock registers in the first 14 bytes and the rest is non-volatile
RAM! Fix!
- RTC/CMOS emulation: support non-realtime mode (where the clock does
NOT follow host time but follows time accurately according to emulation).
But of course the option to follow realtime would also be available.
- IDE/ATA emulation: What exactly is triggering the debugger when
you boot MS-DOS 6.22 using the OAK CD-ROM driver? It needs to be removed,
it makes using MS-DOS 6.22 with debugger builds annoying.
- VGA Linewise rendering is currently hardcoded for 16bpp RGB. Why?
Add option to allow the user to choose 32bpp RGBA linewise rendering.
- VGA output: add optional scalar or post-processing that can auto-detect
fake high-color VGA modes in demos, and process the scanlines such that
the RGB spreads vertically to mask the raster scanline effect (so that
the picture is presentable even if rescaled later)
- VGA output: Add support for VESA 24bpp modes (DOSBox's scalers are
currently hard-coded for 8/16/32bpp). There are some demos (a 1997
Coma demo comes to mind) where if a 24/32bpp mode is chosen the demo
assumes 24bpp RGB arrangement.
- VGA debugging function: Add code that, if triggered, allows DOSBox to
pause emulation and allow you to examine/play with the VGA palette, DAC,
registers, screen bytes, etc. The reason I want to do this is that there
are some demos (listed elsewhere in the BUGS section) where for whatever
reason there are VGA palette errors, some entries remain black despite
palette animation. The "debugger" would overlay the VGA screen, of course.
- VGA "fixed output" mode. A scalar would be invoked if enabled that
upscales all VGA raster output to a specific resolution and frame rate
(the frame rate would be 250Hz, 300Hz, or 1000Hz so that refresh rate
changes are better represented accurately). This would be one way to
capture demos that change VGA modes once per section in one AVI file.
Scalar would include common VGA resolutions like 640x400, 640x480,
800x600, and 1024x768. The scalar could also distort the picture if
the CRT timing is known to cause older VGA monitors to squeeze the
picture (such as some older DOS demos that speed up vertical retrace
knowing it would cause older VGA monitors to focus the raster beam
in the center for a "widescreen" effect).
- VGA overscan border rendering. Update/rewrite the raster linewise
renderers to include overscan border in output if asked to.
- ODML AVI capture. The current code works great until you hit 2GB, then
falls apart. I would be willing to throw in code I've written for other
professional projects to write AVI files that are ODML compliant to
enable longer captures >= 2GB (contain both the AVIOLDINDEX and ODML
AVI index).