- added instructions how to update the online documentation
[bochs-mirror.git] / doc / docbook / development / development.dbk
blob2542ec8b518dde0c1c9278a6279dd82f2ae586de
1 <!--
2 ================================================================
3 doc/docbook/development/development.dbk
4 $Id: development.dbk,v 1.30 2008/12/17 14:43:16 vruppert Exp $
6 This is the top level file for the Bochs Developers Manual.
7 ================================================================
8 -->
9 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook V4.1//EN" [
11 <!-- include definitions that are common to all Bochs documentation -->
12 <!ENTITY % bochsdefs SYSTEM "../include/defs.sgm">
13 %bochsdefs;
16 <book>
17 <bookinfo>
18    <title>Bochs Developers Guide</title>
19    <authorgroup>
20    <author><firstname>Kevin</firstname><surname>Lawton</surname></author>
21    <author><firstname>Bryce</firstname><surname>Denney</surname></author>
22    <author><firstname>Christophe</firstname><surname>Bothamy</surname></author>
23    <editor><firstname>Michael</firstname><surname>Calabrese</surname></editor>
24    </authorgroup>
25 </bookinfo>
27 <!-- *************************************************************** -->
28 <chapter id="resources"><title>Resources for developers</title>
29 <para>
30 The development guide describes resources that are intended for developers
31 in particular.  Many Bochs resources are also covered in the User Guide,
32 including compile instructions, bochsrc options, how to find the mailing
33 lists, etc.
34 </para>
37 <section><title>Setting up CVS write access</title>
38 <para>
39 If you are an official SourceForge developer, then you can use CVS with write
40 access.  The CVS contains the most recent copy of the source code, and with
41 write access you can upload any changes you make to the CVS server for others
42 to use.  A few extra steps are required the first time you use CVS write
43 access.
44 </para>
46 <section><title>Install ssh and cvs</title>
47 <para>
48 First you need to install both cvs (Concurrent Version System) and ssh (Secure
49 Shell).  These are already installed on many UNIX systems and also Cygwin
50 (win32 platform).  If not, you can install binaries or compile cvs and ssh
51 yourself.  The links below should help you get going.
52 </para>
53 <itemizedlist>
54 <listitem> <para> CVS software and instructions are available at <ulink url="http://www.cvshome.org">www.cvshome.org</ulink>. </para> </listitem>
55 <listitem> <para> A free version of secure shell called OpenSSH is at <ulink url="http://www.openssh.org">www.openssh.org</ulink>. </para> </listitem>
56 <listitem> <para> OpenSSH requires a library called OpenSSL from <ulink url="http://www.openssl.org">www.openssl.org</ulink>.  Be sure to install OpenSSL before trying to compile OpenSSH. </para> </listitem>
57 </itemizedlist>
58 </section>
60 <section><title>ssh to cvs.sf.net</title>
61 <para>
62 Next, you need to use secure shell to connect to cvs.sf.net.  This step is a
63 little strange, because you can't actually log in and get a shell prompt.  All
64 that will happen, when you get the username and password right, is that it
65 will create a home directory on that machine for you.  That's it!  If you try
66 it again, it will say "This is a restricted Shell Account.  You cannot execute
67 anything here."   At this point, you've succeeded and you never have to do
68 this step again, ever.
70 <screen>
71   ssh <replaceable>sfusername</replaceable>@bochs.cvs.sf.net
72 </screen>
73 </para>
75 <para>
76 Replace <replaceable>sfusername</replaceable> with your Source Forge username,
77 of course.  The first time, you will probably get a message like
78 <screen>
79 The authenticity of host 'cvs.sf.net' can't be established.
80 Are you sure you want to continue?</screen>
82 Just type yes.  When it asks for a password, be sure to type your source
83 forge password.  If you have trouble logging in, be sure to use your SOURCE
84 FORGE username and password in the ssh line, which isn't necessarily the same
85 as your local username and password.  Add the "-v" option to ssh to see more
86 information about what is failing.  If you have ssh version 2, it is possible
87 that you might need to add "-1" to the ssh command to force it to use the
88 version 1 protocol.  </para> </section>
90 <section><title>Set CVS_RSH environment variable to ssh</title>
91 <para>
92 Every time you connect to the Source Forge CVS server (including cvs update,
93 stat, commit, etc.), you must set the CVS_RSH environment variable to ssh.  So
94 just take the time now to add one of these lines to your .bashrc/.cshrc, so
95 that the CVS_RSH setting will be there every time you log in.
96 </para>
98 <screen>
99   export CVS_RSH=ssh           (bash syntax)
100   setenv CVS_RSH ssh           (csh syntax)
101 </screen>
102 </section> <!--end of "Set environment variable"-->
104 <section><title>cvs checkout</title>
105 <para>
106 Finally, you should be able to do the checkout!  If you already have a Bochs
107 subdirectory directory, move it out of the way because the checkout will
108 overwrite it.
109 </para>
111 <screen>
112   export CVSROOT=":ext:<replaceable>sfusername</replaceable>@bochs.cvs.sourceforge.net:/cvsroot/bochs"
113   cvs -z3 checkout bochs
114   <replaceable>sfusername</replaceable>@bochs.cvs.sourceforge.net's password:        <replaceable><--type your password</replaceable>
115 </screen>
117 <para>
118 In the CVSROOT variable, replace <replaceable>sfusername</replaceable> with your SF username.  There's
119 no need to add CVSROOT to your rc files because CVS will remember it
120 after the checkout.  The -z3 (optional) just adds some compression to make
121 the checkout go faster.  Once all the files have been downloaded, you will
122 have a Bochs directory which is checked out with write access!
123 </para>
124 </section> <!-- end cvs checkout -->
126 </section> <!-- end setting up cvs write access -->
128 <section id="using-cvs-write-access"><title>Using CVS write access</title>
130 <section><title>Checking in files</title>
131 <para>
132 Once you have a Bochs directory with cvs write access, you can compile the
133 files, edit them, test them, etc.  See the documentation section, "Tracking
134 the source code with CVS" for more info on CVS, in the User Manual.
135 (FIXME: add cross reference) But what's new and different is that you can now
136 do cvs commits.  When a file is all fixed and ready to share with the rest of
137 the world, you run a commit command to upload your version to the server.
138 First, it's good to do a cvs update to make sure nobody else has changed it
139 since you downloaded it last.
140 </para>
142 <screen>
143   $ cvs update file.cc
144   <replaceable>sfusername</replaceable>@bochs.cvs.sf.net's password:        <replaceable><--type your password</replaceable>
145   $ cvs commit file.cc
146   <replaceable>sfusername</replaceable>@bochs.cvs.sf.net's password:        <replaceable><--type your password</replaceable>
147   [editor opens. type log message, save, and exit.]
148 </screen>
150 <para>
151 When CVS starts an editor, The default is usually vi.  If you want a different
152 editor, set the EDITOR environment variable to the name of your preferred
153 editor.  When you're done, just save the file and quit the editor.  Unless
154 there's some problem, you will see a message that says what the new revision
155 number for the file is, and then "done".  If while you're editing the log
156 message, you decide that you don't want to commit after all, don't save the
157 file.  Quit the editor, and when it asks where the log message went, tell it
158 to abort.
159 </para>
161 <para>
162 Here is an example of a successful checkin:
164 <screen>
165   $ cvs commit misc.txt
166   <replaceable>sfusername</replaceable>@bochs.cvs.sf.net's password:        <replaceable><--type your password</replaceable>
167   [edit log msg]
168   Checking in misc.txt;
169   /cvsroot/bochs/bochs/doc/docbook/misc.txt,v  <--  misc.txt
170   new revision: 1.6; previous revision: 1.5
171   done
172 </screen>
174 And here is an aborted one:
176 <screen>
177   $ cvs commit misc.txt
178   <replaceable>sfusername</replaceable>@bochs.cvs.sf.net's password:        <replaceable><--type your password</replaceable>
179   [quit editor without saving]
180   Log message unchanged or not specified
181   a)bort, c)ontinue, e)dit, !)reuse this message unchanged for remaining dirs
182   Action: a
183   cvs [commit aborted]: aborted by user
184 </screen>
186 </para>
187 </section> <!--end of "Checking in Files" -->
189 </section> <!--end of "Using CVS write access" -->
191       <section id="trackers"><title>SourceForge bug, feature, and patch trackers</title>
192          <para>
193          &FIXME;
194          </para>
195       </section>
197 <section id="other"><title>Ideas for other sections</title>
198 <para>
199 <screen>
200 Ideas:
201 - how to browse code with cvsweb
202 - how to find an identifier, variable, or specific text in the code
203 - how to make patches with CVS
204 </screen>
205 </para>
206 </section>
208 </chapter>
210 <chapter id="about-the-code"><title>About the code</title>
212 <section id="code-overview"><title>Overview</title>
213 <para>
214 The initial versions of some sections in this chapter are based on a document
215 written by Peter "Firefly" Lund. It was added and updated in January 2006.
216 </para>
217 <para>
218 The Bochs virtual PC consists of many pieces of hardware. At a bare minimum
219 there are always a CPU, a PIT (Programmable Interval Timer), a PIC
220 (Programmable Interrupt Controller), a DMA controller, some memory (this
221 includes both RAM and BIOS ROMs), a video card (usually VGA), a keyboard port
222 (also handles the mouse), an RTC with battery backed NVRAM, and some extra
223 motherboard circuitry.
224 </para>
225 <para>
226 There might also be a NE2K ethernet card, a PCI controller, a Sound Blaster 16,
227 an IDE controller (+ harddisks/CDROM), a SCSI controller (+ harddisks), a
228 floppy controller, an APIC ..
229 </para>
230 <para>
231 There may also be more than one CPU.
232 </para>
233 <para>
234 Most of these pieces of hardware have their own C++ class - and if Bochs is
235 configured to have more than one piece of a type of hardware, each will have
236 its own object.
237 </para>
238 <para>
239 The pieces of hardware communicates over a couple of buses with each other -
240 some of the things that the buses carry are reads and writes in memory space,
241 reads and writes in I/O space, interrupt requests, interrupt acknowledges, DMA
242 requests, DMA acknowledges, and NMI request/acknowledge. How that is simulated
243 is explained later.&FIXME;
244 </para>
245 <para>
246 Other important pieces of the puzzle are: the options object (reads/writes
247 configuration files, can be written to and queried while Bochs is running) and
248 the GUI object. There are many different but compatible implementations of the
249 GUI object, depending on whether you compile for X (Unix/Linux), Win32,
250 Macintosh (two versions: one for Mac OS X and one for older OS's), BeOS, Amiga,
251 etc.
252 </para>
253 <para>
254 And then there is the supporting cast: debugger, config menu, panic handler,
255 disassembler, tracer, instrumentation.
256 </para>
257 </section>
259 <section id="directory-structure"><title>Directory Structure</title>
260 <para>
261 <table>
262 <title>Directory structure</title>
263 <tgroup cols="2">
264 <thead>
265 <row>
266 <entry>Location</entry>
267 <entry>Meaning</entry>
268 </row>
269 </thead>
270 <tbody>
271 <row><entry>bios</entry><entry>System and VGA BIOS images, system BIOS sources and makefile</entry></row>
272 <row><entry>build</entry><entry>additional stuff required for building Bochs on different platforms</entry></row>
273 <row><entry>bx_debug</entry><entry>the builtin Bochs debugger</entry></row>
274 <row><entry>cpu</entry><entry>the cpu emulation sources</entry></row>
275 <row><entry>disasm</entry><entry>the disassembler for the Bochs debugger</entry></row>
276 <row><entry>doc/docbook</entry><entry>the Bochs documentation in DocBook format</entry></row>
277 <row><entry>doc/man</entry><entry>Bochs manual pages</entry></row>
278 <row><entry>docs-html</entry><entry>old Bochs documentation in HTML (will be replaced by DocBook)</entry></row>
279 <row><entry>dynamic</entry><entry>empty directory (reserved for dynamic translation code)</entry></row>
280 <row><entry>font</entry><entry>the default VGA font used by most of the display libraries</entry></row>
281 <row><entry>fpu</entry><entry>the fpu emulation sources</entry></row>
282 <row><entry>gui</entry><entry>display libraries (guis), the simulator interface and text mode config interface</entry></row>
283 <row><entry>gui/bitmaps</entry><entry>bitmaps for the headerbar</entry></row>
284 <row><entry>gui/keymaps</entry><entry>keymaps for the keyboard mapping feature</entry></row>
285 <row><entry>host</entry><entry>host specific drivers (currently only used by the pcidev kernel module for Linux)</entry></row>
286 <row><entry>instrument</entry><entry>directory tree for the instrumentation feature</entry></row>
287 <row><entry>iodev</entry><entry>standard PC devices, PCI devices, lowlevel networking and sound drivers</entry></row>
288 <row><entry>memory</entry><entry>memory management and ROM loader</entry></row>
289 <row><entry>misc</entry><entry>useful utilities (e.g. bximage, bxcommit, niclist)</entry></row>
290 <row><entry>misc/sb16</entry><entry>tool to control the SB16 emulation from the guest side</entry></row>
291 <row><entry>patches</entry><entry>pending patches</entry></row>
292 <row><entry>plex86</entry><entry>plex86 directory structure (possibly outdated)</entry></row>
293 </tbody>
294 </tgroup>
295 </table>
296 </para>
297 </section>
299 <section id="emulator-objects"><title>Emulator Objects</title>
300 <section><title>Weird macros and other mysteries</title>
301 <para>
302 Bochs has many macros with inscrutable names. One might even go as far as to
303 say that Bochs is macro infested.
304 Some of them are gross speed hacks, to cover up the slow speed that C++ causes.
305 Others paper over differences between the simulated PC configurations.
306 Many of the macros exhibit the same problem as C++ does: too much stuff happens
307 behind the programmer's back. More explicitness would be a big win.
308 </para>
309 </section>
310 <section id="static-methods-hack"><title>Static methods hack</title>
311 <para>
312 C++ methods have an invisible parameter called the this pointer - otherwise the
313 method wouldn't know which object to operate on. In many cases in Bochs, there
314 will only ever be one object - so this flexibility is unnecessary. There is a
315 hack that can be enabled by #defining BX_USE_CPU_SMF to 1 in <filename>config.h
316 </filename> that makes most methods static, which means they have a "special
317 relationship" with the class they are declared in but apart from that are
318 normal C functions with no hidden parameters. Of course they still need access
319 to the internals of an object, so the single object of their class has a globally
320 visible name that these functions use. It is all hidden with macros.
321 </para>
322 <para>
323 Declaration of a class, from iodev/pic.h:
324 </para>
325 <screen>
327 #if BX_USE_PIC_SMF
328 #  define BX_PIC_SMF  static
329 #  define BX_PIC_THIS thePic->
330 #else
331 #  define BX_PIC_SMF
332 #  define BX_PIC_THIS this->
333 #endif
335 class bx_pic_c : public bx_pic_stub_c {
337 public:
338   bx_pic_c(void);
339   ~bx_pic_c(void);
341   BX_PIC_SMF void   service_master_pic(void);
342   BX_PIC_SMF void   service_slave_pic(void);
343   BX_PIC_SMF void   clear_highest_interrupt(bx_pic_t *pic);
344   };
345 </screen>
346 <para>
347 And iodev/pic.cc:
348 </para>
349 <screen>
351 #define LOG_THIS thePic->
353 bx_pic_c *thePic = NULL;
355   void
356 bx_pic_c::service_master_pic(void)
358   Bit8u unmasked_requests;
359   int irq;
360   Bit8u isr, max_irq;
361   Bit8u highest_priority = BX_PIC_THIS s.master_pic.lowest_priority + 1;
362   if(highest_priority > 7)
363     highest_priority = 0;
365   if (BX_PIC_THIS s.master_pic.INT) { /* last interrupt still not acknowleged */
366     return;
367     }
369   if (BX_PIC_THIS s.master_pic.special_mask) {
370     /* all priorities may be enabled.  check all IRR bits except ones
371      * which have corresponding ISR bits set
372      */
373     max_irq = highest_priority;
374     }
375   else { /* normal mode */
376     /* Find the highest priority IRQ that is enabled due to current ISR */
377     isr = BX_PIC_THIS s.master_pic.isr;
381 </screen>
382 <para>
383 Ugly, isn't it? If we use static methods, methods prefixed with BX_PIC_SMF are
384 declared static and references to fields inside the object, which are prefixed
385 with BX_PIC_THIS, will use the globally visible object, thePic->. If we don't
386 use static methods, BX_PIC_SMF evaluates to nothing and BX_PIC_THIS becomes this->.
387 Making it evaluate to nothing would be a lot cleaner, but then the scoping rules
388 would change slightly between the two Bochs configurations, which would be a load
389 of bugs just waiting to happen. Some classes use BX_SMF, others have their own
390 version of the macro, like BX_PIC_SMF above.
391 </para>
392 </section>
393 <section id="cpu-mem-objects"><title>CPU und memory objects in UP/SMP configurations</title>
394 <para>
395 The CPU class is a special case of the above: if Bochs is simulating a uni-
396 processor machine then there is obviously only one bx_cpu_c object and the
397 static methods trick can be used. If, on the other hand, Bochs is simulating an
398 smp machine then we can't use the trick. The same seems to be true for memory:
399 for some reason, we have a memory object for each CPU object. This might become
400 relevant for NUMA machines, but they are not all that common -- and even the
401 existing IA-32 NUMA machines bend over backwards to hide that fact: it should
402 only be visible in slightly worse timing for non-local memory and non-local
403 peripherals. Other than that, the memory map and device map presented to each
404 CPU will be identical.
405 </para>
406 <para>
407 In a UP configuration, the CPU object is declared as bx_cpu. In an SMP
408 configuration it will be an array of pointers to CPU objects (bx_cpu_array[]).
409 For memory that would be bx_mem and bx_mem_array[], respectively.
410 Each CPU object contains a pointer to its associated memory object.
411 Access of a CPU object often goes through the BX_CPU(x) macro, which either
412 ignores the parameter and evaluates to &amp;bx_cpu, or evaluates to bx_cpu_array
413 [n], so the result will always be a pointer. The same goes for BX_MEM(x).
414 If static methods are used then BX_CPU_THIS_PTR evaluates to BX_CPU(0)->. Ugly,
415 isn't it?
416 </para>
417 </section>
418 <section id="config-parameter-tree"><title>The configuration parameter tree</title>
419 <para>
420 Starting with version 1.3, the Bochs configuration parameters are stored in parameter
421 objects. These objects have get/set methods with min/max checks and it is possible
422 to define parameter handlers to perform side effects and to override settings.
423 Each parameter type has it's own object type with specific features (numeric,
424 boolean, enum, string and file name). A special object type containing a list of
425 parameters is designed for building and managing configuration menus or dialogs
426 automatically. In the original implementation the parameters could be accessed
427 only with their unique id from a static list or a special structure containing
428 pointers to all parameters.
429 </para>
430 <para>
431 Starting with version 2.3, the Bochs parameter object handling has been rewritten
432 to a parameter tree. There is now a root list containing child lists, and these
433 lists can contain lists or parameters and so on. The parameters are now accessed
434 by a name build from all the list names in the path and finally the parameter
435 name separated by periods.
436 <screen>
437 Bit32u megs = SIM->get_param_num("memory.standard.ram.size")->get();
438 </screen>
439 </para>
440 <para>
441 The example above shows how to get the memory size in megabytes from the simulator
442 interface. In the root list (".") there is child list named "memory" containing
443 a child list "standard". It's child list "ram" contains the numeric parameter type
444 "size". The SIM->get_param_num() methods returns the object pointer and the get()
445 method returns the parameter value.
446 </para>
447 <para>
448 The table below shows all parameter types used by the Bochs configuration interface.
449 <table>
450 <title>Parameter types</title>
451 <tgroup cols="2">
452 <thead>
453 <row>
454 <entry>Type</entry>
455 <entry>Description</entry>
456 </row>
457 </thead>
458 <tbody>
459 <row>
460 <entry>bx_object_c</entry>
461 <entry>Base class for all the other parameter types. It contains the unique parameter id and the object type value.</entry>
462 </row>
463 <row>
464 <entry>bx_param_c</entry>
465 <entry>Generic parameter class. It contains the name, label, description and the input/output formats.</entry>
466 </row>
467 <row>
468 <entry>bx_param_num_c</entry>
469 <entry>Numerical (decimal/hex) config settings are stored in this parameter type.</entry>
470 </row>
471 <row>
472 <entry>bx_param_bool_c</entry>
473 <entry>This parameter type is based on bx_param_num_c, but it is designed for boolean values. A dependency
474 list can be defined to enable/disable other parameters depending on the value change.</entry>
475 </row>
476 <row>
477 <entry>bx_param_enum_c</entry>
478 <entry>Based on bx_param_num_c this parameter type contains a list of valid values.</entry>
479 </row>
480 <row>
481 <entry>bx_param_string_c</entry>
482 <entry>Configuration strings are stored in this type of parameter.</entry>
483 </row>
484 <row>
485 <entry>bx_param_filename_c</entry>
486 <entry>Based on bx_param_string_c this parameter type is used for file names.</entry>
487 </row>
488 <row>
489 <entry>bx_list_c</entry>
490 <entry>Contains a list of pointers to parameters (bx_param_*_c and bx_list_c).
491 In the config interface it is used for menus/dialogs.</entry>
492 </row>
493 </tbody>
494 </tgroup>
495 </table>
496 </para>
497 </section>
498 <section id="save-restore"><title>The save/restore feature</title>
499 <para>
500 The save/restore feature is based on an extension to the parameter tree concept.
501 A subtree (list) called "bochs" appears in the root of the parameter tree
502 and some new "shadow" parameter types store pointers to values instead of the values
503 itself. All the hardware objects have register_state() methods to register pointers
504 to the device registers and switches that need to be saved. The simulator interface
505 saves the registered data in text format to the specified folder (usually one file
506 per item in the save/restore list). Large binary arrays are registered with a
507 special parameter type, so they are saved as separate files.
508 </para>
509 <para>
510 The table below shows the additional parameter types for save/restore.
511 <table>
512 <title>Save/restore parameter types</title>
513 <tgroup cols="2">
514 <thead>
515 <row>
516 <entry>Type</entry>
517 <entry>Description</entry>
518 </row>
519 </thead>
520 <tbody>
521 <row>
522 <entry>bx_shadow_num_c</entry>
523 <entry>Based on bx_param_num_c this type stores a pointer to a numerical variable.</entry>
524 </row>
525 <row>
526 <entry>bx_shadow_bool_c</entry>
527 <entry>This parameter type stores a pointer to a boolean variable.</entry>
528 </row>
529 <row>
530 <entry>bx_shadow_data_c</entry>
531 <entry>This special parameter type stores pointer size of a binary array.</entry>
532 </row>
533 </tbody>
534 </tgroup>
535 </table>
536 It is also possible to use the bx_param_num_c object with parameter save/restore
537 handlers. With this special way several device settings can be save to and restored
538 from one single parameter.
539 </para>
540 <para>
541 All devices can uses these two save/restore specific methods:
542 <itemizedlist>
543 <listitem><para>register_state() is called after the device init() to register the device members for save/restore</para></listitem>
544 <listitem><para>after_restore_state() is an optional method to do things directly after restore</para></listitem>
545 </itemizedlist>
546 </para>
547 </section>
548 </section>
550      <section id="configure-scripting"><title>Configure Scripting</title>
551       <para>
552       &FIXME;
553       configure script, makefiles, header files
554       </para>
555      </section>
557       <section id="logfunctions"><title>Log Functions</title>
558       <para>
559       &FIXME;
560       log functions: what is a panic, what is an error, etc.
561       </para>
562       </section>
564       <section id="timers"><title>timers</title>
565       <para>
566       &FIXME;
567       </para>
568       </section>
570 <section id="cmos-map"><title>Bochs's CMOS map</title>
571 <para>
572 In addition to the default CMOS RAM layout, the Bochs BIOS uses some additional
573 registers for harddisk parameters and the boot sequence. The following table
574 shows all CMOS registers and their meaning.
575 </para>
576 <para>
577 <screen>
578 Legend:
579 S       - set by the emulator (Bochs)
580 B       - set by the bios
581 U       - unused by the bios
583 LOC     NOTES   MEANING
584 0x00    S       rtc seconds
585 0x01    B       second alarm
586 0x02    S       rtc minutes
587 0x03    B       minute alarm
588 0x04    S       rtc hours
589 0x05    B       hour alarm
591 0x06    S,U     day of week
592 0x07    S,B     date of month
593 0x08    S,B     month
594 0x09    S,B     year
596 0x0a    S,B     status register A
597 0x0b    S,B     status register B
598 0x0c    S       status register C
599 0x0d    S       status register D
601 0x0f    S       shutdown status
602     values:
603         0x00: normal startup
604         0x09: normal
605         0x0d+: normal
606         0x05: eoi ?
607         else: unimpl
609 0x10    S       fd drive type (2 nibbles: high=fd0, low=fd1)
610     values:
611         1: 360K 5.25"
612         2: 1.2MB 5.25"
613         3: 720K 3.5"
614         4: 1.44MB 3.5"
615         5: 2.88MB 3.5"
617 !0x11   configuration bits!!
619 0x12    S       how many disks first (hd type)
621 !0x13   advanced configuration bits!!
623 0x14    S,U     equipment byte (?)
624         bits    where           what
625         7-6     floppy.cc
626         5-4     vga.cc          0 = vga
627         2       keyboard.cc     1 = enabled
628         0       floppy.cc
630 0x15    S,U     base memory - low
631 0x16    S,U     base memory - high
633 0x17    S,U     extended memory in k - low
634 0x18    S,U     extended memory in k - high
636 0x19    S       hd0: extended type
637 0x1a    S       hd1: extended type
639 0x1b    S,U     hd0:cylinders - low
640 0x1c    S,U     hd0:cylinders - high
641 0x1d    S,U     hd0:heads
642 0x1e    S,U     hd0:write pre-comp - low
643 0x1f    S,U     hd0:write pre-comp - high
644 0x20    S,U     hd0:retries/bad_map/heads>8
645 0x21    S,U     hd0:landing zone - low
646 0x22    S,U     hd0:landing zone - high
647 0x23    S,U     hd0:sectors per track
649 0x24    S,U     hd1:cylinders - low
650 0x25    S,U     hd1:cylinders - high
651 0x26    S,U     hd1:heads
652 0x27    S,U     hd1:write pre-comp - low
653 0x28    S,U     hd1:write pre-comp - high
654 0x29    S,U     hd1:retries/bad_map/heads>8
655 0x2a    S,U     hd1:landing zone - low
656 0x2b    S,U     hd1:landing zone - high
657 0x2c    S,U     hd1:sectors per track
659 0x2d    S       boot from (bit5: 0:fd, 1:hd)
661 0x2e    S,U     standard cmos checksum (0x10->0x2d) - high
662 0x2f    S,U     standard cmos checksum (0x10->0x2d) - low
664 0x30    S       extended memory in k - low
665 0x31    S       extended memory in k - high
667 0x32    S       rtc century
669 0x34    S       extended memory in 64k - low
670 0x35    S       extended memory in 64k - high
672 0x37    S       ps/2 rtc century (copy of 0x32, needed for winxp)
674 0x38    S       eltorito boot sequence + boot signature check
675         bits
676         0       floppy boot signature check (1: disabled, 0: enabled)
677         7-4     boot drive #3 (0: unused, 1: fd, 2: hd, 3:cd, else: fd)
679 0x39    S       ata translation policy - ata0 + ata1
680         bits
681         1-0     ata0-master (0: none, 1: LBA, 2: LARGE, 3: R-ECHS)
682         3-2     ata0-slave
683         5-4     ata1-master
684         7-6     ata1-slave
686 0x3a    S       ata translation policy - ata2 + ata3 (see above)
688 0x3d    S       eltorito boot sequence (see above)
689         bits
690         3-0     boot drive #1
691         7-4     boot drive #2
692 </screen>
693 </para>
694 </section>
696 <section id="sb16-emulation-basics"> <!-- start of SB16 section-->
698 <title>Sound Blaster 16 Emulation</title>
699 <note><para>
700   A little more up-to-date version of the user related part of this section is
701   available in the <ulink url="../user/sb16-emulation.html">user guide</ulink>.
702 </para></note>
703 <para>
704 Sound Blaster 16 (SB16) emulation for Bochs was written and donated by
705 Josef Drexler, who has a
706 <ulink url="http://publish.uwo.ca/~jdrexler/bochs/">web page</ulink> on the topic.
707   The entire set of his SB16 patches have been integrated into
708 Bochs, however, so you can find everything you need here.
709 </para>
711 <para>
712 SB16 Emulation has been tested with several soundcards and versions of Linux.  Please give
713 Josef <ulink url="mailto:jdrexler@julian.uwo.ca">feedback</ulink> on
714 whether is does or doesn't work on your combination of software and hardware.
715 </para>
717 <section><title>How well does it work?</title>
718 <para>
719 Right now, MPU401 emulation is next to perfect. It supports UART
720 and SBMIDI mode, because the SB16's MPU401 ports can't do anything else as well.
721 </para>
723 <para>
724 The digital audio basically works, but the emulation is too slow for fluent
725 output unless the application doesn't do much in the background (or the
726 foreground, really). The sound tends to looping or crackle on slower
727 computer, but the emulation appears to be correct. Even a MOD
728 player works, although only for lower sampling speeds.
729 </para>
730 <para>
731 Also, the MIDI data running through the MPU401 ports can be written
732 into a SMF, that is the standard midi file. The wave output
733 can be written into a VOC file, which has a format defined by
734 Creative Labs. This file format can be converted to WAV by
735 sox for example.
736 </para>
737 </section>
739 <section><title>Output to a sound card</title>
741 <para>
742 Output is supported on Linux and Windows 95 at the moment.
743 On Linux, the output goes to any file or device. If you have a
744 wavetable synthesizer, midi can go to /dev/midi00, otherwise you may need
745 a midi interpreter. For example, the midid program from the
746 DosEmu project would work. Wave output should go to /dev/dsp.
747 These devices are assumed to be OSS devices, if they're not
748 some of the ioctl's might fail.
749 On Windows, midi and output goes to the midi mapper and the wave mapper,
750 respectively. A future version might have selectable output devices.
751 </para>
752 </section>
754 <section><title>Installation on Linux</title>
756 <para>
757 <emphasis>Prerequisites:</emphasis>
758 </para>
760 <para>
761 A wavetable synthesizer on /dev/midi00 and a working /dev/dsp if you want real time music and sound, otherwise output to midi and wave files is also possible.
762 Optionally, you can use a software midi interpreter, such as the midid program from the DosEmu project instead of /dev/midi00.
763 </para>
764 </section>
766 <section><title>Configuring Bochs</title>
768 <para>
769 There are a few values in config.h that are relevant to the sound functions.
770 Edit config.h after running configure, but before compiling.
771 </para>
773 <para>
774 BX_USE_SB16_SMF should be 1 unless you intend to have several sound cards
775 running at the same time.
776 </para>
778 <para>
779 BX_USE_SOUND_VIRTUAL can be 0 or 1, and determines whether the output class
780 uses virtual functions or not. The former is more versatile and allows to
781 select the class at runtime (not supported at the moment), while the latter
782 is slightly faster.
783 </para>
785 <para>
786 BX_SOUND_OUTPUT_C is the name of the class used for output.  The default is
787 to have no output functions, so you need to change this if you want any sound.
788 The following are supported at the moment:
789 </para>
791 <programlisting>
792         bx_sound_linux_c    for output to /dev/dsp and /dev/midi00 on Linux
793                             (and maybe other OSes that use the OSS driver)
794         bx_sound_windows_c  for output to the midi and wave mapper of
795                             Windows 3.1 and higher.
796         bx_sound_output_c   for no output at all.
797 </programlisting>
799 <para>
800 Setup the SB16 emulation in your .bochsrc, according to instructions
801 in that file.
802 </para>
803 </section>
805 <section><title>Runtime configuration</title>
807 <para>
808 The source for the SB16CTRL program that is used to modify
809 the runtime behaviour of the SB16 emulator is included in
810 misc/sb16. You can compile it or download the
811 <ulink url="http://publish.uwo.ca/~jdrexler/bochs/">executable</ulink>.
812 </para>
814 <para>
815 See the section "Sound Blaster 16 Emulation" in the user documentation for
816 information about the commands of SB16CTRL.
817 </para>
818 </section>
820 <section><title>Features planned for the future</title>
821 <itemizedlist>
822 <listitem><para>Ports to more OS's, but I can't do this myself</para></listitem>
823 <listitem><para>Finishing the OPL3 FM emulation by translating the music to midi data</para></listitem>
824 </itemizedlist>
825 </section>
827 <section>
828 <title>Description of the sound output classes</title>
830 <para>
831 This file is intended for programmers who would like to port the sound
832 output routines to their platform. It gives a short outline what services
833 have to be provided.
834 </para>
835 <para>
836 You should also have a look at the exisiting files, <emphasis>SOUNDLNX.CC</emphasis>
837 for Linux and <emphasis>SOUNDWIN.CC</emphasis> for Windows and their respective
838 header files to get an idea about how these things really work.
839 </para>
840 </section>
842 <section><title>Files</title>
844 <para>
845 The main include file is <emphasis>bochs.h</emphasis>. It has all definitions
846 for the system-independent functions that the SB16 emulation uses, which
847 are defined in <emphasis>sb16.h</emphasis>.
848 </para>
850 <para>
851 Additionally, every output driver will have an include file, which
852 should be included at the end of sb16.h to allow the emulator
853 to use that driver.
854 </para>
856 <para>
857 To actually make the emulator use any specific driver,
858 <emphasis>BX_SOUND_OUTPUT_C</emphasis> has to be set to the name of the respective
859 output class.
860 </para>
862 <para>
863 Note that if your class contains any system-specific statements,
864 include-files and so on, you should enclose both the include-file and
865 the CC-file in an <emphasis>#if defined</emphasis> (OS-define) construct.
866 Also don't forget to add your file to the object list in
867 iodev/Makefile and iodev/Makefile.in.
868 </para>
869 </section>
871 <section><title>Classes</title>
873 <para>
874 The following classes are involved with the SB16 emulation:
875 </para>
876 <itemizedlist>
877 <listitem><para>
878 <emphasis>bx_sb16_c</emphasis> is the class containing the emulator itself, that
879 is the part acting on port accesses by the application, handling the
880 DMA transfers and so on. It also prepares the data for the output
881 classes.
882 </para></listitem>
884 <listitem><para>
885 <emphasis>bx_sound_output_c</emphasis> is the base output class. It has all
886 the methods used by the emulator, but only as stubs and does not
887 actually produce any output. These methods are then called by
888 the emulator whenever output is necessary.
889 </para></listitem>
891 <listitem><para>
892 <emphasis>bx_sound_OS_c</emphasis> is derived from
893 <emphasis>bx_sound_output_c</emphasis>. It contains the code to generate
894 output for the <emphasis>OS</emphasis> operating system.
895 It is necessary to override all
896 the methods defined in the base class, unless virtual functions
897 are used. Note that this should remain an option, so try to
898 override all methods, even if only as stubs. They should be
899 declared <emphasis>virtual</emphasis> if and only if <emphasis>BX_USE_SOUND_VIRTUAL</emphasis>
900 is defined, just as in the examples.
901 The constructor should call the inherited constructor
902 as usual, even though the current constructor does not do
903 anything yet.
904 </para></listitem>
905 </itemizedlist>
906 </section>
909 <section><title>Methods</title>
910 <para>
911 The following are the methods that the output class has to override.
912 All but constructor and destructor have to return either
913 <emphasis>BX_SOUND_OUTPUT_OK</emphasis> <emphasis>(0)</emphasis> if the function was successful,
914 or <emphasis>BX_SOUND_OUTPUT_ERR</emphasis> <emphasis>(1)</emphasis> if not. If any of the initialization
915 functions fail, output to that device is disabled until the emulator is restarted.
916 </para>
917 </section>
919 <section><title>bx_sound_OS_c(bx_sb16_c*sb16)</title>
921 <para>
922 The emulator instantiates the class at the initialization of Bochs.
923 </para>
925 <para>
926 Description of the parameter:
927 </para>
929 <itemizedlist>
930 <listitem><para>
931 <emphasis>sb16</emphasis> is a pointer to the emulator class.
932 This pointer can then be used to access for example the <emphasis>writelog</emphasis> function to generate
933 sound-related log messages. Apart from that, no access to the emulator
934 should be necessary.
935 </para></listitem>
937 <listitem><para>
938 The constructor should <emphasis>not</emphasis> allocate the output devices.
939 This shouldn't be done until the actual output occurs; in either
940 <emphasis>initmidioutput()</emphasis> or <emphasis>initwaveoutput()</emphasis>.
941 Otherwise it would be impossible to have two copies of Bochs running
942 concurrently (if anybody ever wants to do this).
943 </para></listitem>
944 </itemizedlist>
945 </section>
947 <section><title>~bx_sound_OS_c()</title>
949 <para>
950 The instance is destroyed just before Bochs ends.
951 </para>
952 </section>
954 <section><title>int openmidioutput(char *device)</title>
956 <itemizedlist>
957 <listitem><para>
958 <emphasis>openmidioutput()</emphasis> is called when the first midi output starts.
959 It is only called if the midi output mode is 1 (midimode 1). It should
960 prepare the given MIDI hardware for receiving midi commands.
961 </para></listitem>
963 <listitem><para>
964 <emphasis>openmidioutput()</emphasis> will always be called before <emphasis>openwaveoutput()</emphasis>,
965 and <emphasis>closemidioutput()</emphasis>will always be called before <emphasis>closewaveoutput()</emphasis>, but not in all cases will both functions be called.
966 </para></listitem>
967 </itemizedlist>
968 </section>
970 <section>
971 <title>Description of the parameters:</title>
973 <itemizedlist>
975 <listitem><para>
976 <emphasis>device</emphasis> is a system-dependent variable.
977 It contains the value of the <emphasis>MIDI=device</emphasis> configuration option.
978 </para></listitem>
980 <listitem><para>
981 Note that only one midi output device will be used at any one time.
982 <emphasis>device</emphasis>
983 may not have the same value throughout one session, but it will be closed
984 before it is changed.
985 </para></listitem>
986 </itemizedlist>
987 </section>
989 <section><title>int midiready()</title>
991 <para>
992 <emphasis>midiready()</emphasis> is called whenever the applications asks if the
993 midi queue can accept more data.
994 </para>
996 <para>
997 Return values:
998 </para>
1000 <itemizedlist>
1001 <listitem><para>
1002 <emphasis>BX_SOUND_OUTPUT_OK</emphasis> if the midi output device is ready.
1003 </para></listitem>
1005 <listitem><para>
1006 <emphasis>BX_SOUND_OUTPUT_ERR</emphasis> if it isn't ready.
1007 </para></listitem>
1008 </itemizedlist>
1010 <para>
1011 <emphasis>Note: </emphasis><emphasis>midiready()</emphasis> will be called a few times
1012 <emphasis>before</emphasis> the device is opened. If this is the case, it should
1013 always report that it is ready, otherwise the application (not Bochs)
1014 will hang.
1015 </para>
1016 </section>
1018 <section><title>int sendmidicommand(int delta, int command, int length, Bit8u data[])</title>
1020 <para>
1021 <emphasis>sendmidicommand()</emphasis>is called whenever a complete midi command has
1022 been written to the emulator. It should then send the given midi command to the midi hardware.
1023 It will only be called after the midi output has been opened. Note that
1024 if at all possible it should not wait for the completion of the command
1025 and instead indicate that the device is not ready during the execution
1026 of the command. This is to avoid delays in the program while it is
1027 generating midi output.
1028 </para>
1030 <para>
1031 Description of the parameters:
1032 </para>
1034 <itemizedlist>
1035 <listitem><para>
1036 <emphasis>delta</emphasis> is the number of delta ticks that
1037 have passed since the last command has been issued. It is always zero for
1038 the first command. There are 24 delta ticks per quarter, and 120 quarters
1039 per minute, thus 48 delta ticks per second.
1040 </para></listitem>
1042 <listitem><para>
1043 <emphasis>command</emphasis> is the midi command byte (sometimes
1044 called status byte), in the usual range of 0x80..0xff. For more information
1045 please see the midi standard specification.
1046 </para></listitem>
1048 <listitem><para>
1049 <emphasis>length</emphasis> is the number of data bytes that
1050 are contained in the data structure. This does <emphasis>not</emphasis> include the status
1051 byte which is not replicated in the data array. It can only be greater
1052 than 3 for SysEx messages (commands <emphasis>0xF0</emphasis> and <emphasis>0xF7</emphasis>)
1053 </para></listitem>
1055 <listitem><para>
1056 <emphasis>data[]</emphasis> is the array of these data bytes,
1057 in the order they have in the standard MIDI specification.
1058 Note, it might be <emphasis>NULL</emphasis> if length==0.
1059 </para></listitem>
1060 </itemizedlist>
1061 </section>
1064 <section><title>int closemidioutput()</title>
1066 <para>
1067 <emphasis>closemidioutput()</emphasis> is called before shutting down Bochs or
1068 when the
1069 emulator gets the <emphasis>stop_output</emphasis> command through the emulator port.
1070 After this, no more output will be necessary until <emphasis>openmidioutput()</emphasis>
1071 is called again, but <emphasis>midiready()</emphasis> might still be called. It should do the following:
1072 </para>
1074 <itemizedlist>
1075 <listitem><para>
1076 Wait for all remaining messages to be completed
1077 </para></listitem>
1078 <listitem><para>
1079 Reset and close the midi output device
1080 </para></listitem>
1081 </itemizedlist>
1082 </section>
1085 <section><title>int openwaveoutput(char *device)</title>
1087 <para>
1088 <emphasis>openwaveoutput()</emphasis> is called when the first wave output occurs,
1089 and only if the selected wavemode is 1. It should do the following:
1090 </para>
1092 <itemizedlist>
1093 <listitem><para>
1094 Open the given device, and prepare it for wave output
1095 </para></listitem>
1096 </itemizedlist>
1097 <para>
1098 <emphasis>or</emphasis>
1099 </para>
1100 <itemizedlist>
1101 <listitem><para>
1102 Store the device name so that the device can be opened in <emphasis>startplayback()</emphasis>.
1103 </para></listitem>
1104 </itemizedlist>
1106 <para>
1107 <emphasis>openmidioutput()</emphasis> will always be called before <emphasis>openwaveoutput()</emphasis>,
1108 and <emphasis>closemidioutput()</emphasis>will always be called before <emphasis>closewaveoutput()</emphasis>, but not in all cases will both functions be called.
1109 </para>
1111 <para>
1112 <emphasis>openwaveoutput()</emphasis> will typically be called once, whereas
1113 <emphasis>startplayback()</emphasis> is called for every new DMA transfer to the SB16 emulation. If feasible,
1114 it could be useful to open and/or lock the output device in
1115 <emphasis>startplayback()</emphasis> as opposed to <emphasis>openwaveoutput()</emphasis>
1116 to ensure that it can be used by other applications while Bochs doesn't
1117 need it.
1118 </para>
1120 <para>
1121 However, many older applications don't use the auto-init DMA
1122 mode, which means that they start a new DMA transfer for every single
1123 block of output, which means usually for every 2048 bytes or so.
1124 Unfortunately there is no way of knowing whether the application will
1125 restart an expired DMA transfer soon, so that in these cases the
1126 <emphasis>startwaveplayback</emphasis> function will be called very often, and it
1127 isn't a good idea to have it reopen the device every time.
1128 </para>
1130 <para>The buffer when writing to the device should not be overly large.
1131 Usually about four buffers of 4096 bytes produce best results. Smaller
1132 buffers could mean too much overhead, while larger buffers contribute
1133 to the fact that the actual output will always be late when the application
1134 tries to synchronize it with for example graphics.
1135 </para>
1137 <para>The parameters are the following: </para>
1139 <itemizedlist>
1140 <listitem><para>
1141 <emphasis>device</emphasis> is the wave device selected by
1142 the user. It is strictly system-dependent. The value is that of the
1143 <emphasis>WAVE=device</emphasis>
1144 configuration option.
1145 </para></listitem>
1146 </itemizedlist>
1148 <para>
1149 Note that only one wave output device will be used at any one time.
1150 <emphasis>device</emphasis> may not have the same value throughout one session, but it will be closed
1151 before it is changed.
1152 </para>
1153 </section>
1155 <section>
1156 <title>int startwaveplayback(int frequency, int bits, int stereo, int format)</title>
1158 <para>
1159 This function is called whenever the application starts a new DMA transfer.  It should do the following:
1160 </para>
1162 <itemizedlist>
1163 <listitem><para>
1164 Open the wave output device, unless <emphasis>openwaveoutput()</emphasis> did that
1165 already
1166 </para></listitem>
1168 <listitem><para>
1169 Prepare the device for data and set the device parameters to those given
1170 in the function call
1171 </para></listitem>
1172 </itemizedlist>
1174 <para>
1175 The parameters are the following:
1176 </para>
1178 <itemizedlist>
1179 <listitem><para>
1180 <emphasis>frequency</emphasis> is the desired frequency of the
1181 output. Because of the capabities of the SB16, it can have any value between
1182 5000 and 44,100.
1183 </para></listitem>
1185 <listitem><para>
1186 <emphasis>bits</emphasis> is either 8 or 16, denoting the resolution
1187 of one sample.
1188 </para></listitem>
1190 <listitem><para>
1191 <emphasis>stereo</emphasis> is either 1 for stereo output, or 0 for mono output.
1192 </para></listitem>
1194 <listitem><para>
1195 <emphasis>format</emphasis> is a bit-coded value (see below).
1196 </para></listitem>
1197 </itemizedlist>
1199 <para>
1200 <table>
1201 <title>format bits</title>
1202 <tgroup cols="2">
1203 <thead>
1204 <row>
1205 <entry>Bit number</entry>
1206 <entry>Meaning</entry>
1207 </row>
1208 </thead>
1209 <tbody>
1210 <row> <entry> 0 (LSB)  </entry><entry><para> 0: unsigned data </para><para>
1211                                             1: signed data </para></entry> </row>
1212 <row> <entry> 1..6     </entry><entry> Type of codec (see below) </entry> </row>
1213 <row> <entry> 7        </entry><entry><para> 0: no reference byte </para><para>
1214                                              1: with reference byte </para></entry> </row>
1215 <row> <entry> 8..x     </entry><entry> reserved (0) </entry> </row>
1216 </tbody>
1217 </tgroup>
1218 </table>
1220 <table>
1221 <title>codecs</title>
1222 <tgroup cols="2">
1223 <thead>
1224 <row>
1225 <entry>Value</entry>
1226 <entry>Meaning</entry>
1227 </row>
1228 </thead>
1229 <tbody>
1230 <row> <entry> 0 </entry><entry> PCM (raw data) </entry> </row>
1231 <row> <entry> 1 </entry><entry> reserved </entry> </row>
1232 <row> <entry> 2 </entry><entry> 2-bit ADPCM (Creative Labs format) </entry> </row>
1233 <row> <entry> 3 </entry><entry> 2.4-bit (3-bit) ADPCM (Creative Labs format) </entry> </row>
1234 <row> <entry> 4 </entry><entry> 4-bit ADPCM (Creative Labs format) </entry> </row>
1235 </tbody>
1236 </tgroup>
1237 </table>
1238 </para>
1239 <para>
1240 Other codecs are not supported by the SB hardware. In fact, most applications will
1241 translate their data into raw data, so that in most cases the codec will be zero.
1242 </para>
1243 <para>
1244 The number of bytes per sample can be calculated from this as (bits / 8) * (stereo + 1).
1245 </para>
1246 </section>
1249 <section>
1250 <title>int waveready()</title>
1252 <para>
1253 This is called whenever the emulator has another output buffer ready
1254 and would like to pass it to the output class. This happens every
1255 <emphasis>BX_SOUND_OUTPUT_WAVEPACKETSIZE</emphasis> bytes, or whenever a DMA transfer
1256 is done or aborted.
1257 </para>
1259 <para>
1260 It should return whether the output device is ready for another buffer
1261 of <emphasis>BX_SOUND_OUTPUT_WAVEPACKETSIZE</emphasis> bytes.
1262 If <emphasis>BX_SOUND_OUTPUT_ERR</emphasis>
1263 is returned, the emulator waits about 1/(frequency * bytes per sample) seconds
1264 and then asks again. The DMA transfer is stalled during that time, but
1265 the application keeps running, until the output device becomes ready.
1266 </para>
1268 <para>
1269 As opposed to <emphasis>midiready(), waveready()</emphasis> will <emphasis>not</emphasis> be
1270 called unless the device is open.
1271 </para>
1272 </section>
1274 <section>
1275 <title>int sendwavepacket(int length, Bit8u data[])</title>
1277 <para>
1278 This function is called whenever a data packet of at most <emphasis>BX_SB16_WAVEPACKETSIZE</emphasis>
1279 is ready at the SB16 emulator. It should then do the following:
1280 </para>
1282 <itemizedlist>
1283 <listitem><para>
1284 Send this wave packet to the wave hardware
1285 </para></listitem>
1286 </itemizedlist>
1288 <para>
1289 This function <emphasis>has</emphasis> to be synchronous, meaning that it <emphasis>has</emphasis>
1290 to return immediately, and <emphasis>not</emphasis> wait until the output is done. Also,
1291 this function might be called before the previous output is done. If your
1292 hardware can't append the new output to the old one, you will have to implement
1293 this yourself, or the output will be very chunky, with as much silence
1294 between the blocks as the blocks take to play. This is not what you want.
1295 Instead, <emphasis>waveready()</emphasis> should return <emphasis>BX_SOUND_OUTPUT_ERR</emphasis>
1296 until the device accepts another block of data.
1297 </para>
1299 <para>
1300 Parameters:
1301 </para>
1303 <itemizedlist>
1304 <listitem><para>
1305 <emphasis>length</emphasis> is the number of data bytes in
1306 the data stream. It will never be larger than <emphasis>BX_SB16_WAVEPACKETSIZE</emphasis>.
1307 </para></listitem>
1309 <listitem><para>
1310 <emphasis>data</emphasis> is the array of data bytes.
1311 </para></listitem>
1312 </itemizedlist>
1314 <para>
1315 The order of bytes in the data stream is the same as that in the Wave file format:
1317 <table>
1318 <title>wave output types</title>
1319 <tgroup cols="2">
1320 <thead>
1321 <row>
1322 <entry>Output type</entry>
1323 <entry>Sequence of data bytes</entry>
1324 </row>
1325 </thead>
1326 <tbody>
1327 <row> <entry> 8 bit mono </entry><entry> Sample 1; Sample 2; Sample 3; etc. </entry> </row>
1328 <row> <entry> 8 bit stereo </entry><entry> Sample 1, Channel 0; Sample 1, Channel 1; Sample 2, Channel 0; Sample 2, Channel 1; etc. </entry> </row>
1329 <row> <entry> 16 bit mono </entry><entry> Sample 1, LSB; Sample 1, MSB; Sample 2, LSB; Sample 2, MSB; etc. </entry> </row>
1330 <row> <entry> 16 bit stereo </entry><entry> Sample 1, LSB, Channel 0; Sample 1, MSB, Channel 0; Sample 1, LSB, Channel 1; Sample 1, MSB, Channel 1; etc. </entry> </row>
1331 </tbody>
1332 </tgroup>
1333 </table>
1334 </para>
1336 <para>
1337 Typically 8 bit data will be unsigned with values from 0 to 255, and
1338 16 bit data will be signed with values from -32768 to 32767, although the
1339 SB16 is not limited to this. For further information on the codecs and
1340 the use of reference bytes please refer to the Creative Labs Sound Blaster
1341 Programmer's Manual, which can be downloaded from the Creative Labs web
1342 site.
1343 </para>
1344 </section>
1346 <section><title>int stopwaveplayback()</title>
1348 <para>
1349 This function is called at the end of a DMA transfer. It should do the following:
1350 </para>
1352 <itemizedlist>
1353 <listitem><para>
1354 Close the output device if it was opened by <emphasis>startwaveplayback()</emphasis>.
1355 and it's not going to be opened soon. Which is almost impossible to tell.
1356 </para></listitem>
1357 </itemizedlist>
1358 </section>
1360 <section><title>int closewaveoutput()</title>
1362 <para>
1363 This function is called just before Bochs exits. It should do the following:
1364 </para>
1366 <itemizedlist>
1367 <listitem><para>
1368  Close the output device, if this hasn't been done by <emphasis>stopwaveplayback()</emphasis>.
1369 </para></listitem>
1370 </itemizedlist>
1372 <para>
1373 Typically, <emphasis>stopwaveplayback()</emphasis> will be called several times, whenever
1374 a DMA transfer is done, where <emphasis>closewaveoutput()</emphasis> will only be called
1375 once. However, in the future it might be possible that <emphasis>openwaveoutput()</emphasis>
1376 is called again, for example if the user chose to switch devices while
1377 Bochs was running. This is not supported at the moment, but might be in
1378 the future.
1379 </para>
1380 </section>
1382 </section> <!-- end of SB16 section-->
1384 <section id="harddisk-redologs"><title>Harddisk Images based on redologs</title>
1385 <para>
1386 This section describes how the three new disk images "undoable", "growing", and "volatile" are
1387 implemented in Bochs 2.1 :
1388 </para>
1389 <itemizedlist>
1390 <listitem><para>
1391 undoable -> flat file, plus growing, commitable, rollbackable redolog file
1392 </para></listitem>
1393 <listitem><para>
1394 growing  -> growing files, all previously unwritten sectors go to the end of file
1395 </para></listitem>
1396 <listitem><para>
1397 volatile -> flat file, plus hidden growing redolog
1398 </para></listitem>
1399 </itemizedlist>
1401 <para>
1402 </para>
1404 <section>
1405 <title>
1406         Description
1407 </title>
1408 <para>
1409 The idea behind volatile and undoable disk images
1410 is to have a flat file, associated with one redolog file.
1411 </para>
1412 <para>
1413 Reading a sector is done from the redolog file if it contains
1414 the sector, or from the flat file otherwise.
1415 </para>
1416 <para>
1417 Sectors written go to the redolog,
1418 so flat files are opened in read only mode in this configuration.
1419 </para>
1420 <para>
1421 The redolog is designed in a way so it starts as a small file
1422 and grows with every new sectors written to it. Previously written
1423 sectors are done in place. Redolog files can not shrink.
1424 </para>
1425 <para>
1426 The redolog is a growing file that can be created on the fly.
1427 </para>
1428 <para>
1429 Now, it turns out that if you only use a redolog without any
1430 flat file, you get a "growing" disk image.
1431 </para>
1432 <para>
1433 So "undoable", "volatile" and "growing" harddisk images classes
1434 are implemented on top of a redolog class.
1435 </para>
1436 </section>
1438 <section>
1439 <title>
1440         How redologs works ?
1441 </title>
1443 <para>
1444 At the start of a redolog file, there is a header, so Bochs can check whether
1445 a file is consistent.
1446 This header could also be checked when we implement
1447 automatic type and size detection.
1448 </para>
1449 <para>
1450 The generic part of the header contains values like type of image, and
1451 spec version number.
1452 </para>
1453 <para>
1454 The header also has a specific part.
1455 For redologs, the number
1456 of entries of the catalog, the extent, bitmap and disk size are stored.
1457 </para>
1459 <para>
1460 In a redolog, the disk image is divided in a number of equal size "extents".
1461 Each extent is a collection of successive 512-bytes sectors of the disk image,
1462 preceeded by a n*512bytes bitmap.
1463 </para>
1465 <para>
1466 the n*512bytes bitmap defines the presence (data has been written to it)
1467 of a specific sector in the extent, one bit for each sector.
1468 Therefore with a 512bytes bitmap, each extent can hold up to 4k blocks
1469 </para>
1471 <para>
1472 Typically the catalog can have 256k entries.
1473 With a 256k entries catalog and 512bytes bitmaps, the redolog can hold up to 512GiB
1474 </para>
1476 <note>
1477 <para>
1478 All data is stored on images as little-endian values
1479 </para>
1480 </note>
1481 <section>
1482 <title>
1483         Header
1484 </title>
1485 <para>
1486 At the start of a redolog file, there is a header. This header is designed
1487 to be reusable by other disk image types.
1488 </para>
1489 <para>
1490 The header length is 512 bytes. It contains :
1491 <table>
1492 <title>Generic header description</title>
1493 <tgroup cols="5">
1494 <thead>
1495 <row>
1496 <entry>Start position in bytes</entry>
1497 <entry>Length in bytes</entry>
1498 <entry>Data type</entry>
1499 <entry>Description</entry>
1500 <entry>Possible values</entry>
1501 </row>
1502 </thead>
1503 <tbody>
1504 <row> <entry> 0 </entry> <entry> 32 </entry> <entry> string </entry> <entry> magical value </entry> <entry> Bochs Virtual HD Image </entry> </row>
1505 <row> <entry> 32 </entry> <entry> 16 </entry> <entry> string </entry> <entry> type of file </entry> <entry> Redolog </entry> </row>
1506 <row> <entry> 48 </entry> <entry> 16 </entry> <entry> string </entry> <entry> subtype of file </entry> <entry> Undoable, Volatile, Growing </entry> </row>
1507 <row> <entry> 64 </entry> <entry> 4 </entry> <entry> Bit32u </entry> <entry> version of used specification </entry> <entry> 0x00010000 </entry> </row>
1508 <row> <entry> 68 </entry> <entry> 4 </entry> <entry> Bit32u </entry> <entry> header size </entry> <entry> 512 </entry> </row>
1509 </tbody>
1510 </tgroup>
1511 </table>
1512 <table>
1513 <title>Redolog specific header description</title>
1514 <tgroup cols="5">
1515 <thead>
1516 <row>
1517 <entry>Start position in bytes</entry>
1518 <entry>Length in bytes</entry>
1519 <entry>Data type</entry>
1520 <entry>Description</entry>
1521 </row>
1522 </thead>
1523 <tbody>
1524 <row> <entry> 72 </entry> <entry> 4 </entry> <entry> Bit32u </entry> <entry> number of entries in the catalog </entry> </row>
1525 <row> <entry> 76 </entry> <entry> 4 </entry> <entry> Bit32u </entry> <entry> bitmap size in bytes </entry> </row>
1526 <row> <entry> 80 </entry> <entry> 4 </entry> <entry> Bit32u </entry> <entry> extent size in bytes</entry> </row>
1527 <row> <entry> 84 </entry> <entry> 8 </entry> <entry> Bit64u </entry> <entry> disk size in bytes </entry> </row>
1528 </tbody>
1529 </tgroup>
1530 </table>
1531 </para>
1532 </section>
1533 <section>
1534 <title>
1535         Catalog
1536 </title>
1537 <para>
1538 Immediately following the header, there is a catalog containing
1539 the position number (in extents) where each extent is located in the file.
1540 </para>
1541 <para>
1542 Each position is a Bit32u entity.
1543 </para>
1545 </section>
1546 <section>
1547 <title>
1548         Extent
1549 </title>
1550 <para>
1551          &FIXME;
1552 </para>
1553 </section>
1554 </section>
1556 <section>
1557 <title>Parameters
1558 </title>
1559 <para>
1560 The following tables shows what parameters are used when creating redologs or creating "growing" images :
1561 <table>
1562 <title>
1563         How number of entries in the catalog and number of blocks by extents are computed
1564 </title>
1565 <tgroup cols="5">
1566 <thead>
1567 <row>
1568 <entry>Catalog entries</entry> <entry>Catalog size(KiB)</entry> <entry>Bitmap size (B)</entry> <entry>Extent size (KiB)</entry> <entry>Disk Max Size</entry>
1569 </row>
1570 </thead>
1572 <tbody>
1573 <row>
1574 <entry>512</entry> <entry>2</entry> <entry>1</entry> <entry>4</entry> <entry>2MiB</entry>
1575 </row>
1576 <row>
1577 <entry>512</entry> <entry>2</entry> <entry>2</entry> <entry>8</entry> <entry>4MiB</entry>
1578 </row>
1579 <row>
1580 <entry>1k</entry> <entry>4</entry> <entry>2</entry> <entry>8</entry> <entry>8MiB</entry>
1581 </row>
1582 <row>
1583 <entry>1k</entry> <entry>4</entry> <entry>4</entry> <entry>16</entry> <entry>16MiB</entry>
1584 </row>
1585 <row>
1586 <entry>2k</entry> <entry>8</entry> <entry>4</entry> <entry>16</entry> <entry>32MiB</entry>
1587 </row>
1588 <row>
1589 <entry>2k</entry> <entry>8</entry> <entry>8</entry> <entry>32</entry> <entry>64MiB</entry>
1590 </row>
1591 <row>
1592 <entry>4k</entry> <entry>16</entry> <entry>8</entry> <entry>32</entry> <entry>128MiB</entry>
1593 </row>
1594 <row>
1595 <entry>4k</entry> <entry>16</entry> <entry>16</entry> <entry>64</entry> <entry>256MiB</entry>
1596 </row>
1597 <row>
1598 <entry>8k</entry> <entry>32</entry> <entry>16</entry> <entry>64</entry> <entry>512MiB</entry>
1599 </row>
1600 <row>
1601 <entry>8k</entry> <entry>32</entry> <entry>32</entry> <entry>128</entry> <entry>1GiB</entry>
1602 </row>
1603 <row>
1604 <entry>16k</entry> <entry>64</entry> <entry>32</entry> <entry>128</entry> <entry>2GiB</entry>
1605 </row>
1606 <row>
1607 <entry>16k</entry> <entry>64</entry> <entry>64</entry> <entry>256</entry> <entry>4GiB</entry>
1608 </row>
1609 <row>
1610 <entry>32k</entry> <entry>128</entry> <entry>64</entry> <entry>256</entry> <entry>8GiB</entry>
1611 </row>
1612 <row>
1613 <entry>32k</entry> <entry>128</entry> <entry>128</entry> <entry>512</entry> <entry>16GiB</entry>
1614 </row>
1615 <row>
1616 <entry>64k</entry> <entry>256</entry> <entry>128</entry> <entry>512</entry> <entry>32GiB</entry>
1617 </row>
1618 <row>
1619 <entry>64k</entry> <entry>256</entry> <entry>256</entry> <entry>1024</entry> <entry>64GiB</entry>
1620 </row>
1621 <row>
1622 <entry>128k</entry> <entry>512</entry> <entry>256</entry> <entry>1024</entry> <entry>128GiB</entry>
1623 </row>
1624 <row>
1625 <entry>128k</entry> <entry>512</entry> <entry>512</entry> <entry>2048</entry> <entry>256GiB</entry>
1626 </row>
1627 <row>
1628 <entry>256k</entry> <entry>1024</entry> <entry>512</entry> <entry>2048</entry> <entry>512GiB</entry>
1629 </row>
1630 <row>
1631 <entry>256k</entry> <entry>1024</entry> <entry>1024</entry> <entry>4096</entry> <entry>1TiB</entry>
1632 </row>
1633 <row>
1634 <entry>512k</entry> <entry>2048</entry> <entry>1024</entry> <entry>4096</entry> <entry>2TiB</entry>
1635 </row>
1636 <row>
1637 <entry>512k</entry> <entry>2048</entry> <entry>2048</entry> <entry>8192</entry> <entry>4TiB</entry>
1638 </row>
1639 <row>
1640 <entry>1024k</entry> <entry>4096</entry> <entry>2048</entry> <entry>8192</entry> <entry>8TiB</entry>
1641 </row>
1642 <row>
1643 <entry>1024k</entry> <entry>4096</entry> <entry>4096</entry> <entry>16384</entry> <entry>16TiB</entry>
1644 </row>
1645 <row>
1646 <entry>2048k</entry> <entry>8192</entry> <entry>4096</entry> <entry>16384</entry> <entry>32TiB</entry>
1647 </row>
1648 </tbody>
1649 </tgroup>
1650 </table>
1651 </para>
1653 </section>
1655 <section>
1656 <title>
1657         Redolog class description
1658 </title>
1659 <para>
1660 The class <emphasis>redolog_t();</emphasis> implements the necessary
1661 methods to create, open, close, read and write data to a redolog.
1662 Managment of header catalog and sector bitmaps is done internally
1663 by the class.
1664 </para>
1665 <section>
1666 <title>
1667         Constants
1668 </title>
1669 <para>
1670 <screen>
1671 #define STANDARD_HEADER_MAGIC     "Bochs Virtual HD Image"
1672 #define STANDARD_HEADER_VERSION   (0x00010000)
1673 #define STANDARD_HEADER_SIZE      (512)
1674 </screen>
1675 These constants are used in the generic part of the header.
1676 </para>
1678 <para>
1679 <screen>
1680 #define REDOLOG_TYPE "Redolog"
1681 #define REDOLOG_SUBTYPE_UNDOABLE "Undoable"
1682 #define REDOLOG_SUBTYPE_VOLATILE "Volatile"
1683 #define REDOLOG_SUBTYPE_GROWING  "Growing"
1684 </screen>
1685 These constants are used in the specific part of the header.
1686 </para>
1688 <para>
1689 <screen>
1690 #define REDOLOG_PAGE_NOT_ALLOCATED (0xffffffff)
1691 </screen>
1692 This constant is used in the catalog for an unwritten extent.
1693 </para>
1695 </section> <!-- Constants -->
1697 <section> <title>Methods</title>
1698 <para>
1699 <emphasis>redolog_t();</emphasis> instanciates a new redolog.
1700 </para>
1701 <para>
1702 <emphasis>int make_header (const char* type, Bit64u size);</emphasis> creates a header
1703 structure in memory, and sets its <emphasis>type</emphasis> and parameters based on the
1704 disk image <emphasis>size</emphasis>. Returns 0.
1705 </para>
1706 <para>
1707 <emphasis>int create (const char* filename, const char* type, Bit64u size);</emphasis>
1708 creates a new empty redolog file, with header and catalog, named <emphasis>filename</emphasis>
1709 of type <emphasis>type</emphasis> for a <emphasis>size</emphasis> bytes image.
1710 Returns 0 for OK or -1 if a problem occured.
1711 </para>
1712 <para>
1713 <emphasis>int create (int filedes, const char* type, Bit64u size);</emphasis>
1714 creates a new empty redolog file, with header and catalog, in a previously
1715 opened file described by <emphasis>filedes</emphasis>, of type <emphasis>type</emphasis>
1716 for a <emphasis>size</emphasis> bytes image.
1717 Returns 0 for OK or -1 if a problem occured.
1718 </para>
1719 <para>
1720 <emphasis>int open (const char* filename, const char* type, Bit64u size);</emphasis>
1721 opens a redolog file named <emphasis>filename</emphasis>, and checks
1722 for consistency of header values against a <emphasis>type</emphasis> and
1723 <emphasis>size</emphasis>.
1724 Returns 0 for OK or -1 if a problem occured.
1725 </para>
1726 <para>
1727 <emphasis>void close ();</emphasis>
1728 closes a redolog file.
1729 </para>
1730 <para>
1731 <emphasis>off_t lseek (off_t offset, int whence);</emphasis>
1732 seeks at logical data offset <emphasis>offset</emphasis> in a redolog.
1733 <emphasis>offset</emphasis> must be a multiple of 512.
1734 Only SEEK_SET is supported for <emphasis>whence</emphasis>.
1735 Returns -1 if a problem occured, or the current logical offset in
1736 the redolog.
1737 </para>
1738 <para>
1739 <emphasis>ssize_t read (void* buf, size_t count);</emphasis>
1740 reads <emphasis>count</emphasis> bytes of data of the redolog, from current logical offset,
1741 and copies it into <emphasis>buf</emphasis>.
1742 <emphasis>count</emphasis> must be 512.
1743 Returns the number of bytes read, that can be 0 if the data
1744 has not previously be written to the redolog.
1745 </para>
1746 <para>
1747 <emphasis>ssize_t write (const void* buf, size_t count);</emphasis>
1748 writes <emphasis>count</emphasis> bytes of data from <emphasis>buf</emphasis>
1749 to the redolog, at current logical offset.
1750 <emphasis>count</emphasis> must be 512.
1751 Returns the number of bytes written.
1752 </para>
1754 </section>
1756 </section> <!-- Redolog class description -->
1758 <section>
1759 <title>
1760         Disk image classes description
1761 </title>
1762 <para>
1763 "volatile" and "undoable" disk images are easily implemented
1764 by instanciating a <emphasis>default_image_t</emphasis> object (flat image)
1765 and a <emphasis>redolog_t</emphasis> object (redolog).
1766 </para>
1767 <para>
1768 "growing" disk images only instanciates a <emphasis>redolog_t</emphasis> object.
1769 </para>
1770 <para>
1771 Classe names are <emphasis>undoable_image_t</emphasis>, <emphasis>volatile_image_t</emphasis>
1772 and <emphasis>growing_image_t</emphasis>.
1773 </para>
1774 <para>
1775 When using these disk images, the underlying data structure and layout
1776 is completely
1777 hidden to the caller. Then, all offset and size values are "logical" values,
1778 as if the disk was a flat file.
1779 </para>
1780 <section>
1781 <title>
1782         Constants
1783 </title>
1784 <para>
1785 <screen>
1786 #define UNDOABLE_REDOLOG_EXTENSION ".redolog"
1787 #define UNDOABLE_REDOLOG_EXTENSION_LENGTH (strlen(UNDOABLE_REDOLOG_EXTENSION))
1788 #define VOLATILE_REDOLOG_EXTENSION ".XXXXXX"
1789 #define VOLATILE_REDOLOG_EXTENSION_LENGTH (strlen(VOLATILE_REDOLOG_EXTENSION))
1790 </screen>
1791 These constants are used when building redolog file names
1792 </para>
1793 </section>
1795 <section>
1796 <title>
1797         undoable_image_t methods
1798 </title>
1799 <para>
1800 <emphasis>
1801 undoable_image_t(Bit64u size, const char* redolog_name);
1802 </emphasis>
1803 instanciates a new <emphasis>undoable_image_t</emphasis>
1804 object. This disk image logical length is <emphasis>size</emphasis> bytes and
1805 the redolog filename is <emphasis>redolog_name</emphasis>.
1806 </para>
1808 <para>
1809 <emphasis>
1810 int open (const char* pathname);
1811 </emphasis>
1812 opens the flat disk image <emphasis>pathname</emphasis>,
1813 as an undoable disk image. The associated redolog will
1814 be named <emphasis>pathname</emphasis> with a
1815 <emphasis>UNDOABLE_REDOLOG_EXTENSION</emphasis>
1816 suffix, unless set in the constructor.
1817 Returns 0 for OK or -1 if a problem occured.
1818 </para>
1820 <para>
1821 <emphasis>
1822 void close ();
1823 </emphasis>
1824 closes the flat image and its redolog.
1825 </para>
1827 <para>
1828 <emphasis>
1829 off_t lseek (off_t offset, int whence);
1830 </emphasis>
1831 seeks at logical data position <emphasis>offset</emphasis> in
1832 the undoable disk image.
1833 Only SEEK_SET is supported for <emphasis>whence</emphasis>.
1834 Returns -1 if a problem occured, or the current logical
1835 offset in the undoable disk image.
1836 </para>
1838 <para>
1839 <emphasis>
1840 ssize_t read (void* buf, size_t count);
1841 </emphasis>
1842 reads <emphasis>count</emphasis> bytes of data
1843 from the undoable disk image, from current logical offset,
1844 and copies it into <emphasis>buf</emphasis>.
1845 <emphasis>count</emphasis> must be 512.
1846 Returns the number of bytes read.
1847 Data will be read from the redolog if it has
1848 been previously written or from the flat image
1849 otherwise.
1850 </para>
1852 <para>
1853 <emphasis>
1854 ssize_t write (const void* buf, size_t count);
1855 </emphasis>
1856 writes <emphasis>count</emphasis> bytes of data from <emphasis>buf</emphasis>
1857 to the undoable disk image, at current logical offset.
1858 <emphasis>count</emphasis> must be 512.
1859 Returns the number of bytes written.
1860 Data will always be written to the redolog.
1861 </para>
1862 </section>
1864 <section>
1865 <title>
1866         volatile_image_t methods
1867 </title>
1868 <para>
1869 <emphasis>
1870 volatile_image_t(Bit64u size, const char* redolog_name);
1871 </emphasis>
1872 instanciates a new <emphasis>volatile_image_t</emphasis>
1873 object. This disk image logical length is <emphasis>size</emphasis> bytes and
1874 the redolog filename is <emphasis>redolog_name</emphasis> plus a
1875 random suffix.
1876 </para>
1878 <para>
1879 <emphasis>
1880 int open (const char* pathname);
1881 </emphasis>
1882 opens the flat disk image <emphasis>pathname</emphasis>,
1883 as a volatile disk image. The associated redolog will
1884 be named <emphasis>pathname</emphasis> with a
1885 random suffix, unless set in the constructor.
1886 Returns 0 for OK or -1 if a problem occured.
1887 </para>
1889 <para>
1890 <emphasis>
1891 void close ();
1892 </emphasis>
1893 closes the flat image and its redolog.
1894 The redolog is deleted/lost after close is called.
1895 </para>
1897 <para>
1898 <emphasis>
1899 off_t lseek (off_t offset, int whence);
1900 </emphasis>
1901 seeks at logical data position <emphasis>offset</emphasis> in
1902 the volatile disk image.
1903 Only SEEK_SET is supported for <emphasis>whence</emphasis>.
1904 Returns -1 if a problem occured, or the current logical offset in
1905 the volatile disk image.
1906 </para>
1908 <para>
1909 <emphasis>
1910 ssize_t read (void* buf, size_t count);
1911 </emphasis>
1912 reads <emphasis>count</emphasis> bytes of data
1913 from the volatile disk image, from current logical offset,
1914 and copies it into <emphasis>buf</emphasis>.
1915 <emphasis>count</emphasis> must be 512.
1916 Returns the number of bytes read.
1917 Data will be read from the redolog if it has
1918 been previously written or from the flat image
1919 otherwise.
1920 </para>
1922 <para>
1923 <emphasis>
1924 ssize_t write (const void* buf, size_t count);
1925 </emphasis>
1926 writes <emphasis>count</emphasis> bytes of data from <emphasis>buf</emphasis>
1927 to the volatile disk image, at current logical offset.
1928 <emphasis>count</emphasis> must be 512.
1929 Returns the number of bytes written.
1930 Data will always be written to the redolog.
1931 </para>
1932 </section>
1934 <section>
1935 <title>
1936         growing_image_t methods
1937 </title>
1938 <para>
1939 <emphasis>
1940 growing_image_t(Bit64u size);
1941 </emphasis>
1942 instanciates a new <emphasis>growing_image_t</emphasis>
1943 object. This disk image logical length is <emphasis>size</emphasis> bytes.
1944 </para>
1946 <para>
1947 <emphasis>
1948 int open (const char* pathname);
1949 </emphasis>
1950 opens the growing disk image <emphasis>pathname</emphasis>,
1951 Returns 0 for OK or -1 if a problem occured.
1952 </para>
1954 <para>
1955 <emphasis>
1956 void close ();
1957 </emphasis>
1958 closes the growing disk image.
1959 </para>
1961 <para>
1962 <emphasis>
1963 off_t lseek (off_t offset, int whence);
1964 </emphasis>
1965 seeks at logical data position <emphasis>offset</emphasis> in
1966 the growable disk image.
1967 Only SEEK_SET is supported for <emphasis>whence</emphasis>.
1968 Returns -1 if a problem occured, or the current logical offset in
1969 the grwoing image.
1970 </para>
1972 <para>
1973 <emphasis>
1974 ssize_t read (void* buf, size_t count);
1975 </emphasis>
1976 reads <emphasis>count</emphasis> bytes of data
1977 from the growing disk image, from current logical offset,
1978 and copies it into <emphasis>buf</emphasis>.
1979 <emphasis>count</emphasis> must be 512.
1980 Returns the number of bytes read.
1981 The buffer will be filled with null bytes if data
1982 has not been previously written to the growing image.
1983 </para>
1985 <para>
1986 <emphasis>
1987 ssize_t write (const void* buf, size_t count);
1988 </emphasis>
1989 writes <emphasis>count</emphasis> bytes of data from <emphasis>buf</emphasis>
1990 to the growing disk image, at current logical offset.
1991 <emphasis>count</emphasis> must be 512.
1992 Returns the number of bytes written.
1993 </para>
1994 </section>
1996 </section>
1998 </section>
2000 <section id="add-keymapping"><title>How to add keymapping in a GUI client</title>
2001 <para>
2002 Christophe Bothamy, wrote the keymapping code for Bochs, provided these
2003 instructions to help developers to add keymapping to a GUI.
2004 </para>
2006 <screen>
2007 Bochs creates a bx_keymap_c object named bx_keymap.
2008 This object allows you to :
2009   - load the configuration specified keymap file
2010   - get the translated BX_KEY_* from your GUI key
2012 You have to provide a translation function from string to your Bit32u key
2013 constant. Casting will be necessary if your key constants are not Bit32u typed.
2014 The function must be "static Bit32u (*)(const char *)" typed, and must return
2015 BX_KEYMAP_UNKNOWN if it can not translate the parameter string.
2017 What you have to do is :
2018   - call once "void loadKeymap(Bit32u (*)(const char*))",
2019     providing your translation function, to load the keymap
2020   - call "Bit32u getBXKey(Bit32u)" that returns the BX_KEY_*
2021     constant, for each key you want to map.
2023 The file gui/x.cc implements this architecture, so you can refer to it
2024 as an example.
2025 </screen>
2027 </section>
2029 </chapter>
2031 <chapter id="debugger"><title>Debugger</title>
2032       <section><title>compile with debugger support</title>
2033       <para>
2034       &FIXME;
2035       </para>
2036       </section>
2037       <section id="debugger-get-started"><title>get started in debugger</title>
2038       <para>
2039       &FIXME;
2040       </para>
2041       </section>
2042       <section id="debugger-commands"><title>command reference</title>
2043       <para>
2044       &FIXME;
2045       </para>
2046       </section>
2047       <section id="debugger-techniques"><title>techniques</title>
2048       <para>
2049       &FIXME;
2050       </para>
2051       </section>
2052 <section id="iodebug"><title>I/O Interface to Bochs Debugger</title>
2053 <para>
2054 This device was added by Dave Poirier (eks@void-core.2y.net).
2055 </para>
2056 <para>
2057 Compiling Bochs with iodebug support
2058 <screen>
2059 ./configure --enable-iodebug
2060 make
2061 </screen>
2062 Other optional fields may be added to the ./configure line, see Bochs documentation for all the information.
2063 </para>
2065 <para>
2066 <screen>
2067 Using the I/O Interface to the debugger
2069 port range:  0x8A00 - 0x8A01
2071 Port 0x8A00 servers as command register. You can use it to enable the i/o interface,
2072 change which data register is active, etc.
2074 Port 0x8A01 is used as data register for the memory monitoring.
2075 </screen>
2076 </para>
2077 <section><title>Commands supported by port 0x8A00</title>
2078 <para>
2079 <screen>
2081 0x8A00
2083  Used to enable the device. Any I/O to the debug module before this command is sent
2084  is sent will simply be ignored.
2087 0x8A01
2089  Selects register 0: Memory monitoring range start address (inclusive)
2092 0x8A02
2094  Selects register 1: Memory monitoring range end address (exclusive)
2097 0x8A80
2099  Enable address range memory monitoring as indicated by register 0 and 1 and
2100  clears both registers
2103 0x8AE0 - Return to Debugger Prompt
2105  If the debugger is enabled (via --enable-debugger), sending 0x8AE0 to port 0x8A00
2106  after the device has been enabled will return the Bochs to the debugger prompt.
2107  Basically the same as doing CTRL+C.
2110 0x8AE2 - Instruction Trace Disable
2112  If the debugger is enabled (via --enable-debugger), sending 0x8AE2 to port 0x8A00
2113  after the device has been enabled will disable instruction tracing
2116 0x8AE3 - Instruction Trace Enable
2118  If the debugger is enabled (via --enable-debugger), sending 0x8AE3 to port 0x8A00
2119  after the device has been enabled will enable instruction tracing
2122 0x8AE4 - Register Trace Disable
2124  If the debugger is enabled (via --enable-debugger), sending 0x8AE4 to port 0x8A00
2125  after the device has been enabled will disable register tracing.
2128 0x8AE5 - Register Trace Enable
2130  If the debugger is enabled (via --enable-debugger), sending 0x8AE5 to port 0x8A00
2131  after the device has been enabled will enable register tracing. This currently
2132  output the value of all the registers for each instruction traced.
2133  Note: instruction tracing must be enabled to view the register tracing
2136 0x8AFF
2138  Disable the I/O interface to the debugger and the memory monitoring functions.
2139 </screen>
2140 <note><para>all accesses must be done using word</para></note>
2141 <note><para>reading this register will return 0x8A00 if currently activated, otherwise 0</para></note>
2142 </para>
2143 </section>
2144 <section><title>Access to port 0x8A01 (write-only)</title>
2145 <para>
2146 All accesses to this port must be done using words. Writing to this port will shift
2147 to the left by 16 the current value of the register and add the provided value to it.
2148 <screen>
2149 Sample:
2151 reg0 = 0x01234567
2153 out port: 0x8A01 data: 0xABCD
2155 reg0 = 0x4567ABCD
2156 </screen>
2157 </para>
2158 </section>
2159 <section><title>Sample</title>
2160 <para>
2161 Enable memory monitoring on first page of text screen (0xb8000-0xb8fa0):
2162 add in bochrc file: <command>optromimage1: file=&quot;asmio.rom&quot;, address=0xd0000</command>
2163 <screen>
2165  *      Make asmio ROM file:
2166  *      gcc -c asmio.S
2167  *      objcopy -O binary asmio.o asmio.rom
2168  */
2169         .text
2170         .global start
2171         .code16
2173 /* ROM Header */
2174         .byte 0x55
2175         .byte 0xAA
2176         .byte 1                 /* 512 bytes long */
2178 start:
2179 /* Monitor memory access on first page of text screen */
2180         mov     $0x8A00,%dx     /* Enable iodebug (0x8A00->0x8A00) */
2181         mov     %dx,%ax
2182         out     %ax,%dx
2183         mov     $0x8A01,%ax     /* Select register 0 start addr (0x8A01->0x8A00) */
2184         out     %ax,%dx
2185         mov     $0x8A01,%dx     /* Write start addr 0xB8000 (high word first) */
2186         mov     $0xB,%ax
2187         out     %ax,%dx
2188         mov     $0x8000,%ax     /* Write start addr (low word) */
2189         out     %ax,%dx
2191         mov     $0x8A02,%ax     /* Select register 1 end addr (0x8A02->0x8A00) */
2192         mov     $0x8A00,%dx
2193         out     %ax,%dx
2194         mov     $0x8A01,%dx     /* Write end addr 0xB8FA0 (high word first) */
2195         mov     $0xB,%ax
2196         out     %ax,%dx
2197         mov     $0x8FA0,%ax     /* Write end addr (low word) */
2198         out     %ax,%dx
2200         mov     $0x8A00,%dx     /* Enable addr range memory monitoring (0x8A80->0x8A00) */
2201         mov     $0x8A80,%ax
2202         out     %ax,%dx
2204         mov     $0x8A00,%dx     /* Return to Bochs Debugger Prompt (0x8AE0->0x8A00) */
2205         mov     $0x8AE0,%ax
2206         out     %ax,%dx
2207         lret
2209         .byte 0x6b              /* Checksum (code dependent!, update it as needed) */
2210         .align 512              /* NOP follow */
2211 </screen>
2212 </para>
2213 </section>
2214 </section>
2215 </chapter>
2217 <chapter id="coding"><title>Coding</title>
2218 <section><title>Coding guidelines</title>
2219 <para>
2220 <itemizedlist>
2221 <listitem><para><command>Don't make use of any external C++ classes.</command></para>
2222 <para>They are not offered on all platforms and this would make Bochs non-portable.
2223 There is use of such classes in the optional debugger. I plan on removing this use.
2224 </para></listitem>
2225 <listitem><para><command>Don't use fancy C++ features.</command></para>
2226 <para>Bochs is incredibly performance sensitive, and will be increasingly so as
2227 more speed enhancements are added. There's a time and place for most everything
2228 and this is not it. Some advanced features create overhead in the generated code
2229 that you don't see. They also convolute the code, and sometimes occlude that is
2230 really going on.
2231 <itemizedlist>
2232 <listitem><para>Don't use templates</para></listitem>
2233 <listitem><para>Don't use virtual functions if not strictly required</para></listitem>
2234 <listitem><para>Don't use C++ exceptions</para></listitem>
2235 <listitem><para>Don't use overloading of any kind</para></listitem>
2236 </itemizedlist></para></listitem>
2237 <listitem><para><command>Use soft tabs.</command></para>
2238 <para>At least when you submit code, convert all hard tabs to spaces.
2239 There is no uniform way to handle tabs properly.</para></listitem>
2240 <listitem><para><command>Please do compile with all warnings turned on.</command></para>
2241 <para>It's really difficult to spot interesting warnings when a compile is littered
2242 with non-interesting ones.</para></listitem>
2243 <listitem><para><command>Don't use signed ints where unsigned will do.</command></para></listitem>
2244 <listitem><para><command>Make sure that contributed code / patches are LGPL compatible.</command></para></listitem>
2245 </itemizedlist>
2246 </para>
2247 </section>
2248       <section id="patches"><title>patches:</title>
2249       <para>
2250       &FIXME;
2251       how to make, where to submit, what happens then?
2252       </para>
2253       </section>
2254 <section id="cvs-release"><title>Building a Bochs release</title>
2255 <section><title>Preparing source files and CVS</title>
2256 <para>
2257 Update version number and strings in configure.in.
2258 <screen>
2259 VERSION="2.2.pre2"
2260 VER_STRING="2.2.pre2"
2261 REL_STRING="Build from CVS snapshot on March 25, 2005"
2262 </screen>
2263 In the README file you have to update version number and date. Add some
2264 information about new features if necessary.
2265 <screen>
2266 Bochs x86 Pentium+ Emulator
2267 Updated: Fri Mar 25 10:33:15 CET 2005
2268 Version: 2.2.pre2
2269 </screen>
2270 Check date, update/sumup info in CHANGES. Run autoconf to regenerate configure and check them in.
2271 Create a CVS tag to mark which revision of each file was used in the release.
2272 For prereleases I make a normal CVS tag like this:
2273 <screen>
2274   cvs tag REL_2_2_pre2_FINAL
2275 </screen>
2276 But for a real release, I make a CVS branch tag AND a normal tag.
2277 <screen>
2278   cvs tag REL_2_2_BASE
2279   cvs tag -b REL_2_2
2280 </screen>
2281 The base tag marks where the branch split off of the main trunk.
2282 This is very useful in maintaining the branch since you can do diffs
2283 against it.
2284 <screen>
2285    cvs diff -r REL_2_2_BASE -r HEAD
2286    cvs diff -r REL_2_2_BASE -r REL_2_0
2287    cvs upd -j REL_2_2_BASE -j HEAD file
2288    etc.
2289 </screen>
2290 The release and all bugfix releases after it are on the REL_2_2 branch.
2291 When the release is actually finalized, you can do this:
2292 <screen>
2293   cvs tag REL_2_2_FINAL
2294 </screen>
2295 Now you can start building packages based on the created release tag.
2296 </para>
2297 </section>
2299 <section><title>Building the release on win32</title>
2300 <para>
2301 These instructions require cygwin and MSVC++.
2302 </para>
2303 <para>
2304 In Cygwin:
2305 <screen>
2306   sh .conf.win32-vcpp         # runs configure
2307   make win32_snap             # unzip workspace, make a win32 source ZIP
2308 </screen>
2309 Copy the source ZIP to a windows machine, if necessary.
2310 </para>
2311 <para>
2312 Open up Visual C++ and load the workspace file Bochs.dsw.  Check
2313 the Build:Set Active Project Configuration is set the way you want it.
2314 For releases I use "Win32 Release".
2315 </para>
2316 <para>
2317 To create "bochsdbg.exe" with Bochs debugger support, manually change two
2318 lines in config.h to turn on the debugger.
2319 <screen>
2320 #define BX_DEBUGGER 1
2321 #define BX_DISASM 1
2322 </screen>
2323 VC++ will rebuild Bochs with debugger and overwrite bochs.exe.  To avoid
2324 trashing the non-debug version, move it out of the way while the debugger
2325 version is being built.  Then rename the debugger version to bochsdbg.exe.
2326 <screen>
2327 cd obj-release
2328 mv bochs.exe bochs-normal.exe
2329 (build again with BX_DEBUGGER=1 this time)
2330 mv bochs.exe bochsdbg.exe
2331 mv bochs-normal.exe bochs.exe
2332 </screen>
2333 </para>
2334 <para>
2335 To get the docbook installed, you need to do something like this:
2336 <itemizedlist>
2337 <listitem> <para> make dl_docbook </para> </listitem>
2338 <listitem> <para> copy up to date doc files </para> </listitem>
2339 </itemizedlist>
2340 Then you can do
2341 <screen>
2342 cd doc/docbook; touch */*.html
2343 </screen>
2344 Do make install_win32 into /tmp or someplace:
2345 <screen>
2346 make install_win32 prefix=/tmp/bochs-2.2.pre2
2347 </screen>
2348 This copies all the files into /tmp/bochs-2.2.pre2 and then creates a
2349 binary ZIP at /tmp/bochs-2.2.pre2.zip. Rename that bochs-2.2.pre2.win32-bin.zip.
2350 </para>
2351 <para>
2352 Now make the NSIS installer package (the current script is known to work with NSIS 2.03)
2353 <screen>
2354 cd build/win32/nsis
2355 </screen>
2356 Unzip the binary ZIP file into bochs-$VERSION (must match Makefile) and
2357 then run make.
2358 <screen>
2359 unzip ~/bochs-2.2.pre2.zip
2360 make
2361 </screen>
2362 That gives an installer called <filename>Bochs-2.2.pre2.exe</filename>. Test and upload it.
2363 </para>
2364 </section>
2365 <section><title>Building the release on Linux</title>
2366 <para>
2367 Do a clean checkout using anonymous cvs, so that the source tarball
2368 will be all set up for anonymous cvs.  First I'll create a clean
2369 directory called "clean-anon".
2370 <screen>
2371 cvs -d:pserver:anonymous@bochs.cvs.sourceforge.net:/cvsroot/bochs login
2372 cvs -z3 -d:pserver:anonymous@bochs.cvs.sourceforge.net:/cvsroot/bochs \
2373   checkout -d clean-anon bochs
2374 </screen>
2375 Start with clean-anon which tracks the CVS head.  Change its sticky tag
2376 so that it sticks to the release tag.
2377 <screen>
2378 cp -a clean-anon bochs-2.2.pre2
2379 cd bochs-2.2.pre2
2380 cvs upd -P -r REL_2_2_pre2_FINAL
2381 cd ..
2382 tar czvf bochs-2.2.pre2.tar.gz --exclude CVS --exclude .cvsignore bochs-2.2.pre2
2383 </screen>
2384 The source TAR file bochs-2.2.pre2.tar.gz is ready to upload.
2385 </para>
2386 <para>
2387 The RPM will be building using the configuration in .conf.linux with
2388 a few parameters from build/redhat/make-rpm.  Make any last minute changes
2389 to .conf.linux.  Any changes will go into the source RPM.
2390 WARNING : do not build in /tmp/bochs-XXX...
2391 <screen>
2392 ./build/redhat/make-rpm | tee ../build.txt
2393 </screen>
2394 This produces two rpm files in the current directory.  Test and upload.
2395 </para>
2396 </section>
2397 <section><title>Uploading files and creating a file release on SF</title>
2398 <para>
2399 When you are ready with creating release packages you have to upload them to SF.
2400 Using the SF webupload feature is the easiest way to do this.
2401 <screen>
2402 https://frs.sourceforge.net/webupload
2403 </screen>
2404 Note that you cannot modify or delete files after uploading them. If you don't do
2405 anything with the uploaded files, they will be deleted by SF after 7 to 14 days.
2406 </para>
2407 <para>
2408 To create or edit a file release you have to log in to the <command>Admin</command>
2409 section on the SF project page of Bochs. Then you have to go to the
2410 <command>File Releases</command> page and follow the instructions there.
2411 </para>
2412 </section>
2414 </section>
2416 </chapter>
2418 <chapter id="webmastering"><title>Webmastering</title>
2420       <section id="websites"><title>websites</title>
2421       <para>
2422       &FIXME;
2423       </para>
2424       </section>
2426 <section id="update-cvs-snapshot"><title>Updating the CVS snapshot</title>
2427 <para>
2428 The CVS snapshot can be updated with SF shell access using SSH. There is a script
2429 called <command>update-snapshots.sh</command> that can do all the required steps
2430 (checking out CVS, packing the source tree into one archive, updating the website
2431 link).
2432 <screen>
2433 ssh -t vruppert,bochs@shell.sourceforge.net create
2434 vruppert,bochs@shell.sourceforge.net's password:
2436 Requesting a new shell for "vruppert" and waiting for it to start.
2437 queued... starting...
2439 This is an interactive shell created for user vruppert,bochs.
2440 Use the "timeleft" command to see how much time remains before shutdown.
2441 Use the "shutdown" command to destroy the shell before the time limit.
2442 For path information and login help, type "sf-help".
2444 [vruppert@shell-24002 ~]$ cd /home/groups/b/bo/bochs/sitebin/
2445 [vruppert@shell-24002 sitebin]$ ./update-snapshots.sh
2446 [vruppert@shell-24002 sitebin]$ shutdown
2447 Requesting that your shell be shut down.
2448 This request will be processed soon.
2449 [vruppert@shell-24002 sitebin]$
2450 Broadcast message from root (Sat Nov 15 08:36:01 2008):
2452 The system is going down for system halt NOW!
2453 Connection to shell-24002 closed by remote host.
2454 Connection to shell-24002 closed.
2455 Connection to shell.sourceforge.net closed.
2456 </screen>
2457 </para>
2458 </section>
2460 <section id="update-online-docs"><title>Updating the online documentation</title>
2461 <para>
2462 To update the online documentation, a file called<filename>bochsdoc.tar.gz</filename>
2463 must be generated with the <command>make</command>. This file must be uploaded
2464 to the location of the online documentation on SF using <command>scp</command>.
2465 <screen>
2466 cd doc/docbook
2467 make bochsdoc.tar.gz
2468 scp bochsdoc.tar.gz vruppert,bochs@web.sf.net:htdocs/doc/docbook
2469 </screen>
2470 After a successful upload, the HTML files must be unpacked from the SF shell.
2471 See previous section how to create a shell.
2472 <screen>
2473 cd /home/groups/b/bo/bochs/htdocs/doc/docbook
2474 tar xvzf bochsdoc.tar.gz
2475 </screen>
2476 </para>
2477 </section>
2479       <section id="repository"><title>website html repository</title>
2480       <para>
2481       &FIXME;
2482       </para>
2483       </section>
2485       <section id="site-update"><title>automatic site update</title>
2486       <para>
2487       &FIXME;
2488       </para>
2489       </section>
2491       <section id="other-content"><title>other content</title>
2492       <para>
2493       &FIXME; sources, tmp
2494       </para>
2495       </section>
2497       <section id="available-tools"><title>available tools</title>
2498       <para>
2499       &FIXME; sources, tmp
2500       </para>
2501       </section>
2503 </chapter>
2504 </book>