5 JPC-RR is licenced under GNU GPL v2. See file “LICENSE”
11 To get started, you need BIOS image, VGABIOS image and DOS boot
12 floppy and JDK for Java 6 standard edition (later versions should
13 they appear should also work). Note: JRE is not enough.
15 Note that to play back recorded movies, you need exact same
16 version of BIOS image, VGABIOS image and DOS boot floppy as was
17 used when making the movie (in addition to exact same versions of
22 See compile.sh or compile.bat. The streamtools stuff is only
23 needed for dumping videos.
27 First you need to get and make some important images. Obtain BIOS
28 image, VGABIOS image and DOS boot floppy from somewhere. After
29 starting the emulator, use Drives -> Import Image to import the
30 images (ignore the error about no BIOS images being found).
34 There is premade autoexec script called assemble.jpcrrinit that
35 has fairly reasonable defaults. To use it:
37 java JPCApplication -library library -autoexec assemble.jpcrrinit
39 The “-library library” specifies that contents of directory
40 'library' are to be used as library. The script pops up settings
41 for new emulated PC (if you want to load savestate, click
42 cancel). Select BIOS and VGABIOS for BIOS and VGABIOS image (they
43 should be already selected), DOSfloppy for fda (boot device
44 should be set to fda) and game image as some HD drive
48 • Putting the game as hdd (the fourth hard disk slot) causes boot
51 • Some BIOS versions have “press F12 to select boot device”. Hit
52 <enter> from emulated keyboard and that prompt will go away in
53 about half emulated second (it stays several emulated seconds
56 • If game doesn't need lots of memory, hitting F5 to skip
57 intialization files is fastest. If it does need more memory,
58 run config.sys commands but not autoexec.bat.
60 • Some DOS disks have DOSIDLE with them, don't use it as it
61 messes badly with emulator.
63 3 Making JPC-RR format images from raw images
65 Due to various factors, JPC-RR can't use raw image files directly
66 but requires its own image format.
68 3.1 Importing images from GUI:
70 Use Drives -> Import Image to import existing directories or
71 image files. Dialog prompting parameters will be displayed. When
72 importing floppy images, check “standard geometry” if possible,
73 that enables geometry autodetection, which is reasonable
74 virtually all of the time it is offered.
78 • If making image from directory, the names of the files must
79 conform to FAT naming restrictions (8+3 character names, no
80 spaces, etc). Avoid filenames with non-ASCII characters.
82 • The DOS limit of 112 or 224 files for floppies does not apply
83 to images created from directory trees. The minimum limit value
84 used is 512. If even that isn't enough, the limit is
85 automatically increased to fit all the needed directory
88 • Making boot disks from tree does NOT work. Even if you got
89 system boot files there, it still won't work.
91 • Only floppy disks and hard drives can be made from directory
92 trees. BIOS images and CDROM images require image file.
94 • Avoid floppies with custom geometry (floppy geometry does
95 affect disk ID). Disks with over 63 sectors per track don't
96 work with DOS. Wheither disks with over 127 tracks per side
97 work with DOS is unknown. Also avoid 1024-tracks per side HDDs.
99 • The geometry limits are: 2-1024 tracks per side for HDD, 1-256
100 tracks per side for floppy. 1-63 sectors per track for HDD,
101 1-255 sectors per track for floppy. 1-16 sides for HDD, 1 or 2
102 sides for floppy. This gives size limit of 65280KiB for floppy
103 disks (but note the DOS limit!) and 516096KiB for HDDs.
105 • There are multiple image file contents that represent the same
106 image. The one with smallest size is picked when creating
109 • Note: Although the IDs are 128 bits long, they are not MD5
112 3.3 Importing from command line
114 There is tool called ImageMaker that can make JPC-RR images from
115 raw images. Each image has format, ID an name. Format and name
116 are specified when making image. ID is automatically calculated
117 from format and contents. Name does not affect the ID but is
118 purely for convience so one doesn't have to specify long image
123 The syntax for ImageMaker when making images is:
125 $ java ImageMaker <format> [<options>...] <destination> <source>
128 <destination> is file name for JPC-RR format image to write.
129 <source> is either name of regular file (raw image file) or name
130 of directory tree with files (supported for making floppy or hard
131 disk images only). In case of directory tree, the files are
132 layout deterministically to disk, so the ID will always be the
133 same for given geometry and type. <name> is name to give to disk.
136 --BIOS BIOS image (note: VGABIOS is also of this type).
138 --CDROM CD-ROM image.
140 --HDD=cylinders,sectors,heads Hard disk with specified geometry.
142 --floppy=tracks,sectors,sides Floppy disk with specified
145 --floppy160 160KiB floppy (40 tracks, 8 sectors, Single sided).
147 --floppy180 180KiB floppy (40 tracks, 9 sectors, Single sided).
149 --floppy320 320KiB floppy (40 tracks, 8 sectors, Double sided).
151 --floppy360 360KiB floppy (40 tracks, 9 sectors, Double sided).
153 --floppy410 410KiB floppy (41 tracks, 10 sectors, Double sided).
155 --floppy420 420KiB floppy (42 tracks, 10 sectors, Double sided).
157 --floppy720 720KiB floppy (80 tracks, 9 sectors, Double sided).
159 --floppy800 800KiB floppy (80 tracks, 10 sectors, Double sided).
161 --floppy820 820KiB floppy (82 tracks, 10 sectors, Double sided).
163 --floppy830 830KiB floppy (83 tracks, 10 sectors, Double sided).
165 --floppy880 880KiB floppy (80 tracks, 11 sectors, Double sided).
167 --floppy1040 1040KiB floppy (80 tracks, 13 sectors, Double
170 --floppy1120 1120KiB floppy (80 tracks, 14 sectors, Double
173 --floppy1200 1200KiB floppy (80 tracks, 15 sectors, Double
176 --floppy1440 1440KiB floppy (80 tracks, 18 sectors, Double
179 --floppy1476 1476KiB floppy (82 tracks, 18 sectors, Double
182 --floppy1494 1494KiB floppy (83 tracks, 18 sectors, Double
185 --floppy1600 1600KiB floppy (80 tracks, 20 sectors, Double
188 --floppy1680 1680KiB floppy (80 tracks, 21 sectors, Double
191 --floppy1722 1722KiB floppy (82 tracks, 21 sectors, Double
194 --floppy1743 1743KiB floppy (83 tracks, 21 sectors, Double
197 --floppy1760 1760KiB floppy (80 tracks, 22 sectors, Double
200 --floppy1840 1840KiB floppy (80 tracks, 23 sectors, Double
203 --floppy1920 1920KiB floppy (80 tracks, 24 sectors, Double
206 --floppy2880 2880KiB floppy (80 tracks, 36 sectors, Double
209 --floppy3120 3120KiB floppy (80 tracks, 39 sectors, Double
212 --floppy3200 3200KiB floppy (80 tracks, 40 sectors, Double
215 --floppy3520 3520KiB floppy (80 tracks, 44 sectors, Double
218 --floppy3840 3840KiB floppy (80 tracks, 48 sectors, Double
223 --volumelabel=label Give specified volume label (affects ID).
224 Only meaningful when making image out of directory tree. Default
227 --timestamp=YYYYMMDDHHMMSS Give specified timestamp for files
228 (affects ID). Only meaningful when making image out of directory
229 tree. The default timestamp is 19900101T000000Z.
231 3.3.3 Image information
235 $ java ImageMaker <imagefile>
237 Variety of information about image is displayed (especially for
238 floppies/HDDs). Two important fields are calculated and claimed
239 disk ID. They should be the same. If they are not, then the image
240 file is corrupt (sadly, imagemaker has bugs and bugs that cause
241 it to write corrupt images have been seen).
243 3.4 Advanced: The disk ID algorithm
245 The disk ID is calculated as:
247 Skein-256-128-deprecated(<typecode>|<geometry>|<image>)
249 Where Skein-256-128-deprecated is Skein hash function with
250 256-bit internal state and 128-bit output using the deprecated
251 rotation constants (as specified in Skein hash function reference
252 documentation versions 1.0 and 1.1). The <image> is the whole
253 image, including parts not stored in image file. The reason for
254 keeping using the deprecated constants are:
256 • Changing the constants would change the IDs, which would
257 invalidate existing images
259 • This is not about cryptographic security
261 • The new constants don't improve security that much anyway.
263 3.4.1 Floppies and HDDs
265 Floppies have <typecode> value 0 (single byte) and HDDs have 1
266 (single byte). <geometry> is as follows (this is exactly the same
267 form as it appears in image header):
269 Byte 0 bits 0-1: Bits 8-9 of track count per side - 1.
271 Byte 0 bits 2-5: Head count - 1.
273 Byte 0 bits 6-7: Reserved, must be 0.
275 Byte 1: Bits 0-7 of track count per side - 1.
277 Byte 2: Sector count per track - 1.
279 3.4.2 CD-ROM and BIOS images
281 CD-ROMs have <typecode> value 2 (single byte) and BIOS images
282 have 3 (single byte). <geometry> is blank.
284 3.5 Advanced: Disk Image format
286 The disk image consists of following parts, concatenated in this
287 order without padding:
299 • type-specific geometry/size data
307 Magic in disk image files is following 5 bytes: “IMAGE”
311 Disk ID is given as 16 bytes, encoding the 128-bit disk ID.
315 Type code is single byte. 0 for floppies, 1 for HDDs, 2 for
316 CD-ROMs and 3 for BIOS images. Other values are reserved.
318 3.5.4 Disk name length
320 Obsolete. Disk name length is given as two-byte big-endian value.
321 New images should have 0 here.
325 Ignored. Name field is there for backward compatiblity. Disk name
326 length gives length of this field in bytes.
328 3.5.6 Type-specific geometry/size data (floppies and HDDs)
330 Floppies and HDDs have 3-byte geometry data:
332 Byte 0 bits 0-1: Bits 8-9 of track count per side - 1.
334 Byte 0 bits 2-5: Head count - 1.
336 Byte 0 bits 6-7: Reserved, must be 0.
338 Byte 1: Bits 0-7 of track count per side - 1.
340 Byte 2: Sector count per track - 1.
342 3.5.7 Type specific-geometry/size data (CD-ROMs)
344 CD-ROMs have 4-byte big-endian sector (512 bytes!) count.
346 3.5.8 Type specific-geometry/size data (BIOS images)
348 BIOS images have 4-byte big-endian byte (not sector or block)
351 3.5.9 Actual image data (floppy/HDD)
353 Floppy or HDD imagedata consists of following subparts:
363 Storage method is single byte. Sectors present gives number of
364 last nonzero sector + 1 (zero if image is all zeroes)
366 3.5.10 Floppy/HDD storage method 0: Raw storage
368 This storage method has empty header. Image data is raw dump of
369 first sectors present sectors.
371 3.5.11 Floppy/HDD storage method 1: Sectormap
373 Image data header contains bitfield with just enough bytes to
374 have one bit per present sector. The order of bits is such that
375 number of bit corresponding to each sector in byte is sector
376 number modulo 8 and byte number is floor of sector number divided
377 by 8 when sector numbers are counted from zero. If bit
378 corresponding to sector is set, then the sector is present in
379 image data, otherwise it is absent and assumed to be all-zeroes.
381 Image data contains dumps of all present sectors in order of
382 increasing sector number.
384 3.5.12 Floppy/HDD storage method 2: Extent first sector zero
386 Image data is empty as storage-specific data is mangled with
387 image data. The image data alternates between blocks encoding
388 zero sectors and blocks encoding nonzero sectors. The first block
389 encodes zero sectors.
391 Block encoding zero sectors consist of single 1-4 byte
392 little-endian value encoding number of sectors in block - 1.
393 Number of bytes is determined by sectors present value. It is 1
394 for 1-256 sectors, 2 for 257-65536, 3 for 65537-16777216 and 4
395 for more than 16777216. All sectors in block are filled with
396 zeroes and are not stored.
398 Block encoding nonzero sectors has same block count as zero
399 sector block but is followed by the sectors stored raw.
401 3.5.13 Floppy/HDD storage method 3: Extent first sector nonzero
403 Same as storage method 2 but first block is nonzero sector block.
405 3.5.14 Actual image data (CD-ROMs and BIOS images)
407 These store image data raw. The amount of data is specified by
412 Comments are given as list of strings, with UTF-8 encoded strings
413 following 2-octet big-endian length. Comment list is terminated
414 by entry with length 0 (0x00 0x00). Comments are optional and may
417 4 The actual emulator
419 The actual emulator is invoked as:
421 $ java JPCApplication <options>...
423 The valid options are:
425 -library <library> Use the specified directory when searching for
426 images (can only be specified once).
428 -autoexec <script> Execute contents of specified file as commands
431 -norenames Copy&Delete files instead of renaming. Mainly meant
432 for debugging copy&delte code.
434 If no arguments are given, defaults of library 'disklibrary' and
435 autoexec file of 'assemble.jpcrrinit' are used.
439 When emulator is started, command line comes up. Following
442 • 'exit': exit immediately
444 • 'load <plugin>': Load plugin (no arguments)
446 • 'load <plugin>(<arguments>)': load plugin with arguments.
448 • 'command <command> [<arguments>...]': Invoke command via
449 external command interface.
451 • 'call<command> [<arguments>...]': Invoke command via external
452 command interface and print return values.
454 When one gets command line, its useful to load some plugins. See
455 section about plugins. Note: Load runner plugin
456 (PCControl/PCRunner and so) last, as some runners like to start
459 4.2 PC settings dialog notes
461 • CPU divider base frequency before division is 1GHz.
463 • Images can be specified by name or by ID. Name is relative to
464 library directory. If the image is in subdirectory of image
465 directory, the directory separator is is '/' regardless of what
468 • CD-ROM and hdc are mutually exclusive
470 • Modules is comma-seperated list of modules to load. To pass
471 arguments to some modules, enclose the arguments in (). Same
472 module can be specified twice only if parameters differ.
474 • Setting boot device doesn't work with some BIOS versions. Those
475 versions prompt the boot device anyway.
477 4.3 Audio output channels
479 PC can have one or more audio output channels. The name of audio
480 output associated with PC speaker is:
481 'org.jpc.emulator.peripheral.PCSpeaker-0'. Modules that have
482 audio outputs get channel names of form <classname>-<sequential>,
483 where <classname> is name of main module class and sequential is
484 number starting from zero. Note that same module can have
485 multiple output channels. If multiple modules of same class
486 request audio outputs, the <sequential> values of subsequent
487 module start where previous left off.
491 Plugins actually execute the tasks of the emulator. They can be
492 loaded using “load <plugin>” or 'load <plugin>(<arguments>)” from
495 Different Plugins using the same output (like running PCMonitor
496 and RAWVideoDumper) should not conflict because connector output
497 hold locking is desinged to handle multiple readers.
499 If no plugin used requires GUI, then the emulator can be run
500 without having GUI available.
502 4.4.1 plugin: org.jpc.plugins.PCControl
504 Takes optionally 'extramenu=<file>' and 'uncompressedsave=1',
505 requires and uses GUI.
507 Runs the PC emulator core. Has capability to start/stop
508 emulation, breakpoint after certain time or start/end of VGA
509 vertical retrace. Also can create, savestate and loadstate PC
510 emulation. Memory dumping is supported.
512 'extramenu=<file>' causes Plugin to load extra menu entries from
513 <file>. 'uncompressedsave=1' causes savestates to be written
514 uncompressed (useful if they are stored in VCS supporting delta
517 4.4.2 plugin: org.jpc.plugins.PCRunner
519 Takes 'movie=<file>' as argument and optionally 'stoptime=<time>'
520 Does not require nor use GUI.
522 Loads PC from savestate and just runs it. CTRL+C to quit. Also
523 automatically quits once stoptime is reached.
525 4.4.3 plugin: org.jpc.plugins.PCMonitor
527 No arguments, requires and uses GUI.
529 VGA monitor for emulated PC.
531 4.4.4 plugin: org.jpc.plugins.VirtualKeyboard
533 No arguments, requires and uses GUI.
535 On-screen keyboard for emulated PC.
537 4.4.5 plugin: org.jpc.plugins.PCStartStopTest
539 No arguments, requires and uses GUI.
541 Small plugin testing remote PC start/stop. Also supports sending
542 some common keypresses.
544 4.4.6 plugin: org.jpc.plugins.RAWVideoDumper
546 Takes 'rawoutput=<file>' as argument. Does not require nor use
549 Dumps all generated frames to RAW file <file>. Rawoutput is
550 required. The raw file consists of concatenation of zlib streams.
551 The uncompressed stream is concatenation of time skips (FFh FFh
552 FFh FFh), each acting as time offset of 2^32-1 nanoseconds and
553 saved frames. The saved frame has time offset in nanoseconds (big
554 endian) as first four bytes (must be at most 2^32-2, as 2^32-1 is
555 reserved for time skip). The next two bytes are big-endian width,
556 next two big-endian height. Finally frame has 4 * width * height
557 bytes of data that encodes pixels using 4 bytes per pixel, in
558 left-to-right, up-to-down order. Byte 0 of each pixel is
559 reserved, byte 1 is the red channel, byte 2 is green channel and
560 byte 3 is blue channel.
562 Dumping to pipe is supported.
564 4.4.7 plugin: org.jpc.plugins.RAWAudioDumper
566 Takes 'src=<name of audio output channel>',
567 'file=<output-filename>' and 'offset=<offset>' as arguments,
568 separated by ','. Does not require nor use GUI.
570 Dumps output from specified audio output channel (src, mandatory)
571 to RAW-format file (file, mandatory). The resulting file consists
572 of records, 4 or 8 bytes each. 4 byte record consists of 0xFF
573 0xFF 0xFF 0xFF and means to increase next time delta by 2^{32}-1
574 ns. Otherwise record is 8 bytes. Each 8 byte record has three
575 fields. First 4 byte unsinged big endian timedelta value (in
576 nanoseconds, must be smaller than 2^{32}-1), then 2 byte signed
577 big endian new left channel volume, then 2 byte signed big endian
578 new right channel volume. Optionally 'offset' can be set to
579 positive value (in nanoseconds) to delay the audio by.
581 4.4.8 plugin: org.jpc.plugins.LuaPlugin
583 Takes 'kernel=<name of lua kernel file>', other parameters are
584 passed to kernel, requires and uses GUI.
586 Lua VM for executing scripts.
588 4.4.9 plugin: org.jpc.plugins.JoystickInput
590 No parameters. Displays window for sending joystick input.
594 5.1 org.jpc.modules.Joystick:
598 • Resources: I/O port 0x201
600 Emulates joystick game port.
602 5.2 org.jpc.modules.SoundCard
604 • Arguments: Optional resources specification
606 • Resources (defaults): I/O port 0x220-0x22F, IRQ 5, DMA 1, DMA 5
610 5.3 org.jpc.modules.FMCard
612 • Arguments: Optional resources specification
614 • Resources (defaults): I/O port 0x338-0x33B
618 5.4 org.jpc.modules.BasicFPU:
624 Crude FPU (x87) emulator.
628 Hacks are saved to savestates but not movies.
632 Force bit 1 of physical address 0x0410 to zero, signaling that
633 the system has no FPU. BIOS assumes system has FPU but some games
634 use that bit to detect FPU, trying to use it if it is “present”.
635 Try this if game startup hangs with lots of trying to use FPU but
636 not present errors. Don't use if there is FPU present. Needed to
637 get games like Blake Stone / Wolfenstein 3-D to work (FPU
638 emulator allows it to start but causes graphical glitches).
642 Update basic VGA parameters before vretrace, not after it. Some
643 games (e.g. Commander Keen 4) don't like if this isn't done and
644 some games (e.g. Mario & Luigi) don't like if it is done. Wrong
645 value manifests as jerky scrolling (scrolling back and forth and
646 fixed statusbars move).
648 7 Some error messages and explanations
650 • <filename> is Not a valid image file
652 • <filename> is not image file
654 • <filename> claims to be floppy with illegal geometry: <x>
655 tracks, <y> sides and <z> sectors.
657 • <filename> claims to be HDD with illegal geometry: <x> tracks,
658 <y> sides and <z> sectors.
660 • Can't read disk image sector map.
662 • Can't read disk image extent.
664 Code expects <filename> to be valid JPC-RR format image, but it
665 isn't JPC-RR image at all or its corrupt.
667 • <filename> is image of unknown type.
669 • <filename> has unrecognized geometry <x> <y> <z>
671 Possibly corrupt image, not JPC-RR image, or JPC-RR image from
672 future version containing something current version can't
675 • Invalid format specifier <something>.
677 • Invalid syntax of --floppy= or --HDD= option.
679 • Invalid format specifier/option <something>.
681 Invalid option or format specifier was given. Check for typos.
683 • java ImageMaker [<options>...] <format> <destination> <source>
686 Check syntax of command. Especially that diskname is present!
688 • The image has <nnn> sectors while it should have <yyy>
689 according to selected geometry.
691 • Raw image file length not divisible by 512.
693 • Trying to read sector out of range.
695 The selected geometry is wrong or raw image is incomplete.
697 • Invalid disk name (Should not happen!).
699 • Invalid geometry to be written.
701 This is a very likely a bug in program.
703 • What the heck <filename> is? It's not regular file nor
706 That sort of file can't be used as input for image making, or the
707 file just doesn't exist.
709 • BIOS images can only be made out of regular files.
711 • CD images can only be made out of regular files.
713 Source image specified is not regular file, but image of that
714 type can't be made of anything else.
716 • Can't read raw bios image file.
718 • Can't read sector <nnn> from image.
720 Reading the raw image file failed for some reason.
722 • Bad library line: "<something>". Ignored.
724 Syntax error in image library.
726 • Removing image <something> a.k.a. "<something>" as it no longer
729 The image file no longer exists so it gets removed from library.
731 • Removing image <something> a.k.a. "<something>" due to <some>
734 Image library code killed some image from library due to some
735 kind of conflict with image being added.
737 • Too much data to fit into given space.
739 The tree you gave contains takes just too much space to fit into
742 8 Advanced: Savestate/movie format
744 8.1 Special character classes
748 Following Unicode codepoints (encoded as UTF-8) are interpretted
751 • Codepoints 0x20, and 0x09.
753 • Codepoints 0x1680, 0x180E, 0x2028, 0x205F and 0x3000
755 • Codepoints 0x2000-0x200A.
759 Following byte sequences are interpretted as linefeeds (line
762 • Byte 0x0A (UTF-8 encoded codepoint 0x0A)
764 • Byte 0x0D (UTF-8 encoded codepoint 0x0D)
766 • Byte 0x1C (UTF-8 encoded codepoint 0x1C)
768 • Byte 0x1D (UTF-8 encoded codepoint 0x1D)
770 • Byte 0x1E (UTF-8 encoded codepoint 0x1E)
772 • Bytes 0xC2 0x85 (UTF-8 for unicode control character NL,
775 • Bytes 0xE2 0x80 0xA9 (UTF-8 encoded codepoint 0x2029)
779 JRSR archive format packs multiple text archive members to text
780 archive. It does not support binary members. JRSR archives have
781 first five or six bytes form the magic. It is “JRSR” followed by
782 LINEFEED character There are four kinds of lines after that
783 (lines are terminated by LINEFEED byte/bytes):
793 Sequencing rules are as follows: Start member is allowed anywhere
794 (after magic). Member line is allowed only inside member (member
795 started but not ended). End member is only allowed inside member.
796 End of file is only allowed outside member. Blank line is allowed
797 anywhere after magic.
801 Start member line is given as “!BEGIN” <SPACE>+ <membername>
802 <LINEFEED>. <SPACE>+ any number of SPACE characters at least one
803 and <LINEFEED> is LINEFEED chacter. The member name is UTF-8
804 encoded and maximum allowed line length is 2048 bytes (including
805 LINEFEED, which means name is limited to 509-2040 codepoints
806 depending on characters used). Starting member inside another
807 implicitly ends the previous member.
811 Member line is given as “+”<content><LINEFEED>. It gives another
812 line for member contents. <content> is passed raw to layers above
813 (followed by line termination)
817 End member line is given as “!END”<LINEFEED>. It ends the current
818 member. The following line can only be start member line or file
823 Blank line is given as <LINEFEED>. Lines like that are ignored.
825 8.3 Four-to-Five encoding
827 Binary members are encoded into text by so-called four-to-five
828 encoding. This encoding can encode single byte to two, two bytes
829 to three, three bytes to four and four bytes to five.
830 Four-to-five encoding has five kinds of blocks. All SPACE and
831 LINEFEED characters are completely ignored, even in middle of
834 8.3.1 End stream block
836 End stream block is encoded as '!'. It ends the stream instantly.
837 There is also implicit end of stream at end of input to decoding.
839 8.3.2 Other four block types
841 Other four block types take the value to be encoded, read it as
842 big-endian value. Then they write it as base-93 big-endian value.
843 Then length specific constants are added to digits of that number
844 to yield ASCII values for characters (those are stored in order):
847 +------------+------------+------------+------------+------------+-----------+
848 | To encode | 1st char. | 2nd char. | 3rd char. | 4th char. | 5th char. |
849 +------------+------------+------------+------------+------------+-----------+
850 +------------+------------+------------+------------+------------+-----------+
851 | 1 byte | 34 | 34 | - | - | - |
852 +------------+------------+------------+------------+------------+-----------+
853 | 2 bytes | 37 | 34 | 34 | - | - |
854 +------------+------------+------------+------------+------------+-----------+
855 | 3 bytes | 45 | 34 | 34 | 34 | - |
856 +------------+------------+------------+------------+------------+-----------+
857 | 4 bytes | 66 | 34 | 34 | 34 | 34 |
858 +------------+------------+------------+------------+------------+-----------+
861 Blocks which encode values greater than what is possible for
862 value of that length are fatal errors.
864 8.4 Line component encoing
866 Line component encoding sits on top of UTF-8 encoding. Line
867 component encoding encodes non-empty 1-D array of non-empty
868 strings into line, and thus array of those into member. Empty
869 lines or lines that don't contain any components are ignored.
870 Line starts with depth value of 0 and must end with depth value
873 Components are seperated by component separators. Empty
874 components are ignored. Following codepoints are separators on
875 depth 0 if not escaped:
877 • Codepoint of '('. The depth is read pre-increment.
879 • Codepoint of ')'. The depth is read post-decrement.
881 • Any SPACE character
883 The following characters are special:
885 • '('. Increments depth by 1 if not escaped (and appears in
888 • ')'. Decrements depth by 1 if not escaped (and appears in
889 component). Depth going negative is an error.
891 • '\'. Next character is interpretted as literal. Error if at end
894 Otherwise, characters are interpretted as literals and appear in
895 components. Depth must be zero at end of line.
899 Header section is in archive member "header". It uses line
900 component encoding. The first component of each line is name of
901 header, and subsequent ones are arguments. How many parameters
902 are expected is dependent on what header it is:
904 8.5.1 PROJECTID header:
906 • Header name: "PROJECTID"
910 • Argument #1: <project-id-string>
914 Gives project ID. Project ID is generated when PC is assembled
915 and is then preserved in save states. It is used for computing
916 rerecord counts. Emulator treats it as opaque string, the IDs it
917 generates are formed by 48 random hexadecimal digits.
919 8.5.2 SAVESTATEID header:
921 • Header name: "SAVESTATEID"
925 • Argument #1: <savestate-id-string>
929 Gives save state ID. Each save state has its own save state ID.
930 Treated as opaque string, but generated as 48 random hexadecimal
931 digits. The presence of this header signals whether there is save
932 state to be loaded. If this header is present, save state load
933 will be attempted. If absent, save state is not to be loaded even
934 if present (and correct savestate load would be technically
937 The value is used to prevent loading incompatible save states in
938 preserve event stream mode and also to find the point in event
939 stream where one left off.
941 8.5.3 RERECORDS header:
943 • Header name: "RERECORDS"
947 • Argument #1: <rerecords>
951 Gives rerecord count. PC assembly (except when loading save
952 state) initializes current rerecord count to zero. Must be
953 non-negative and decimal number using ASCII digit characters.
955 On loading save state:
957 1) If project ID matches with previous:
959 1a) If loaded rerecord count is larger or equal to current
962 1a-a) Current rerecord count is loaded rerecord count + 1.
966 1b-a) Current rerecord count increments by 1.
970 2a) Current rerecord count is loaded rerecord count + 1.
972 The current rerecord count at time of save is saved to save
975 8.5.4 AUTHORS header:
977 • Header name: "AUTHORS"
979 • Components: 2 or more
981 • Arguments: free form
985 Gives authors of run. Each argument gives one author. May be
986 present multiple times.
988 8.5.5 COMMENT header:
990 • Header name: "COMMENT"
992 • Components: 2 or more
994 • Arguments: free form
998 Various kinds of free form data. Not parsed further by emulator.
1000 8.6 Initialization segment:
1002 If SAVESTATEID header isn't present (not a save state), member
1003 "initialization" gives PC initialization parameters for
1004 assembling the PC. It is present anyway even if SAVESTATEID is
1005 present (savestate).
1007 Following parameters are used (space separates components):
1011 Gives Image ID of main system BIOS (mandatory)
1015 Gives Image ID of VGA BIOS (mandatory).
1019 Gives Image ID of hda. Present only if system has hard disk hda.
1023 Gives Image ID of hdb. Present only if system has hard disk hdb.
1027 Gives Image ID of hdc. Present only if system has hard disk hdc.
1031 Gives Image ID of hdd. Present only if system has hard disk hdd.
1035 Gives Image ID of disk in slot <num>. Slot number must be
1038 “DISKNAME” <num> <name>
1040 kGives image name of disk in slot <num>. Slot number must be
1041 non-negative. The slot must be previously declared using “DISK”.
1045 Gives Image slot to initially put into floppy drive fda. Disk
1046 must be of floppy type. If none present, no disk is initially put
1051 Gives Image slot to initially put into floppy drive fdb. Disk
1052 must be of floppy type. If none present, no disk is initially put
1057 Gives Image slot to initially put into CD-ROM drive hdc. Not
1058 allowed if hard disk hdc is present. Disk must be of CD-ROM type.
1059 If none present no disk is initially put there.
1061 "INITIALTIME" <time>
1063 Number of milliseconds since Unix epoch to system start up time.
1066 0-4102444799999. Mandatory.
1068 "CPUDIVIDER" <divider>
1070 Set CPU frequency divider (dividing the 1GHz master clock).
1071 Allowed range is 1-256. Mandatory.
1073 "MEMORYSIZE" <pages>
1075 Number of 4KiB pages of RAM memory. Allowed range 256-262144.
1080 Set boot device. Valid devices are "FLOPPY" (boot from fda),
1081 "HDD" (boot from hda) and "CDROM" (boot from CD).
1083 "LOADMODULEA" <module> <parameters>
1085 Load module <module> with parameters <parameters>.
1087 "LOADMODULE" <module>
1089 Load module <module> with no parameters
1093 Use class <fpu> as FPU emulator.
1097 Use I/O port delay emulation (each I/O port read/write takes
1102 Emulate VGA horizontal retrace.
1104 8.7 Event record format:
1106 Event record is in archive member "events". It uses line
1107 component encoding. Each line gives an event. First component of
1108 each line gives time stamp. These timestamps MUST be in
1109 increasing order and all MUST be non-negative. Time stamp time
1110 unit is exactly 1 nanosecond of emulated time.
1112 The second component of each line is name of class to dispatch
1113 to. Further components are passed as-is to event handlers.
1114 Classes with names consisting only of uppercase A-Z and 0-9 are
1115 special and reserved. It is error to encounter unknown such
1118 8.7.1 Savestate event
1120 • Dispatch to: SAVESTATE
1122 • Argument #1: Savestate id
1124 • Argument #2 (optional): Rerecord count at time of saving
1127 Signals that savestate has occured here. The save state IDs MUST
1128 be unique in entire event stream. The second argument to
1129 savestate (if present) is rerecord count at time of saving that
1130 savestate (useful for calulating rerecord count of movie starting
1131 from savestate). No time restrictions
1135 • Dispatch to: OPTION
1137 • Argument #1: “ABSOLUTE” or “RELATIVE”
1139 Controls various options. “ABSOLUTE” turns on absolute mode
1140 (default) where event timestamps are absolute. “RELATIVE” turns
1141 on relative mode where event timestamps are relative to last
1142 event in stream. The OPTION event itself is not affected by
1143 timing change. No time restrictions. Unknown arguments are
1146 8.7.3 Keyboard keypress/keyrelease event:
1148 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1150 • Argument #1: Fixed: "KEYEDGE"
1152 • Argument #2: Key number. Valid values are 1-83, 85-95, 129-197
1155 Send key press or key release. Keys work in toggle button manner.
1156 The event time must be multiple of 66 666, and must not be less
1157 than 60 * 66 666 TUs after last PAUSE event, 20 * 66 666 TUs
1158 after last KEYEDGE on key >128 and 10 * 66 666 TUs after last
1159 KEYEDGE on key <128.
1163 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1165 • Argument #1: Fixed: "PAUSE"
1167 Send pause key event. The time restrictions are identical to
1170 8.7.5 Mouse button event:
1172 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1174 • Argument #1: Fixed: "MOUSEBUTTON"
1176 • Argument #2: Number of button to release or press (0-4)
1178 Presses or releases the designated mouse button.
1180 8.7.6 X mouse motion event:
1182 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1184 • Argument #1: Fixed: "XMOUSEMOTION"
1186 • Argument #2: Number of units to move (-255 - 255)
1188 Move the mouse in X direction by specified amount. Positive is
1191 8.7.7 Y mouse motion event:
1193 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1195 • Argument #1: Fixed: "YMOUSEMOTION"
1197 • Argument #2: Number of units to move (-255 - 255)
1199 Move the mouse in Y direction by specified amount. Positive is
1202 8.7.8 Z mouse motion event:
1204 • Dispatch to: org.jpc.emulator.peripheral.Keyboard
1206 • Argument #1: Fixed: "ZMOUSEMOTION"
1208 • Argument #2: Number of units to move (-7 - 7)
1210 Move the mouse in Z direction (scrollwheel) by specified amount.
1212 8.7.9 Joystick button event:
1214 • Dispatch to: org.jpc.modules.Joystick
1216 • Argument #1: “BUTTONA”, “BUTTONB”, “BUTTONC” or “BUTTOND”
1218 • Argument #2: “0” if released, “1” if pressed
1220 Send button down/up event. No time restrictions.
1222 8.7.10 Joystick axis event:
1224 • Dispatch to: org.jpc.modules.Joystick
1226 • Argument #1: “AXISA”, “AXISB”, “AXISC” or “AXISD”
1228 • Argument #2: Multivibrator unstable state length in ns.
1230 Set amount of time multivibrator remains in unstable state. No
1235 • Dispatch to: org.jpc.emulator.PC$ResetButton
1241 8.7.12 Fda disk change:
1243 • Dispatch to: org.jpc.emulator.PC$DiskChanger
1245 • Argument #1: Fixed: "FDA"
1247 • Argument #2: Number of image slot to put there.
1249 The disk number MUST be -1 or valid disk number. -1 MUST NOT be
1250 used if there is no disk in floppy drive A. This event causes
1251 specified disk to be placed to FDA or FDA disk to be ejected with
1252 no replacement if disk number is -1. The specified disk if not -1
1253 must be of floppy type. The specified disk if valid must not be
1256 8.7.13 Fdb disk change:
1258 • Dispatch to: org.jpc.emulator.PC$DiskChanger
1260 • Argument #1: Fixed: "FDB"
1262 • Argument #2: Number of image slot to put there.
1264 The disk number MUST be -1 or valid disk number. -1 MUST NOT be
1265 used if there is no disk in floppy drive B. This event causes
1266 specified disk to be placed to FDB or FDB disk to be ejected with
1267 no replacement if disk number is -1. The specified disk if not -1
1268 must be of floppy type. The specified disk if valid must not be
1271 8.7.14 Change CDROM:
1273 • Dispatch to: org.jpc.emulator.PC$DiskChanger
1275 • Argument #1: Fixed: "CDROM"
1277 • Argument #2: Number of image slot to put there.
1279 The disk number MUST be -1 or valid disk number. -1 MUST NOT be
1280 used if there is no disk in CD-ROM. This event causes specified
1281 disk to be placed to CD-ROM or CD-ROM disk to be ejected with no
1282 replacement if disk number is -1. The specified disk if not -1
1283 must be of CD-ROM type.
1285 This event has no effect if CD-ROM is locked.
1287 8.7.15 Write protect floppy:
1289 • Dispatch to: org.jpc.emulator.PC$DiskChanger
1291 • Argument #1: Fixed: "WRITEPROTECT"
1293 • Argument #2: Number of image slot to manipulate
1295 Write protects specified disk. The disk MUST NOT be in any drive
1296 and MUST be valid floppy-type disk.
1298 8.7.16 Write unprotect floppy:
1300 • Dispatch to: org.jpc.emulator.PC$DiskChanger
1302 • Argument #1: Fixed: "WRITEUNPROTECT"
1304 • Argument #2: Number of image slot to manipulate
1306 Disables write protection specified disk. The disk MUST NOT be in
1307 any drive and MUST be valid floppy-type disk.
1309 8.8 Diskinfo sections
1311 Diskinfo sections are named “diskinfo-”<id of disk>. They use
1312 line component encoding, fieldtype being first component on each
1313 line (value being the second). Following fields are defined:
1317 Gives type of image. Possible values are
1319 • “FLOPPY” (floppy disk)
1325 • “BIOS” (BIOS/VGABIOS image)
1327 • “UNKNOWN” (what the heck is this???)
1335 (BIOS images only) Gives length of BIOS image
1339 MD5 of raw disk/BIOS image without any headers or trailers.
1343 (FLOPPY/HDD/CDROM images only) Number of total sectors on disk.
1347 (FLOPPY/HDD images only) Number of tracks on disk per side (1-256
1348 for floppy, 1-1024 for HDD).
1352 (FLOPPY/HDD images only) Number of sides on disk (1 or 2 for
1353 floppy, 1-16 for HDD).
1357 (FLOPPY/HDD images only) Number of sectors per track (1-255 for
1358 floppy, 1-63 for HDD).
1362 Line from image comment block. Usually give data about files
1363 image has. May or may not be present (multiple times)
1367 Output info is stored in section “output-info”. Its relatively
1368 new, so it might not be present (then the contents have to be
1369 guessed based on modules present). Each line gives information
1370 about one output, first field being the type of output.
1374 For video output, there are no parameters so line is just “VIDEO”
1379 For audio output, the only parameter is name of output, so first
1380 component is “AUDIO” and second component is name of audio
1385 Actual savestate format is not documented here. It is close to
1386 impossible to comprehend without access to emulator source
1389 9 Advanced: Making class dumpable
1391 Class is made dumpable by implementing interface
1392 org.jpc.emulator.SRDumpable and implementing method
1393 dumpSRPartial(org.jpc.emulator.SRDumper) and constructor
1394 <init>(org.jpc.emulator.SRLoader). Non-static inner classes can
1395 not be dumpable (make them static using tricks similar to what
1398 If dumped class has dumpable superclass, the first thing dumping
1399 function needs to do is to call dumper function of superclass and
1400 first thing loading constructor needs to do is to call loading
1401 constructor of superclass. If class has no dumpable superclass,
1402 dumper doesn't need to do anything special, while loader needs to
1403 call objectCreated(this) on SRLoader object passed as parameter.
1405 Following these fixed parts, dump all members that are part of
1406 mutable state in emulator core.
1408 9.1 Member dumping/loading functions
1410 There is dumping/loading function for following (all functions
1411 dumping/loading reference types can handle null):
1413 • boolean: SRDumper.dumpBoolean, SRLoader.loadBoolean
1415 • byte: SRDumper.dumpByte, SRLoader.loadByte
1417 • short: SRDumper.dumpShort, SRLoader.loadShort
1419 • int: SRDumper.dumpInt, SRLoader.loadInt
1421 • long: SRDumper.dumpLong, SRLoader.loadLong
1423 • String: SRDumper.dumpString, SRLoader.loadString
1425 • boolean[]: SRDumper.dumpArray, SRLoader.loadArrayBoolean
1427 • byte[]: SRDumper.dumpArray, SRLoader.loadArrayByte
1429 • short[]: SRDumper.dumpArray, SRLoader.loadArrayShort
1431 • int[]: SRDumper.dumpArray, SRLoader.loadArrayInt
1433 • long[]: SRDumper.dumpArray, SRLoader.loadArrayLong
1435 • double[]: SRDumper.dumpArray, SRLoader.loadArrayDouble
1437 • <dumpable type>: SRDumper.dumpObject, SRLoader.loadObject
1439 • special object: SRDumper.specialObject, SRLoader.specialObject
1443 • Dumpable objects come out as type of
1444 org.jpc.emulator.SRDumpable.
1446 • Special objects are various static objects that don't need to
1447 be stored because they don't have mutable fields.
1449 • Don't dump fields related to event state feedback.
1451 • Don't dump temporary flags that are only used while PC is
1452 running. Savestate when PC is running isn't possible anyway.
1454 • Some connectors dump fields related to connector output, some
1457 10 Advanced: Making output connectors
1459 Implementing interface org.jpc.emulator.DisplayController signals
1460 that this is display controller, inhibiting loading of the
1461 standard VGA display controller if loaded as module.
1463 10.1 Interface org.jpc.emulator.OutputConnector
1465 Class is made to be output connector by implementing this
1466 interface. This interface specifies the methods used for output
1467 hold locking. Class org.jpc.emulator.OutputConnectorLocking has
1468 implementations of these that are suitable for calling.
1470 10.1.1 Method subscribeOutput(Object)
1472 Subscribes the output, with specified object as handle.
1474 10.1.2 Method unsubscribeOutput(Object)
1476 Unsubscribe the specified handle object from output.
1478 10.1.3 Method waitOutput(Object)
1480 Wait for output on specified connector using specified handle
1481 object. Returns true on success, false if wait was interrupted by
1482 thread interrupt. Blocking.
1484 10.1.4 Method releaseOutput(Object)
1486 Release connector from p.o.v. of given handle. Does not block.
1488 10.1.5 Method holdOutput()
1490 Release threads waiting on waitOutput() and block until all
1491 subscribers have returned from waitOutput() and enteired
1494 10.1.6 Method releaseOutputWaitAll(object)
1496 Like releaseOutput(), but waits until all handles have released
1499 10.2 Class org.jpc.emulator.VGADigtalOut
1501 Class org.jpc.emulator.VGADigtalOut (already implements
1502 OutputConnector) implements VGA output connector. If module
1503 provodes output connector, it needs to implement
1504 org.jpc.emulator.DisplayController.
1506 10.2.1 Method getWidth()
1508 Get width of display (watch out, can return 0).
1510 10.2.2 Method getHeight()
1512 Get height of display (watch out, can return 0).
1514 10.2.3 Methods getDirtyXMin(), getDirtyXMax(), getDirtyYMin(),
1517 Returns the dirty region (region modified since last output).
1519 10.2.4 Method getBuffer()
1521 Get buffer of ints, at least width * height elements
1522 (left-to-right, top-down, one value per pixel) giving pixel data.
1523 Value for each pixel is 65536 * <red-component> + 256 *
1524 <green-component> + <blue-component>.
1526 10.2.5 Method resizeDisplay(int _width, int _height)
1528 Resize the display to be of specified size.
1530 10.2.6 Method dirtyDisplayRegion(int x, int y, int w, int h)
1532 Mark the specified region as dirty.
1534 10.2.7 Method resetDirtyRegion()
1536 Resets the dirty region to be empty.
1538 10.3 Class org.jpc.emulator.PC method getVideoOutput()
1540 Get VGA output connector for PC.
1542 10.4 Interface org.jpc.emulator.DisplayController.
1544 Implementing this class signals that module is VGA controller.
1545 There can be only one such module active at time and presence of
1546 such module prevents loading builtin VGA controller emulation
1549 10.4.1 Method getOutputDevice()
1551 Get VGA output connector for this VGA device.
1553 10.5 Class org.jpc.emulator.SoundDigitalOut
1555 Class org.jpc.emulator.SoundDigitalOut provodes output connector
1556 for sound. Each connector can transfer stereo signal at arbitiary
1557 sampling rate. Modules that have audio connectors need to
1558 implement interface org.jpc.emulator.SoundOutputDevice, as this
1559 signals that output connectors should be created.
1561 10.5.1 Method addSample(long, short, short)
1563 Add stereo sample at time given by first argument. The second and
1564 third arguments give volume on left and right channels.
1566 10.5.2 Method addSample(long, short)
1568 Add mono sample at time given by first argument. The second
1569 argument give volume on both channels.
1571 10.5.3 Method readBlock(Block)
1573 Reads block of output (atomic versus addSample). Block structure
1574 has following fields which are filled:
1576 • timeBase: Time base for block.
1578 • baseLeft: Left volume at time base.
1580 • baseRight: Right volume at time base
1582 • blockNo: Sequence number of block filled.
1584 • samples: Number of samples in block
1586 • sampleTiming: Number of nanoseconds since last sample
1588 • sampleLeft: Left channel samples
1590 • sampleRight: Right channel samples
1592 10.6 Interface org.jpc.emulator.SoundOutputDevice
1594 Implementing this interface signals that module has audio output
1598 org.jpc.emulator.SoundOutputDevice.requestedSoundChannels()
1600 Return the number of sound channels module has.
1603 org.jpc.emulator.SoundOutputDevice.soundChannelCallback(SoundDigitalOut)
1605 This is called once per sound channel requested giving precreated
1608 10.7 Class org.jpc.emulator.PC method getSoundOut(String)
1610 Get sound output with specified name.
1612 11 Advanced: Writing event targets
1614 Whereas output connectors are the way output is dispatched, input
1615 is dispatched via event targets. Event targets need to implement
1616 interface org.jpc.emulator.EventDispatchTarget.
1618 Event targets also provode methods which then encode events and
1619 dispatch them forward (without doing anything else) to event
1620 recorder. Also, event targets may have methods for obtaining
1623 11.1 Interface org.jpc.emulator.EventDispatchTarget
1625 Interface that marks class capable of receiving events.
1627 11.1.1 Method setEventRecorder(EventRecorder)
1629 Set the event recorder input events are sent to.
1631 11.1.2 Method startEventCheck()
1633 Signals target to reset all state related to event checking and
1634 state feedback. This may be called at any time in order to
1635 reinitialialize event checking/feedback state.
1637 11.1.3 Method doEvent(long, String[], int) throws IOException
1639 Event dispatch handler. The first argument is event time, second
1640 is parameters and third is what to do with it. If target doesn't
1641 like the event, throw IOException. Following types (the integer
1642 parameter) are used:
1644 0 (EventRecorder.EVENT_TIMED): Time has been assigned for event.
1646 1 (EventRecorder.EVENT_STATE_EFFECT_FUTURE): Future event in
1647 event replay for reinitialization
1649 2 (EventRecorder.EVENT_STATE_EFFECT): Past event in event replay
1652 3 (EventRecorder.EVENT_EXECUTE): This event occurs now. Execute
1655 11.1.4 Method endEventCheock()
1657 End event reinitialization. Usually unused.
1659 11.1.5 Method getEventTimeLowBound(long, String[]) throws
1662 Return the time value that's the earliest possiblity for this
1663 event to occur. Returning any time in past (including -1) causes
1664 event to fire as soon as possible. The long parameter gives the
1665 current scheduled time for event.
1669 Modules are various extensions that run inside emulator core. As
1670 such, they affect sync. Modules must implement interface
1671 org.jpc.emulator.HardwareComponent (they are hardware components)
1672 and must be dumpable. Additionally, they need either constructor
1673 <init>() or <init>(String). The first is if no parameters are
1674 passed, the second is for case where parameters are passed.
1676 Aside of the constructors, modules need to obey the ordinary
1677 conventions for hardware components. No code outside modules
1678 needs to know that module exists.
1682 Plugins handle various UI tasks. They need to implement interface
1685 13.1 Interface org.jpc.pluginsbase.Plugin
1687 13.1.1 Method systemShutdown()
1689 Called when emulator shuts down. Either called in dedicated
1690 thread or in thread that called emulatorShutdown(). These
1691 handlers should do the bare minimum to get files on disk to
1692 consistent state. After these calls from all plugins have
1693 finished, emulator exits. Do not try to manipulate UI from these
1694 methods, as doing that easily leads into deadlock.
1696 13.1.2 Method reconnect(PC)
1698 Gives new PC to connect to. Null is passed if plugin should
1701 13.1.3 Method main()
1703 Called in dedicated thread after plugin is initialized.
1705 13.1.4 Method pcStopping()
1707 Called after PC has stopped.
1709 13.1.5 Method pcStarting()
1711 Called before PC starts.
1713 13.1.6 Method notifyArguments(String[])
1715 Pass arguments from command line.
1717 13.1.7 Constructor <init>(Plugins)
1719 This constructor is used to initialize plugins that don't take
1722 13.1.8 Constructor <init>(Plugins, String)
1724 This constructor is used to initialize plugins that take
1727 13.2 Class org.jpc.pluginsbase.Plugins
1729 This class provodes various methods for manipulating plugins.
1731 13.2.1 Method isShuttingDown()
1733 Returns true if Plugins.shutdownEmulator() has been called
1734 somehow, either via VM exit, CTRL+C or explicitly. Useful to skip
1735 cleanups involving GUI, as these are too deadlock-prone.
1737 13.2.2 Method shutdownEmulator()
1739 Shut down and exit the emulator. All plugin shutdown functions
1740 are called in this thread.
1742 13.2.3 Method reconnectPC(PC)
1744 Signal reconnectPC event to all plugins.
1746 13.2.4 Method pcStarted()
1748 Signal pcStarting() event to all plugins.
1750 13.2.5 Method pcStopped()
1752 Signal pcStopping() event to all plugins.
1754 14 Inter-plugin communication
1756 14.1 Receiving communications
1758 To receive invocation/call by name 'foo-bar', declare public
1759 method named 'eci_foo_bar'. Arguments to this method can
1760 currently be String, Integer (int) or Long (long). Last argument
1761 may be array over these types to get variable number of
1762 arguments. On call, each argument gets value from call. If last
1763 argument is array, it gets all overflowing arguments. If return
1764 type is void or method returns boolean false, call is assumed to
1765 have completed. If return value is boolean true, it is assumed
1766 that there is more processing.
1769 org.jpc.pluginsbase.Plugins.invokeExternalCommand(String cmd,
1772 Invoke command asynchronously, broadcasting to all plugins. Does
1773 not wait for slow commands to complete. cmd is the name to send
1774 and args are the arguments to pass.
1777 org.jpc.pluginsbase.Plugins.invokeExternalCommandSynchronous(String
1780 Same as invokeExternalCommand, but waits for slow commands to
1784 org.jpc.pluginsbase.Plugins.invokeExternalCommandReturn(String
1787 Similar to invokeExternalCommandSynchornous, but:
1789 • Quits calling more plugins when it gets successful reply.
1791 • Returns said reply
1793 14.5 void org.jpc.pluginsbase.Plugins.returnValue(Object... ret)
1795 Gives return value to return from call and signals that command
1798 14.6 void org.jpc.pluginsbase.Plugins.signalCommandCompletion()
1800 Signals that command has completed. Only needed if there is no
1801 return value and eci_ method returned false (not done yet).
1803 15 Lua kernel programming
1805 At startup, kernel gets its arguments in 'args' table and the
1806 script name to run in 'scriptname' string. It should enter the
1807 named script in protected mode.
1809 The Lua VM exports numerious callbacks to kernel. The kernel can
1810 then choose to omit, wrap or re-export these to Lua scripts.
1812 • Always grab any functions used into local variables so nobody
1815 • Don't use global variables in kernel (except for those passed).