Subversion Repositories Kolibri OS

Compare Revisions

No changes between revisions

Regard whitespace Rev 1813 → Rev 1814

/programs/emulator/DosBox/dosbox
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/DosBox/dosbox.conf
0,0 → 1,233
# This is the configurationfile for DOSBox 0.73.
# Lines starting with a # are commentlines.
# They are used to (briefly) document the effect of each option.
 
[sdl]
# fullscreen: Start dosbox directly in fullscreen.
# fulldouble: Use double buffering in fullscreen.
# fullresolution: What resolution to use for fullscreen: original or fixed size (e.g. 1024x768).
# windowresolution: Scale the window to this size IF the output device supports hardware scaling.
# output: What video system to use for output.
# Possible values: surface, overlay, opengl, openglnb, ddraw.
# autolock: Mouse will automatically lock, if you click on the screen.
# sensitivity: Mouse sensitivity.
# waitonerror: Wait before closing the console if dosbox has an error.
# priority: Priority levels for dosbox. Second entry behind the comma is for when dosbox is not focused/minimized. (pause is only valid for the second entry)
# Possible values: lowest, lower, normal, higher, highest, pause.
# mapperfile: File used to load/save the key/event mappings from.
# usescancodes: Avoid usage of symkeys, might not work on all operating systems.
 
fullscreen=false
fulldouble=false
fullresolution=original
windowresolution=original
output=surface
autolock=true
sensitivity=100
waitonerror=true
priority=higher,normal
mapperfile=mapper.txt
usescancodes=true
 
[dosbox]
# language: Select another language file.
# machine: The type of machine tries to emulate.
# Possible values: hercules, cga, tandy, pcjr, ega, vgaonly, svga_s3, svga_et3000, svga_et4000, svga_paradise, vesa_nolfb, vesa_oldvbe.
# captures: Directory where things like wave, midi, screenshot get captured.
# memsize: Amount of memory DOSBox has in megabytes.
# This value is best left at its default to avoid problems with some games,
# though few games might require a higher value.
# There is generally no speed advantage when raising this value.
 
language=
machine=svga_s3
captures=capture
memsize=16
 
[render]
# frameskip: How many frames DOSBox skips before drawing one.
# aspect: Do aspect correction, if your output method doesn't support scaling this can slow things down!.
# scaler: Scaler used to enlarge/enhance low resolution modes. If 'forced' is appended,the scaler will be used even if the result might not be desired.
# Possible values: none, normal2x, normal3x, advmame2x, advmame3x, advinterp2x, advinterp3x, hq2x, hq3x, 2xsai, super2xsai, supereagle, tv2x, tv3x, rgb2x, rgb3x, scan2x, scan3x.
 
frameskip=0
aspect=false
scaler=normal2x
 
[cpu]
# core: CPU Core used in emulation. auto will switch to dynamic if available and appropriate.
# Possible values: auto, dynamic, normal, simple.
# cputype: CPU Type used in emulation. auto is the fastest choice.
# Possible values: auto, 386, 386_slow, 486_slow, pentium_slow, 386_prefetch.
# cycles: Amount of instructions DOSBox tries to emulate each millisecond. Setting this value too high results in sound dropouts and lags. Cycles can be set in 3 ways:
# 'auto' tries to guess what a game needs.
# It usually works, but can fail for certain games.
# 'fixed #number' will set a fixed amount of cycles. This is what you usually need if 'auto' fails.
# (Example: fixed 4000)
# 'max' will allocate as much cycles as your computer is able to handle
#
# Possible values: auto, fixed, max.
# cycleup: Amount of cycles to increase/decrease with keycombo.
# cycledown: Setting it lower than 100 will be a percentage.
 
core=auto
cputype=auto
cycles=auto
cycleup=500
cycledown=20
 
[mixer]
# nosound: Enable silent mode, sound is still emulated though.
# rate: Mixer sample rate, setting any device's rate higher than this will probably lower their sound quality.
# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716.
# blocksize: Mixer block size, larger blocks might help sound stuttering but sound will also be more lagged.
# Possible values: 2048, 4096, 8192, 1024, 512, 256.
# prebuffer: How many milliseconds of data to keep on top of the blocksize.
 
nosound=false
rate=22050
blocksize=2048
prebuffer=10
 
[midi]
# mpu401: Type of MPU-401 to emulate.
# Possible values: intelligent, uart, none.
# mididevice: Device that will receive the MIDI data from MPU-401.
# Possible values: default, win32, alsa, oss, coreaudio, coremidi, none.
# midiconfig: Special configuration options for the device driver. This is usually the id of the device you want to use. See README for details.
 
mpu401=intelligent
mididevice=default
midiconfig=
 
[sblaster]
# sbtype: Type of sblaster to emulate.
# Possible values: sb1, sb2, sbpro1, sbpro2, sb16, none.
# sbbase: The IO address of the soundblaster.
# Possible values: 220, 240, 260, 280, 2a0, 2c0, 2e0, 300.
# irq: The IRQ number of the soundblaster.
# Possible values: 7, 5, 3, 9, 10, 11, 12.
# dma: The DMA number of the soundblaster.
# Possible values: 1, 5, 0, 3, 6, 7.
# hdma: The High DMA number of the soundblaster.
# Possible values: 1, 5, 0, 3, 6, 7.
# sbmixer: Allow the soundblaster mixer to modify the DOSBox mixer.
# oplmode: Type of OPL emulation. On 'auto' the mode is determined by sblaster type. All OPL modes are Adlib-compatible, except for 'cms'.
# Possible values: auto, cms, opl2, dualopl2, opl3, none.
# oplemu: Provider for the OPL emulation. compat or old might provide better quality (see oplrate as well).
# Possible values: default, compat, fast, old.
# oplrate: Sample rate of OPL music emulation. Use 49716 for highest quality (set the mixer rate accordingly).
# Possible values: 22050, 49716, 44100, 48000, 32000, 16000, 11025, 8000.
 
sbtype=sb16
sbbase=220
irq=7
dma=1
hdma=5
sbmixer=true
oplmode=auto
oplemu=default
oplrate=22050
 
[gus]
# gus: Enable the Gravis Ultrasound emulation.
# gusrate: Sample rate of Ultrasound emulation.
# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716.
# gusbase: The IO base address of the Gravis Ultrasound.
# Possible values: 240, 220, 260, 280, 2a0, 2c0, 2e0, 300.
# gusirq: The IRQ number of the Gravis Ultrasound.
# Possible values: 5, 3, 7, 9, 10, 11, 12.
# gusdma: The DMA channel of the Gravis Ultrasound.
# Possible values: 3, 0, 1, 5, 6, 7.
# ultradir: Path to Ultrasound directory. In this directory
# there should be a MIDI directory that contains
# the patch files for GUS playback. Patch sets used
# with Timidity should work fine.
 
gus=false
gusrate=22050
gusbase=240
gusirq=5
gusdma=3
ultradir=C:\ULTRASND
 
[speaker]
# pcspeaker: Enable PC-Speaker emulation.
# pcrate: Sample rate of the PC-Speaker sound generation.
# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716.
# tandy: Enable Tandy Sound System emulation. For 'auto', emulation is present only if machine is set to 'tandy'.
# Possible values: auto, on, off.
# tandyrate: Sample rate of the Tandy 3-Voice generation.
# Possible values: 22050, 44100, 48000, 32000, 16000, 11025, 8000, 49716.
# disney: Enable Disney Sound Source emulation. (Covox Voice Master and Speech Thing compatible).
 
pcspeaker=true
pcrate=22050
tandy=auto
tandyrate=22050
disney=true
 
[joystick]
# joysticktype: Type of joystick to emulate: auto (default), none,
# 2axis (supports two joysticks),
# 4axis (supports one joystick, first joystick used),
# 4axis_2 (supports one joystick, second joystick used),
# fcs (Thrustmaster), ch (CH Flightstick).
# none disables joystick emulation.
# auto chooses emulation depending on real joystick(s).
# Possible values: auto, 2axis, 4axis, 4axis_2, fcs, ch, none.
# timed: enable timed intervals for axis. (false is old style behaviour).
# autofire: continuously fires as long as you keep the button pressed.
# swap34: swap the 3rd and the 4th axis. can be useful for certain joysticks.
# buttonwrap: enable button wrapping at the number of emulated buttons.
 
joysticktype=auto
timed=true
autofire=false
swap34=false
buttonwrap=true
 
[serial]
# serial1: set type of device connected to com port.
# Can be disabled, dummy, modem, nullmodem, directserial.
# Additional parameters must be in the same line in the form of
# parameter:value. Parameter for all types is irq.
# for directserial: realport (required), rxdelay (optional).
# (realport:COM1 realport:ttyS0).
# for modem: listenport (optional).
# for nullmodem: server, rxdelay, txdelay, telnet, usedtr,
# transparent, port, inhsocket (all optional).
# Example: serial1=modem listenport:5000
# Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial2: see serial1
# Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial3: see serial1
# Possible values: dummy, disabled, modem, nullmodem, directserial.
# serial4: see serial1
# Possible values: dummy, disabled, modem, nullmodem, directserial.
 
serial1=dummy
serial2=dummy
serial3=disabled
serial4=disabled
 
[dos]
# xms: Enable XMS support.
# ems: Enable EMS support.
# umb: Enable UMB support.
# keyboardlayout: Language code of the keyboard layout (or none).
 
xms=true
ems=true
umb=true
keyboardlayout=auto
 
[ipx]
# ipx: Enable ipx over UDP/IP emulation.
 
ipx=false
 
[autoexec]
# Lines in this section will be run at startup.
keyb ru 866
 
/programs/emulator/DosBox/readme.txt
0,0 → 1,1469
DOSBox v0.74 Manual (always use the latest version from www.dosbox.com)
 
 
 
=====
NOTE:
=====
 
While we are hoping that one day DOSBox will run all programs ever made for
the PC, we are not there yet.
At present, DOSBox running on a high-end machine will roughly be the equivalent
of a Pentium I PC. DOSBox can be configured to run a wide range of DOS games,
from CGA/Tandy/PCjr classics up to games from the Quake era.
 
 
 
======
INDEX:
======
 
1. Quickstart
2. Start (FAQ)
3. Command Line Parameters
4. Internal Programs
5. Special Keys
6. Joystick/Gamepad
7. KeyMapper
8. Keyboard Layout
9. Serial Multiplayer feature
10. How to speed up/slow down DOSBox
11. Troubleshooting
12. DOSBox Status Window
13. The configuration (options) file
14. The language file
15. Building your own version of DOSBox
16. Special thanks
17. Contact
 
 
 
==============
1. Quickstart:
==============
 
Type INTRO in DOSBox for a quick tour.
It is essential that you get familiar with the idea of mounting, DOSBox does not
automatically make any drive (or a part of it) accessible to the emulation. See
the FAQ entry "How to start?" as well as the description of the MOUNT command
(section 4: "Internal Programs"). If you have your game on a cdrom you may try
this guide: http://vogons.zetafleet.com/viewtopic.php?t=8933
 
 
 
===============
2. Start (FAQ):
===============
 
START: How to start?
AUTOMATION: Do I always have to type these "mount" commands?
FULLSCREEN: How do I change to fullscreen?
CD-ROM: My CD-ROM doesn't work.
CD-ROM: The game/application can't find its CD-ROM.
MOUSE: The mouse doesn't work.
SOUND: There is no sound.
SOUND: What sound hardware does DOSBox presently emulate?
SOUND: The sound stutters or sounds stretched/weird.
KEYBOARD: I can't type \ or : in DOSBox.
KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only)
KEYBOARD: The keyboard lags.
CONTROL: The character/cursor/mouse pointer always moves into one direction!
SPEED: The game/application runs much too slow/too fast!
CRASH: The game/application does not run at all/crashes!
CRASH: DOSBox crashes on startup!
GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems.
SAFETY: Can DOSBox harm my computer?
OPTIONS: I would like to change DOSBox's options.
HELP: Great Manual, but I still don't get it.
 
 
 
START: How to start?
At the beginning you've got a Z:\> instead of a C:\> at the prompt.
You have to make your directories available as drives in DOSBox by using
the "mount" command. For example, in Windows "mount C D:\GAMES" will give
you a C drive in DOSBox which points to your Windows D:\GAMES directory
(that was created before). In Linux, "mount c /home/username" will give you
a C drive in DOSBox which points to /home/username in Linux.
To change to the drive mounted like above, type "C:". If everything went
fine, DOSBox will display the prompt "C:\>".
 
 
AUTOMATION: Do I always have to type these commands?
In the DOSBox configuration file is an [autoexec] section. The commands
present there are run when DOSBox starts, so you can use this section
for the mounting. Look at Section 13: The configuration (options) file
 
 
FULLSCREEN: How do I change to fullscreen?
Press alt-enter. Alternatively: Edit the configuration file of DOSBox and
change the option fullscreen=false to fullscreen=true. If fullscreen looks
wrong in your opinion: Play with the options: fullresolution, output and
aspect in the configuration file of DOSBox. To get back from fullscreen
mode: Press alt-enter again.
 
 
CD-ROM: My CD-ROM doesn't work.
To mount your CD-ROM in DOSBox you have to specify some additional options
when mounting the CD-ROM.
To enable CD-ROM support (includes MSCDEX) in Windows:
- mount d f:\ -t cdrom
in Linux:
- mount d /media/cdrom -t cdrom
 
In some cases you might want to use a different CD-ROM interface,
for example if CD audio does not work:
To enable SDL-support (does not include low-level CD access!):
- mount d f:\ -t cdrom -usecd 0 -noioctl
To enable ioctl access using digital audio extraction for CD audio
(windows-only, useful for Vista):
- mount d f:\ -t cdrom -ioctl_dx
To enable ioctl access using MCI for CD audio (windows-only):
- mount d f:\ -t cdrom -ioctl_mci
To force ioctl-only access (windows-only):
- mount d f:\ -t cdrom -ioctl_dio
To enable low-level aspi-support (win98 with aspi-layer installed):
- mount d f:\ -t cdrom -aspi
 
explanation: - d driveletter you will get in DOSBox (d is the best,
don't change it!)
- f:\ location of CD-ROM on your PC. In most cases it will
be d:\ or e:\
- 0 The number of the CD-ROM drive, reported by "mount -cd"
(note that this value is only needed when using SDL
for CD audio, otherwise it is ignored)
See also the next question: The game/application can't find its CD-ROM.
 
 
CD-ROM: The game/application can't find its CD-ROM.
Be sure to mount the CD-ROM with -t cdrom switch, this will enable the
MSCDEX interface required by DOS games to interface with CD-ROMs.
Also try adding the correct label (-label LABEL) to the mount command,
where LABEL is the CD-label (volume ID) of the CD-ROM.
Under Windows you can specify -ioctl, -aspi or -noioctl. Look at the
description of the mount command in Section 4: "Internal programs"
for their meaning and the
additional audio-CD related options -ioctl_dx, ioctl_mci, ioctl_dio.
 
Try creating a CD-ROM image (preferably CUE/BIN pair) and use the
DOSBox's internal IMGMOUNT tool to mount the image (the CUE sheet).
This enables very good low-level CD-ROM support on any operating system.
 
 
MOUSE: The mouse doesn't work.
Usually, DOSBox detects when a game uses mouse control. When you click on
the screen it should get locked (confined to the DOSBox window) and work.
With certain games, the DOSBox mouse detection doesn't work. In that case
you will have to lock the mouse manually by pressing CTRL-F10.
 
 
SOUND: There is no sound.
Be sure that the sound is correctly configured in the game. This might be
done during the installation or with a setup/setsound utility that
accompanies the game. First see if an autodetection option is provided. If
there is none try selecting Soundblaster or Soundblaster 16 with the default
settings being "address=220 irq=7 dma=1" (sometimes highdma=5). You might
also want to select Sound Canvas/SCC/MPU-401/General MIDI/Wave Blaster
at "address=330 IRQ=2" as music device.
The parameters of the emulated sound cards can be changed in the DOSBox
configuration file.
If you still don't get any sound set the core to normal in DOSBox
configuration and use some lower fixed cycles value (like cycles=2000). Also
assure that your host operating sound does provide sound.
In certain cases it might be useful to use a different emulated sound device
like a soundblaster pro (sbtype=sbpro1 in the DOSBox configuration file) or
the gravis ultrasound (gus=true).
 
 
SOUND: What sound hardware does DOSBox presently emulate?
DOSBox emulates several legacy sound devices:
- Internal PC speaker/Buzzer
This emulation includes both the tone generator and several forms of
digital sound output through the internal speaker.
- Creative CMS/Gameblaster
The is the first card released by Creative Labs(R). The default
configuration places it on address 220. It is disabled as default.
- Tandy 3 voice
The emulation of this sound hardware is complete with the exception of
the noise channel. The noise channel is not very well documented and as
such is only a best guess as to the sound's accuracy. It is disabled as
default.
- Tandy DAC
Some games may require turning off sound blaster emulation (sbtype=none)
for better tandy DAC sound support. Don't forget to set the sbtype back to
sb16 if you don't use tandy sound.
- Adlib
This emulation is almost perfect and includes the Adlib's ability to
almost play digitized sound. Placed at address 220 (also on 388).
- SoundBlaster 16 / SoundBlaster Pro I & II / SoundBlaster I & II
By default DOSBox provides Soundblaster 16 level 16-bit stereo sound.
You can select a different SoundBlaster version in the configuration of
DOSBox. AWE32 music is not emulated as you can use MPU-401 instead
(see below).
- Disney Sound Source and Covox Speech Thing
Using the printer port, this sound device outputs digital sound only.
Placed at LPT1
- Gravis Ultrasound
The emulation of this hardware is nearly complete, though the MIDI
capabilities have been left out, since an MPU-401 has been emulated
in other code. For Gravis music you also have to install Gravis drivers
inside DOSBox. It is disabled as default.
- MPU-401
A MIDI passthrough interface is also emulated. This method of sound
output will only work when used with external device/emulator.
Every Windows XP/Vista/7 and MAC OS has got a default emulator compatible
with: Sound Canvas/SCC/General Standard/General MIDI/Wave Blaster.
A different device/emulator is needed for Roland LAPC/CM-32L/MT-32
compatibility.
 
 
SOUND: The sound stutters or sounds stretched/weird.
You may be using too much CPU power to keep DOSBox running at the current
speed. You can lower the cycles, skip frames, reduce the sampling rate of
the respective sound device, increase the prebuffer. See section 13: "The
configuration (options) file"
If you are using cycles=max or =auto, then make sure that there is no
background processes interfering! (especially if they access the harddisk)
Also look at Section 10. "How to speed up/slow down DOSBox"
 
 
KEYBOARD: I can't type \ or : in DOSBox.
This can happen in various cases, like your host keyboard layout does not
have a matching DOS layout representation (or it was not correctly
detected), or the key mapping is wrong.
Some possible fixes:
1. Use / instead, or ALT-58 for : and ALT-92 for \.
2. Change the DOS keyboard layout (see Section 8: Keyboard Layout).
3. Add the commands you want to execute to the [autoexec] section
of the DOSBox configuration file.
4. Open the DOSBox configuration file and change the usescancodes entry.
5. Switch the keyboard layout of your operating system.
 
Note that if the host layout can not be identified, or keyboardlayout is
set to none in the DOSBox configuration file, the standard US layout is
used. In this configuration try the keys around "enter" for the key \
(backslash), and for the key : (colon) use shift and the keys between
"enter" and "L".
 
 
KEYBOARD: Right Shift and "\" doesn't work in DOSBox. (Windows only)
This may happen if Windows thinks that you have more than one keyboard
connected to your PC when you use some remote control devices.
To verity this problem run cmd.exe, navigate to DOSBox program folder
and type:
set sdl_videodriver=windib
dosbox.exe
check whether keyboard started to work properly. As windib is slower it is
best to use one of the two solutions provided here:
http://vogons.zetafleet.com/viewtopic.php?t=24072
 
 
KEYBOARD: The keyboard lags.
Lower the priority setting in the DOSBox configuration file, for example
set "priority=normal,normal". You might also want to try lowering the
cycles (use a fixed cycle amount to start with, like cycles=10000).
 
 
CONTROL: The character/cursor/mouse pointer always moves into one direction!
See if it still happens if you disable the joystick emulation,
set joysticktype=none in the [joystick] section of your DOSBox
configuration file. Maybe also try unplugging any joystick/gamepad.
If you want to use the joystick in the game, try setting timed=false
and be sure to calibrate the joystick (both in your OS as well as
in the game or the game's setup program).
 
 
SPEED: The game/application runs much too slow/too fast!
Look at the section 10: "How to speed up/slow down DOSBox" for more
information.
 
 
CRASH: The game/application does not run at all/crashes!
Look at Section 11: Troubleshooting
 
 
CRASH: DOSBox crashes on startup!.
Look at Section 11: Troubleshooting
 
 
GAME: My Build game(Duke3D/Blood/Shadow Warrior) has problems.
First of all, try to find a port of the game. Those will offer a better
experience. To fix the graphics problem that occurs in DOSBox on higher
resolutions: Open the configuration file of DOSBox and search for
machine=svga_s3. Change svga_s3 to vesa_nolfb
Change memsize=16 to memsize=63
 
 
SAFETY: Can DOSBox harm my computer?
DOSBox can not harm your computer more than any other resource demanding
program. Increasing the cycles does not overclock your real CPU.
Setting the cycles too high has a negative performance effect on the
software running inside DOSBox.
 
 
OPTIONS: I would like to change DOSBox's options.
Look at Section 13. "The configuration (options) file"
 
 
HELP: Great Manual, but I still don't get it.
For more questions read the rest of this Manual. You may also look at:
guides located at http://vogons.zetafleet.com/viewforum.php?f=39
the wiki of DOSBox http://www.dosbox.com/wiki/
the site/forum: http://www.dosbox.com
 
 
 
===========================
3. Command Line Parameters:
===========================
 
An overview of the command line options you can give to DOSBox. Although
in most cases it is easier to use DOSBox's configuration file instead.
See: Section 13. "The configuration (options) file"
 
To be able to use Command Line Parameters:
(Windows) open cmd.exe or command.com or edit the shortcut to dosbox.exe
(Linux) use console
(MAC OS X) start terminal.app and navigate to:
/applications/dosbox.app/contents/macos/dosbox
 
The options are valid for all operating systems unless noted in the option
description:
 
dosbox [name] [-exit] [-c command] [-fullscreen] [-userconf]
[-conf congfigfilelocation] [-lang languagefilelocation]
[-machine machine type] [-noconsole] [-startmapper] [-noautoexec]
[-securemode] [-scaler scaler | -forcescaler scaler] [-version]
[-socket socket]
dosbox -version
dosbox -editconf program
dosbox -opencaptures program
dosbox -printconf
dosbox -eraseconf
dosbox -erasemapper
 
name
If "name" is a directory it will mount that as the C: drive.
If "name" is an executable it will mount the directory of "name"
as the C: drive and execute "name".
 
-exit
DOSBox will close itself when the DOS application "name" ends.
 
-c command
Runs the specified command before running "name". Multiple commands
can be specified. Each command should start with "-c" though.
A command can be: an Internal Program, a DOS command or an executable
on a mounted drive.
 
-fullscreen
Starts DOSBox in fullscreen mode.
 
-userconf
Start DOSBox with the users specific configuration file. Can be used
together with multiple -conf parameters, but -userconf will always be
loaded before them.
 
-conf configfilelocation
Start DOSBox with the options specified in "configfilelocation".
Multiple -conf options may be present.
See Section 13 for more details.
 
-lang languagefilelocation
Start DOSBox using the language specified in "languagefilelocation".
See Section 14 for more details.
 
-machine machinetype
Setup DOSBox to emulate a specific type of machine. Valid choices are:
hercules, cga, ega, pcjr, tandy, svga_s3 (default) as well as
the additional svga chipsets listed in the DOSBox configuration file.
svga_s3 enables vesa emulation as well.
For some special vga effects the machinetype vgaonly can be used,
note that this disables svga capabilities and might be slower due to the
higher emulation precision.
The machinetype affects the video card and the available sound cards.
 
-noconsole (Windows Only)
Start DOSBox without showing DOSBox Status Window (console).
Output will be redirected to stdout.txt and stderr.txt
 
-startmapper
Enter the keymapper directly on startup. Useful for people with
keyboard problems.
 
-noautoexec
Skips the [autoexec] section of the loaded configuration file.
 
-securemode
Same as -noautoexec, but adds config.com -securemode at the
bottom of AUTOEXEC.BAT (which in turn disables any changes to how
the drives are mounted inside DOSBox).
 
-scaler scaler
Uses the scaler specified by "scaler". See the DOSBox configuration file
for the available scalers.
 
-forcescaler scaler
Similar to the -scaler parameter, but tries to force usage of
the specified scaler even if it might not fit.
 
-version
output version information and exit. Useful for frontends.
 
-editconf program
calls program with as first parameter the configuration file.
You can specify this command more than once. In this case it will
move to second program if the first one fails to start.
 
-opencaptures program
calls program with as first parameter the location of the captures
folder.
 
-printconf
prints the location of the default configuration file.
 
-resetconf
removes the default configuration file.
 
-resetmapper
removes the mapperfile used by the default clean configuration file.
 
-socket
passes the socket number to the nullmodem emulation. See Section 9:
"Serial Multiplayer feature."
 
Note: If a name/command/configfilelocation/languagefilelocation contains
a space, put the whole name/command/configfilelocation/languagefilelocation
between quotes ("command or file name"). If you need to use quotes within
quotes (most likely with -c and mount):
Windows and OS/2 users can use single quotes inside the double quotes.
Other people should be able to use escaped double quotes inside the
double quotes.
Windows: -c "mount c 'c:\My folder with DOS games\'"
Linux: -c "mount c \"/tmp/name with space\""
 
A rather unusual example, just to demonstrate what you can do (Windows):
dosbox D:\folder\file.exe -c "MOUNT Y H:\MyFolder"
This mounts D:\folder as C:\ and runs file.exe.
Before it does that, it will first mount H:\MyFolder as the Y drive.
 
In Windows, you can also drag directories/files onto the DOSBox executable.
 
 
 
=====================
4. Internal Programs:
=====================
 
DOSBox supports most of the DOS commands found in command.com.
To get a list of the internal commands type "HELP" at the prompt.
 
In addition, the following commands are available:
 
MOUNT "Emulated Drive letter" "Real Drive or Directory"
[-t type] [-aspi] [-ioctl] [-noioctl] [-usecd number] [-size drivesize]
[-label drivelabel] [-freesize size_in_mb]
[-freesize size_in_kb (floppies)]
MOUNT -cd
MOUNT -u "Emulated Drive letter"
 
Program to mount local directories as drives inside DOSBox.
 
"Emulated Drive letter"
The driveletter inside DOSBox (for example C).
 
"Real Drive letter (usually for CD-ROMs in Windows) or Directory"
The local directory you want accessible inside DOSBox.
 
-t type
Type of the mounted directory.
Supported are: dir (default), floppy, cdrom.
 
-size drivesize
(experts only)
Sets the size of the drive, where drivesize is of the form
"bps,spc,tcl,fcl":
bps: bytes per sector, by default 512 for regular drives and
2048 for CD-ROM drives
spc: sectors per cluster, usually between 1 and 127
tcl: total clusters, between 1 and 65534
fcl: total free clusters, between 1 and tcl
 
-freesize size_in_mb | size_in_kb
Sets the amount of free space available on a drive
in megabytes (regular drives) or kilobytes (floppy drives).
This is a simpler version of -size.
 
-label drivelabel
Sets the name of the drive to "drivelabel". Needed on some systems
if the CD-ROM label isn't read correctly (useful when a program
can't find its CD-ROM). If you don't specify a label
and no lowlevel support is selected (that is omitting the -usecd #
and/or -aspi parameters, or specifying -noioctl):
For Windows: label is extracted from "Real Drive".
For Linux: label is set to NO_LABEL.
 
If you do specify a label, this label will be kept as long as the drive
is mounted. It will not be updated !!
 
-aspi
Forces use of the aspi layer. Only valid if mounting a CD-ROM under
Windows systems with an ASPI-Layer.
 
-ioctl (automatic selection of the CD audio interface)
-ioctl_dx (digital audio extraction used for CD audio)
-ioctl_dio (ioctl calls used for CD audio)
-ioctl_mci (MCI used for CD audio)
Forces use of ioctl commands. Only valid if mounting a CD-ROM under
a Windows OS which support them (Win2000/XP/NT).
The various choices only differ in the way CD audio is handled,
preferably -ioctl_dio is used (lowest workload), but this might not
work on all systems, so -ioctl_dx (or -ioctl_mci) can be used.
 
-noioctl
Forces use of the SDL CD-ROM layer. Valid on all systems.
 
-usecd number
Valid on all systems, under windows the -noioctl switch has to be
present to make use of the -usecd switch.
Enables to select the drive that should be used by SDL. Use this if
the wrong or no CD-ROM drive is mounted while using the SDL CD-ROM
interface. "number" can be found by "MOUNT -cd".
 
-cd
Displays all CD-ROM drives detected by SDL, and their numbers.
See the information at the -usecd entry above.
 
-u
Removes the mount. Doesn't work for Z:\.
 
Note: It's possible to mount a local directory as CD-ROM drive,
but hardware support is then missing.
 
Basically MOUNT allows you to connect real hardware to DOSBox's emulated PC.
So MOUNT C C:\GAMES tells DOSBox to use your C:\GAMES directory as drive C:
in DOSBox. MOUNT C E:\SomeFolder tells DOSBox to use your E:\SomeFolder
directory as drive C: in DOSBox.
 
Mounting your entire C drive with MOUNT C C:\ is NOT recommended! The same
is true for mounting the root of any other drive, except for CD-ROMs (due to
their read-only nature).
Otherwise if you or DOSBox make a mistake you may lose all your files.
Also never mount a "Windows" or "Program Files" folders or their subfolders
in Windows Vista/7 as DOSBox may not work correctly, or will stop working
correctly later. It is recommended to keep all your dos applications/games
in a simple folder (for example c:\dosgames) and mount that.
 
You should always install your game inside DOSBox.
So if you have the game on CD you always (even after installation!)
have to mount both: folder as a harddisk drive and a CD-ROM.
HardDisk should always be mounted as c
CD-ROM should always be mounted as d
Floppy should always be mounted as a (or b)
 
Basic MOUNT Examples for normal usage (Windows):
 
1. To mount a folder as a harddisk drive:
mount c d:\dosgames
 
3. To mount your CD-ROM drive E as CD-ROM drive D in DOSBox:
mount d e:\ -t cdrom
 
2. To mount your drive a: as a floppy:
mount a a:\ -t floppy
 
Advanced MOUNT examples (Windows):
 
4. To mount a hard disk drive with ~870 mb free diskspace (simple version):
mount c d:\dosgames -freesize 870
 
5. To mount a drive with ~870 mb free diskspace (experts only, full control):
mount c d:\dosgames -size 512,127,16513,13500
 
1. To mount c:\dosgames\floppy as a floppy:
mount a c:\dosgames\floppy -t floppy
 
 
Other MOUNT examples:
 
3. To mount system CD-ROM drive at mountpoint /media/cdrom as CD-ROM drive D
in DOSBox:
mount d /media/cdrom -t cdrom -usecd 0
 
6. To mount /home/user/dosgames as drive C in DOSBox:
mount c /home/user/dosgames
 
7. To mount the directory where DOSBox was started as C in DOSBox:
mount c .
(note the . which represents the directory where DOSBox was started,
on Windows Vista/7 don't use this if you installed DOSBox
to your "Program Files" folder)
 
If you want to mount a CD image or floppy image, check IMGMOUNT.
MOUNT also works with images but only if you use external program,
for example (both are free):
- Daemon Tools Lite (for CD images),
- Virtual Floppy Drive (for floppy images).
Although IMGMOUNT can give better compatibility.
 
 
MEM
Program to display the amount and type of free memory.
 
 
VER
VER set major_version [minor_version]
Display the current DOSBox version and reported DOS version
(parameterless usage).
Change the reported DOS version with the "set" parameter,
for example: "VER set 6 22" to have DOSBox report DOS 6.22 as version number.
 
 
CONFIG -writeconf filelocation
CONFIG -writelang filelocation
CONFIG -securemode
CONFIG -set "section property=value"
CONFIG -get "section property"
 
CONFIG can be used to change or query various settings of DOSBox
during runtime. It can save the current settings and language strings to
disk. Information about all possible sections and properties can
be found in Section 13: "The configuration (options) file".
 
-writeconf filelocation
Write the current configuration settings to a file in a specified location.
"filelocation" is located on the local drive, not a mounted drive in DOSBox.
The configuration file controls various settings of DOSBox:
the amount of emulated memory, the emulated sound cards and many more
things. It allows access to AUTOEXEC.BAT as well.
See Section 13: "The configuration (options) file" for more information.
 
-writelang filelocation
Write the current language settings to a file in a specified location.
"filelocation" is located on the local drive, not a mounted drive
in DOSBox. The language file controls all visible output of the internal
commands and the internal DOS.
See Section 14: "The Language File" for more information.
 
-securemode
Switches DOSBox to a more secure mode. In this mode the internal
commands MOUNT, IMGMOUNT and BOOT won't work. It's not possible either
to create a new configfile or languagefile in this mode.
(Warning: you can only undo this mode by restarting DOSBox.)
 
-set "section property=value"
CONFIG will attempt to set the property to new value.
Currently CONFIG can not report whether the command succeeded or not.
 
-get "section property"
The current value of the property is reported and stored in the
environment variable %CONFIG%. This can be used to store the value
when using batch files.
 
Both "-set" and "-get" work from batch files and can be used to set up your
own preferences for each game. Although it may be easier to use separate
DOSBox's configuration files for each game instead.
 
Examples:
1. To create a configuration file in your c:\dosgames directory:
config -writeconf c:\dosgames\dosbox.conf
2. To set the cpu cycles to 10000:
config -set "cpu cycles=10000"
3. To turn ems memory emulation off:
config -set "dos ems=off"
4. To check which cpu core is being used.
config -get "cpu core"
 
 
LOADFIX [-size] [program] [program-parameters]
LOADFIX -f
Program to reduce the amount of available conventional memory.
Useful for old programs which don't expect much memory to be free.
 
-size
number of kilobytes to "eat up", default = 64kb
 
-f
frees all previously allocated memory
 
Examples:
1. To start mm2.exe and allocate 64kb memory
(mm2 will have 64 kb less available):
loadfix mm2
2. To start mm2.exe and allocate 32kb memory:
loadfix -32 mm2
3. To free previous allocated memory:
loadfix -f
 
 
RESCAN
Make DOSBox reread the directory structure. Useful if you changed something
on a mounted drive outside of DOSBox. (CTRL - F4 does this as well!)
 
 
MIXER
Makes DOSBox display its current volume settings.
Here's how you can change them:
 
mixer channel left:right [/NOSHOW] [/LISTMIDI]
 
channel
Can be one of the following: MASTER, DISNEY, SPKR, GUS, SB, FM [, CDAUDIO].
CDAUDIO is only available if a CD-ROM interface with volume control is
enabled (CD image, ioctl_dx).
 
left:right
The volume levels in percentages. If you put a D in front it will be
in decibel (Example: mixer gus d-10).
 
/NOSHOW
Prevents DOSBox from showing the result if you set one
of the volume levels.
 
/LISTMIDI
In Windows lists the available midi devices on your PC. To select a device
other than the Windows default midi-mapper, change the line 'midiconfig='
in the [midi] section of the configuration file to 'midiconfig=id', where
'id' is the number for the device as listed by LISTMIDI. eg. midiconfig=2
 
In Linux this option doesn't work, but you get similar results by using
'pmidi -l' in console. Then change the line 'midiconfig=' to
'midiconfig=port', where 'port' is the port for the device as listed by
'pmidi -l'. eg. midiconfig=128:0
 
 
IMGMOUNT
A utility to mount disk images and CD-ROM images in DOSBox.
 
IMGMOUNT DRIVE [imagefile] -t [image_type] -fs [image_format]
-size [sectorsbytesize, sectorsperhead, heads, cylinders]
IMGMOUNT DRIVE [imagefile1 imagefile2 .. imagefileN] -t cdrom -fs iso
 
imagefile
Location of the image file to mount in DOSBox. The location can be
on a mounted drive inside DOSBox, or on your real disk. It is possible
to mount CD-ROM images (ISOs or CUE/BIN or CUE/IMG) too.
If you need CD swapping capabilities, specify all images in succession
(see the next entry).
CUE/BIN pairs and cue/img are the preferred CD-ROM image types as they can
store audio tracks compared to ISOs (which are data-only). For
the CUE/BIN mounting always specify the CUE sheet.
 
imagefile1 imagefile2 .. imagefileN
Location of the image files to mount in DOSBox. Specifying a number
of image files is only allowed for CD-ROM images.
The CD's can be swapped with CTRL-F4 at any time.
This is required for games which use multiple CD-ROMs and require the CD
to be switched during the gameplay at some point.
 
-t
The following are valid image types:
floppy: Specifies a floppy image. DOSBox will automatically identify
the disk geometry (360K, 1.2MB, 720K, 1.44MB, etc).
cdrom: Specifies a CD-ROM image. The geometry is automatic and
set for this size. This can be an iso or a cue/bin pair or
a cue/img pair.
hdd: Specifies a harddrive image. The proper CHS geometry must be set
for this to work.
 
-fs
The following are valid file system formats:
iso: Specifies the ISO 9660 CD-ROM format.
fat: Specifies that the image uses the FAT file system. DOSBox will
attempt to mount this image as a drive in DOSBox and make
the files available from inside DOSBox.
none: DOSBox will make no attempt to read the file system on the disk.
This is useful if you need to format it or if you want to boot
the disk using the BOOT command. When using the "none"
filesystem, you must specify the drive number (2 or 3,
where 2 = master, 3 = slave) rather than a drive letter.
For example, to mount a 70MB image as the slave drive device,
you would type (without the quotes):
"imgmount 3 d:\test.img -size 512,63,16,142 -fs none"
Compare this with a mount to be able to access the drive
within DOSBox, which would read as:
"imgmount e: d:\test.img -size 512,63,16,142"
 
-size
The Cylinders, Heads and Sectors of the drive.
Required to mount hard drive images.
 
An example how to mount CD-ROM images (in Linux):
1. imgmount d /tmp/cdimage1.cue /tmp/cdimage2.cue -t cdrom
or (which also works):
2a. mount c /tmp
2b. imgmount d c:\cdimage1.cue c:\cdimage2.cue -t cdrom
(in Windows):
imgmount d f:\img\CD1.cue f:\img\CD2.cue f:\img\CD3.cue -t cdrom
imgmount d "g:\img\7th Guest CD1.cue" "g:\img\7th Guest CD2.cue" -t cdrom
Don't forget that you can also use MOUNT with images, but only if you use
external program, for example (both are free):
- Daemon Tools Lite (for CD images),
- Virtual Floppy Drive (for floppy images).
Although IMGMOUNT can give better compatibility.
 
 
BOOT
Boot will start floppy images or hard disk images independent of
the operating system emulation offered by DOSBox. This will allow you to
play booter floppies or boot other operating systems inside DOSBox.
If the target emulated system is PCjr (machine=pcjr) the boot command
can be used to load PCjr cartridges (.jrc).
 
BOOT [diskimg1.img diskimg2.img .. diskimgN.img] [-l driveletter]
BOOT [cart.jrc] (PCjr only)
 
diskimg1.img diskimg2.img .. diskimgN.img
This can be any number of floppy disk images one wants mounted after
DOSBox boots the specified drive letter.
To swap between images, hit CTRL-F4 to change from the current disk
to the next disk in the list. The list will loop back from the last
disk image to the beginning.
 
[-l driveletter]
This parameter allows you to specify the drive to boot from.
The default is the A drive, the floppy drive. You can also boot
a hard drive image mounted as master by specifying "-l C"
without the quotes, or the drive as slave by specifying "-l D"
 
cart.jrc (PCjr only)
When emulation of a PCjr is enabled, cartridges can be loaded with
the BOOT command. Support is still limited.
 
 
IPX
 
You need to enable IPX networking in the configuration file of DOSBox.
 
All of the IPX networking is managed through the internal DOSBox program
IPXNET. For help on the IPX networking from inside DOSBox, type
"IPXNET HELP" (without quotes) and the program will list the commands
and relevant documentation.
 
With regard to actually setting up a network, one system needs to be
the server. To set this up, type "IPXNET STARTSERVER" (without the quotes)
in a DOSBox session. The server DOSBox session will automatically add
itself to the virtual IPX network. For every additional computer that
should be part of the virtual IPX network, you'll need to type
"IPXNET CONNECT <computer host name or IP>".
For example, if your server is at bob.dosbox.com, you would type
"IPXNET CONNECT bob.dosbox.com" on every non-server system.
 
To play games that need Netbios a file named NETBIOS.EXE from Novell is
needed. Establish the IPX connection as explained above, then run
"netbios.exe".
 
The following is an IPXNET command reference:
 
IPXNET CONNECT
 
IPXNET CONNECT opens a connection to an IPX tunneling server
running on another DOSBox session. The "address" parameter specifies
the IP address or host name of the server computer. You can also
specify the UDP port to use. By default IPXNET uses port 213 - the
assigned IANA port for IPX tunneling - for its connection.
 
The syntax for IPXNET CONNECT is:
IPXNET CONNECT address <port>
 
IPXNET DISCONNECT
 
IPXNET DISCONNECT closes the connection to the IPX tunneling server.
 
The syntax for IPXNET DISCONNECT is:
IPXNET DISCONNECT
 
IPXNET STARTSERVER
 
IPXNET STARTSERVER starts an IPX tunneling server on this DOSBox
session. By default, the server will accept connections on UDP port
213, though this can be changed. Once the server is started, DOSBox
will automatically start a client connection to the IPX tunneling server.
 
The syntax for IPXNET STARTSERVER is:
IPXNET STARTSERVER <port>
 
If the server is behind a router, UDP port <port> needs to be forwarded
to that computer.
 
On Linux/Unix-based systems port numbers smaller than 1023 can only be
used with root privileges. Use ports greater than 1023 on those systems.
 
IPXNET STOPSERVER
 
IPXNET STOPSERVER stops the IPX tunneling server running on this DOSBox
session. Care should be taken to ensure that all other connections have
terminated as well, since stopping the server may cause lockups on other
machines that are still using the IPX tunneling server.
 
The syntax for IPXNET STOPSERVER is:
IPXNET STOPSERVER
 
IPXNET PING
 
IPXNET PING broadcasts a ping request through the IPX tunneled network.
In response, all other connected computers will respond to the ping
and report the time it took to receive and send the ping message.
 
The syntax for IPXNET PING is:
IPXNET PING
 
IPXNET STATUS
 
IPXNET STATUS reports the current state of this DOSBox session's
IPX tunneling network. For a list of all computers connected to the
network use the IPXNET PING command.
 
The syntax for IPXNET STATUS is:
IPXNET STATUS
 
 
KEYB [keyboardlayoutcode [codepage [codepagefile]]]
 
Change the keyboard layout. For detailed information about keyboard layouts
please see Section 8: "Keyboard Layout"
 
[keyboardlayoutcode] is a string consisting of five or less characters,
examples are PL214 (Polish typists) or PL457 (Polish programmers).
It specifies the keyboard layout to be used.
The list of all layouts built into DOSBox is here:
http://vogons.zetafleet.com/viewtopic.php?t=21824
 
[codepage] is the number of the codepage to be used. The keyboard layout
has to provide support for the specified codepage, otherwise the layout
loading will fail.
If no codepage is specified, an appropriate codepage for the requested
layout is chosen automatically.
 
[codepagefile] can be used to load codepages that are yet not compiled
into DOSBox. This is only needed when DOSBox does not find the codepage.
If no codepagefile is specified, but you place all ten ega.cpx files
(from FreeDOS) in the DOSBox program folder, an appropriate codepagefile
for the requested layout/codepage is chosen automatically.
 
Examples:
1. To load the polish typist keys layout (automatically uses codepage 852):
keyb pl214
2. To load one of russian keyboard layouts with codepage 866:
keyb ru441 866
In order to type russian characters press ALT+RIGHT-SHIFT.
3. To load one of french keyboard layouts with codepage 850 (where the
codepage is defined in EGACPI.DAT):
keyb fr189 850 EGACPI.DAT
4. To load codepage 858 (without a keyboard layout):
keyb none 858
This can be used to change the codepage for the FreeDOS keyb2 utility.
5. To display the current codepage and, if loaded, the keyboard layout:
keyb
 
 
 
For more information use the /? command line switch with the programs.
 
 
 
================
5. Special Keys:
================
 
ALT-ENTER Switch to full screen and back.
ALT-PAUSE Pause emulation (hit ALT-PAUSE again to continue).
CTRL-F1 Start the keymapper.
CTRL-F4 Change between mounted floppy/CD images. Update directory cache
for all drives.
CTRL-ALT-F5 Start/Stop creating a movie of the screen. (avi video capturing)
CTRL-F5 Save a screenshot. (PNG format)
CTRL-F6 Start/Stop recording sound output to a wave file.
CTRL-ALT-F7 Start/Stop recording of OPL commands. (DRO format)
CTRL-ALT-F8 Start/Stop the recording of raw MIDI commands.
CTRL-F7 Decrease frameskip.
CTRL-F8 Increase frameskip.
CTRL-F9 Kill DOSBox.
CTRL-F10 Capture/Release the mouse.
CTRL-F11 Slow down emulation (Decrease DOSBox Cycles).
CTRL-F12 Speed up emulation (Increase DOSBox Cycles)*.
ALT-F12 Unlock speed (turbo button/fast forward)**.
F11, ALT-F11 (machine=cga) change tint in NTSC output modes***
F11 (machine=hercules) cycle through amber, green, white colouring***
 
*NOTE: Once you increase your DOSBox cycles beyond your computer CPU resources,
it will produce the same effect as slowing down the emulation.
This maximum will vary from computer to computer.
 
**NOTE: You need free CPU resources for this (the more you have, the faster
it goes), so it won't work at all with cycles=max or a too high amount
of fixed cycles. You have to keep the keys pressed for it to work!
 
***NOTE: These keys won't work if you saved a mapper file earlier with
a different machine type. So either reassign them or reset the mapper.
 
These are the default keybindings. They can be changed in the keymapper
(see Section 7: KeyMapper).
 
In MAC OS you can try using cmd(applekey) together with Ctrl if the key doesn't
work eg. cmd-ctrl-F1, but some keys may still need remapping (in Linux too).
 
Saved/recorded files can be found in:
(Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Extras
(Linux) ~/.dosbox/capture
(MAC OS X) "~/Library/Preferences/capture"
This can be changed in the DOSBox configuration file.
 
 
 
====================
6. Joystick/Gamepad:
====================
 
The standard joystick port in DOS supports a maximum of 4 axes and 4 buttons.
For more, different modifications of that configuration were used.
 
To force DOSBox to use a different type of emulated joystick/gamepad, the entry
"joysticktype" in the [joystick] section of the DOSBox configuration file can
be used.
 
none - disables controller support.
auto - (default) autodetects whether you have one or two controllers connected:
if you have one - '4axis' setting is used,
if you have two - '2axis' setting is used.
2axis - If you have two controllers connected, each will emulate a joystick
with 2 axes and 2 buttons. If you have only one controller connected,
it will emulate a joystick with only 2 axis and 2 buttons.
4axis - supports only first controller, emulates a joystick
with 4 axis and 4 buttons or a gamepad with 2axis and 6 buttons.
4axis_2 - supports only second controller.
fcs - supports only first controller, emulates ThrustMaster
Flight Control System, with 3-axes, 4 buttons and 1 hat.
ch - supports only first controller, emulates CH Flightstick,
with 4-axes, 6 buttons and 1 hat, but you cannot press more
than one button at the same time.
 
You also have to configure controller properly inside the game.
 
It is important to remember that if you saved the mapperfile without joystick
 
connected, or with a different joystick setting, your new setting will
not work
properly,
or not work at all, until you reset DOSBox's mapperfile.
 
 
If controller is working properly outside DOSBox, but doesn't calibrate properly
inside DOSBox, try different 'timed' setting in DOSBox's configuration file.
 
 
 
=============
7. KeyMapper:
=============
 
You start the DOSBox mapper either with CTRL-F1 (see section 5. Special Keys)
or -startmapper (see Section 3. Command Line Parameters).
You are presented with a virtual keyboard and a virtual joystick.
 
These virtual devices correspond to the keys and events DOSBox will
report to the DOS applications. If you click on a button with your mouse,
you can see in the lower left corner with which event it is associated
(EVENT) and to what events it is currently bound.
 
Event: EVENT
BIND: BIND (the real key/button/axis you push with your finger/hand)
 
Add Del
mod1 hold Next
mod2
mod3
 
 
EVENT
The key or joystick axis/button/hat DOSBox will report to DOS applications.
(the event that will happen during the game, (eg. shooting/jumping/walking)
BIND
The key on your real keyboard or the axis/button/hat on your real
joystick(s) (as reported by SDL), which is connected to the EVENT.
mod1,2,3
Modifiers. These are keys you need to have to be pressed while pressing
BIND. mod1 = CTRL and mod2 = ALT. These are generally only used when you
want to change the special keys of DOSBox.
Add
Add a new BIND to this EVENT. Basically add a key from your keyboard or an
event from the joystick (button press, axis/hat movement) which will
produce the EVENT in DOSBox.
Del
Delete the BIND to this EVENT. If an EVENT has no BINDS, then it is not
possible to trigger this event in DOSBox (that is there's no way to type
the key or use the respective action of the joystick).
Next
Go through the list of bindings which map to this EVENT.
 
 
Example:
Q1. You want to have the X on your keyboard to type a Z in DOSBox.
A. Click on the Z on the keyboard mapper. Click "Add".
Now press the X key on your keyboard.
 
Q2. If you click "Next" a couple of times, you will notice that the Z on your
keyboard also produces an Z in DOSBox.
A. Therefore select the Z again, and click "Next" until you have the Z on
your keyboard. Now click "Del".
 
Q3. If you try it out in DOSBox, you will notice that pressing X makes ZX
appear.
A. The X on your keyboard is still mapped to the X as well! Click on
the X in the keyboard mapper and search with "Next" until you find the
mapped key X. Click "Del".
 
 
Examples about remapping the joystick:
You have a joystick attached, it is working fine under DOSBox and you
want to play some keyboard-only game with the joystick (it is assumed
that the game is controlled by the arrows on the keyboard):
1. Start the mapper, then click on one of the left keyboard arrow.
EVENT should be key_left. Now click on Add and move your joystick
in the respective direction, this should add an event to the BIND.
2. Repeat the above for the missing three directions, additionally
the buttons of the joystick can be remapped as well (fire/jump).
3. Click on Save, then on Exit and test it with some game.
 
You want to swap the y-axis of the joystick because some flightsim uses
the up/down joystick movement in a way you don't like, and it is not
configurable in the game itself:
1. Start the mapper and click on Y- in the first joystick field.
EVENT should be jaxis_0_1-.
2. Click on Del to remove the current binding, then click Add and move
your joystick downwards. A new bind should be created.
3. Repeat this for Y+, save the layout and finally test it with some game.
 
If you want to remap anything to your d-pad/hat you will have to change
'joysticktype=auto' to 'joysticktype=fcs' in configuration file. Maybe this
will be improved in the next dosbox version.
 
 
If you change the default mapping, you can save your changes by clicking on
"Save". DOSBox will save the mapping to a location specified in
the configuration file (the mapperfile= entry). At startup, DOSBox will load
your mapperfile, if it is present in the DOSBox configuration file.
 
 
 
===================
8. Keyboard Layout:
===================
 
To switch to a different keyboard layout, either the entry "keyboardlayout"
in the [dos] section of the DOSBox configuration file can be used, or the
internal DOSBox program keyb.com (Section 4: Internal Programs)
Both accept DOS conforming language codes (see below),
but only by using keyb.com a custom codepage can be specified.
 
The default keyboardlayout=auto currently works under windows only. The language
is chosen according to the OS language, but the keyboard layout is not detected.
 
Layout switching
DOSBox supports a number of keyboard layouts and codepages by default,
in this case just the layout identifier needs to be specified (like
keyboardlayout=PL214 in the DOSBox configuration file, or using "keyb PL214"
at the DOSBox command prompt). The list of all layouts built into DOSBox is
here: http://vogons.zetafleet.com/viewtopic.php?t=21824
 
Some keyboard layouts (for example layout GK319 codepage 869 and layout RU441
codepage 808) have support for dual layouts that can be accessed by pressing
LeftALT+RrightSHIFT for one layout and LeftALT+LeftSHIFT for the other.
Some keyboard layouts (for example layout LT456 codepage 771) have support
for three layouts, third can be accessed by pressing LeftALT+LeftCTRL
 
Supported external files
The FreeDOS .kl files are supported (FreeDOS keyb2 keyboard layoutfiles) as
well as the FreeDOS keyboard.sys/keybrd2.sys/keybrd3.sys libraries which
consist of all available .kl files.
See http://www.freedos.org/ for precompiled keyboard layouts if
the DOSBox-integrated layouts don't work for some reason, or if updated or
new layouts become available.
 
Both .CPI (MS-DOS and compatible codepage files) and .CPX (FreeDOS
UPX-compressed codepage files) can be used. Some codepages are compiled
into DOSBox, so it is mostly not needed to care about external codepage
files. If you need a different (or custom) codepage file, copy it into
the directory of the DOSBox so it is accessible for DOSBox.
If you place all ten ega.cpx files (from FreeDOS) in DOSBox folder,
an appropriate codepagefile for the requested layout/codepage is
chosen automatically.
 
Additional layouts can be added by copying the corresponding .kl file into
the directory of the DOSBox configuration file and using the first part of
the filename as language code.
Example: For the file UZ.KL (keyboard layout for Uzbekistan) specify
"keyboardlayout=uz" in the DOSBox configuration file.
The integration of keyboard layout packages (like keybrd2.sys) works similar.
 
Note that the keyboard layout allows foreign characters to be entered, but
there is NO support for them in filenames. Try to avoid them both inside
DOSBox as well as in files on your host operating system that are accessible
by DOSBox.
 
 
 
==============================
9. Serial Multiplayer feature:
==============================
 
DOSBox can emulate a serial nullmodem cable over network and internet.
It can be configured through the [serialports] section in the DOSBox
configuration file.
 
To create a nullmodem connection, one side needs to act as the server and
one as the client.
 
The server needs to be set up in the DOSBox configuration file like this:
serial1=nullmodem
 
The client:
serial1=nullmodem server:<IP or name of the server>
 
Now start your game and choose nullmodem / serial cable / already connected
as multiplayer method on COM1. Set the same baudrate on both computers.
 
Furthermore, additional parameters can be specified to control the behavior
of the nullmodem connection. These are all parameters:
 
* port: - TCP port number. Default: 23
* rxdelay: - how long (milliseconds) to delay received data if the
interface is not ready. Increase this value if you encounter
overrun errors in the DOSBox Status Window. Default: 100
* txdelay: - how long to gather data before sending a packet. Default: 12
(reduces Network overhead)
* server: - This nullmodem will be a client connecting to the specified
server. (No server argument: be a server.)
* transparent:1 - Only send the serial data, no RTS/DTR handshake. Use this
when connecting to anything other than a nullmodem.
* telnet:1 - Interpret Telnet data from the remote site. Automatically
sets transparent.
* usedtr:1 - The connection will not be established until DTR is switched
on by the DOS program. Useful for modem terminals.
Automatically sets transparent.
* inhsocket:1 - Use a socket passed to DOSBox by command line. Automatically
sets transparent. (Socket Inheritance: It is used for
playing old DOS door games on new BBS software.)
 
Example: Be a server listening on TCP port 5000.
serial1=nullmodem server:<IP or name of the server> port:5000 rxdelay:1000
 
 
 
=====================================
10. How to speed up/slow down DOSBox:
=====================================
 
DOSBox emulates the CPU, the sound and graphic cards, and other peripherals
of a PC, all at the same time. The speed of an emulated DOS application
depends on how many instructions can be emulated, which is adjustable
(number of cycles).
 
CPU Cycles (speed up/slow down)
By default (cycles=auto) DOSBox tries to detect whether a game needs to
be run with as many instructions emulated per time interval as possible
(cycles=max, sometimes this results in game working too fast or unstable),
or whether to use fixed amount of cycles (cycles=3000, sometimes this results
in game working too slow or too fast). But you can always manually force
a different setting in the DOSBox's configuration file.
 
You can force the slow or fast behavior by setting a fixed amount of cycles
in the DOSBox's configuration file. If you for example set cycles=10000, then
DOSBox window will display a line "Cpu Speed: fixed 10000 cycles" at the top.
In this mode you can reduce the amount of cycles even more by hitting CTRL-F11
(you can go as low as you want) or raise it by hitting CTRL-F12 as much as you
want, but you will be limited by the power of one core of your computer's CPU.
You can see how much free time your real CPU's cores have by looking at
the Task Manager in Windows 2000/XP/Vista/7 and the System Monitor
in Windows 95/98/ME. Once 100% of the power of your computer's real CPU's one
core is used, there is no further way to speed up DOSBox (it will actually
start to slow down), unless you reduce the load generated by the non-CPU parts
of DOSBox. DOSBox can use only one core of your CPU, so If you have
for example a CPU with 4 cores, DOSBox will not be able to use the power
of three other cores.
 
You can also force the fast behavior by setting cycles=max in the DOSBox
configuration file. The DOSBox window will display a line
"Cpu Speed: max 100% cycles" at the top then. This time you won't have to care
how much free time your real CPU's cores have, because DOSBox will always use
100% of your real CPU's one core. In this mode you can reduce the amount
of your real CPU's core usage by CTRL-F11 or raise it with CTRL-F12.
 
CPU Core (speed up)
On x86 architectures you can try to force the usage of a dynamically
recompiling core (set core=dynamic in the DOSBox configuration file).
This usually gives better results if the auto detection (core=auto) fails.
It is best accompanied by cycles=max. But you may also try using it with
high amounts of cycles (for example 20000 or more). Note that there might be
games that work worse/crash with the dynamic core (so save your game often),
or do not work at all!
 
Graphics emulation (speed up)
VGA emulation is a demanding part of DOSBox in terms of actual CPU usage.
Increase the number of frames skipped (in increments of one) by pressing
CTRL-F8. Your CPU usage should decrease when using a fixed cycle setting,
and you will be able to increase cycles with CTRL-F12.
You can repeat this until the game runs fast enough for you.
Please note that this is a trade-off: you lose in fluidity of video what
you gain in speed.
 
Sound emulation (speed up)
You can also try to disable the sound through the setup utility of the game
to reduce load on your CPU further. Setting nosound=true in DOSBox's
configuration does NOT disable the emulation of sound devices, just
the output of sound will be disabled.
 
Also try to close every program but DOSBox to reserve as much resources
as possible for DOSBox.
 
 
Advanced cycles configuration:
The cycles=auto and cycles=max settings can be parameterized to have
different startup defaults. The syntax is
cycles=auto ["realmode default"] ["protected mode default"%]
[limit "cycle limit"]
cycles=max ["protected mode default"%] [limit "cycle limit"]
Example:
cycles=auto 5000 80% limit 20000
will use cycles=5000 for real mode games, 80% CPU throttling for
protected mode games along with a hard cycle limit of 20000
 
 
 
====================
11. Troubleshooting:
====================
 
General tip:
Check messages in DOSBox Status Window. See section 12. "DOSBox Status Window"
 
DOSBox crashes right after starting it:
- use different values for the output= entry in your DOSBox
configuration file
- try to update your graphics card driver and DirectX
- (Linux) set the environment variable SDL_AUDIODRIVER to alsa or oss.
 
Running a certain game closes DOSBox, crashes with some message or hangs:
- see if it works with a default DOSBox installation
(unmodified configuration file)
- try it with sound disabled (use the sound configuration
program that comes with the game, additionally you can
set sbtype=none and gus=false in the DOSBox configuration file)
- change some entries of the DOSBox configuration file, especially try:
core=normal
fixed cycles (for example cycles=10000)
ems=false
xms=false
or combinations of the above settings,
similar the machine settings that control the emulated chipset and
functionality:
machine=vesa_nolfb
or
machine=vgaonly
- use loadfix before starting the game
 
The game exits to the DOSBox prompt with some error message:
- read the error message closely and try to locate the error
- try the hints at the above sections
- mount differently as some games are picky about the locations,
for example if you used "mount d d:\oldgames\game" try
"mount c d:\oldgames\game" and "mount c d:\oldgames"
- if the game requires a CD-ROM be sure you used "-t cdrom" when
mounting and try different additional parameters (the ioctl,
usecd and label switches, see the appropriate section)
- check the file permissions of the game files (remove read-only
attributes, add write permissions etc.)
- try reinstalling the game within DOSBox
 
 
 
=========================
12. DOSBox Status Window:
=========================
 
DOSBox's Staus window contains many useful information about your currant
configuration, your actions in DOSBox, errors that happened and more.
Whenever you have any problem with DOSBox check these messages.
 
To start DOSBox Status Window:
(Windows) Status Window is being started together with main DOSBox window.
(Linux) You may have to start DOSBox from a console to see Status Window.
(MAC OS X) Right click on DOSBox.app, choose "Show Package Contents"->
->enter "Contents"->enter "MacOS"->run "DOSBox"
 
 
 
=====================================
13. The configuration (options) file:
=====================================
 
The configuration file is automatically created the first time you run DOSBox.
The file can be found in:
(Windows) "Start/WinLogo Menu"->"All Programs"->DOSBox-0.74->Options
(Linux) ~/.dosbox/dosbox-0.74.conf
(MAC OS X) "~/Library/Preferences/DOSBox 0.74 Preferences"
The file is divided into several sections. Each section starts with a
[section name] line. The settings are the property=value lines where value can
be altered to customize DOSBox.
# and % indicate comment-lines.
 
 
An extra configuration file can be generated by CONFIG.COM, which can be found
on the internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4:
"Internal programs" for usage of CONFIG.COM. You can start DOSBox with
the -conf switch to load the generated file and use its settings.
 
DOSBox will load configuration files that are specified with -conf. If none were
specified, it will try to load "dosbox.conf" from the local directory.
If there is none, DOSBox will load the user configuration file.
This file will be created if it doesn't exist.
 
Important!: In Windows Vista/7 the configuration file won't work correctly
if it is located in "Windows" or "Program Files" folder or their subfolders,
or directly on c:\, so the best place for storing extra configuration files is
for example: C:\oldgames
 
 
 
======================
14. The Language File:
======================
 
A language file can be generated by CONFIG.COM, which can be found on the
internal DOSBox Z: drive when you start up DOSBox. Look in the Section 4:
"Internal programs" for usage of CONFIG.COM.
Read the language file, and you will hopefully understand how to change it.
Start DOSBox with the -lang switch to use your new language file.
Alternatively, you can setup the filename in the configuration file
in the [dosbox] section. There's a language= entry that can be changed with
the filelocation.
 
 
 
========================================
15. Building your own version of DOSBox:
========================================
 
Download the source.
Check the INSTALL in the source distribution.
 
 
 
===================
16. Special thanks:
===================
 
See the THANKS file.
 
 
 
============
17. Contact:
============
 
See the site:
http://www.dosbox.com
for an email address (The Crew-page).
 
 
/programs/emulator/DosBox
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/ScummVM
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/e80/trunk/48.h
0,0 → 1,1027
char BIOS48[]= {
0xf3,0xaf,0x11,0xff,0xff,0xc3,0xcb,0x11,0x2a,0x5d,0x5c,0x22,0x5f,0x5c,0x18,0x43,
0xc3,0xf2,0x15,0xff,0xff,0xff,0xff,0xff,0x2a,0x5d,0x5c,0x7e,0xcd,0x7d,0x00,0xd0,
0xcd,0x74,0x00,0x18,0xf7,0xff,0xff,0xff,0xc3,0x5b,0x33,0xff,0xff,0xff,0xff,0xff,
0xc5,0x2a,0x61,0x5c,0xe5,0xc3,0x9e,0x16,0xf5,0xe5,0x2a,0x78,0x5c,0x23,0x22,0x78,
0x5c,0x7c,0xb5,0x20,0x03,0xfd,0x34,0x40,0xc5,0xd5,0xcd,0xbf,0x02,0xd1,0xc1,0xe1,
0xf1,0xfb,0xc9,0xe1,0x6e,0xfd,0x75,0x00,0xed,0x7b,0x3d,0x5c,0xc3,0xc5,0x16,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xe5,0x2a,0xb0,0x5c,0x7c,0xb5,0x20,0x01,0xe9,
0xe1,0xf1,0xed,0x45,0x2a,0x5d,0x5c,0x23,0x22,0x5d,0x5c,0x7e,0xc9,0xfe,0x21,0xd0,
0xfe,0x0d,0xc8,0xfe,0x10,0xd8,0xfe,0x18,0x3f,0xd8,0x23,0xfe,0x16,0x38,0x01,0x23,
0x37,0x22,0x5d,0x5c,0xc9,0xbf,0x52,0x4e,0xc4,0x49,0x4e,0x4b,0x45,0x59,0xa4,0x50,
0xc9,0x46,0xce,0x50,0x4f,0x49,0x4e,0xd4,0x53,0x43,0x52,0x45,0x45,0x4e,0xa4,0x41,
0x54,0x54,0xd2,0x41,0xd4,0x54,0x41,0xc2,0x56,0x41,0x4c,0xa4,0x43,0x4f,0x44,0xc5,
0x56,0x41,0xcc,0x4c,0x45,0xce,0x53,0x49,0xce,0x43,0x4f,0xd3,0x54,0x41,0xce,0x41,
0x53,0xce,0x41,0x43,0xd3,0x41,0x54,0xce,0x4c,0xce,0x45,0x58,0xd0,0x49,0x4e,0xd4,
0x53,0x51,0xd2,0x53,0x47,0xce,0x41,0x42,0xd3,0x50,0x45,0x45,0xcb,0x49,0xce,0x55,
0x53,0xd2,0x53,0x54,0x52,0xa4,0x43,0x48,0x52,0xa4,0x4e,0x4f,0xd4,0x42,0x49,0xce,
0x4f,0xd2,0x41,0x4e,0xc4,0x3c,0xbd,0x3e,0xbd,0x3c,0xbe,0x4c,0x49,0x4e,0xc5,0x54,
0x48,0x45,0xce,0x54,0xcf,0x53,0x54,0x45,0xd0,0x44,0x45,0x46,0x20,0x46,0xce,0x43,
0x41,0xd4,0x46,0x4f,0x52,0x4d,0x41,0xd4,0x4d,0x4f,0x56,0xc5,0x45,0x52,0x41,0x53,
0xc5,0x4f,0x50,0x45,0x4e,0x20,0xa3,0x43,0x4c,0x4f,0x53,0x45,0x20,0xa3,0x4d,0x45,
0x52,0x47,0xc5,0x56,0x45,0x52,0x49,0x46,0xd9,0x42,0x45,0x45,0xd0,0x43,0x49,0x52,
0x43,0x4c,0xc5,0x49,0x4e,0xcb,0x50,0x41,0x50,0x45,0xd2,0x46,0x4c,0x41,0x53,0xc8,
0x42,0x52,0x49,0x47,0x48,0xd4,0x49,0x4e,0x56,0x45,0x52,0x53,0xc5,0x4f,0x56,0x45,
0xd2,0x4f,0x55,0xd4,0x4c,0x50,0x52,0x49,0x4e,0xd4,0x4c,0x4c,0x49,0x53,0xd4,0x53,
0x54,0x4f,0xd0,0x52,0x45,0x41,0xc4,0x44,0x41,0x54,0xc1,0x52,0x45,0x53,0x54,0x4f,
0x52,0xc5,0x4e,0x45,0xd7,0x42,0x4f,0x52,0x44,0x45,0xd2,0x43,0x4f,0x4e,0x54,0x49,
0x4e,0x55,0xc5,0x44,0x49,0xcd,0x52,0x45,0xcd,0x46,0x4f,0xd2,0x47,0x4f,0x20,0x54,
0xcf,0x47,0x4f,0x20,0x53,0x55,0xc2,0x49,0x4e,0x50,0x55,0xd4,0x4c,0x4f,0x41,0xc4,
0x4c,0x49,0x53,0xd4,0x4c,0x45,0xd4,0x50,0x41,0x55,0x53,0xc5,0x4e,0x45,0x58,0xd4,
0x50,0x4f,0x4b,0xc5,0x50,0x52,0x49,0x4e,0xd4,0x50,0x4c,0x4f,0xd4,0x52,0x55,0xce,
0x53,0x41,0x56,0xc5,0x52,0x41,0x4e,0x44,0x4f,0x4d,0x49,0x5a,0xc5,0x49,0xc6,0x43,
0x4c,0xd3,0x44,0x52,0x41,0xd7,0x43,0x4c,0x45,0x41,0xd2,0x52,0x45,0x54,0x55,0x52,
0xce,0x43,0x4f,0x50,0xd9,0x42,0x48,0x59,0x36,0x35,0x54,0x47,0x56,0x4e,0x4a,0x55,
0x37,0x34,0x52,0x46,0x43,0x4d,0x4b,0x49,0x38,0x33,0x45,0x44,0x58,0x0e,0x4c,0x4f,
0x39,0x32,0x57,0x53,0x5a,0x20,0x0d,0x50,0x30,0x31,0x51,0x41,0xe3,0xc4,0xe0,0xe4,
0xb4,0xbc,0xbd,0xbb,0xaf,0xb0,0xb1,0xc0,0xa7,0xa6,0xbe,0xad,0xb2,0xba,0xe5,0xa5,
0xc2,0xe1,0xb3,0xb9,0xc1,0xb8,0x7e,0xdc,0xda,0x5c,0xb7,0x7b,0x7d,0xd8,0xbf,0xae,
0xaa,0xab,0xdd,0xde,0xdf,0x7f,0xb5,0xd6,0x7c,0xd5,0x5d,0xdb,0xb6,0xd9,0x5b,0xd7,
0x0c,0x07,0x06,0x04,0x05,0x08,0x0a,0x0b,0x09,0x0f,0xe2,0x2a,0x3f,0xcd,0xc8,0xcc,
0xcb,0x5e,0xac,0x2d,0x2b,0x3d,0x2e,0x2c,0x3b,0x22,0xc7,0x3c,0xc3,0x3e,0xc5,0x2f,
0xc9,0x60,0xc6,0x3a,0xd0,0xce,0xa8,0xca,0xd3,0xd4,0xd1,0xd2,0xa9,0xcf,0x2e,0x2f,
0x11,0xff,0xff,0x01,0xfe,0xfe,0xed,0x78,0x2f,0xe6,0x1f,0x28,0x0e,0x67,0x7d,0x14,
0xc0,0xd6,0x08,0xcb,0x3c,0x30,0xfa,0x53,0x5f,0x20,0xf4,0x2d,0xcb,0x00,0x38,0xe6,
0x7a,0x3c,0xc8,0xfe,0x28,0xc8,0xfe,0x19,0xc8,0x7b,0x5a,0x57,0xfe,0x18,0xc9,0xcd,
0x8e,0x02,0xc0,0x21,0x00,0x5c,0xcb,0x7e,0x20,0x07,0x23,0x35,0x2b,0x20,0x02,0x36,
0xff,0x7d,0x21,0x04,0x5c,0xbd,0x20,0xee,0xcd,0x1e,0x03,0xd0,0x21,0x00,0x5c,0xbe,
0x28,0x2e,0xeb,0x21,0x04,0x5c,0xbe,0x28,0x27,0xcb,0x7e,0x20,0x04,0xeb,0xcb,0x7e,
0xc8,0x5f,0x77,0x23,0x36,0x05,0x23,0x3a,0x09,0x5c,0x77,0x23,0xfd,0x4e,0x07,0xfd,
0x56,0x01,0xe5,0xcd,0x33,0x03,0xe1,0x77,0x32,0x08,0x5c,0xfd,0xcb,0x01,0xee,0xc9,
0x23,0x36,0x05,0x23,0x35,0xc0,0x3a,0x0a,0x5c,0x77,0x23,0x7e,0x18,0xea,0x42,0x16,
0x00,0x7b,0xfe,0x27,0xd0,0xfe,0x18,0x20,0x03,0xcb,0x78,0xc0,0x21,0x05,0x02,0x19,
0x7e,0x37,0xc9,0x7b,0xfe,0x3a,0x38,0x2f,0x0d,0xfa,0x4f,0x03,0x28,0x03,0xc6,0x4f,
0xc9,0x21,0xeb,0x01,0x04,0x28,0x03,0x21,0x05,0x02,0x16,0x00,0x19,0x7e,0xc9,0x21,
0x29,0x02,0xcb,0x40,0x28,0xf4,0xcb,0x5a,0x28,0x0a,0xfd,0xcb,0x30,0x5e,0xc0,0x04,
0xc0,0xc6,0x20,0xc9,0xc6,0xa5,0xc9,0xfe,0x30,0xd8,0x0d,0xfa,0x9d,0x03,0x20,0x19,
0x21,0x54,0x02,0xcb,0x68,0x28,0xd3,0xfe,0x38,0x30,0x07,0xd6,0x20,0x04,0xc8,0xc6,
0x08,0xc9,0xd6,0x36,0x04,0xc8,0xc6,0xfe,0xc9,0x21,0x30,0x02,0xfe,0x39,0x28,0xba,
0xfe,0x30,0x28,0xb6,0xe6,0x07,0xc6,0x80,0x04,0xc8,0xee,0x0f,0xc9,0x04,0xc8,0xcb,
0x68,0x21,0x30,0x02,0x20,0xa4,0xd6,0x10,0xfe,0x22,0x28,0x06,0xfe,0x20,0xc0,0x3e,
0x5f,0xc9,0x3e,0x40,0xc9,0xf3,0x7d,0xcb,0x3d,0xcb,0x3d,0x2f,0xe6,0x03,0x4f,0x06,
0x00,0xdd,0x21,0xd1,0x03,0xdd,0x09,0x3a,0x48,0x5c,0xe6,0x38,0x0f,0x0f,0x0f,0xf6,
0x08,0x00,0x00,0x00,0x04,0x0c,0x0d,0x20,0xfd,0x0e,0x3f,0x05,0xc2,0xd6,0x03,0xee,
0x10,0xd3,0xfe,0x44,0x4f,0xcb,0x67,0x20,0x09,0x7a,0xb3,0x28,0x09,0x79,0x4d,0x1b,
0xdd,0xe9,0x4d,0x0c,0xdd,0xe9,0xfb,0xc9,0xef,0x31,0x27,0xc0,0x03,0x34,0xec,0x6c,
0x98,0x1f,0xf5,0x04,0xa1,0x0f,0x38,0x21,0x92,0x5c,0x7e,0xa7,0x20,0x5e,0x23,0x4e,
0x23,0x46,0x78,0x17,0x9f,0xb9,0x20,0x54,0x23,0xbe,0x20,0x50,0x78,0xc6,0x3c,0xf2,
0x25,0x04,0xe2,0x6c,0x04,0x06,0xfa,0x04,0xd6,0x0c,0x30,0xfb,0xc6,0x0c,0xc5,0x21,
0x6e,0x04,0xcd,0x06,0x34,0xcd,0xb4,0x33,0xef,0x04,0x38,0xf1,0x86,0x77,0xef,0xc0,
0x02,0x31,0x38,0xcd,0x94,0x1e,0xfe,0x0b,0x30,0x22,0xef,0xe0,0x04,0xe0,0x34,0x80,
0x43,0x55,0x9f,0x80,0x01,0x05,0x34,0x35,0x71,0x03,0x38,0xcd,0x99,0x1e,0xc5,0xcd,
0x99,0x1e,0xe1,0x50,0x59,0x7a,0xb3,0xc8,0x1b,0xc3,0xb5,0x03,0xcf,0x0a,0x89,0x02,
0xd0,0x12,0x86,0x89,0x0a,0x97,0x60,0x75,0x89,0x12,0xd5,0x17,0x1f,0x89,0x1b,0x90,
0x41,0x02,0x89,0x24,0xd0,0x53,0xca,0x89,0x2e,0x9d,0x36,0xb1,0x89,0x38,0xff,0x49,
0x3e,0x89,0x43,0xff,0x6a,0x73,0x89,0x4f,0xa7,0x00,0x54,0x89,0x5c,0x00,0x00,0x00,
0x89,0x69,0x14,0xf6,0x24,0x89,0x76,0xf1,0x10,0x05,0x1e,0x8c,0xc8,0x2b,0xc7,0x8e,
0xc0,0x8e,0xd8,0x6a,0x27,0x06,0x57,0xbe,0x6e,0x48,0xb5,0x03,0xf3,0xa5,0xcb,0x06,
0xeb,0xe8,0x21,0x3f,0x05,0xe5,0x21,0x80,0x1f,0xcb,0x7f,0x28,0x03,0x21,0x98,0x0c,
0x08,0x13,0xdd,0x2b,0xf3,0x3e,0x02,0x47,0x10,0xfe,0xd3,0xfe,0xee,0x0f,0x06,0xa4,
0x2d,0x20,0xf5,0x05,0x25,0xf2,0xd8,0x04,0x06,0x2f,0x10,0xfe,0xd3,0xfe,0x3e,0x0d,
0x06,0x37,0x10,0xfe,0xd3,0xfe,0x01,0x0e,0x3b,0x08,0x6f,0xc3,0x07,0x05,0x7a,0xb3,
0x28,0x0c,0xdd,0x6e,0x00,0x7c,0xad,0x67,0x3e,0x01,0x37,0xc3,0x25,0x05,0x6c,0x18,
0xf4,0x79,0xcb,0x78,0x10,0xfe,0x30,0x04,0x06,0x42,0x10,0xfe,0xd3,0xfe,0x06,0x3e,
0x20,0xef,0x05,0xaf,0x3c,0xcb,0x15,0xc2,0x14,0x05,0x1b,0xdd,0x23,0x06,0x31,0x3e,
0x7f,0xdb,0xfe,0x1f,0xd0,0x7a,0x3c,0xc2,0xfe,0x04,0x06,0x3b,0x10,0xfe,0xc9,0xf5,
0x3a,0x48,0x5c,0xe6,0x38,0x0f,0x0f,0x0f,0xd3,0xfe,0x3e,0x7f,0xdb,0xfe,0x1f,0xfb,
0x38,0x02,0xcf,0x0c,0xf1,0xc9,0x14,0x08,0x15,0xf3,0x3e,0x0f,0xd3,0xfe,0x21,0x3f,
0x05,0xe5,0xdb,0xfe,0x1f,0xe6,0x20,0xf6,0x02,0x4f,0xbf,0xc0,0xcd,0xe7,0x05,0x30,
0xfa,0x21,0x15,0x04,0x10,0xfe,0x2b,0x7c,0xb5,0x20,0xf9,0xcd,0xe3,0x05,0x30,0xeb,
0x06,0x9c,0xcd,0xe3,0x05,0x30,0xe4,0x3e,0xc6,0xb8,0x30,0xe0,0x24,0x20,0xf1,0x06,
0xc9,0xcd,0xe7,0x05,0x30,0xd5,0x78,0xfe,0xd4,0x30,0xf4,0xcd,0xe7,0x05,0xd0,0x79,
0xee,0x03,0x4f,0x26,0x00,0x06,0xb0,0x18,0x1f,0x08,0x20,0x07,0x30,0x0f,0xdd,0x75,
0x00,0x18,0x0f,0xcb,0x11,0xad,0xc0,0x79,0x1f,0x4f,0x13,0x18,0x07,0xdd,0x7e,0x00,
0xad,0xc0,0xdd,0x23,0x1b,0x08,0x06,0xb2,0x2e,0x01,0xcd,0xe3,0x05,0xd0,0x3e,0xcb,
0xb8,0xcb,0x15,0x06,0xb0,0xd2,0xca,0x05,0x7c,0xad,0x67,0x7a,0xb3,0x20,0xca,0x7c,
0xfe,0x01,0xc9,0xcd,0xe7,0x05,0xd0,0x3e,0x16,0x3d,0x20,0xfd,0xa7,0x04,0xc8,0x3e,
0x7f,0xdb,0xfe,0x1f,0xd0,0xa9,0xe6,0x20,0x28,0xf3,0x79,0x2f,0x4f,0xe6,0x07,0xf6,
0x08,0xd3,0xfe,0x37,0xc9,0xf1,0x3a,0x74,0x5c,0xd6,0xe0,0x32,0x74,0x5c,0xcd,0x8c,
0x1c,0xcd,0x30,0x25,0x28,0x3c,0x01,0x11,0x00,0x3a,0x74,0x5c,0xa7,0x28,0x02,0x0e,
0x22,0xf7,0xd5,0xdd,0xe1,0x06,0x0b,0x3e,0x20,0x12,0x13,0x10,0xfc,0xdd,0x36,0x01,
0xff,0xcd,0xf1,0x2b,0x21,0xf6,0xff,0x0b,0x09,0x03,0x30,0x0f,0x3a,0x74,0x5c,0xa7,
0x20,0x02,0xcf,0x0e,0x78,0xb1,0x28,0x0a,0x01,0x0a,0x00,0xdd,0xe5,0xe1,0x23,0xeb,
0xed,0xb0,0xdf,0xfe,0xe4,0x20,0x49,0x3a,0x74,0x5c,0xfe,0x03,0xca,0x8a,0x1c,0xe7,
0xcd,0xb2,0x28,0xcb,0xf9,0x30,0x0b,0x21,0x00,0x00,0x3a,0x74,0x5c,0x3d,0x28,0x15,
0xcf,0x01,0xc2,0x8a,0x1c,0xcd,0x30,0x25,0x28,0x18,0x23,0x7e,0xdd,0x77,0x0b,0x23,
0x7e,0xdd,0x77,0x0c,0x23,0xdd,0x71,0x0e,0x3e,0x01,0xcb,0x71,0x28,0x01,0x3c,0xdd,
0x77,0x00,0xeb,0xe7,0xfe,0x29,0x20,0xda,0xe7,0xcd,0xee,0x1b,0xeb,0xc3,0x5a,0x07,
0xfe,0xaa,0x20,0x1f,0x3a,0x74,0x5c,0xfe,0x03,0xca,0x8a,0x1c,0xe7,0xcd,0xee,0x1b,
0xdd,0x36,0x0b,0x00,0xdd,0x36,0x0c,0x1b,0x21,0x00,0x40,0xdd,0x75,0x0d,0xdd,0x74,
0x0e,0x18,0x4d,0xfe,0xaf,0x20,0x4f,0x3a,0x74,0x5c,0xfe,0x03,0xca,0x8a,0x1c,0xe7,
0xcd,0x48,0x20,0x20,0x0c,0x3a,0x74,0x5c,0xa7,0xca,0x8a,0x1c,0xcd,0xe6,0x1c,0x18,
0x0f,0xcd,0x82,0x1c,0xdf,0xfe,0x2c,0x28,0x0c,0x3a,0x74,0x5c,0xa7,0xca,0x8a,0x1c,
0xcd,0xe6,0x1c,0x18,0x04,0xe7,0xcd,0x82,0x1c,0xcd,0xee,0x1b,0xcd,0x99,0x1e,0xdd,
0x71,0x0b,0xdd,0x70,0x0c,0xcd,0x99,0x1e,0xdd,0x71,0x0d,0xdd,0x70,0x0e,0x60,0x69,
0xdd,0x36,0x00,0x03,0x18,0x44,0xfe,0xca,0x28,0x09,0xcd,0xee,0x1b,0xdd,0x36,0x0e,
0x80,0x18,0x17,0x3a,0x74,0x5c,0xa7,0xc2,0x8a,0x1c,0xe7,0xcd,0x82,0x1c,0xcd,0xee,
0x1b,0xcd,0x99,0x1e,0xdd,0x71,0x0d,0xdd,0x70,0x0e,0xdd,0x36,0x00,0x00,0x2a,0x59,
0x5c,0xed,0x5b,0x53,0x5c,0x37,0xed,0x52,0xdd,0x75,0x0b,0xdd,0x74,0x0c,0x2a,0x4b,
0x5c,0xed,0x52,0xdd,0x75,0x0f,0xdd,0x74,0x10,0xeb,0x3a,0x74,0x5c,0xa7,0xca,0x70,
0x09,0xe5,0x01,0x11,0x00,0xdd,0x09,0xdd,0xe5,0x11,0x11,0x00,0xaf,0x37,0xcd,0x56,
0x05,0xdd,0xe1,0x30,0xf2,0x3e,0xfe,0xcd,0x01,0x16,0xfd,0x36,0x52,0x03,0x0e,0x80,
0xdd,0x7e,0x00,0xdd,0xbe,0xef,0x20,0x02,0x0e,0xf6,0xfe,0x04,0x30,0xd9,0x11,0xc0,
0x09,0xc5,0xcd,0x0a,0x0c,0xc1,0xdd,0xe5,0xd1,0x21,0xf0,0xff,0x19,0x06,0x0a,0x7e,
0x3c,0x20,0x03,0x79,0x80,0x4f,0x13,0x1a,0xbe,0x23,0x20,0x01,0x0c,0xd7,0x10,0xf6,
0xcb,0x79,0x20,0xb3,0x3e,0x0d,0xd7,0xe1,0xdd,0x7e,0x00,0xfe,0x03,0x28,0x0c,0x3a,
0x74,0x5c,0x3d,0xca,0x08,0x08,0xfe,0x02,0xca,0xb6,0x08,0xe5,0xdd,0x6e,0xfa,0xdd,
0x66,0xfb,0xdd,0x5e,0x0b,0xdd,0x56,0x0c,0x7c,0xb5,0x28,0x0d,0xed,0x52,0x38,0x26,
0x28,0x07,0xdd,0x7e,0x00,0xfe,0x03,0x20,0x1d,0xe1,0x7c,0xb5,0x20,0x06,0xdd,0x6e,
0x0d,0xdd,0x66,0x0e,0xe5,0xdd,0xe1,0x3a,0x74,0x5c,0xfe,0x02,0x37,0x20,0x01,0xa7,
0x3e,0xff,0xcd,0x56,0x05,0xd8,0xcf,0x1a,0xdd,0x5e,0x0b,0xdd,0x56,0x0c,0xe5,0x7c,
0xb5,0x20,0x06,0x13,0x13,0x13,0xeb,0x18,0x0c,0xdd,0x6e,0xfa,0xdd,0x66,0xfb,0xeb,
0x37,0xed,0x52,0x38,0x09,0x11,0x05,0x00,0x19,0x44,0x4d,0xcd,0x05,0x1f,0xe1,0xdd,
0x7e,0x00,0xa7,0x28,0x3e,0x7c,0xb5,0x28,0x13,0x2b,0x46,0x2b,0x4e,0x2b,0x03,0x03,
0x03,0xdd,0x22,0x5f,0x5c,0xcd,0xe8,0x19,0xdd,0x2a,0x5f,0x5c,0x2a,0x59,0x5c,0x2b,
0xdd,0x4e,0x0b,0xdd,0x46,0x0c,0xc5,0x03,0x03,0x03,0xdd,0x7e,0xfd,0xf5,0xcd,0x55,
0x16,0x23,0xf1,0x77,0xd1,0x23,0x73,0x23,0x72,0x23,0xe5,0xdd,0xe1,0x37,0x3e,0xff,
0xc3,0x02,0x08,0xeb,0x2a,0x59,0x5c,0x2b,0xdd,0x22,0x5f,0x5c,0xdd,0x4e,0x0b,0xdd,
0x46,0x0c,0xc5,0xcd,0xe5,0x19,0xc1,0xe5,0xc5,0xcd,0x55,0x16,0xdd,0x2a,0x5f,0x5c,
0x23,0xdd,0x4e,0x0f,0xdd,0x46,0x10,0x09,0x22,0x4b,0x5c,0xdd,0x66,0x0e,0x7c,0xe6,
0xc0,0x20,0x0a,0xdd,0x6e,0x0d,0x22,0x42,0x5c,0xfd,0x36,0x0a,0x00,0xd1,0xdd,0xe1,
0x37,0x3e,0xff,0xc3,0x02,0x08,0xdd,0x4e,0x0b,0xdd,0x46,0x0c,0xc5,0x03,0xf7,0x36,
0x80,0xeb,0xd1,0xe5,0xe5,0xdd,0xe1,0x37,0x3e,0xff,0xcd,0x02,0x08,0xe1,0xed,0x5b,
0x53,0x5c,0x7e,0xe6,0xc0,0x20,0x19,0x1a,0x13,0xbe,0x23,0x20,0x02,0x1a,0xbe,0x1b,
0x2b,0x30,0x08,0xe5,0xeb,0xcd,0xb8,0x19,0xe1,0x18,0xec,0xcd,0x2c,0x09,0x18,0xe2,
0x7e,0x4f,0xfe,0x80,0xc8,0xe5,0x2a,0x4b,0x5c,0x7e,0xfe,0x80,0x28,0x25,0xb9,0x28,
0x08,0xc5,0xcd,0xb8,0x19,0xc1,0xeb,0x18,0xf0,0xe6,0xe0,0xfe,0xa0,0x20,0x12,0xd1,
0xd5,0xe5,0x23,0x13,0x1a,0xbe,0x20,0x06,0x17,0x30,0xf7,0xe1,0x18,0x03,0xe1,0x18,
0xe0,0x3e,0xff,0xd1,0xeb,0x3c,0x37,0xcd,0x2c,0x09,0x18,0xc4,0x20,0x10,0x08,0x22,
0x5f,0x5c,0xeb,0xcd,0xb8,0x19,0xcd,0xe8,0x19,0xeb,0x2a,0x5f,0x5c,0x08,0x08,0xd5,
0xcd,0xb8,0x19,0x22,0x5f,0x5c,0x2a,0x53,0x5c,0xe3,0xc5,0x08,0x38,0x07,0x2b,0xcd,
0x55,0x16,0x23,0x18,0x03,0xcd,0x55,0x16,0x23,0xc1,0xd1,0xed,0x53,0x53,0x5c,0xed,
0x5b,0x5f,0x5c,0xc5,0xd5,0xeb,0xed,0xb0,0xe1,0xc1,0xd5,0xcd,0xe8,0x19,0xd1,0xc9,
0xe5,0x3e,0xfd,0xcd,0x01,0x16,0xaf,0x11,0xa1,0x09,0xcd,0x0a,0x0c,0xfd,0xcb,0x02,
0xee,0xcd,0xd4,0x15,0xdd,0xe5,0x11,0x11,0x00,0xaf,0xcd,0xc2,0x04,0xdd,0xe1,0x06,
0x32,0x76,0x10,0xfd,0xdd,0x5e,0x0b,0xdd,0x56,0x0c,0x3e,0xff,0xdd,0xe1,0xc3,0xc2,
0x04,0x80,0x53,0x74,0x61,0x72,0x74,0x20,0x74,0x61,0x70,0x65,0x2c,0x20,0x74,0x68,
0x65,0x6e,0x20,0x70,0x72,0x65,0x73,0x73,0x20,0x61,0x6e,0x79,0x20,0x6b,0x65,0x79,
0xae,0x0d,0x50,0x72,0x6f,0x67,0x72,0x61,0x6d,0x3a,0xa0,0x0d,0x4e,0x75,0x6d,0x62,
0x65,0x72,0x20,0x61,0x72,0x72,0x61,0x79,0x3a,0xa0,0x0d,0x43,0x68,0x61,0x72,0x61,
0x63,0x74,0x65,0x72,0x20,0x61,0x72,0x72,0x61,0x79,0x3a,0xa0,0x0d,0x42,0x79,0x74,
0x65,0x73,0x3a,0xa0,0xcd,0x03,0x0b,0xfe,0x20,0xd2,0xd9,0x0a,0xfe,0x06,0x38,0x69,
0xfe,0x18,0x30,0x65,0x21,0x0b,0x0a,0x5f,0x16,0x00,0x19,0x5e,0x19,0xe5,0xc3,0x03,
0x0b,0x4e,0x57,0x10,0x29,0x54,0x53,0x52,0x37,0x50,0x4f,0x5f,0x5e,0x5d,0x5c,0x5b,
0x5a,0x54,0x53,0x0c,0x3e,0x22,0xb9,0x20,0x11,0xfd,0xcb,0x01,0x4e,0x20,0x09,0x04,
0x0e,0x02,0x3e,0x18,0xb8,0x20,0x03,0x05,0x0e,0x21,0xc3,0xd9,0x0d,0x3a,0x91,0x5c,
0xf5,0xfd,0x36,0x57,0x01,0x3e,0x20,0xcd,0x65,0x0b,0xf1,0x32,0x91,0x5c,0xc9,0xfd,
0xcb,0x01,0x4e,0xc2,0xcd,0x0e,0x0e,0x21,0xcd,0x55,0x0c,0x05,0xc3,0xd9,0x0d,0xcd,
0x03,0x0b,0x79,0x3d,0x3d,0xe6,0x10,0x18,0x5a,0x3e,0x3f,0x18,0x6c,0x11,0x87,0x0a,
0x32,0x0f,0x5c,0x18,0x0b,0x11,0x6d,0x0a,0x18,0x03,0x11,0x87,0x0a,0x32,0x0e,0x5c,
0x2a,0x51,0x5c,0x73,0x23,0x72,0xc9,0x11,0xf4,0x09,0xcd,0x80,0x0a,0x2a,0x0e,0x5c,
0x57,0x7d,0xfe,0x16,0xda,0x11,0x22,0x20,0x29,0x44,0x4a,0x3e,0x1f,0x91,0x38,0x0c,
0xc6,0x02,0x4f,0xfd,0xcb,0x01,0x4e,0x20,0x16,0x3e,0x16,0x90,0xda,0x9f,0x1e,0x3c,
0x47,0x04,0xfd,0xcb,0x02,0x46,0xc2,0x55,0x0c,0xfd,0xbe,0x31,0xda,0x86,0x0c,0xc3,
0xd9,0x0d,0x7c,0xcd,0x03,0x0b,0x81,0x3d,0xe6,0x1f,0xc8,0x57,0xfd,0xcb,0x01,0xc6,
0x3e,0x20,0xcd,0x3b,0x0c,0x15,0x20,0xf8,0xc9,0xcd,0x24,0x0b,0xfd,0xcb,0x01,0x4e,
0x20,0x1a,0xfd,0xcb,0x02,0x46,0x20,0x08,0xed,0x43,0x88,0x5c,0x22,0x84,0x5c,0xc9,
0xed,0x43,0x8a,0x5c,0xed,0x43,0x82,0x5c,0x22,0x86,0x5c,0xc9,0xfd,0x71,0x45,0x22,
0x80,0x5c,0xc9,0xfd,0xcb,0x01,0x4e,0x20,0x14,0xed,0x4b,0x88,0x5c,0x2a,0x84,0x5c,
0xfd,0xcb,0x02,0x46,0xc8,0xed,0x4b,0x8a,0x5c,0x2a,0x86,0x5c,0xc9,0xfd,0x4e,0x45,
0x2a,0x80,0x5c,0xc9,0xfe,0x80,0x38,0x3d,0xfe,0x90,0x30,0x26,0x47,0xcd,0x38,0x0b,
0xcd,0x03,0x0b,0x11,0x92,0x5c,0x18,0x47,0x21,0x92,0x5c,0xcd,0x3e,0x0b,0xcb,0x18,
0x9f,0xe6,0x0f,0x4f,0xcb,0x18,0x9f,0xe6,0xf0,0xb1,0x0e,0x04,0x77,0x23,0x0d,0x20,
0xfb,0xc9,0xd6,0xa5,0x30,0x09,0xc6,0x15,0xc5,0xed,0x4b,0x7b,0x5c,0x18,0x0b,0xcd,
0x10,0x0c,0xc3,0x03,0x0b,0xc5,0xed,0x4b,0x36,0x5c,0xeb,0x21,0x3b,0x5c,0xcb,0x86,
0xfe,0x20,0x20,0x02,0xcb,0xc6,0x26,0x00,0x6f,0x29,0x29,0x29,0x09,0xc1,0xeb,0x79,
0x3d,0x3e,0x21,0x20,0x0e,0x05,0x4f,0xfd,0xcb,0x01,0x4e,0x28,0x06,0xd5,0xcd,0xcd,
0x0e,0xd1,0x79,0xb9,0xd5,0xcc,0x55,0x0c,0xd1,0xc5,0xe5,0x3a,0x91,0x5c,0x06,0xff,
0x1f,0x38,0x01,0x04,0x1f,0x1f,0x9f,0x4f,0x3e,0x08,0xa7,0xfd,0xcb,0x01,0x4e,0x28,
0x05,0xfd,0xcb,0x30,0xce,0x37,0xeb,0x08,0x1a,0xa0,0xae,0xa9,0x12,0x08,0x38,0x13,
0x14,0x23,0x3d,0x20,0xf2,0xeb,0x25,0xfd,0xcb,0x01,0x4e,0xcc,0xdb,0x0b,0xe1,0xc1,
0x0d,0x23,0xc9,0x08,0x3e,0x20,0x83,0x5f,0x08,0x18,0xe6,0x7c,0x0f,0x0f,0x0f,0xe6,
0x03,0xf6,0x58,0x67,0xed,0x5b,0x8f,0x5c,0x7e,0xab,0xa2,0xab,0xfd,0xcb,0x57,0x76,
0x28,0x08,0xe6,0xc7,0xcb,0x57,0x20,0x02,0xee,0x38,0xfd,0xcb,0x57,0x66,0x28,0x08,
0xe6,0xf8,0xcb,0x6f,0x20,0x02,0xee,0x07,0x77,0xc9,0xe5,0x26,0x00,0xe3,0x18,0x04,
0x11,0x95,0x00,0xf5,0xcd,0x41,0x0c,0x38,0x09,0x3e,0x20,0xfd,0xcb,0x01,0x46,0xcc,
0x3b,0x0c,0x1a,0xe6,0x7f,0xcd,0x3b,0x0c,0x1a,0x13,0x87,0x30,0xf5,0xd1,0xfe,0x48,
0x28,0x03,0xfe,0x82,0xd8,0x7a,0xfe,0x03,0xd8,0x3e,0x20,0xd5,0xd9,0xd7,0xd9,0xd1,
0xc9,0xf5,0xeb,0x3c,0xcb,0x7e,0x23,0x28,0xfb,0x3d,0x20,0xf8,0xeb,0xf1,0xfe,0x20,
0xd8,0x1a,0xd6,0x41,0xc9,0xfd,0xcb,0x01,0x4e,0xc0,0x11,0xd9,0x0d,0xd5,0x78,0xfd,
0xcb,0x02,0x46,0xc2,0x02,0x0d,0xfd,0xbe,0x31,0x38,0x1b,0xc0,0xfd,0xcb,0x02,0x66,
0x28,0x16,0xfd,0x5e,0x2d,0x1d,0x28,0x5a,0x3e,0x00,0xcd,0x01,0x16,0xed,0x7b,0x3f,
0x5c,0xfd,0xcb,0x02,0xa6,0xc9,0xcf,0x04,0xfd,0x35,0x52,0x20,0x45,0x3e,0x18,0x90,
0x32,0x8c,0x5c,0x2a,0x8f,0x5c,0xe5,0x3a,0x91,0x5c,0xf5,0x3e,0xfd,0xcd,0x01,0x16,
0xaf,0x11,0xf8,0x0c,0xcd,0x0a,0x0c,0xfd,0xcb,0x02,0xee,0x21,0x3b,0x5c,0xcb,0xde,
0xcb,0xae,0xd9,0xcd,0xd4,0x15,0xd9,0xfe,0x20,0x28,0x45,0xfe,0xe2,0x28,0x41,0xf6,
0x20,0xfe,0x6e,0x28,0x3b,0x3e,0xfe,0xcd,0x01,0x16,0xf1,0x32,0x91,0x5c,0xe1,0x22,
0x8f,0x5c,0xcd,0xfe,0x0d,0xfd,0x46,0x31,0x04,0x0e,0x21,0xc5,0xcd,0x9b,0x0e,0x7c,
0x0f,0x0f,0x0f,0xe6,0x03,0xf6,0x58,0x67,0x11,0xe0,0x5a,0x1a,0x4e,0x06,0x20,0xeb,
0x12,0x71,0x13,0x23,0x10,0xfa,0xc1,0xc9,0x80,0x73,0x63,0x72,0x6f,0x6c,0x6c,0xbf,
0xcf,0x0c,0xfe,0x02,0x38,0x80,0xfd,0x86,0x31,0xd6,0x19,0xd0,0xed,0x44,0xc5,0x47,
0x2a,0x8f,0x5c,0xe5,0x2a,0x91,0x5c,0xe5,0xcd,0x4d,0x0d,0x78,0xf5,0x21,0x6b,0x5c,
0x46,0x78,0x3c,0x77,0x21,0x89,0x5c,0xbe,0x38,0x03,0x34,0x06,0x18,0xcd,0x00,0x0e,
0xf1,0x3d,0x20,0xe8,0xe1,0xfd,0x75,0x57,0xe1,0x22,0x8f,0x5c,0xed,0x4b,0x88,0x5c,
0xfd,0xcb,0x02,0x86,0xcd,0xd9,0x0d,0xfd,0xcb,0x02,0xc6,0xc1,0xc9,0xaf,0x2a,0x8d,
0x5c,0xfd,0xcb,0x02,0x46,0x28,0x04,0x67,0xfd,0x6e,0x0e,0x22,0x8f,0x5c,0x21,0x91,
0x5c,0x20,0x02,0x7e,0x0f,0xae,0xe6,0x55,0xae,0x77,0xc9,0xcd,0xaf,0x0d,0x21,0x3c,
0x5c,0xcb,0xae,0xcb,0xc6,0xcd,0x4d,0x0d,0xfd,0x46,0x31,0xcd,0x44,0x0e,0x21,0xc0,
0x5a,0x3a,0x8d,0x5c,0x05,0x18,0x07,0x0e,0x20,0x2b,0x77,0x0d,0x20,0xfb,0x10,0xf7,
0xfd,0x36,0x31,0x02,0x3e,0xfd,0xcd,0x01,0x16,0x2a,0x51,0x5c,0x11,0xf4,0x09,0xa7,
0x73,0x23,0x72,0x23,0x11,0xa8,0x10,0x3f,0x38,0xf6,0x01,0x21,0x17,0x18,0x2a,0x21,
0x00,0x00,0x22,0x7d,0x5c,0xfd,0xcb,0x30,0x86,0xcd,0x94,0x0d,0x3e,0xfe,0xcd,0x01,
0x16,0xcd,0x4d,0x0d,0x06,0x18,0xcd,0x44,0x0e,0x2a,0x51,0x5c,0x11,0xf4,0x09,0x73,
0x23,0x72,0xfd,0x36,0x52,0x01,0x01,0x21,0x18,0x21,0x00,0x5b,0xfd,0xcb,0x01,0x4e,
0x20,0x12,0x78,0xfd,0xcb,0x02,0x46,0x28,0x05,0xfd,0x86,0x31,0xd6,0x18,0xc5,0x47,
0xcd,0x9b,0x0e,0xc1,0x3e,0x21,0x91,0x5f,0x16,0x00,0x19,0xc3,0xdc,0x0a,0x06,0x17,
0xcd,0x9b,0x0e,0x0e,0x08,0xc5,0xe5,0x78,0xe6,0x07,0x78,0x20,0x0c,0xeb,0x21,0xe0,
0xf8,0x19,0xeb,0x01,0x20,0x00,0x3d,0xed,0xb0,0xeb,0x21,0xe0,0xff,0x19,0xeb,0x47,
0xe6,0x07,0x0f,0x0f,0x0f,0x4f,0x78,0x06,0x00,0xed,0xb0,0x06,0x07,0x09,0xe6,0xf8,
0x20,0xdb,0xe1,0x24,0xc1,0x0d,0x20,0xcd,0xcd,0x88,0x0e,0x21,0xe0,0xff,0x19,0xeb,
0xed,0xb0,0x06,0x01,0xc5,0xcd,0x9b,0x0e,0x0e,0x08,0xc5,0xe5,0x78,0xe6,0x07,0x0f,
0x0f,0x0f,0x4f,0x78,0x06,0x00,0x0d,0x54,0x5d,0x36,0x00,0x13,0xed,0xb0,0x11,0x01,
0x07,0x19,0x3d,0xe6,0xf8,0x47,0x20,0xe5,0xe1,0x24,0xc1,0x0d,0x20,0xdc,0xcd,0x88,
0x0e,0x62,0x6b,0x13,0x3a,0x8d,0x5c,0xfd,0xcb,0x02,0x46,0x28,0x03,0x3a,0x48,0x5c,
0x77,0x0b,0xed,0xb0,0xc1,0x0e,0x21,0xc9,0x7c,0x0f,0x0f,0x0f,0x3d,0xf6,0x50,0x67,
0xeb,0x61,0x68,0x29,0x29,0x29,0x29,0x29,0x44,0x4d,0xc9,0x3e,0x18,0x90,0x57,0x0f,
0x0f,0x0f,0xe6,0xe0,0x6f,0x7a,0xe6,0x18,0xf6,0x40,0x67,0xc9,0xf3,0x06,0xb0,0x21,
0x00,0x40,0xe5,0xc5,0xcd,0xf4,0x0e,0xc1,0xe1,0x24,0x7c,0xe6,0x07,0x20,0x0a,0x7d,
0xc6,0x20,0x6f,0x3f,0x9f,0xe6,0xf8,0x84,0x67,0x10,0xe7,0x18,0x0d,0xf3,0x21,0x00,
0x5b,0x06,0x08,0xc5,0xcd,0xf4,0x0e,0xc1,0x10,0xf9,0x3e,0x04,0xd3,0xfb,0xfb,0x21,
0x00,0x5b,0xfd,0x75,0x46,0xaf,0x47,0x77,0x23,0x10,0xfc,0xfd,0xcb,0x30,0x8e,0x0e,
0x21,0xc3,0xd9,0x0d,0x78,0xfe,0x03,0x9f,0xe6,0x02,0xd3,0xfb,0x57,0xcd,0x54,0x1f,
0x38,0x0a,0x3e,0x04,0xd3,0xfb,0xfb,0xcd,0xdf,0x0e,0xcf,0x0c,0xdb,0xfb,0x87,0xf8,
0x30,0xeb,0x0e,0x20,0x5e,0x23,0x06,0x08,0xcb,0x12,0xcb,0x13,0xcb,0x1a,0xdb,0xfb,
0x1f,0x30,0xfb,0x7a,0xd3,0xfb,0x10,0xf0,0x0d,0x20,0xe9,0xc9,0x2a,0x3d,0x5c,0xe5,
0x21,0x7f,0x10,0xe5,0xed,0x73,0x3d,0x5c,0xcd,0xd4,0x15,0xf5,0x16,0x00,0xfd,0x5e,
0xff,0x21,0xc8,0x00,0xcd,0xb5,0x03,0xf1,0x21,0x38,0x0f,0xe5,0xfe,0x18,0x30,0x31,
0xfe,0x07,0x38,0x2d,0xfe,0x10,0x38,0x3a,0x01,0x02,0x00,0x57,0xfe,0x16,0x38,0x0c,
0x03,0xfd,0xcb,0x37,0x7e,0xca,0x1e,0x10,0xcd,0xd4,0x15,0x5f,0xcd,0xd4,0x15,0xd5,
0x2a,0x5b,0x5c,0xfd,0xcb,0x07,0x86,0xcd,0x55,0x16,0xc1,0x23,0x70,0x23,0x71,0x18,
0x0a,0xfd,0xcb,0x07,0x86,0x2a,0x5b,0x5c,0xcd,0x52,0x16,0x12,0x13,0xed,0x53,0x5b,
0x5c,0xc9,0x5f,0x16,0x00,0x21,0x99,0x0f,0x19,0x5e,0x19,0xe5,0x2a,0x5b,0x5c,0xc9,
0x09,0x66,0x6a,0x50,0xb5,0x70,0x7e,0xcf,0xd4,0x2a,0x49,0x5c,0xfd,0xcb,0x37,0x6e,
0xc2,0x97,0x10,0xcd,0x6e,0x19,0xcd,0x95,0x16,0x7a,0xb3,0xca,0x97,0x10,0xe5,0x23,
0x4e,0x23,0x46,0x21,0x0a,0x00,0x09,0x44,0x4d,0xcd,0x05,0x1f,0xcd,0x97,0x10,0x2a,
0x51,0x5c,0xe3,0xe5,0x3e,0xff,0xcd,0x01,0x16,0xe1,0x2b,0xfd,0x35,0x0f,0xcd,0x55,
0x18,0xfd,0x34,0x0f,0x2a,0x59,0x5c,0x23,0x23,0x23,0x23,0x22,0x5b,0x5c,0xe1,0xcd,
0x15,0x16,0xc9,0xfd,0xcb,0x37,0x6e,0x20,0x08,0x21,0x49,0x5c,0xcd,0x0f,0x19,0x18,
0x6d,0xfd,0x36,0x00,0x10,0x18,0x1d,0xcd,0x31,0x10,0x18,0x05,0x7e,0xfe,0x0d,0xc8,
0x23,0x22,0x5b,0x5c,0xc9,0xcd,0x31,0x10,0x01,0x01,0x00,0xc3,0xe8,0x19,0xcd,0xd4,
0x15,0xcd,0xd4,0x15,0xe1,0xe1,0xe1,0x22,0x3d,0x5c,0xfd,0xcb,0x00,0x7e,0xc0,0xf9,
0xc9,0x37,0xcd,0x95,0x11,0xed,0x52,0x19,0x23,0xc1,0xd8,0xc5,0x44,0x4d,0x62,0x6b,
0x23,0x1a,0xe6,0xf0,0xfe,0x10,0x20,0x09,0x23,0x1a,0xd6,0x17,0xce,0x00,0x20,0x01,
0x23,0xa7,0xed,0x42,0x09,0xeb,0x38,0xe6,0xc9,0xfd,0xcb,0x37,0x6e,0xc0,0x2a,0x49,
0x5c,0xcd,0x6e,0x19,0xeb,0xcd,0x95,0x16,0x21,0x4a,0x5c,0xcd,0x1c,0x19,0xcd,0x95,
0x17,0x3e,0x00,0xc3,0x01,0x16,0xfd,0xcb,0x37,0x7e,0x28,0xa8,0xc3,0x81,0x0f,0xfd,
0xcb,0x30,0x66,0x28,0xa1,0xfd,0x36,0x00,0xff,0x16,0x00,0xfd,0x5e,0xfe,0x21,0x90,
0x1a,0xcd,0xb5,0x03,0xc3,0x30,0x0f,0xe5,0xcd,0x90,0x11,0x2b,0xcd,0xe5,0x19,0x22,
0x5b,0x5c,0xfd,0x36,0x07,0x00,0xe1,0xc9,0xfd,0xcb,0x02,0x5e,0xc4,0x1d,0x11,0xa7,
0xfd,0xcb,0x01,0x6e,0xc8,0x3a,0x08,0x5c,0xfd,0xcb,0x01,0xae,0xf5,0xfd,0xcb,0x02,
0x6e,0xc4,0x6e,0x0d,0xf1,0xfe,0x20,0x30,0x52,0xfe,0x10,0x30,0x2d,0xfe,0x06,0x30,
0x0a,0x47,0xe6,0x01,0x4f,0x78,0x1f,0xc6,0x12,0x18,0x2a,0x20,0x09,0x21,0x6a,0x5c,
0x3e,0x08,0xae,0x77,0x18,0x0e,0xfe,0x0e,0xd8,0xd6,0x0d,0x21,0x41,0x5c,0xbe,0x77,
0x20,0x02,0x36,0x00,0xfd,0xcb,0x02,0xde,0xbf,0xc9,0x47,0xe6,0x07,0x4f,0x3e,0x10,
0xcb,0x58,0x20,0x01,0x3c,0xfd,0x71,0xd3,0x11,0x0d,0x11,0x18,0x06,0x3a,0x0d,0x5c,
0x11,0xa8,0x10,0x2a,0x4f,0x5c,0x23,0x23,0x73,0x23,0x72,0x37,0xc9,0xcd,0x4d,0x0d,
0xfd,0xcb,0x02,0x9e,0xfd,0xcb,0x02,0xae,0x2a,0x8a,0x5c,0xe5,0x2a,0x3d,0x5c,0xe5,
0x21,0x67,0x11,0xe5,0xed,0x73,0x3d,0x5c,0x2a,0x82,0x5c,0xe5,0x37,0xcd,0x95,0x11,
0xeb,0xcd,0x7d,0x18,0xeb,0xcd,0xe1,0x18,0x2a,0x8a,0x5c,0xe3,0xeb,0xcd,0x4d,0x0d,
0x3a,0x8b,0x5c,0x92,0x38,0x26,0x20,0x06,0x7b,0xfd,0x96,0x50,0x30,0x1e,0x3e,0x20,
0xd5,0xcd,0xf4,0x09,0xd1,0x18,0xe9,0x16,0x00,0xfd,0x5e,0xfe,0x21,0x90,0x1a,0xcd,
0xb5,0x03,0xfd,0x36,0x00,0xff,0xed,0x5b,0x8a,0x5c,0x18,0x02,0xd1,0xe1,0xe1,0x22,
0x3d,0x5c,0xc1,0xd5,0xcd,0xd9,0x0d,0xe1,0x22,0x82,0x5c,0xfd,0x36,0x26,0x00,0xc9,
0x2a,0x61,0x5c,0x2b,0xa7,0xed,0x5b,0x59,0x5c,0xfd,0xcb,0x37,0x6e,0xc8,0xed,0x5b,
0x61,0x5c,0xd8,0x2a,0x63,0x5c,0xc9,0x7e,0xfe,0x0e,0x01,0x06,0x00,0xcc,0xe8,0x19,
0x7e,0x23,0xfe,0x0d,0x20,0xf1,0xc9,0xf3,0x3e,0xff,0xed,0x5b,0xb2,0x5c,0xd9,0xed,
0x4b,0xb4,0x5c,0xed,0x5b,0x38,0x5c,0x2a,0x7b,0x5c,0xd9,0x47,0x3e,0x07,0xd3,0xfe,
0x3e,0x3f,0xed,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x62,0x6b,0x36,0x02,0x2b,0xbc,
0x20,0xfa,0xa7,0xed,0x52,0x19,0x23,0x30,0x06,0x35,0x28,0x03,0x35,0x28,0xf3,0x2b,
0xd9,0xed,0x43,0xb4,0x5c,0xed,0x53,0x38,0x5c,0x22,0x7b,0x5c,0xd9,0x04,0x28,0x19,
0x22,0xb4,0x5c,0x11,0xaf,0x3e,0x01,0xa8,0x00,0xeb,0xed,0xb8,0xeb,0x23,0x22,0x7b,
0x5c,0x2b,0x01,0x40,0x00,0xed,0x43,0x38,0x5c,0x22,0xb2,0x5c,0x21,0x00,0x3c,0x22,
0x36,0x5c,0x2a,0xb2,0x5c,0x36,0x3e,0x2b,0xf9,0x2b,0x2b,0x22,0x3d,0x5c,0xed,0x56,
0xfd,0x21,0x3a,0x5c,0xfb,0x21,0xb6,0x5c,0x22,0x4f,0x5c,0x11,0xaf,0x15,0x01,0x15,
0x00,0xeb,0xed,0xb0,0xeb,0x2b,0x22,0x57,0x5c,0x23,0x22,0x53,0x5c,0x22,0x4b,0x5c,
0x36,0x80,0x23,0x22,0x59,0x5c,0x36,0x0d,0x23,0x36,0x80,0x23,0x22,0x61,0x5c,0x22,
0x63,0x5c,0x22,0x65,0x5c,0x3e,0x38,0x32,0x8d,0x5c,0x32,0x8f,0x5c,0x32,0x48,0x5c,
0x21,0x23,0x05,0x22,0x09,0x5c,0xfd,0x35,0xc6,0xfd,0x35,0xca,0x21,0xc6,0x15,0x11,
0x10,0x5c,0x01,0x0e,0x00,0xed,0xb0,0xfd,0xcb,0x01,0xce,0xcd,0xdf,0x0e,0xfd,0x36,
0x31,0x02,0xcd,0x6b,0x0d,0xaf,0x11,0x38,0x15,0xcd,0x0a,0x0c,0xfd,0xcb,0x02,0xee,
0x18,0x07,0xfd,0x36,0x31,0x02,0xcd,0x95,0x17,0xcd,0xb0,0x16,0x3e,0x00,0xcd,0x01,
0x16,0xcd,0x2c,0x0f,0xcd,0x17,0x1b,0xfd,0xcb,0x00,0x7e,0x20,0x12,0xfd,0xcb,0x30,
0x66,0x28,0x40,0x2a,0x59,0x5c,0xcd,0xa7,0x11,0xfd,0x36,0x00,0xff,0x18,0xdd,0x2a,
0x59,0x5c,0x22,0x5d,0x5c,0xcd,0xfb,0x19,0x78,0xb1,0xc2,0x5d,0x15,0xdf,0xfe,0x0d,
0x28,0xc0,0xfd,0xcb,0x30,0x46,0xc4,0xaf,0x0d,0xcd,0x6e,0x0d,0x3e,0x19,0xfd,0x96,
0x4f,0x32,0x8c,0x5c,0xfd,0xcb,0x01,0xfe,0xfd,0x36,0x00,0xff,0xfd,0x36,0x0a,0x01,
0xcd,0x8a,0x1b,0x76,0xfd,0xcb,0x01,0xae,0xfd,0xcb,0x30,0x4e,0xc4,0xcd,0x0e,0x3a,
0x3a,0x5c,0x3c,0xf5,0x21,0x00,0x00,0xfd,0x74,0x37,0xfd,0x74,0x26,0x22,0x0b,0x5c,
0x21,0x01,0x00,0x22,0x16,0x5c,0xcd,0xb0,0x16,0xfd,0xcb,0x37,0xae,0xcd,0x6e,0x0d,
0xfd,0xcb,0x02,0xee,0xf1,0x47,0xfe,0x0a,0x38,0x02,0xc6,0x07,0xcd,0xef,0x15,0x3e,
0x20,0xd7,0x78,0x11,0x91,0x13,0xcd,0x0a,0x0c,0xaf,0x11,0x36,0x15,0xcd,0x0a,0x0c,
0xed,0x4b,0x45,0x5c,0xcd,0x1b,0x1a,0x3e,0x3a,0xd7,0xfd,0x4e,0x0d,0x06,0x00,0xcd,
0x1b,0x1a,0xcd,0x97,0x10,0x3a,0x3a,0x5c,0x3c,0x28,0x1b,0xfe,0x09,0x28,0x04,0xfe,
0x15,0x20,0x03,0xfd,0x34,0x0d,0x01,0x03,0x00,0x11,0x70,0x5c,0x21,0x44,0x5c,0xcb,
0x7e,0x28,0x01,0x09,0xed,0xb8,0xfd,0x36,0x0a,0xff,0xfd,0xcb,0x01,0x9e,0xc3,0xac,
0x12,0x80,0x4f,0xcb,0x4e,0x45,0x58,0x54,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,
0x20,0x46,0x4f,0xd2,0x56,0x61,0x72,0x69,0x61,0x62,0x6c,0x65,0x20,0x6e,0x6f,0x74,
0x20,0x66,0x6f,0x75,0x6e,0xe4,0x53,0x75,0x62,0x73,0x63,0x72,0x69,0x70,0x74,0x20,
0x77,0x72,0x6f,0x6e,0xe7,0x4f,0x75,0x74,0x20,0x6f,0x66,0x20,0x6d,0x65,0x6d,0x6f,
0x72,0xf9,0x4f,0x75,0x74,0x20,0x6f,0x66,0x20,0x73,0x63,0x72,0x65,0x65,0xee,0x4e,
0x75,0x6d,0x62,0x65,0x72,0x20,0x74,0x6f,0x6f,0x20,0x62,0x69,0xe7,0x52,0x45,0x54,
0x55,0x52,0x4e,0x20,0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x47,0x4f,0x53,0x55,
0xc2,0x45,0x6e,0x64,0x20,0x6f,0x66,0x20,0x66,0x69,0x6c,0xe5,0x53,0x54,0x4f,0x50,
0x20,0x73,0x74,0x61,0x74,0x65,0x6d,0x65,0x6e,0xf4,0x49,0x6e,0x76,0x61,0x6c,0x69,
0x64,0x20,0x61,0x72,0x67,0x75,0x6d,0x65,0x6e,0xf4,0x49,0x6e,0x74,0x65,0x67,0x65,
0x72,0x20,0x6f,0x75,0x74,0x20,0x6f,0x66,0x20,0x72,0x61,0x6e,0x67,0xe5,0x4e,0x6f,
0x6e,0x73,0x65,0x6e,0x73,0x65,0x20,0x69,0x6e,0x20,0x42,0x41,0x53,0x49,0xc3,0x42,
0x52,0x45,0x41,0x4b,0x20,0x2d,0x20,0x43,0x4f,0x4e,0x54,0x20,0x72,0x65,0x70,0x65,
0x61,0x74,0xf3,0x4f,0x75,0x74,0x20,0x6f,0x66,0x20,0x44,0x41,0x54,0xc1,0x49,0x6e,
0x76,0x61,0x6c,0x69,0x64,0x20,0x66,0x69,0x6c,0x65,0x20,0x6e,0x61,0x6d,0xe5,0x4e,
0x6f,0x20,0x72,0x6f,0x6f,0x6d,0x20,0x66,0x6f,0x72,0x20,0x6c,0x69,0x6e,0xe5,0x53,
0x54,0x4f,0x50,0x20,0x69,0x6e,0x20,0x49,0x4e,0x50,0x55,0xd4,0x46,0x4f,0x52,0x20,
0x77,0x69,0x74,0x68,0x6f,0x75,0x74,0x20,0x4e,0x45,0x58,0xd4,0x49,0x6e,0x76,0x61,
0x6c,0x69,0x64,0x20,0x49,0x2f,0x4f,0x20,0x64,0x65,0x76,0x69,0x63,0xe5,0x49,0x6e,
0x76,0x61,0x6c,0x69,0x64,0x20,0x63,0x6f,0x6c,0x6f,0x75,0xf2,0x42,0x52,0x45,0x41,
0x4b,0x20,0x69,0x6e,0x74,0x6f,0x20,0x70,0x72,0x6f,0x67,0x72,0x61,0xed,0x52,0x41,
0x4d,0x54,0x4f,0x50,0x20,0x6e,0x6f,0x20,0x67,0x6f,0x6f,0xe4,0x53,0x74,0x61,0x74,
0x65,0x6d,0x65,0x6e,0x74,0x20,0x6c,0x6f,0x73,0xf4,0x49,0x6e,0x76,0x61,0x6c,0x69,
0x64,0x20,0x73,0x74,0x72,0x65,0x61,0xed,0x46,0x4e,0x20,0x77,0x69,0x74,0x68,0x6f,
0x75,0x74,0x20,0x44,0x45,0xc6,0x50,0x61,0x72,0x61,0x6d,0x65,0x74,0x65,0x72,0x20,
0x65,0x72,0x72,0x6f,0xf2,0x54,0x61,0x70,0x65,0x20,0x6c,0x6f,0x61,0x64,0x69,0x6e,
0x67,0x20,0x65,0x72,0x72,0x6f,0xf2,0x2c,0xa0,0x7f,0x20,0x31,0x39,0x38,0x32,0x20,
0x53,0x69,0x6e,0x63,0x6c,0x61,0x69,0x72,0x20,0x52,0x65,0x73,0x65,0x61,0x72,0x63,
0x68,0x20,0x4c,0x74,0xe4,0x3e,0x10,0x01,0x00,0x00,0xc3,0x13,0x13,0xed,0x43,0x49,
0x5c,0x2a,0x5d,0x5c,0xeb,0x21,0x55,0x15,0xe5,0x2a,0x61,0x5c,0x37,0xed,0x52,0xe5,
0x60,0x69,0xcd,0x6e,0x19,0x20,0x06,0xcd,0xb8,0x19,0xcd,0xe8,0x19,0xc1,0x79,0x3d,
0xb0,0x28,0x28,0xc5,0x03,0x03,0x03,0x03,0x2b,0xed,0x5b,0x53,0x5c,0xd5,0xcd,0x55,
0x16,0xe1,0x22,0x53,0x5c,0xc1,0xc5,0x13,0x2a,0x61,0x5c,0x2b,0x2b,0xed,0xb8,0x2a,
0x49,0x5c,0xeb,0xc1,0x70,0x2b,0x71,0x2b,0x73,0x2b,0x72,0xf1,0xc3,0xa2,0x12,0xf4,
0x09,0xa8,0x10,0x4b,0xf4,0x09,0xc4,0x15,0x53,0x81,0x0f,0xc4,0x15,0x52,0xf4,0x09,
0xc4,0x15,0x50,0x80,0xcf,0x12,0x01,0x00,0x06,0x00,0x0b,0x00,0x01,0x00,0x01,0x00,
0x06,0x00,0x10,0x00,0xfd,0xcb,0x02,0x6e,0x20,0x04,0xfd,0xcb,0x02,0xde,0xcd,0xe6,
0x15,0xd8,0x28,0xfa,0xcf,0x07,0xd9,0xe5,0x2a,0x51,0x5c,0x23,0x23,0x18,0x08,0x1e,
0x30,0x83,0xd9,0xe5,0x2a,0x51,0x5c,0x5e,0x23,0x56,0xeb,0xcd,0x2c,0x16,0xe1,0xd9,
0xc9,0x87,0xc6,0x16,0x6f,0x26,0x5c,0x5e,0x23,0x56,0x7a,0xb3,0x20,0x02,0xcf,0x17,
0x1b,0x2a,0x4f,0x5c,0x19,0x22,0x51,0x5c,0xfd,0xcb,0x30,0xa6,0x23,0x23,0x23,0x23,
0x4e,0x21,0x2d,0x16,0xcd,0xdc,0x16,0xd0,0x16,0x00,0x5e,0x19,0xe9,0x4b,0x06,0x53,
0x12,0x50,0x1b,0x00,0xfd,0xcb,0x02,0xc6,0xfd,0xcb,0x01,0xae,0xfd,0xcb,0x30,0xe6,
0x18,0x04,0xfd,0xcb,0x02,0x86,0xfd,0xcb,0x01,0x8e,0xc3,0x4d,0x0d,0xfd,0xcb,0x01,
0xce,0xc9,0x01,0x01,0x00,0xe5,0xcd,0x05,0x1f,0xe1,0xcd,0x64,0x16,0x2a,0x65,0x5c,
0xeb,0xed,0xb8,0xc9,0xf5,0xe5,0x21,0x4b,0x5c,0x3e,0x0e,0x5e,0x23,0x56,0xe3,0xa7,
0xed,0x52,0x19,0xe3,0x30,0x09,0xd5,0xeb,0x09,0xeb,0x72,0x2b,0x73,0x23,0xd1,0x23,
0x3d,0x20,0xe8,0xeb,0xd1,0xf1,0xa7,0xed,0x52,0x44,0x4d,0x03,0x19,0xeb,0xc9,0x00,
0x00,0xeb,0x11,0x8f,0x16,0x7e,0xe6,0xc0,0x20,0xf7,0x56,0x23,0x5e,0xc9,0x2a,0x63,
0x5c,0x2b,0xcd,0x55,0x16,0x23,0x23,0xc1,0xed,0x43,0x61,0x5c,0xc1,0xeb,0x23,0xc9,
0x2a,0x59,0x5c,0x36,0x0d,0x22,0x5b,0x5c,0x23,0x36,0x80,0x23,0x22,0x61,0x5c,0x2a,
0x61,0x5c,0x22,0x63,0x5c,0x2a,0x63,0x5c,0x22,0x65,0x5c,0xe5,0x21,0x92,0x5c,0x22,
0x68,0x5c,0xe1,0xc9,0x5d,0x5b,0x59,0x5c,0xc3,0xe5,0x19,0x23,0x7e,0xa7,0xc8,0xb9,
0x23,0x20,0xf8,0x37,0xc9,0xcd,0x1e,0x17,0xcd,0x01,0x17,0x01,0x00,0x00,0x11,0xe2,
0xa3,0xeb,0x19,0x38,0x07,0x01,0xd4,0x15,0x09,0x4e,0x23,0x46,0xeb,0x71,0x23,0x70,
0xc9,0xe5,0x2a,0x4f,0x5c,0x09,0x23,0x23,0x23,0x4e,0xeb,0x21,0x16,0x17,0xcd,0xdc,
0x16,0x4e,0x06,0x00,0x09,0xe9,0x4b,0x05,0x53,0x03,0x50,0x01,0xe1,0xc9,0xcd,0x94,
0x1e,0xfe,0x10,0x38,0x02,0xcf,0x17,0xc6,0x03,0x07,0x21,0x10,0x5c,0x4f,0x06,0x00,
0x09,0x4e,0x23,0x46,0x2b,0xc9,0xef,0x01,0x38,0xcd,0x1e,0x17,0x78,0xb1,0x28,0x16,
0xeb,0x2a,0x4f,0x5c,0x09,0x23,0x23,0x23,0x7e,0xeb,0xfe,0x4b,0x28,0x08,0xfe,0x53,
0x28,0x04,0xfe,0x50,0x20,0xcf,0xcd,0x5d,0x17,0x73,0x23,0x72,0xc9,0xe5,0xcd,0xf1,
0x2b,0x78,0xb1,0x20,0x02,0xcf,0x0e,0xc5,0x1a,0xe6,0xdf,0x4f,0x21,0x7a,0x17,0xcd,
0xdc,0x16,0x30,0xf1,0x4e,0x06,0x00,0x09,0xc1,0xe9,0x4b,0x06,0x53,0x08,0x50,0x0a,
0x00,0x1e,0x01,0x18,0x06,0x1e,0x06,0x18,0x02,0x1e,0x10,0x0b,0x78,0xb1,0x20,0xd5,
0x57,0xe1,0xc9,0x18,0x90,0xed,0x73,0x3f,0x5c,0xfd,0x36,0x02,0x10,0xcd,0xaf,0x0d,
0xfd,0xcb,0x02,0xc6,0xfd,0x46,0x31,0xcd,0x44,0x0e,0xfd,0xcb,0x02,0x86,0xfd,0xcb,
0x30,0xc6,0x2a,0x49,0x5c,0xed,0x5b,0x6c,0x5c,0xa7,0xed,0x52,0x19,0x38,0x22,0xd5,
0xcd,0x6e,0x19,0x11,0xc0,0x02,0xeb,0xed,0x52,0xe3,0xcd,0x6e,0x19,0xc1,0xc5,0xcd,
0xb8,0x19,0xc1,0x09,0x38,0x0e,0xeb,0x56,0x23,0x5e,0x2b,0xed,0x53,0x6c,0x5c,0x18,
0xed,0x22,0x6c,0x5c,0x2a,0x6c,0x5c,0xcd,0x6e,0x19,0x28,0x01,0xeb,0xcd,0x33,0x18,
0xfd,0xcb,0x02,0xa6,0xc9,0x3e,0x03,0x18,0x02,0x3e,0x02,0xfd,0x36,0x02,0x00,0xcd,
0x30,0x25,0xc4,0x01,0x16,0xdf,0xcd,0x70,0x20,0x38,0x14,0xdf,0xfe,0x3b,0x28,0x04,
0xfe,0x2c,0x20,0x06,0xe7,0xcd,0x82,0x1c,0x18,0x08,0xcd,0xe6,0x1c,0x18,0x03,0xcd,
0xde,0x1c,0xcd,0xee,0x1b,0xcd,0x99,0x1e,0x78,0xe6,0x3f,0x67,0x69,0x22,0x49,0x5c,
0xcd,0x6e,0x19,0x1e,0x01,0xcd,0x55,0x18,0xd7,0xfd,0xcb,0x02,0x66,0x28,0xf6,0x3a,
0x6b,0x5c,0xfd,0x96,0x4f,0x20,0xee,0xab,0xc8,0xe5,0xd5,0x21,0x6c,0x5c,0xcd,0x0f,
0x19,0xd1,0xe1,0x18,0xe0,0xed,0x4b,0x49,0x5c,0xcd,0x80,0x19,0x16,0x3e,0x28,0x05,
0x11,0x00,0x00,0xcb,0x13,0xfd,0x73,0x2d,0x7e,0xfe,0x40,0xc1,0xd0,0xc5,0xcd,0x28,
0x1a,0x23,0x23,0x23,0xfd,0xcb,0x01,0x86,0x7a,0xa7,0x28,0x05,0xd7,0xfd,0xcb,0x01,
0xc6,0xd5,0xeb,0xfd,0xcb,0x30,0x96,0x21,0x3b,0x5c,0xcb,0x96,0xfd,0xcb,0x37,0x6e,
0x28,0x02,0xcb,0xd6,0x2a,0x5f,0x5c,0xa7,0xed,0x52,0x20,0x05,0x3e,0x3f,0xcd,0xc1,
0x18,0xcd,0xe1,0x18,0xeb,0x7e,0xcd,0xb6,0x18,0x23,0xfe,0x0d,0x28,0x06,0xeb,0xcd,
0x37,0x19,0x18,0xe0,0xd1,0xc9,0xfe,0x0e,0xc0,0x23,0x23,0x23,0x23,0x23,0x23,0x7e,
0xc9,0xd9,0x2a,0x8f,0x5c,0xe5,0xcb,0xbc,0xcb,0xfd,0x22,0x8f,0x5c,0x21,0x91,0x5c,
0x56,0xd5,0x36,0x00,0xcd,0xf4,0x09,0xe1,0xfd,0x74,0x57,0xe1,0x22,0x8f,0x5c,0xd9,
0xc9,0x2a,0x5b,0x5c,0xa7,0xed,0x52,0xc0,0x3a,0x41,0x5c,0xcb,0x07,0x28,0x04,0xc6,
0x43,0x18,0x16,0x21,0x3b,0x5c,0xcb,0x9e,0x3e,0x4b,0xcb,0x56,0x28,0x0b,0xcb,0xde,
0x3c,0xfd,0xcb,0x30,0x5e,0x28,0x02,0x3e,0x43,0xd5,0xcd,0xc1,0x18,0xd1,0xc9,0x5e,
0x23,0x56,0xe5,0xeb,0x23,0xcd,0x6e,0x19,0xcd,0x95,0x16,0xe1,0xfd,0xcb,0x37,0x6e,
0xc0,0x72,0x2b,0x73,0xc9,0x7b,0xa7,0xf8,0x18,0x0d,0xaf,0x09,0x3c,0x38,0xfc,0xed,
0x42,0x3d,0x28,0xf1,0xc3,0xef,0x15,0xcd,0x1b,0x2d,0x30,0x30,0xfe,0x21,0x38,0x2c,
0xfd,0xcb,0x01,0x96,0xfe,0xcb,0x28,0x24,0xfe,0x3a,0x20,0x0e,0xfd,0xcb,0x37,0x6e,
0x20,0x16,0xfd,0xcb,0x30,0x56,0x28,0x14,0x18,0x0e,0xfe,0x22,0x20,0x0a,0xf5,0x3a,
0x6a,0x5c,0xee,0x04,0x32,0x6a,0x5c,0xf1,0xfd,0xcb,0x01,0xd6,0xd7,0xc9,0xe5,0x2a,
0x53,0x5c,0x54,0x5d,0xc1,0xcd,0x80,0x19,0xd0,0xc5,0xcd,0xb8,0x19,0xeb,0x18,0xf4,
0x7e,0xb8,0xc0,0x23,0x7e,0x2b,0xb9,0xc9,0x23,0x23,0x23,0x22,0x5d,0x5c,0x0e,0x00,
0x15,0xc8,0xe7,0xbb,0x20,0x04,0xa7,0xc9,0x23,0x7e,0xcd,0xb6,0x18,0x22,0x5d,0x5c,
0xfe,0x22,0x20,0x01,0x0d,0xfe,0x3a,0x28,0x04,0xfe,0xcb,0x20,0x04,0xcb,0x41,0x28,
0xdf,0xfe,0x0d,0x20,0xe3,0x15,0x37,0xc9,0xe5,0x7e,0xfe,0x40,0x38,0x17,0xcb,0x6f,
0x28,0x14,0x87,0xfa,0xc7,0x19,0x3f,0x01,0x05,0x00,0x30,0x02,0x0e,0x12,0x17,0x23,
0x7e,0x30,0xfb,0x18,0x06,0x23,0x23,0x4e,0x23,0x46,0x23,0x09,0xd1,0xa7,0xed,0x52,
0x44,0x4d,0x19,0xeb,0xc9,0xcd,0xdd,0x19,0xc5,0x78,0x2f,0x47,0x79,0x2f,0x4f,0x03,
0xcd,0x64,0x16,0xeb,0xe1,0x19,0xd5,0xed,0xb0,0xe1,0xc9,0x2a,0x59,0x5c,0x2b,0x22,
0x5d,0x5c,0xe7,0x21,0x92,0x5c,0x22,0x65,0x5c,0xcd,0x3b,0x2d,0xcd,0xa2,0x2d,0x38,
0x04,0x21,0xf0,0xd8,0x09,0xda,0x8a,0x1c,0xc3,0xc5,0x16,0xd5,0xe5,0xaf,0xcb,0x78,
0x20,0x20,0x60,0x69,0x1e,0xff,0x18,0x08,0xd5,0x56,0x23,0x5e,0xe5,0xeb,0x1e,0x20,
0x01,0x18,0xfc,0xcd,0x2a,0x19,0x01,0x9c,0xff,0xcd,0x2a,0x19,0x0e,0xf6,0xcd,0x2a,
0x19,0x7d,0xcd,0xef,0x15,0xe1,0xd1,0xc9,0xb1,0xcb,0xbc,0xbf,0xc4,0xaf,0xb4,0x93,
0x91,0x92,0x95,0x98,0x98,0x98,0x98,0x98,0x98,0x98,0x7f,0x81,0x2e,0x6c,0x6e,0x70,
0x48,0x94,0x56,0x3f,0x41,0x2b,0x17,0x1f,0x37,0x77,0x44,0x0f,0x59,0x2b,0x43,0x2d,
0x51,0x3a,0x6d,0x42,0x0d,0x49,0x5c,0x44,0x15,0x5d,0x01,0x3d,0x02,0x06,0x00,0x67,
0x1e,0x06,0xcb,0x05,0xf0,0x1c,0x06,0x00,0xed,0x1e,0x00,0xee,0x1c,0x00,0x23,0x1f,
0x04,0x3d,0x06,0xcc,0x06,0x05,0x03,0x1d,0x04,0x00,0xab,0x1d,0x05,0xcd,0x1f,0x05,
0x89,0x20,0x05,0x02,0x2c,0x05,0xb2,0x1b,0x00,0xb7,0x11,0x03,0xa1,0x1e,0x05,0xf9,
0x17,0x08,0x00,0x80,0x1e,0x03,0x4f,0x1e,0x00,0x5f,0x1e,0x03,0xac,0x1e,0x00,0x6b,
0x0d,0x09,0x00,0xdc,0x22,0x06,0x00,0x3a,0x1f,0x05,0xed,0x1d,0x05,0x27,0x1e,0x03,
0x42,0x1e,0x09,0x05,0x82,0x23,0x00,0xac,0x0e,0x05,0xc9,0x1f,0x05,0xf5,0x17,0x0b,
0x0b,0x0b,0x0b,0x08,0x00,0xf8,0x03,0x09,0x05,0x20,0x23,0x07,0x07,0x07,0x07,0x07,
0x07,0x08,0x00,0x7a,0x1e,0x06,0x00,0x94,0x22,0x05,0x60,0x1f,0x06,0x2c,0x0a,0x00,
0x36,0x17,0x06,0x00,0xe5,0x16,0x0a,0x00,0x93,0x17,0x0a,0x2c,0x0a,0x00,0x93,0x17,
0x0a,0x00,0x93,0x17,0x00,0x93,0x17,0xfd,0xcb,0x01,0xbe,0xcd,0xfb,0x19,0xaf,0x32,
0x47,0x5c,0x3d,0x32,0x3a,0x5c,0x18,0x01,0xe7,0xcd,0xbf,0x16,0xfd,0x34,0x0d,0xfa,
0x8a,0x1c,0xdf,0x06,0x00,0xfe,0x0d,0x28,0x7a,0xfe,0x3a,0x28,0xeb,0x21,0x76,0x1b,
0xe5,0x4f,0xe7,0x79,0xd6,0xce,0xda,0x8a,0x1c,0x4f,0x21,0x48,0x1a,0x09,0x4e,0x09,
0x18,0x03,0x2a,0x74,0x5c,0x7e,0x23,0x22,0x74,0x5c,0x01,0x52,0x1b,0xc5,0x4f,0xfe,
0x20,0x30,0x0c,0x21,0x01,0x1c,0x06,0x00,0x09,0x4e,0x09,0xe5,0xdf,0x05,0xc9,0xdf,
0xb9,0xc2,0x8a,0x1c,0xe7,0xc9,0xcd,0x54,0x1f,0x38,0x02,0xcf,0x14,0xfd,0xcb,0x0a,
0x7e,0x20,0x71,0x2a,0x42,0x5c,0xcb,0x7c,0x28,0x14,0x21,0xfe,0xff,0x22,0x45,0x5c,
0x2a,0x61,0x5c,0x2b,0xed,0x5b,0x59,0x5c,0x1b,0x3a,0x44,0x5c,0x18,0x33,0xcd,0x6e,
0x19,0x3a,0x44,0x5c,0x28,0x19,0xa7,0x20,0x43,0x47,0x7e,0xe6,0xc0,0x78,0x28,0x0f,
0xcf,0xff,0xc1,0xcd,0x30,0x25,0xc8,0x2a,0x55,0x5c,0x3e,0xc0,0xa6,0xc0,0xaf,0xfe,
0x01,0xce,0x00,0x56,0x23,0x5e,0xed,0x53,0x45,0x5c,0x23,0x5e,0x23,0x56,0xeb,0x19,
0x23,0x22,0x55,0x5c,0xeb,0x22,0x5d,0x5c,0x57,0x1e,0x00,0xfd,0x36,0x0a,0xff,0x15,
0xfd,0x72,0x0d,0xca,0x28,0x1b,0x14,0xcd,0x8b,0x19,0x28,0x08,0xcf,0x16,0xcd,0x30,
0x25,0xc0,0xc1,0xc1,0xdf,0xfe,0x0d,0x28,0xba,0xfe,0x3a,0xca,0x28,0x1b,0xc3,0x8a,
0x1c,0x0f,0x1d,0x4b,0x09,0x67,0x0b,0x7b,0x8e,0x71,0xb4,0x81,0xcf,0xcd,0xde,0x1c,
0xbf,0xc1,0xcc,0xee,0x1b,0xeb,0x2a,0x74,0x5c,0x4e,0x23,0x46,0xeb,0xc5,0xc9,0xcd,
0xb2,0x28,0xfd,0x36,0x37,0x00,0x30,0x08,0xfd,0xcb,0x37,0xce,0x20,0x18,0xcf,0x01,
0xcc,0x96,0x29,0xfd,0xcb,0x01,0x76,0x20,0x0d,0xaf,0xcd,0x30,0x25,0xc4,0xf1,0x2b,
0x21,0x71,0x5c,0xb6,0x77,0xeb,0xed,0x43,0x72,0x5c,0x22,0x4d,0x5c,0xc9,0xc1,0xcd,
0x56,0x1c,0xcd,0xee,0x1b,0xc9,0x3a,0x3b,0x5c,0xf5,0xcd,0xfb,0x24,0xf1,0xfd,0x56,
0x01,0xaa,0xe6,0x40,0x20,0x24,0xcb,0x7a,0xc2,0xff,0x2a,0xc9,0xcd,0xb2,0x28,0xf5,
0x79,0xf6,0x9f,0x3c,0x20,0x14,0xf1,0x18,0xa9,0xe7,0xcd,0x82,0x1c,0xfe,0x2c,0x20,
0x09,0xe7,0xcd,0xfb,0x24,0xfd,0xcb,0x01,0x76,0xc0,0xcf,0x0b,0xcd,0xfb,0x24,0xfd,
0xcb,0x01,0x76,0xc8,0x18,0xf4,0xfd,0xcb,0x01,0x7e,0xfd,0xcb,0x02,0x86,0xc4,0x4d,
0x0d,0xf1,0x3a,0x74,0x5c,0xd6,0x13,0xcd,0xfc,0x21,0xcd,0xee,0x1b,0x2a,0x8f,0x5c,
0x22,0x8d,0x5c,0x21,0x91,0x5c,0x7e,0x07,0xae,0xe6,0xaa,0xae,0x77,0xc9,0xcd,0x30,
0x25,0x28,0x13,0xfd,0xcb,0x02,0x86,0xcd,0x4d,0x0d,0x21,0x90,0x5c,0x7e,0xf6,0xf8,
0x77,0xfd,0xcb,0x57,0xb6,0xdf,0xcd,0xe2,0x21,0x18,0x9f,0xc3,0x05,0x06,0xfe,0x0d,
0x28,0x04,0xfe,0x3a,0x20,0x9c,0xcd,0x30,0x25,0xc8,0xef,0xa0,0x38,0xc9,0xcf,0x08,
0xc1,0xcd,0x30,0x25,0x28,0x0a,0xef,0x02,0x38,0xeb,0xcd,0xe9,0x34,0xda,0xb3,0x1b,
0xc3,0x29,0x1b,0xfe,0xcd,0x20,0x09,0xe7,0xcd,0x82,0x1c,0xcd,0xee,0x1b,0x18,0x06,
0xcd,0xee,0x1b,0xef,0xa1,0x38,0xef,0xc0,0x02,0x01,0xe0,0x01,0x38,0xcd,0xff,0x2a,
0x22,0x68,0x5c,0x2b,0x7e,0xcb,0xfe,0x01,0x06,0x00,0x09,0x07,0x38,0x06,0x0e,0x0d,
0xcd,0x55,0x16,0x23,0xe5,0xef,0x02,0x02,0x38,0xe1,0xeb,0x0e,0x0a,0xed,0xb0,0x2a,
0x45,0x5c,0xeb,0x73,0x23,0x72,0xfd,0x56,0x0d,0x14,0x23,0x72,0xcd,0xda,0x1d,0xd0,
0xfd,0x46,0x38,0x2a,0x45,0x5c,0x22,0x42,0x5c,0x3a,0x47,0x5c,0xed,0x44,0x57,0x2a,
0x5d,0x5c,0x1e,0xf3,0xc5,0xed,0x4b,0x55,0x5c,0xcd,0x86,0x1d,0xed,0x43,0x55,0x5c,
0xc1,0x38,0x11,0xe7,0xf6,0x20,0xb8,0x28,0x03,0xe7,0x18,0xe8,0xe7,0x3e,0x01,0x92,
0x32,0x44,0x5c,0xc9,0xcf,0x11,0x7e,0xfe,0x3a,0x28,0x18,0x23,0x7e,0xe6,0xc0,0x37,
0xc0,0x46,0x23,0x4e,0xed,0x43,0x42,0x5c,0x23,0x4e,0x23,0x46,0xe5,0x09,0x44,0x4d,
0xe1,0x16,0x00,0xc5,0xcd,0x8b,0x19,0xc1,0xd0,0x18,0xe0,0xfd,0xcb,0x37,0x4e,0xc2,
0x2e,0x1c,0x2a,0x4d,0x5c,0xcb,0x7e,0x28,0x1f,0x23,0x22,0x68,0x5c,0xef,0xe0,0xe2,
0x0f,0xc0,0x02,0x38,0xcd,0xda,0x1d,0xd8,0x2a,0x68,0x5c,0x11,0x0f,0x00,0x19,0x5e,
0x23,0x56,0x23,0x66,0xeb,0xc3,0x73,0x1e,0xcf,0x00,0xef,0xe1,0xe0,0xe2,0x36,0x00,
0x02,0x01,0x03,0x37,0x00,0x04,0x38,0xa7,0xc9,0x38,0x37,0xc9,0xe7,0xcd,0x1f,0x1c,
0xcd,0x30,0x25,0x28,0x29,0xdf,0x22,0x5f,0x5c,0x2a,0x57,0x5c,0x7e,0xfe,0x2c,0x28,
0x09,0x1e,0xe4,0xcd,0x86,0x1d,0x30,0x02,0xcf,0x0d,0xcd,0x77,0x00,0xcd,0x56,0x1c,
0xdf,0x22,0x57,0x5c,0x2a,0x5f,0x5c,0xfd,0x36,0x26,0x00,0xcd,0x78,0x00,0xdf,0xfe,
0x2c,0x28,0xc9,0xcd,0xee,0x1b,0xc9,0xcd,0x30,0x25,0x20,0x0b,0xcd,0xfb,0x24,0xfe,
0x2c,0xc4,0xee,0x1b,0xe7,0x18,0xf5,0x3e,0xe4,0x47,0xed,0xb9,0x11,0x00,0x02,0xc3,
0x8b,0x19,0xcd,0x99,0x1e,0x60,0x69,0xcd,0x6e,0x19,0x2b,0x22,0x57,0x5c,0xc9,0xcd,
0x99,0x1e,0x78,0xb1,0x20,0x04,0xed,0x4b,0x78,0x5c,0xed,0x43,0x76,0x5c,0xc9,0x2a,
0x6e,0x5c,0xfd,0x56,0x36,0x18,0x0c,0xcd,0x99,0x1e,0x60,0x69,0x16,0x00,0x7c,0xfe,
0xf0,0x30,0x2c,0x22,0x42,0x5c,0xfd,0x72,0x0a,0xc9,0xcd,0x85,0x1e,0xed,0x79,0xc9,
0xcd,0x85,0x1e,0x02,0xc9,0xcd,0xd5,0x2d,0x38,0x15,0x28,0x02,0xed,0x44,0xf5,0xcd,
0x99,0x1e,0xf1,0xc9,0xcd,0xd5,0x2d,0x18,0x03,0xcd,0xa2,0x2d,0x38,0x01,0xc8,0xcf,
0x0a,0xcd,0x67,0x1e,0x01,0x00,0x00,0xcd,0x45,0x1e,0x18,0x03,0xcd,0x99,0x1e,0x78,
0xb1,0x20,0x04,0xed,0x4b,0xb2,0x5c,0xc5,0xed,0x5b,0x4b,0x5c,0x2a,0x59,0x5c,0x2b,
0xcd,0xe5,0x19,0xcd,0x6b,0x0d,0x2a,0x65,0x5c,0x11,0x32,0x00,0x19,0xd1,0xed,0x52,
0x30,0x08,0x2a,0xb4,0x5c,0xa7,0xed,0x52,0x30,0x02,0xcf,0x15,0xeb,0x22,0xb2,0x5c,
0xd1,0xc1,0x36,0x3e,0x2b,0xf9,0xc5,0xed,0x73,0x3d,0x5c,0xeb,0xe9,0xd1,0xfd,0x66,
0x0d,0x24,0xe3,0x33,0xed,0x4b,0x45,0x5c,0xc5,0xe5,0xed,0x73,0x3d,0x5c,0xd5,0xcd,
0x67,0x1e,0x01,0x14,0x00,0x2a,0x65,0x5c,0x09,0x38,0x0a,0xeb,0x21,0x50,0x00,0x19,
0x38,0x03,0xed,0x72,0xd8,0x2e,0x03,0xc3,0x55,0x00,0x01,0x00,0x00,0xcd,0x05,0x1f,
0x44,0x4d,0xc9,0xc1,0xe1,0xd1,0x7a,0xfe,0x3e,0x28,0x0b,0x3b,0xe3,0xeb,0xed,0x73,
0x3d,0x5c,0xc5,0xc3,0x73,0x1e,0xd5,0xe5,0xcf,0x06,0xcd,0x99,0x1e,0x76,0x0b,0x78,
0xb1,0x28,0x0c,0x78,0xa1,0x3c,0x20,0x01,0x03,0xfd,0xcb,0x01,0x6e,0x28,0xee,0xfd,
0xcb,0x01,0xae,0xc9,0x3e,0x7f,0xdb,0xfe,0x1f,0xd8,0x3e,0xfe,0xdb,0xfe,0x1f,0xc9,
0xcd,0x30,0x25,0x28,0x05,0x3e,0xce,0xc3,0x39,0x1e,0xfd,0xcb,0x01,0xf6,0xcd,0x8d,
0x2c,0x30,0x16,0xe7,0xfe,0x24,0x20,0x05,0xfd,0xcb,0x01,0xb6,0xe7,0xfe,0x28,0x20,
0x3c,0xe7,0xfe,0x29,0x28,0x20,0xcd,0x8d,0x2c,0xd2,0x8a,0x1c,0xeb,0xe7,0xfe,0x24,
0x20,0x02,0xeb,0xe7,0xeb,0x01,0x06,0x00,0xcd,0x55,0x16,0x23,0x23,0x36,0x0e,0xfe,
0x2c,0x20,0x03,0xe7,0x18,0xe0,0xfe,0x29,0x20,0x13,0xe7,0xfe,0x3d,0x20,0x0e,0xe7,
0x3a,0x3b,0x5c,0xf5,0xcd,0xfb,0x24,0xf1,0xfd,0xae,0x01,0xe6,0x40,0xc2,0x8a,0x1c,
0xcd,0xee,0x1b,0xcd,0x30,0x25,0xe1,0xc8,0xe9,0x3e,0x03,0x18,0x02,0x3e,0x02,0xcd,
0x30,0x25,0xc4,0x01,0x16,0xcd,0x4d,0x0d,0xcd,0xdf,0x1f,0xcd,0xee,0x1b,0xc9,0xdf,
0xcd,0x45,0x20,0x28,0x0d,0xcd,0x4e,0x20,0x28,0xfb,0xcd,0xfc,0x1f,0xcd,0x4e,0x20,
0x28,0xf3,0xfe,0x29,0xc8,0xcd,0xc3,0x1f,0x3e,0x0d,0xd7,0xc9,0xdf,0xfe,0xac,0x20,
0x0d,0xcd,0x79,0x1c,0xcd,0xc3,0x1f,0xcd,0x07,0x23,0x3e,0x16,0x18,0x10,0xfe,0xad,
0x20,0x12,0xe7,0xcd,0x82,0x1c,0xcd,0xc3,0x1f,0xcd,0x99,0x1e,0x3e,0x17,0xd7,0x79,
0xd7,0x78,0xd7,0xc9,0xcd,0xf2,0x21,0xd0,0xcd,0x70,0x20,0xd0,0xcd,0xfb,0x24,0xcd,
0xc3,0x1f,0xfd,0xcb,0x01,0x76,0xcc,0xf1,0x2b,0xc2,0xe3,0x2d,0x78,0xb1,0x0b,0xc8,
0x1a,0x13,0xd7,0x18,0xf7,0xfe,0x29,0xc8,0xfe,0x0d,0xc8,0xfe,0x3a,0xc9,0xdf,0xfe,
0x3b,0x28,0x14,0xfe,0x2c,0x20,0x0a,0xcd,0x30,0x25,0x28,0x0b,0x3e,0x06,0xd7,0x18,
0x06,0xfe,0x27,0xc0,0xcd,0xf5,0x1f,0xe7,0xcd,0x45,0x20,0x20,0x01,0xc1,0xbf,0xc9,
0xfe,0x23,0x37,0xc0,0xe7,0xcd,0x82,0x1c,0xa7,0xcd,0xc3,0x1f,0xcd,0x94,0x1e,0xfe,
0x10,0xd2,0x0e,0x16,0xcd,0x01,0x16,0xa7,0xc9,0xcd,0x30,0x25,0x28,0x08,0x3e,0x01,
0xcd,0x01,0x16,0xcd,0x6e,0x0d,0xfd,0x36,0x02,0x01,0xcd,0xc1,0x20,0xcd,0xee,0x1b,
0xed,0x4b,0x88,0x5c,0x3a,0x6b,0x5c,0xb8,0x38,0x03,0x0e,0x21,0x47,0xed,0x43,0x88,
0x5c,0x3e,0x19,0x90,0x32,0x8c,0x5c,0xfd,0xcb,0x02,0x86,0xcd,0xd9,0x0d,0xc3,0x6e,
0x0d,0xcd,0x4e,0x20,0x28,0xfb,0xfe,0x28,0x20,0x0e,0xe7,0xcd,0xdf,0x1f,0xdf,0xfe,
0x29,0xc2,0x8a,0x1c,0xe7,0xc3,0xb2,0x21,0xfe,0xca,0x20,0x11,0xe7,0xcd,0x1f,0x1c,
0xfd,0xcb,0x37,0xfe,0xfd,0xcb,0x01,0x76,0xc2,0x8a,0x1c,0x18,0x0d,0xcd,0x8d,0x2c,
0xd2,0xaf,0x21,0xcd,0x1f,0x1c,0xfd,0xcb,0x37,0xbe,0xcd,0x30,0x25,0xca,0xb2,0x21,
0xcd,0xbf,0x16,0x21,0x71,0x5c,0xcb,0xb6,0xcb,0xee,0x01,0x01,0x00,0xcb,0x7e,0x20,
0x0b,0x3a,0x3b,0x5c,0xe6,0x40,0x20,0x02,0x0e,0x03,0xb6,0x77,0xf7,0x36,0x0d,0x79,
0x0f,0x0f,0x30,0x05,0x3e,0x22,0x12,0x2b,0x77,0x22,0x5b,0x5c,0xfd,0xcb,0x37,0x7e,
0x20,0x2c,0x2a,0x5d,0x5c,0xe5,0x2a,0x3d,0x5c,0xe5,0x21,0x3a,0x21,0xe5,0xfd,0xcb,
0x30,0x66,0x28,0x04,0xed,0x73,0x3d,0x5c,0x2a,0x61,0x5c,0xcd,0xa7,0x11,0xfd,0x36,
0x00,0xff,0xcd,0x2c,0x0f,0xfd,0xcb,0x01,0xbe,0xcd,0xb9,0x21,0x18,0x03,0xcd,0x2c,
0x0f,0xfd,0x36,0x22,0x00,0xcd,0xd6,0x21,0x20,0x0a,0xcd,0x1d,0x11,0xed,0x4b,0x82,
0x5c,0xcd,0xd9,0x0d,0x21,0x71,0x5c,0xcb,0xae,0xcb,0x7e,0xcb,0xbe,0x20,0x1c,0xe1,
0xe1,0x22,0x3d,0x5c,0xe1,0x22,0x5f,0x5c,0xfd,0xcb,0x01,0xfe,0xcd,0xb9,0x21,0x2a,
0x5f,0x5c,0xfd,0x36,0x26,0x00,0x22,0x5d,0x5c,0x18,0x17,0x2a,0x63,0x5c,0xed,0x5b,
0x61,0x5c,0x37,0xed,0x52,0x44,0x4d,0xcd,0xb2,0x2a,0xcd,0xff,0x2a,0x18,0x03,0xcd,
0xfc,0x1f,0xcd,0x4e,0x20,0xca,0xc1,0x20,0xc9,0x2a,0x61,0x5c,0x22,0x5d,0x5c,0xdf,
0xfe,0xe2,0x28,0x0c,0x3a,0x71,0x5c,0xcd,0x59,0x1c,0xdf,0xfe,0x0d,0xc8,0xcf,0x0b,
0xcd,0x30,0x25,0xc8,0xcf,0x10,0x2a,0x51,0x5c,0x23,0x23,0x23,0x23,0x7e,0xfe,0x4b,
0xc9,0xe7,0xcd,0xf2,0x21,0xd8,0xdf,0xfe,0x2c,0x28,0xf6,0xfe,0x3b,0x28,0xf2,0xc3,
0x8a,0x1c,0xfe,0xd9,0xd8,0xfe,0xdf,0x3f,0xd8,0xf5,0xe7,0xf1,0xd6,0xc9,0xf5,0xcd,
0x82,0x1c,0xf1,0xa7,0xcd,0xc3,0x1f,0xf5,0xcd,0x94,0x1e,0x57,0xf1,0xd7,0x7a,0xd7,
0xc9,0xd6,0x11,0xce,0x00,0x28,0x1d,0xd6,0x02,0xce,0x00,0x28,0x56,0xfe,0x01,0x7a,
0x06,0x01,0x20,0x04,0x07,0x07,0x06,0x04,0x4f,0x7a,0xfe,0x02,0x30,0x16,0x79,0x21,
0x91,0x5c,0x18,0x38,0x7a,0x06,0x07,0x38,0x05,0x07,0x07,0x07,0x06,0x38,0x4f,0x7a,
0xfe,0x0a,0x38,0x02,0xcf,0x13,0x21,0x8f,0x5c,0xfe,0x08,0x38,0x0b,0x7e,0x28,0x07,
0xb0,0x2f,0xe6,0x24,0x28,0x01,0x78,0x4f,0x79,0xcd,0x6c,0x22,0x3e,0x07,0xba,0x9f,
0xcd,0x6c,0x22,0x07,0x07,0xe6,0x50,0x47,0x3e,0x08,0xba,0x9f,0xae,0xa0,0xae,0x77,
0x23,0x78,0xc9,0x9f,0x7a,0x0f,0x06,0x80,0x20,0x03,0x0f,0x06,0x40,0x4f,0x7a,0xfe,
0x08,0x28,0x04,0xfe,0x02,0x30,0xbd,0x79,0x21,0x8f,0x5c,0xcd,0x6c,0x22,0x79,0x0f,
0x0f,0x0f,0x18,0xd8,0xcd,0x94,0x1e,0xfe,0x08,0x30,0xa9,0xd3,0xfe,0x07,0x07,0x07,
0xcb,0x6f,0x20,0x02,0xee,0x07,0x32,0x48,0x5c,0xc9,0x3e,0xaf,0x90,0xda,0xf9,0x24,
0x47,0xa7,0x1f,0x37,0x1f,0xa7,0x1f,0xa8,0xe6,0xf8,0xa8,0x67,0x79,0x07,0x07,0x07,
0xa8,0xe6,0xc7,0xa8,0x07,0x07,0x6f,0x79,0xe6,0x07,0xc9,0xcd,0x07,0x23,0xcd,0xaa,
0x22,0x47,0x04,0x7e,0x07,0x10,0xfd,0xe6,0x01,0xc3,0x28,0x2d,0xcd,0x07,0x23,0xcd,
0xe5,0x22,0xc3,0x4d,0x0d,0xed,0x43,0x7d,0x5c,0xcd,0xaa,0x22,0x47,0x04,0x3e,0xfe,
0x0f,0x10,0xfd,0x47,0x7e,0xfd,0x4e,0x57,0xcb,0x41,0x20,0x01,0xa0,0xcb,0x51,0x20,
0x02,0xa8,0x2f,0x77,0xc3,0xdb,0x0b,0xcd,0x14,0x23,0x47,0xc5,0xcd,0x14,0x23,0x59,
0xc1,0x51,0x4f,0xc9,0xcd,0xd5,0x2d,0xda,0xf9,0x24,0x0e,0x01,0xc8,0x0e,0xff,0xc9,
0xdf,0xfe,0x2c,0xc2,0x8a,0x1c,0xe7,0xcd,0x82,0x1c,0xcd,0xee,0x1b,0xef,0x2a,0x3d,
0x38,0x7e,0xfe,0x81,0x30,0x05,0xef,0x02,0x38,0x18,0xa1,0xef,0xa3,0x38,0x36,0x83,
0xef,0xc5,0x02,0x38,0xcd,0x7d,0x24,0xc5,0xef,0x31,0xe1,0x04,0x38,0x7e,0xfe,0x80,
0x30,0x08,0xef,0x02,0x02,0x38,0xc1,0xc3,0xdc,0x22,0xef,0xc2,0x01,0xc0,0x02,0x03,
0x01,0xe0,0x0f,0xc0,0x01,0x31,0xe0,0x01,0x31,0xe0,0xa0,0xc1,0x02,0x38,0xfd,0x34,
0x62,0xcd,0x94,0x1e,0x6f,0xe5,0xcd,0x94,0x1e,0xe1,0x67,0x22,0x7d,0x5c,0xc1,0xc3,
0x20,0x24,0xdf,0xfe,0x2c,0x28,0x06,0xcd,0xee,0x1b,0xc3,0x77,0x24,0xe7,0xcd,0x82,
0x1c,0xcd,0xee,0x1b,0xef,0xc5,0xa2,0x04,0x1f,0x31,0x30,0x30,0x00,0x06,0x02,0x38,
0xc3,0x77,0x24,0xc0,0x02,0xc1,0x02,0x31,0x2a,0xe1,0x01,0xe1,0x2a,0x0f,0xe0,0x05,
0x2a,0xe0,0x01,0x3d,0x38,0x7e,0xfe,0x81,0x30,0x07,0xef,0x02,0x02,0x38,0xc3,0x77,
0x24,0xcd,0x7d,0x24,0xc5,0xef,0x02,0xe1,0x01,0x05,0xc1,0x02,0x01,0x31,0xe1,0x04,
0xc2,0x02,0x01,0x31,0xe1,0x04,0xe2,0xe5,0xe0,0x03,0xa2,0x04,0x31,0x1f,0xc5,0x02,
0x20,0xc0,0x02,0xc2,0x02,0xc1,0xe5,0x04,0xe0,0xe2,0x04,0x0f,0xe1,0x01,0xc1,0x02,
0xe0,0x04,0xe2,0xe5,0x04,0x03,0xc2,0x2a,0xe1,0x2a,0x0f,0x02,0x38,0x1a,0xfe,0x81,
0xc1,0xda,0x77,0x24,0xc5,0xef,0x01,0x38,0x3a,0x7d,0x5c,0xcd,0x28,0x2d,0xef,0xc0,
0x0f,0x01,0x38,0x3a,0x7e,0x5c,0xcd,0x28,0x2d,0xef,0xc5,0x0f,0xe0,0xe5,0x38,0xc1,
0x05,0x28,0x3c,0x18,0x14,0xef,0xe1,0x31,0xe3,0x04,0xe2,0xe4,0x04,0x03,0xc1,0x02,
0xe4,0x04,0xe2,0xe3,0x04,0x0f,0xc2,0x02,0x38,0xc5,0xef,0xc0,0x02,0xe1,0x0f,0x31,
0x38,0x3a,0x7d,0x5c,0xcd,0x28,0x2d,0xef,0x03,0xe0,0xe2,0x0f,0xc0,0x01,0xe0,0x38,
0x3a,0x7e,0x5c,0xcd,0x28,0x2d,0xef,0x03,0x38,0xcd,0xb7,0x24,0xc1,0x10,0xc6,0xef,
0x02,0x02,0x01,0x38,0x3a,0x7d,0x5c,0xcd,0x28,0x2d,0xef,0x03,0x01,0x38,0x3a,0x7e,
0x5c,0xcd,0x28,0x2d,0xef,0x03,0x38,0xcd,0xb7,0x24,0xc3,0x4d,0x0d,0xef,0x31,0x28,
0x34,0x32,0x00,0x01,0x05,0xe5,0x01,0x05,0x2a,0x38,0xcd,0xd5,0x2d,0x38,0x06,0xe6,
0xfc,0xc6,0x04,0x30,0x02,0x3e,0xfc,0xf5,0xcd,0x28,0x2d,0xef,0xe5,0x01,0x05,0x31,
0x1f,0xc4,0x02,0x31,0xa2,0x04,0x1f,0xc1,0x01,0xc0,0x02,0x31,0x04,0x31,0x0f,0xa1,
0x03,0x1b,0xc3,0x02,0x38,0xc1,0xc9,0xcd,0x07,0x23,0x79,0xb8,0x30,0x06,0x69,0xd5,
0xaf,0x5f,0x18,0x07,0xb1,0xc8,0x68,0x41,0xd5,0x16,0x00,0x60,0x78,0x1f,0x85,0x38,
0x03,0xbc,0x38,0x07,0x94,0x4f,0xd9,0xc1,0xc5,0x18,0x04,0x4f,0xd5,0xd9,0xc1,0x2a,
0x7d,0x5c,0x78,0x84,0x47,0x79,0x3c,0x85,0x38,0x0d,0x28,0x0d,0x3d,0x4f,0xcd,0xe5,
0x22,0xd9,0x79,0x10,0xd9,0xd1,0xc9,0x28,0xf3,0xcf,0x0a,0xdf,0x06,0x00,0xc5,0x4f,
0x21,0x96,0x25,0xcd,0xdc,0x16,0x79,0xd2,0x84,0x26,0x06,0x00,0x4e,0x09,0xe9,0xcd,
0x74,0x00,0x03,0xfe,0x0d,0xca,0x8a,0x1c,0xfe,0x22,0x20,0xf3,0xcd,0x74,0x00,0xfe,
0x22,0xc9,0xe7,0xfe,0x28,0x20,0x06,0xcd,0x79,0x1c,0xdf,0xfe,0x29,0xc2,0x8a,0x1c,
0xfd,0xcb,0x01,0x7e,0xc9,0xcd,0x07,0x23,0x2a,0x36,0x5c,0x11,0x00,0x01,0x19,0x79,
0x0f,0x0f,0x0f,0xe6,0xe0,0xa8,0x5f,0x79,0xe6,0x18,0xee,0x40,0x57,0x06,0x60,0xc5,
0xd5,0xe5,0x1a,0xae,0x28,0x04,0x3c,0x20,0x1a,0x3d,0x4f,0x06,0x07,0x14,0x23,0x1a,
0xae,0xa9,0x20,0x0f,0x10,0xf7,0xc1,0xc1,0xc1,0x3e,0x80,0x90,0x01,0x01,0x00,0xf7,
0x12,0x18,0x0a,0xe1,0x11,0x08,0x00,0x19,0xd1,0xc1,0x10,0xd3,0x48,0xc3,0xb2,0x2a,
0xcd,0x07,0x23,0x79,0x0f,0x0f,0x0f,0x4f,0xe6,0xe0,0xa8,0x6f,0x79,0xe6,0x03,0xee,
0x58,0x67,0x7e,0xc3,0x28,0x2d,0x22,0x1c,0x28,0x4f,0x2e,0xf2,0x2b,0x12,0xa8,0x56,
0xa5,0x57,0xa7,0x84,0xa6,0x8f,0xc4,0xe6,0xaa,0xbf,0xab,0xc7,0xa9,0xce,0x00,0xe7,
0xc3,0xff,0x24,0xdf,0x23,0xe5,0x01,0x00,0x00,0xcd,0x0f,0x25,0x20,0x1b,0xcd,0x0f,
0x25,0x28,0xfb,0xcd,0x30,0x25,0x28,0x11,0xf7,0xe1,0xd5,0x7e,0x23,0x12,0x13,0xfe,
0x22,0x20,0xf8,0x7e,0x23,0xfe,0x22,0x28,0xf2,0x0b,0xd1,0x21,0x3b,0x5c,0xcb,0xb6,
0xcb,0x7e,0xc4,0xb2,0x2a,0xc3,0x12,0x27,0xe7,0xcd,0xfb,0x24,0xfe,0x29,0xc2,0x8a,
0x1c,0xe7,0xc3,0x12,0x27,0xc3,0xbd,0x27,0xcd,0x30,0x25,0x28,0x28,0xed,0x4b,0x76,
0x5c,0xcd,0x2b,0x2d,0xef,0xa1,0x0f,0x34,0x37,0x16,0x04,0x34,0x80,0x41,0x00,0x00,
0x80,0x32,0x02,0xa1,0x03,0x31,0x38,0xcd,0xa2,0x2d,0xed,0x43,0x76,0x5c,0x7e,0xa7,
0x28,0x03,0xd6,0x10,0x77,0x18,0x09,0xcd,0x30,0x25,0x28,0x04,0xef,0xa3,0x38,0x34,
0xe7,0xc3,0xc3,0x26,0x01,0x5a,0x10,0xe7,0xfe,0x23,0xca,0x0d,0x27,0x21,0x3b,0x5c,
0xcb,0xb6,0xcb,0x7e,0x28,0x1f,0xcd,0x8e,0x02,0x0e,0x00,0x20,0x13,0xcd,0x1e,0x03,
0x30,0x0e,0x15,0x5f,0xcd,0x33,0x03,0xf5,0x01,0x01,0x00,0xf7,0xf1,0x12,0x0e,0x01,
0x06,0x00,0xcd,0xb2,0x2a,0xc3,0x12,0x27,0xcd,0x22,0x25,0xc4,0x35,0x25,0xe7,0xc3,
0xdb,0x25,0xcd,0x22,0x25,0xc4,0x80,0x25,0xe7,0x18,0x48,0xcd,0x22,0x25,0xc4,0xcb,
0x22,0xe7,0x18,0x3f,0xcd,0x88,0x2c,0x30,0x56,0xfe,0x41,0x30,0x3c,0xcd,0x30,0x25,
0x20,0x23,0xcd,0x9b,0x2c,0xdf,0x01,0x06,0x00,0xcd,0x55,0x16,0x23,0x36,0x0e,0x23,
0xeb,0x2a,0x65,0x5c,0x0e,0x05,0xa7,0xed,0x42,0x22,0x65,0x5c,0xed,0xb0,0xeb,0x2b,
0xcd,0x77,0x00,0x18,0x0e,0xdf,0x23,0x7e,0xfe,0x0e,0x20,0xfa,0x23,0xcd,0xb4,0x33,
0x22,0x5d,0x5c,0xfd,0xcb,0x01,0xf6,0x18,0x14,0xcd,0xb2,0x28,0xda,0x2e,0x1c,0xcc,
0x96,0x29,0x3a,0x3b,0x5c,0xfe,0xc0,0x38,0x04,0x23,0xcd,0xb4,0x33,0x18,0x33,0x01,
0xdb,0x09,0xfe,0x2d,0x28,0x27,0x01,0x18,0x10,0xfe,0xae,0x28,0x20,0xd6,0xaf,0xda,
0x8a,0x1c,0x01,0xf0,0x04,0xfe,0x14,0x28,0x14,0xd2,0x8a,0x1c,0x06,0x10,0xc6,0xdc,
0x4f,0xfe,0xdf,0x30,0x02,0xcb,0xb1,0xfe,0xee,0x38,0x02,0xcb,0xb9,0xc5,0xe7,0xc3,
0xff,0x24,0xdf,0xfe,0x28,0x20,0x0c,0xfd,0xcb,0x01,0x76,0x20,0x17,0xcd,0x52,0x2a,
0xe7,0x18,0xf0,0x06,0x00,0x4f,0x21,0x95,0x27,0xcd,0xdc,0x16,0x30,0x06,0x4e,0x21,
0xed,0x26,0x09,0x46,0xd1,0x7a,0xb8,0x38,0x3a,0xa7,0xca,0x18,0x00,0xc5,0x21,0x3b,
0x5c,0x7b,0xfe,0xed,0x20,0x06,0xcb,0x76,0x20,0x02,0x1e,0x99,0xd5,0xcd,0x30,0x25,
0x28,0x09,0x7b,0xe6,0x3f,0x47,0xef,0x3b,0x38,0x18,0x09,0x7b,0xfd,0xae,0x01,0xe6,
0x40,0xc2,0x8a,0x1c,0xd1,0x21,0x3b,0x5c,0xcb,0xf6,0xcb,0x7b,0x20,0x02,0xcb,0xb6,
0xc1,0x18,0xc1,0xd5,0x79,0xfd,0xcb,0x01,0x76,0x20,0x15,0xe6,0x3f,0xc6,0x08,0x4f,
0xfe,0x10,0x20,0x04,0xcb,0xf1,0x18,0x08,0x38,0xd7,0xfe,0x17,0x28,0x02,0xcb,0xf9,
0xc5,0xe7,0xc3,0xff,0x24,0x2b,0xcf,0x2d,0xc3,0x2a,0xc4,0x2f,0xc5,0x5e,0xc6,0x3d,
0xce,0x3e,0xcc,0x3c,0xcd,0xc7,0xc9,0xc8,0xca,0xc9,0xcb,0xc5,0xc7,0xc6,0xc8,0x00,
0x06,0x08,0x08,0x0a,0x02,0x03,0x05,0x05,0x05,0x05,0x05,0x05,0x06,0xcd,0x30,0x25,
0x20,0x35,0xe7,0xcd,0x8d,0x2c,0xd2,0x8a,0x1c,0xe7,0xfe,0x24,0xf5,0x20,0x01,0xe7,
0xfe,0x28,0x20,0x12,0xe7,0xfe,0x29,0x28,0x10,0xcd,0xfb,0x24,0xdf,0xfe,0x2c,0x20,
0x03,0xe7,0x18,0xf5,0xfe,0x29,0xc2,0x8a,0x1c,0xe7,0x21,0x3b,0x5c,0xcb,0xb6,0xf1,
0x28,0x02,0xcb,0xf6,0xc3,0x12,0x27,0xe7,0xe6,0xdf,0x47,0xe7,0xd6,0x24,0x4f,0x20,
0x01,0xe7,0xe7,0xe5,0x2a,0x53,0x5c,0x2b,0x11,0xce,0x00,0xc5,0xcd,0x86,0x1d,0xc1,
0x30,0x02,0xcf,0x18,0xe5,0xcd,0xab,0x28,0xe6,0xdf,0xb8,0x20,0x08,0xcd,0xab,0x28,
0xd6,0x24,0xb9,0x28,0x0c,0xe1,0x2b,0x11,0x00,0x02,0xc5,0xcd,0x8b,0x19,0xc1,0x18,
0xd7,0xa7,0xcc,0xab,0x28,0xd1,0xd1,0xed,0x53,0x5d,0x5c,0xcd,0xab,0x28,0xe5,0xfe,
0x29,0x28,0x42,0x23,0x7e,0xfe,0x0e,0x16,0x40,0x28,0x07,0x2b,0xcd,0xab,0x28,0x23,
0x16,0x00,0x23,0xe5,0xd5,0xcd,0xfb,0x24,0xf1,0xfd,0xae,0x01,0xe6,0x40,0x20,0x2b,
0xe1,0xeb,0x2a,0x65,0x5c,0x01,0x05,0x00,0xed,0x42,0x22,0x65,0x5c,0xed,0xb0,0xeb,
0x2b,0xcd,0xab,0x28,0xfe,0x29,0x28,0x0d,0xe5,0xdf,0xfe,0x2c,0x20,0x0d,0xe7,0xe1,
0xcd,0xab,0x28,0x18,0xbe,0xe5,0xdf,0xfe,0x29,0x28,0x02,0xcf,0x19,0xd1,0xeb,0x22,
0x5d,0x5c,0x2a,0x0b,0x5c,0xe3,0x22,0x0b,0x5c,0xd5,0xe7,0xe7,0xcd,0xfb,0x24,0xe1,
0x22,0x5d,0x5c,0xe1,0x22,0x0b,0x5c,0xe7,0xc3,0x12,0x27,0x23,0x7e,0xfe,0x21,0x38,
0xfa,0xc9,0xfd,0xcb,0x01,0xf6,0xdf,0xcd,0x8d,0x2c,0xd2,0x8a,0x1c,0xe5,0xe6,0x1f,
0x4f,0xe7,0xe5,0xfe,0x28,0x28,0x28,0xcb,0xf1,0xfe,0x24,0x28,0x11,0xcb,0xe9,0xcd,
0x88,0x2c,0x30,0x0f,0xcd,0x88,0x2c,0x30,0x16,0xcb,0xb1,0xe7,0x18,0xf6,0xe7,0xfd,
0xcb,0x01,0xb6,0x3a,0x0c,0x5c,0xa7,0x28,0x06,0xcd,0x30,0x25,0xc2,0x51,0x29,0x41,
0xcd,0x30,0x25,0x20,0x08,0x79,0xe6,0xe0,0xcb,0xff,0x4f,0x18,0x37,0x2a,0x4b,0x5c,
0x7e,0xe6,0x7f,0x28,0x2d,0xb9,0x20,0x22,0x17,0x87,0xf2,0x3f,0x29,0x38,0x30,0xd1,
0xd5,0xe5,0x23,0x1a,0x13,0xfe,0x20,0x28,0xfa,0xf6,0x20,0xbe,0x28,0xf4,0xf6,0x80,
0xbe,0x20,0x06,0x1a,0xcd,0x88,0x2c,0x30,0x15,0xe1,0xc5,0xcd,0xb8,0x19,0xeb,0xc1,
0x18,0xce,0xcb,0xf8,0xd1,0xdf,0xfe,0x28,0x28,0x09,0xcb,0xe8,0x18,0x0d,0xd1,0xd1,
0xd1,0xe5,0xdf,0xcd,0x88,0x2c,0x30,0x03,0xe7,0x18,0xf8,0xe1,0xcb,0x10,0xcb,0x70,
0xc9,0x2a,0x0b,0x5c,0x7e,0xfe,0x29,0xca,0xef,0x28,0x7e,0xf6,0x60,0x47,0x23,0x7e,
0xfe,0x0e,0x28,0x07,0x2b,0xcd,0xab,0x28,0x23,0xcb,0xa8,0x78,0xb9,0x28,0x12,0x23,
0x23,0x23,0x23,0x23,0xcd,0xab,0x28,0xfe,0x29,0xca,0xef,0x28,0xcd,0xab,0x28,0x18,
0xd9,0xcb,0x69,0x20,0x0c,0x23,0xed,0x5b,0x65,0x5c,0xcd,0xc0,0x33,0xeb,0x22,0x65,
0x5c,0xd1,0xd1,0xaf,0x3c,0xc9,0xaf,0x47,0xcb,0x79,0x20,0x4b,0xcb,0x7e,0x20,0x0e,
0x3c,0x23,0x4e,0x23,0x46,0x23,0xeb,0xcd,0xb2,0x2a,0xdf,0xc3,0x49,0x2a,0x23,0x23,
0x23,0x46,0xcb,0x71,0x28,0x0a,0x05,0x28,0xe8,0xeb,0xdf,0xfe,0x28,0x20,0x61,0xeb,
0xeb,0x18,0x24,0xe5,0xdf,0xe1,0xfe,0x2c,0x28,0x20,0xcb,0x79,0x28,0x52,0xcb,0x71,
0x20,0x06,0xfe,0x29,0x20,0x3c,0xe7,0xc9,0xfe,0x29,0x28,0x6c,0xfe,0xcc,0x20,0x32,
0xdf,0x2b,0x22,0x5d,0x5c,0x18,0x5e,0x21,0x00,0x00,0xe5,0xe7,0xe1,0x79,0xfe,0xc0,
0x20,0x09,0xdf,0xfe,0x29,0x28,0x51,0xfe,0xcc,0x28,0xe5,0xc5,0xe5,0xcd,0xee,0x2a,
0xe3,0xeb,0xcd,0xcc,0x2a,0x38,0x19,0x0b,0xcd,0xf4,0x2a,0x09,0xd1,0xc1,0x10,0xb3,
0xcb,0x79,0x20,0x66,0xe5,0xcb,0x71,0x20,0x13,0x42,0x4b,0xdf,0xfe,0x29,0x28,0x02,
0xcf,0x02,0xe7,0xe1,0x11,0x05,0x00,0xcd,0xf4,0x2a,0x09,0xc9,0xcd,0xee,0x2a,0xe3,
0xcd,0xf4,0x2a,0xc1,0x09,0x23,0x42,0x4b,0xeb,0xcd,0xb1,0x2a,0xdf,0xfe,0x29,0x28,
0x07,0xfe,0x2c,0x20,0xdb,0xcd,0x52,0x2a,0xe7,0xfe,0x28,0x28,0xf8,0xfd,0xcb,0x01,
0xb6,0xc9,0xcd,0x30,0x25,0xc4,0xf1,0x2b,0xe7,0xfe,0x29,0x28,0x50,0xd5,0xaf,0xf5,
0xc5,0x11,0x01,0x00,0xdf,0xe1,0xfe,0xcc,0x28,0x17,0xf1,0xcd,0xcd,0x2a,0xf5,0x50,
0x59,0xe5,0xdf,0xe1,0xfe,0xcc,0x28,0x09,0xfe,0x29,0xc2,0x8a,0x1c,0x62,0x6b,0x18,
0x13,0xe5,0xe7,0xe1,0xfe,0x29,0x28,0x0c,0xf1,0xcd,0xcd,0x2a,0xf5,0xdf,0x60,0x69,
0xfe,0x29,0x20,0xe6,0xf1,0xe3,0x19,0x2b,0xe3,0xa7,0xed,0x52,0x01,0x00,0x00,0x38,
0x07,0x23,0xa7,0xfa,0x20,0x2a,0x44,0x4d,0xd1,0xfd,0xcb,0x01,0xb6,0xcd,0x30,0x25,
0xc8,0xaf,0xfd,0xcb,0x01,0xb6,0xc5,0xcd,0xa9,0x33,0xc1,0x2a,0x65,0x5c,0x77,0x23,
0x73,0x23,0x72,0x23,0x71,0x23,0x70,0x23,0x22,0x65,0x5c,0xc9,0xaf,0xd5,0xe5,0xf5,
0xcd,0x82,0x1c,0xf1,0xcd,0x30,0x25,0x28,0x12,0xf5,0xcd,0x99,0x1e,0xd1,0x78,0xb1,
0x37,0x28,0x05,0xe1,0xe5,0xa7,0xed,0x42,0x7a,0xde,0x00,0xe1,0xd1,0xc9,0xeb,0x23,
0x5e,0x23,0x56,0xc9,0xcd,0x30,0x25,0xc8,0xcd,0xa9,0x30,0xda,0x15,0x1f,0xc9,0x2a,
0x4d,0x5c,0xfd,0xcb,0x37,0x4e,0x28,0x5e,0x01,0x05,0x00,0x03,0x23,0x7e,0xfe,0x20,
0x28,0xfa,0x30,0x0b,0xfe,0x10,0x38,0x11,0xfe,0x16,0x30,0x0d,0x23,0x18,0xed,0xcd,
0x88,0x2c,0x38,0xe7,0xfe,0x24,0xca,0xc0,0x2b,0x79,0x2a,0x59,0x5c,0x2b,0xcd,0x55,
0x16,0x23,0x23,0xeb,0xd5,0x2a,0x4d,0x5c,0x1b,0xd6,0x06,0x47,0x28,0x11,0x23,0x7e,
0xfe,0x21,0x38,0xfa,0xf6,0x20,0x13,0x12,0x10,0xf4,0xf6,0x80,0x12,0x3e,0xc0,0x2a,
0x4d,0x5c,0xae,0xf6,0x20,0xe1,0xcd,0xea,0x2b,0xe5,0xef,0x02,0x38,0xe1,0x01,0x05,
0x00,0xa7,0xed,0x42,0x18,0x40,0xfd,0xcb,0x01,0x76,0x28,0x06,0x11,0x06,0x00,0x19,
0x18,0xe7,0x2a,0x4d,0x5c,0xed,0x4b,0x72,0x5c,0xfd,0xcb,0x37,0x46,0x20,0x30,0x78,
0xb1,0xc8,0xe5,0xf7,0xd5,0xc5,0x54,0x5d,0x23,0x36,0x20,0xed,0xb8,0xe5,0xcd,0xf1,
0x2b,0xe1,0xe3,0xa7,0xed,0x42,0x09,0x30,0x02,0x44,0x4d,0xe3,0xeb,0x78,0xb1,0x28,
0x02,0xed,0xb0,0xc1,0xd1,0xe1,0xeb,0x78,0xb1,0xc8,0xd5,0xed,0xb0,0xe1,0xc9,0x2b,
0x2b,0x2b,0x7e,0xe5,0xc5,0xcd,0xc6,0x2b,0xc1,0xe1,0x03,0x03,0x03,0xc3,0xe8,0x19,
0x3e,0xdf,0x2a,0x4d,0x5c,0xa6,0xf5,0xcd,0xf1,0x2b,0xeb,0x09,0xc5,0x2b,0x22,0x4d,
0x5c,0x03,0x03,0x03,0x2a,0x59,0x5c,0x2b,0xcd,0x55,0x16,0x2a,0x4d,0x5c,0xc1,0xc5,
0x03,0xed,0xb8,0xeb,0x23,0xc1,0x70,0x2b,0x71,0xf1,0x2b,0x77,0x2a,0x59,0x5c,0x2b,
0xc9,0x2a,0x65,0x5c,0x2b,0x46,0x2b,0x4e,0x2b,0x56,0x2b,0x5e,0x2b,0x7e,0x22,0x65,
0x5c,0xc9,0xcd,0xb2,0x28,0xc2,0x8a,0x1c,0xcd,0x30,0x25,0x20,0x08,0xcb,0xb1,0xcd,
0x96,0x29,0xcd,0xee,0x1b,0x38,0x08,0xc5,0xcd,0xb8,0x19,0xcd,0xe8,0x19,0xc1,0xcb,
0xf9,0x06,0x00,0xc5,0x21,0x01,0x00,0xcb,0x71,0x20,0x02,0x2e,0x05,0xeb,0xe7,0x26,
0xff,0xcd,0xcc,0x2a,0xda,0x20,0x2a,0xe1,0xc5,0x24,0xe5,0x60,0x69,0xcd,0xf4,0x2a,
0xeb,0xdf,0xfe,0x2c,0x28,0xe8,0xfe,0x29,0x20,0xbb,0xe7,0xc1,0x79,0x68,0x26,0x00,
0x23,0x23,0x29,0x19,0xda,0x15,0x1f,0xd5,0xc5,0xe5,0x44,0x4d,0x2a,0x59,0x5c,0x2b,
0xcd,0x55,0x16,0x23,0x77,0xc1,0x0b,0x0b,0x0b,0x23,0x71,0x23,0x70,0xc1,0x78,0x23,
0x77,0x62,0x6b,0x1b,0x36,0x00,0xcb,0x71,0x28,0x02,0x36,0x20,0xc1,0xed,0xb8,0xc1,
0x70,0x2b,0x71,0x2b,0x3d,0x20,0xf8,0xc9,0xcd,0x1b,0x2d,0x3f,0xd8,0xfe,0x41,0x3f,
0xd0,0xfe,0x5b,0xd8,0xfe,0x61,0x3f,0xd0,0xfe,0x7b,0xc9,0xfe,0xc4,0x20,0x19,0x11,
0x00,0x00,0xe7,0xd6,0x31,0xce,0x00,0x20,0x0a,0xeb,0x3f,0xed,0x6a,0xda,0xad,0x31,
0xeb,0x18,0xef,0x42,0x4b,0xc3,0x2b,0x2d,0xfe,0x2e,0x28,0x0f,0xcd,0x3b,0x2d,0xfe,
0x2e,0x20,0x28,0xe7,0xcd,0x1b,0x2d,0x38,0x22,0x18,0x0a,0xe7,0xcd,0x1b,0x2d,0xda,
0x8a,0x1c,0xef,0xa0,0x38,0xef,0xa1,0xc0,0x02,0x38,0xdf,0xcd,0x22,0x2d,0x38,0x0b,
0xef,0xe0,0xa4,0x05,0xc0,0x04,0x0f,0x38,0xe7,0x18,0xef,0xfe,0x45,0x28,0x03,0xfe,
0x65,0xc0,0x06,0xff,0xe7,0xfe,0x2b,0x28,0x05,0xfe,0x2d,0x20,0x02,0x04,0xe7,0xcd,
0x1b,0x2d,0x38,0xcb,0xc5,0xcd,0x3b,0x2d,0xcd,0xd5,0x2d,0xc1,0xda,0xad,0x31,0xa7,
0xfa,0xad,0x31,0x04,0x28,0x02,0xed,0x44,0xc3,0x4f,0x2d,0xfe,0x30,0xd8,0xfe,0x3a,
0x3f,0xc9,0xcd,0x1b,0x2d,0xd8,0xd6,0x30,0x4f,0x06,0x00,0xfd,0x21,0x3a,0x5c,0xaf,
0x5f,0x51,0x48,0x47,0xcd,0xb6,0x2a,0xef,0x38,0xa7,0xc9,0xf5,0xef,0xa0,0x38,0xf1,
0xcd,0x22,0x2d,0xd8,0xef,0x01,0xa4,0x04,0x0f,0x38,0xcd,0x74,0x00,0x18,0xf1,0x07,
0x0f,0x30,0x02,0x2f,0x3c,0xf5,0x21,0x92,0x5c,0xcd,0x0b,0x35,0xef,0xa4,0x38,0xf1,
0xcb,0x3f,0x30,0x0d,0xf5,0xef,0xc1,0xe0,0x00,0x04,0x04,0x33,0x02,0x05,0xe1,0x38,
0xf1,0x28,0x08,0xf5,0xef,0x31,0x04,0x38,0xf1,0x18,0xe5,0xef,0x02,0x38,0xc9,0x23,
0x4e,0x23,0x7e,0xa9,0x91,0x5f,0x23,0x7e,0x89,0xa9,0x57,0xc9,0x0e,0x00,0xe5,0x36,
0x00,0x23,0x71,0x23,0x7b,0xa9,0x91,0x77,0x23,0x7a,0x89,0xa9,0x77,0x23,0x36,0x00,
0xe1,0xc9,0xef,0x38,0x7e,0xa7,0x28,0x05,0xef,0xa2,0x0f,0x27,0x38,0xef,0x02,0x38,
0xe5,0xd5,0xeb,0x46,0xcd,0x7f,0x2d,0xaf,0x90,0xcb,0x79,0x42,0x4b,0x7b,0xd1,0xe1,
0xc9,0x57,0x17,0x9f,0x5f,0x4f,0xaf,0x47,0xcd,0xb6,0x2a,0xef,0x34,0xef,0x1a,0x20,
0x9a,0x85,0x04,0x27,0x38,0xcd,0xa2,0x2d,0xd8,0xf5,0x05,0x04,0x28,0x03,0xf1,0x37,
0xc9,0xf1,0xc9,0xef,0x31,0x36,0x00,0x0b,0x31,0x37,0x00,0x0d,0x02,0x38,0x3e,0x30,
0xd7,0xc9,0x2a,0x38,0x3e,0x2d,0xd7,0xef,0xa0,0xc3,0xc4,0xc5,0x02,0x38,0xd9,0xe5,
0xd9,0xef,0x31,0x27,0xc2,0x03,0xe2,0x01,0xc2,0x02,0x38,0x7e,0xa7,0x20,0x47,0xcd,
0x7f,0x2d,0x06,0x10,0x7a,0xa7,0x20,0x06,0xb3,0x28,0x09,0x53,0x06,0x08,0xd5,0xd9,
0xd1,0xd9,0x18,0x57,0xef,0xe2,0x38,0x7e,0xd6,0x7e,0xcd,0xc1,0x2d,0x57,0x3a,0xac,
0x5c,0x92,0x32,0xac,0x5c,0x7a,0xcd,0x4f,0x2d,0xef,0x31,0x27,0xc1,0x03,0xe1,0x38,
0xcd,0xd5,0x2d,0xe5,0x32,0xa1,0x5c,0x3d,0x17,0x9f,0x3c,0x21,0xab,0x5c,0x77,0x23,
0x86,0x77,0xe1,0xc3,0xcf,0x2e,0xd6,0x80,0xfe,0x1c,0x38,0x13,0xcd,0xc1,0x2d,0xd6,
0x07,0x47,0x21,0xac,0x5c,0x86,0x77,0x78,0xed,0x44,0xcd,0x4f,0x2d,0x18,0x92,0xeb,
0xcd,0xba,0x2f,0xd9,0xcb,0xfa,0x7d,0xd9,0xd6,0x80,0x47,0xcb,0x23,0xcb,0x12,0xd9,
0xcb,0x13,0xcb,0x12,0xd9,0x21,0xaa,0x5c,0x0e,0x05,0x7e,0x8f,0x27,0x77,0x2b,0x0d,
0x20,0xf8,0x10,0xe7,0xaf,0x21,0xa6,0x5c,0x11,0xa1,0x5c,0x06,0x09,0xed,0x6f,0x0e,
0xff,0xed,0x6f,0x20,0x04,0x0d,0x0c,0x20,0x0a,0x12,0x13,0xfd,0x34,0x71,0xfd,0x34,
0x72,0x0e,0x00,0xcb,0x40,0x28,0x01,0x23,0x10,0xe7,0x3a,0xab,0x5c,0xd6,0x09,0x38,
0x0a,0xfd,0x35,0x71,0x3e,0x04,0xfd,0xbe,0x6f,0x18,0x41,0xef,0x02,0xe2,0x38,0xeb,
0xcd,0xba,0x2f,0xd9,0x3e,0x80,0x95,0x2e,0x00,0xcb,0xfa,0xd9,0xcd,0xdd,0x2f,0xfd,
0x7e,0x71,0xfe,0x08,0x38,0x06,0xd9,0xcb,0x12,0xd9,0x18,0x20,0x01,0x00,0x02,0x7b,
0xcd,0x8b,0x2f,0x5f,0x7a,0xcd,0x8b,0x2f,0x57,0xc5,0xd9,0xc1,0x10,0xf1,0x21,0xa1,
0x5c,0x79,0xfd,0x4e,0x71,0x09,0x77,0xfd,0x34,0x71,0x18,0xd3,0xf5,0x21,0xa1,0x5c,
0xfd,0x4e,0x71,0x06,0x00,0x09,0x41,0xf1,0x2b,0x7e,0xce,0x00,0x77,0xa7,0x28,0x05,
0xfe,0x0a,0x3f,0x30,0x08,0x10,0xf1,0x36,0x01,0x04,0xfd,0x34,0x72,0xfd,0x70,0x71,
0xef,0x02,0x38,0xd9,0xe1,0xd9,0xed,0x4b,0xab,0x5c,0x21,0xa1,0x5c,0x78,0xfe,0x09,
0x38,0x04,0xfe,0xfc,0x38,0x26,0xa7,0xcc,0xef,0x15,0xaf,0x90,0xfa,0x52,0x2f,0x47,
0x18,0x0c,0x79,0xa7,0x28,0x03,0x7e,0x23,0x0d,0xcd,0xef,0x15,0x10,0xf4,0x79,0xa7,
0xc8,0x04,0x3e,0x2e,0xd7,0x3e,0x30,0x10,0xfb,0x41,0x18,0xe6,0x50,0x15,0x06,0x01,
0xcd,0x4a,0x2f,0x3e,0x45,0xd7,0x4a,0x79,0xa7,0xf2,0x83,0x2f,0xed,0x44,0x4f,0x3e,
0x2d,0x18,0x02,0x3e,0x2b,0xd7,0x06,0x00,0xc3,0x1b,0x1a,0xd5,0x6f,0x26,0x00,0x5d,
0x54,0x29,0x29,0x19,0x29,0x59,0x19,0x4c,0x7d,0xd1,0xc9,0x7e,0x36,0x00,0xa7,0xc8,
0x23,0xcb,0x7e,0xcb,0xfe,0x2b,0xc8,0xc5,0x01,0x05,0x00,0x09,0x41,0x4f,0x37,0x2b,
0x7e,0x2f,0xce,0x00,0x77,0x10,0xf8,0x79,0xc1,0xc9,0xe5,0xf5,0x4e,0x23,0x46,0x77,
0x23,0x79,0x4e,0xc5,0x23,0x4e,0x23,0x46,0xeb,0x57,0x5e,0xd5,0x23,0x56,0x23,0x5e,
0xd5,0xd9,0xd1,0xe1,0xc1,0xd9,0x23,0x56,0x23,0x5e,0xf1,0xe1,0xc9,0xa7,0xc8,0xfe,
0x21,0x30,0x16,0xc5,0x47,0xd9,0xcb,0x2d,0xcb,0x1a,0xcb,0x1b,0xd9,0xcb,0x1a,0xcb,
0x1b,0x10,0xf2,0xc1,0xd0,0xcd,0x04,0x30,0xc0,0xd9,0xaf,0x2e,0x00,0x57,0x5d,0xd9,
0x11,0x00,0x00,0xc9,0x1c,0xc0,0x14,0xc0,0xd9,0x1c,0x20,0x01,0x14,0xd9,0xc9,0xeb,
0xcd,0x6e,0x34,0xeb,0x1a,0xb6,0x20,0x26,0xd5,0x23,0xe5,0x23,0x5e,0x23,0x56,0x23,
0x23,0x23,0x7e,0x23,0x4e,0x23,0x46,0xe1,0xeb,0x09,0xeb,0x8e,0x0f,0xce,0x00,0x20,
0x0b,0x9f,0x77,0x23,0x73,0x23,0x72,0x2b,0x2b,0x2b,0xd1,0xc9,0x2b,0xd1,0xcd,0x93,
0x32,0xd9,0xe5,0xd9,0xd5,0xe5,0xcd,0x9b,0x2f,0x47,0xeb,0xcd,0x9b,0x2f,0x4f,0xb8,
0x30,0x03,0x78,0x41,0xeb,0xf5,0x90,0xcd,0xba,0x2f,0xcd,0xdd,0x2f,0xf1,0xe1,0x77,
0xe5,0x68,0x61,0x19,0xd9,0xeb,0xed,0x4a,0xeb,0x7c,0x8d,0x6f,0x1f,0xad,0xd9,0xeb,
0xe1,0x1f,0x30,0x08,0x3e,0x01,0xcd,0xdd,0x2f,0x34,0x28,0x23,0xd9,0x7d,0xe6,0x80,
0xd9,0x23,0x77,0x2b,0x28,0x1f,0x7b,0xed,0x44,0x3f,0x5f,0x7a,0x2f,0xce,0x00,0x57,
0xd9,0x7b,0x2f,0xce,0x00,0x5f,0x7a,0x2f,0xce,0x00,0x30,0x07,0x1f,0xd9,0x34,0xca,
0xad,0x31,0xd9,0x57,0xd9,0xaf,0xc3,0x55,0x31,0xc5,0x06,0x10,0x7c,0x4d,0x21,0x00,
0x00,0x29,0x38,0x0a,0xcb,0x11,0x17,0x30,0x03,0x19,0x38,0x02,0x10,0xf3,0xc1,0xc9,
0xcd,0xe9,0x34,0xd8,0x23,0xae,0xcb,0xfe,0x2b,0xc9,0x1a,0xb6,0x20,0x22,0xd5,0xe5,
0xd5,0xcd,0x7f,0x2d,0xeb,0xe3,0x41,0xcd,0x7f,0x2d,0x78,0xa9,0x4f,0xe1,0xcd,0xa9,
0x30,0xeb,0xe1,0x38,0x0a,0x7a,0xb3,0x20,0x01,0x4f,0xcd,0x8e,0x2d,0xd1,0xc9,0xd1,
0xcd,0x93,0x32,0xaf,0xcd,0xc0,0x30,0xd8,0xd9,0xe5,0xd9,0xd5,0xeb,0xcd,0xc0,0x30,
0xeb,0x38,0x5a,0xe5,0xcd,0xba,0x2f,0x78,0xa7,0xed,0x62,0xd9,0xe5,0xed,0x62,0xd9,
0x06,0x21,0x18,0x11,0x30,0x05,0x19,0xd9,0xed,0x5a,0xd9,0xd9,0xcb,0x1c,0xcb,0x1d,
0xd9,0xcb,0x1c,0xcb,0x1d,0xd9,0xcb,0x18,0xcb,0x19,0xd9,0xcb,0x19,0x1f,0x10,0xe4,
0xeb,0xd9,0xeb,0xd9,0xc1,0xe1,0x78,0x81,0x20,0x01,0xa7,0x3d,0x3f,0x17,0x3f,0x1f,
0xf2,0x46,0x31,0x30,0x68,0xa7,0x3c,0x20,0x08,0x38,0x06,0xd9,0xcb,0x7a,0xd9,0x20,
0x5c,0x77,0xd9,0x78,0xd9,0x30,0x15,0x7e,0xa7,0x3e,0x80,0x28,0x01,0xaf,0xd9,0xa2,
0xcd,0xfb,0x2f,0x07,0x77,0x38,0x2e,0x23,0x77,0x2b,0x18,0x29,0x06,0x20,0xd9,0xcb,
0x7a,0xd9,0x20,0x12,0x07,0xcb,0x13,0xcb,0x12,0xd9,0xcb,0x13,0xcb,0x12,0xd9,0x35,
0x28,0xd7,0x10,0xea,0x18,0xd7,0x17,0x30,0x0c,0xcd,0x04,0x30,0x20,0x07,0xd9,0x16,
0x80,0xd9,0x34,0x28,0x18,0xe5,0x23,0xd9,0xd5,0xd9,0xc1,0x78,0x17,0xcb,0x16,0x1f,
0x77,0x23,0x71,0x23,0x72,0x23,0x73,0xe1,0xd1,0xd9,0xe1,0xd9,0xc9,0xcf,0x05,0xcd,
0x93,0x32,0xeb,0xaf,0xcd,0xc0,0x30,0x38,0xf4,0xeb,0xcd,0xc0,0x30,0xd8,0xd9,0xe5,
0xd9,0xd5,0xe5,0xcd,0xba,0x2f,0xd9,0xe5,0x60,0x69,0xd9,0x61,0x68,0xaf,0x06,0xdf,
0x18,0x10,0x17,0xcb,0x11,0xd9,0xcb,0x11,0xcb,0x10,0xd9,0x29,0xd9,0xed,0x6a,0xd9,
0x38,0x10,0xed,0x52,0xd9,0xed,0x52,0xd9,0x30,0x0f,0x19,0xd9,0xed,0x5a,0xd9,0xa7,
0x18,0x08,0xa7,0xed,0x52,0xd9,0xed,0x52,0xd9,0x37,0x04,0xfa,0xd2,0x31,0xf5,0x28,
0xe1,0x5f,0x51,0xd9,0x59,0x50,0xf1,0xcb,0x18,0xf1,0xcb,0x18,0xd9,0xc1,0xe1,0x78,
0x91,0xc3,0x3d,0x31,0x7e,0xa7,0xc8,0xfe,0x81,0x30,0x06,0x36,0x00,0x3e,0x20,0x18,
0x51,0xfe,0x91,0x20,0x1a,0x23,0x23,0x23,0x3e,0x80,0xa6,0x2b,0xb6,0x2b,0x20,0x03,
0x3e,0x80,0xae,0x2b,0x20,0x36,0x77,0x23,0x36,0xff,0x2b,0x3e,0x18,0x18,0x33,0x30,
0x2c,0xd5,0x2f,0xc6,0x91,0x23,0x56,0x23,0x5e,0x2b,0x2b,0x0e,0x00,0xcb,0x7a,0x28,
0x01,0x0d,0xcb,0xfa,0x06,0x08,0x90,0x80,0x38,0x04,0x5a,0x16,0x00,0x90,0x28,0x07,
0x47,0xcb,0x3a,0xcb,0x1b,0x10,0xfa,0xcd,0x8e,0x2d,0xd1,0xc9,0x7e,0xd6,0xa0,0xf0,
0xed,0x44,0xd5,0xeb,0x2b,0x47,0xcb,0x38,0xcb,0x38,0xcb,0x38,0x28,0x05,0x36,0x00,
0x2b,0x10,0xfb,0xe6,0x07,0x28,0x09,0x47,0x3e,0xff,0xcb,0x27,0x10,0xfc,0xa6,0x77,
0xeb,0xd1,0xc9,0xcd,0x96,0x32,0xeb,0x7e,0xa7,0xc0,0xd5,0xcd,0x7f,0x2d,0xaf,0x23,
0x77,0x2b,0x77,0x06,0x91,0x7a,0xa7,0x20,0x08,0xb3,0x42,0x28,0x10,0x53,0x58,0x06,
0x89,0xeb,0x05,0x29,0x30,0xfc,0xcb,0x09,0xcb,0x1c,0xcb,0x1d,0xeb,0x2b,0x73,0x2b,
0x72,0x2b,0x70,0xd1,0xc9,0x00,0xb0,0x00,0x40,0xb0,0x00,0x01,0x30,0x00,0xf1,0x49,
0x0f,0xda,0xa2,0x40,0xb0,0x00,0x0a,0x8f,0x36,0x3c,0x34,0xa1,0x33,0x0f,0x30,0xca,
0x30,0xaf,0x31,0x51,0x38,0x1b,0x35,0x24,0x35,0x3b,0x35,0x3b,0x35,0x3b,0x35,0x3b,
0x35,0x3b,0x35,0x3b,0x35,0x14,0x30,0x2d,0x35,0x3b,0x35,0x3b,0x35,0x3b,0x35,0x3b,
0x35,0x3b,0x35,0x3b,0x35,0x9c,0x35,0xde,0x35,0xbc,0x34,0x45,0x36,0x6e,0x34,0x69,
0x36,0xde,0x35,0x74,0x36,0xb5,0x37,0xaa,0x37,0xda,0x37,0x33,0x38,0x43,0x38,0xe2,
0x37,0x13,0x37,0xc4,0x36,0xaf,0x36,0x4a,0x38,0x92,0x34,0x6a,0x34,0xac,0x34,0xa5,
0x34,0xb3,0x34,0x1f,0x36,0xc9,0x35,0x01,0x35,0xc0,0x33,0xa0,0x36,0x86,0x36,0xc6,
0x33,0x7a,0x36,0x06,0x35,0xf9,0x34,0x9b,0x36,0x83,0x37,0x14,0x32,0xa2,0x33,0x4f,
0x2d,0x97,0x32,0x49,0x34,0x1b,0x34,0x2d,0x34,0x0f,0x34,0xcd,0xbf,0x35,0x78,0x32,
0x67,0x5c,0xd9,0xe3,0xd9,0xed,0x53,0x65,0x5c,0xd9,0x7e,0x23,0xe5,0xa7,0xf2,0x80,
0x33,0x57,0xe6,0x60,0x0f,0x0f,0x0f,0x0f,0xc6,0x7c,0x6f,0x7a,0xe6,0x1f,0x18,0x0e,
0xfe,0x18,0x30,0x08,0xd9,0x01,0xfb,0xff,0x54,0x5d,0x09,0xd9,0x07,0x6f,0x11,0xd7,
0x32,0x26,0x00,0x19,0x5e,0x23,0x56,0x21,0x65,0x33,0xe3,0xd5,0xd9,0xed,0x4b,0x66,
0x5c,0xc9,0xf1,0x3a,0x67,0x5c,0xd9,0x18,0xc3,0xd5,0xe5,0x01,0x05,0x00,0xcd,0x05,
0x1f,0xe1,0xd1,0xc9,0xed,0x5b,0x65,0x5c,0xcd,0xc0,0x33,0xed,0x53,0x65,0x5c,0xc9,
0xcd,0xa9,0x33,0xed,0xb0,0xc9,0x62,0x6b,0xcd,0xa9,0x33,0xd9,0xe5,0xd9,0xe3,0xc5,
0x7e,0xe6,0xc0,0x07,0x07,0x4f,0x0c,0x7e,0xe6,0x3f,0x20,0x02,0x23,0x7e,0xc6,0x50,
0x12,0x3e,0x05,0x91,0x23,0x13,0x06,0x00,0xed,0xb0,0xc1,0xe3,0xd9,0xe1,0xd9,0x47,
0xaf,0x05,0xc8,0x12,0x13,0x18,0xfa,0xa7,0xc8,0xf5,0xd5,0x11,0x00,0x00,0xcd,0xc8,
0x33,0xd1,0xf1,0x3d,0x18,0xf2,0x4f,0x07,0x07,0x81,0x4f,0x06,0x00,0x09,0xc9,0xd5,
0x2a,0x68,0x5c,0xcd,0x06,0x34,0xcd,0xc0,0x33,0xe1,0xc9,0x62,0x6b,0xd9,0xe5,0x21,
0xc5,0x32,0xd9,0xcd,0xf7,0x33,0xcd,0xc8,0x33,0xd9,0xe1,0xd9,0xc9,0xe5,0xeb,0x2a,
0x68,0x5c,0xcd,0x06,0x34,0xeb,0xcd,0xc0,0x33,0xeb,0xe1,0xc9,0x06,0x05,0x1a,0x4e,
0xeb,0x12,0x71,0x23,0x13,0x10,0xf7,0xeb,0xc9,0x47,0xcd,0x5e,0x33,0x31,0x0f,0xc0,
0x02,0xa0,0xc2,0x31,0xe0,0x04,0xe2,0xc1,0x03,0x38,0xcd,0xc6,0x33,0xcd,0x62,0x33,
0x0f,0x01,0xc2,0x02,0x35,0xee,0xe1,0x03,0x38,0xc9,0x06,0xff,0x18,0x06,0xcd,0xe9,
0x34,0xd8,0x06,0x00,0x7e,0xa7,0x28,0x0b,0x23,0x78,0xe6,0x80,0xb6,0x17,0x3f,0x1f,
0x77,0x2b,0xc9,0xd5,0xe5,0xcd,0x7f,0x2d,0xe1,0x78,0xb1,0x2f,0x4f,0xcd,0x8e,0x2d,
0xd1,0xc9,0xcd,0xe9,0x34,0xd8,0xd5,0x11,0x01,0x00,0x23,0xcb,0x16,0x2b,0x9f,0x4f,
0xcd,0x8e,0x2d,0xd1,0xc9,0xcd,0x99,0x1e,0xed,0x78,0x18,0x04,0xcd,0x99,0x1e,0x0a,
0xc3,0x28,0x2d,0xcd,0x99,0x1e,0x21,0x2b,0x2d,0xe5,0xc5,0xc9,0xcd,0xf1,0x2b,0x0b,
0x78,0xb1,0x20,0x23,0x1a,0xcd,0x8d,0x2c,0x38,0x09,0xd6,0x90,0x38,0x19,0xfe,0x15,
0x30,0x15,0x3c,0x3d,0x87,0x87,0x87,0xfe,0xa8,0x30,0x0c,0xed,0x4b,0x7b,0x5c,0x81,
0x4f,0x30,0x01,0x04,0xc3,0x2b,0x2d,0xcf,0x09,0xe5,0xc5,0x47,0x7e,0x23,0xb6,0x23,
0xb6,0x23,0xb6,0x78,0xc1,0xe1,0xc0,0x37,0xc9,0xcd,0xe9,0x34,0xd8,0x3e,0xff,0x18,
0x06,0xcd,0xe9,0x34,0x18,0x05,0xaf,0x23,0xae,0x2b,0x07,0xe5,0x3e,0x00,0x77,0x23,
0x77,0x23,0x17,0x77,0x1f,0x23,0x77,0x23,0x77,0xe1,0xc9,0xeb,0xcd,0xe9,0x34,0xeb,
0xd8,0x37,0x18,0xe7,0xeb,0xcd,0xe9,0x34,0xeb,0xd0,0xa7,0x18,0xde,0xeb,0xcd,0xe9,
0x34,0xeb,0xd0,0xd5,0x1b,0xaf,0x12,0x1b,0x12,0xd1,0xc9,0x78,0xd6,0x08,0xcb,0x57,
0x20,0x01,0x3d,0x0f,0x30,0x08,0xf5,0xe5,0xcd,0x3c,0x34,0xd1,0xeb,0xf1,0xcb,0x57,
0x20,0x07,0x0f,0xf5,0xcd,0x0f,0x30,0x18,0x33,0x0f,0xf5,0xcd,0xf1,0x2b,0xd5,0xc5,
0xcd,0xf1,0x2b,0xe1,0x7c,0xb5,0xe3,0x78,0x20,0x0b,0xb1,0xc1,0x28,0x04,0xf1,0x3f,
0x18,0x16,0xf1,0x18,0x13,0xb1,0x28,0x0d,0x1a,0x96,0x38,0x09,0x20,0xed,0x0b,0x13,
0x23,0xe3,0x2b,0x18,0xdf,0xc1,0xf1,0xa7,0xf5,0xef,0xa0,0x38,0xf1,0xf5,0xdc,0x01,
0x35,0xf1,0xf5,0xd4,0xf9,0x34,0xf1,0x0f,0xd4,0x01,0x35,0xc9,0xcd,0xf1,0x2b,0xd5,
0xc5,0xcd,0xf1,0x2b,0xe1,0xe5,0xd5,0xc5,0x09,0x44,0x4d,0xf7,0xcd,0xb2,0x2a,0xc1,
0xe1,0x78,0xb1,0x28,0x02,0xed,0xb0,0xc1,0xe1,0x78,0xb1,0x28,0x02,0xed,0xb0,0x2a,
0x65,0x5c,0x11,0xfb,0xff,0xe5,0x19,0xd1,0xc9,0xcd,0xd5,0x2d,0x38,0x0e,0x20,0x0c,
0xf5,0x01,0x01,0x00,0xf7,0xf1,0x12,0xcd,0xb2,0x2a,0xeb,0xc9,0xcf,0x0a,0x2a,0x5d,
0x5c,0xe5,0x78,0xc6,0xe3,0x9f,0xf5,0xcd,0xf1,0x2b,0xd5,0x03,0xf7,0xe1,0xed,0x53,
0x5d,0x5c,0xd5,0xed,0xb0,0xeb,0x2b,0x36,0x0d,0xfd,0xcb,0x01,0xbe,0xcd,0xfb,0x24,
0xdf,0xfe,0x0d,0x20,0x07,0xe1,0xf1,0xfd,0xae,0x01,0xe6,0x40,0xc2,0x8a,0x1c,0x22,
0x5d,0x5c,0xfd,0xcb,0x01,0xfe,0xcd,0xfb,0x24,0xe1,0x22,0x5d,0x5c,0x18,0xa0,0x01,
0x01,0x00,0xf7,0x22,0x5b,0x5c,0xe5,0x2a,0x51,0x5c,0xe5,0x3e,0xff,0xcd,0x01,0x16,
0xcd,0xe3,0x2d,0xe1,0xcd,0x15,0x16,0xd1,0x2a,0x5b,0x5c,0xa7,0xed,0x52,0x44,0x4d,
0xcd,0xb2,0x2a,0xeb,0xc9,0xcd,0x94,0x1e,0xfe,0x10,0xd2,0x9f,0x1e,0x2a,0x51,0x5c,
0xe5,0xcd,0x01,0x16,0xcd,0xe6,0x15,0x01,0x00,0x00,0x30,0x03,0x0c,0xf7,0x12,0xcd,
0xb2,0x2a,0xe1,0xcd,0x15,0x16,0xc3,0xbf,0x35,0xcd,0xf1,0x2b,0x78,0xb1,0x28,0x01,
0x1a,0xc3,0x28,0x2d,0xcd,0xf1,0x2b,0xc3,0x2b,0x2d,0xd9,0xe5,0x21,0x67,0x5c,0x35,
0xe1,0x20,0x04,0x23,0xd9,0xc9,0xd9,0x5e,0x7b,0x17,0x9f,0x57,0x19,0xd9,0xc9,0x13,
0x13,0x1a,0x1b,0x1b,0xa7,0x20,0xef,0xd9,0x23,0xd9,0xc9,0xf1,0xd9,0xe3,0xd9,0xc9,
0xef,0xc0,0x02,0x31,0xe0,0x05,0x27,0xe0,0x01,0xc0,0x04,0x03,0xe0,0x38,0xc9,0xef,
0x31,0x36,0x00,0x04,0x3a,0x38,0xc9,0x31,0x3a,0xc0,0x03,0xe0,0x01,0x30,0x00,0x03,
0xa1,0x03,0x38,0xc9,0xef,0x3d,0x34,0xf1,0x38,0xaa,0x3b,0x29,0x04,0x31,0x27,0xc3,
0x03,0x31,0x0f,0xa1,0x03,0x88,0x13,0x36,0x58,0x65,0x66,0x9d,0x78,0x65,0x40,0xa2,
0x60,0x32,0xc9,0xe7,0x21,0xf7,0xaf,0x24,0xeb,0x2f,0xb0,0xb0,0x14,0xee,0x7e,0xbb,
0x94,0x58,0xf1,0x3a,0x7e,0xf8,0xcf,0xe3,0x38,0xcd,0xd5,0x2d,0x20,0x07,0x38,0x03,
0x86,0x30,0x09,0xcf,0x05,0x38,0x07,0x96,0x30,0x04,0xed,0x44,0x77,0xc9,0xef,0x02,
0xa0,0x38,0xc9,0xef,0x3d,0x31,0x37,0x00,0x04,0x38,0xcf,0x09,0xa0,0x02,0x38,0x7e,
0x36,0x80,0xcd,0x28,0x2d,0xef,0x34,0x38,0x00,0x03,0x01,0x31,0x34,0xf0,0x4c,0xcc,
0xcc,0xcd,0x03,0x37,0x00,0x08,0x01,0xa1,0x03,0x01,0x38,0x34,0xef,0x01,0x34,0xf0,
0x31,0x72,0x17,0xf8,0x04,0x01,0xa2,0x03,0xa2,0x03,0x31,0x34,0x32,0x20,0x04,0xa2,
0x03,0x8c,0x11,0xac,0x14,0x09,0x56,0xda,0xa5,0x59,0x30,0xc5,0x5c,0x90,0xaa,0x9e,
0x70,0x6f,0x61,0xa1,0xcb,0xda,0x96,0xa4,0x31,0x9f,0xb4,0xe7,0xa0,0xfe,0x5c,0xfc,
0xea,0x1b,0x43,0xca,0x36,0xed,0xa7,0x9c,0x7e,0x5e,0xf0,0x6e,0x23,0x80,0x93,0x04,
0x0f,0x38,0xc9,0xef,0x3d,0x34,0xee,0x22,0xf9,0x83,0x6e,0x04,0x31,0xa2,0x0f,0x27,
0x03,0x31,0x0f,0x31,0x0f,0x31,0x2a,0xa1,0x03,0x31,0x37,0xc0,0x00,0x04,0x02,0x38,
0xc9,0xa1,0x03,0x01,0x36,0x00,0x02,0x1b,0x38,0xc9,0xef,0x39,0x2a,0xa1,0x03,0xe0,
0x00,0x06,0x1b,0x33,0x03,0xef,0x39,0x31,0x31,0x04,0x31,0x0f,0xa1,0x03,0x86,0x14,
0xe6,0x5c,0x1f,0x0b,0xa3,0x8f,0x38,0xee,0xe9,0x15,0x63,0xbb,0x23,0xee,0x92,0x0d,
0xcd,0xed,0xf1,0x23,0x5d,0x1b,0xea,0x04,0x38,0xc9,0xef,0x31,0x1f,0x01,0x20,0x05,
0x38,0xc9,0xcd,0x97,0x32,0x7e,0xfe,0x81,0x38,0x0e,0xef,0xa1,0x1b,0x01,0x05,0x31,
0x36,0xa3,0x01,0x00,0x06,0x1b,0x33,0x03,0xef,0xa0,0x01,0x31,0x31,0x04,0x31,0x0f,
0xa1,0x03,0x8c,0x10,0xb2,0x13,0x0e,0x55,0xe4,0x8d,0x58,0x39,0xbc,0x5b,0x98,0xfd,
0x9e,0x00,0x36,0x75,0xa0,0xdb,0xe8,0xb4,0x63,0x42,0xc4,0xe6,0xb5,0x09,0x36,0xbe,
0xe9,0x36,0x73,0x1b,0x5d,0xec,0xd8,0xde,0x63,0xbe,0xf0,0x61,0xa1,0xb3,0x0c,0x04,
0x0f,0x38,0xc9,0xef,0x31,0x31,0x04,0xa1,0x03,0x1b,0x28,0xa1,0x0f,0x05,0x24,0x31,
0x0f,0x38,0xc9,0xef,0x22,0xa3,0x03,0x1b,0x38,0xc9,0xef,0x31,0x30,0x00,0x1e,0xa2,
0x38,0xef,0x01,0x31,0x30,0x00,0x07,0x25,0x04,0x38,0xc3,0xc4,0x36,0x02,0x31,0x30,
0x00,0x09,0xa0,0x01,0x37,0x00,0x06,0xa1,0x01,0x05,0x02,0xa1,0x38,0xc9,0xbd,0x7b,
0x00,0xb0,0xbb,0xe6,0x60,0xbe,0x60,0x03,0xb2,0xd5,0xff,0xd5,0xbb,0xbf,0xff,0x72,
0x03,0xbb,0xff,0xfb,0xff,0xd5,0x13,0xdb,0x72,0xfa,0xe8,0x18,0xff,0x8a,0x01,0xaa,
0xe2,0xfb,0xff,0xd5,0x72,0xe4,0xb3,0x08,0xe8,0x1e,0xff,0x93,0x74,0x02,0x04,0x1f,
0x41,0x3c,0x3b,0x75,0xea,0x42,0x03,0xc2,0x3c,0x1b,0x75,0xe3,0x5e,0xb1,0xef,0xba,
0xc9,0x03,0x8a,0xc1,0xd0,0xe8,0xee,0xb0,0x11,0xee,0xee,0xe2,0xf5,0x4a,0xee,0x68,
0x00,0xa0,0x07,0xbd,0x6f,0x02,0x8b,0xc6,0xc1,0xc8,0x03,0x02,0xe4,0x72,0x02,0xf7,
0xd0,0xf6,0xd0,0xc0,0xec,0x06,0x04,0x05,0x8a,0xec,0x98,0xc1,0xe0,0x05,0x97,0xb0,
0x23,0xf7,0xe1,0x03,0xf8,0xaf,0xe8,0x9e,0x01,0x81,0xef,0x7e,0x0c,0x8a,0x9c,0x05,
0x12,0x32,0xff,0x60,0xb2,0x20,0x2a,0xda,0xe8,0x4a,0x01,0x61,0x81,0xff,0x00,0x20,
0x73,0x1f,0x60,0x81,0xef,0x37,0x01,0xb2,0x0d,0x93,0x2c,0x30,0x75,0x02,0xb0,0x3f,
0x3c,0x02,0x75,0x02,0xb0,0x20,0x93,0xe8,0x2b,0x01,0x61,0x8a,0x9f,0x54,0x12,0xeb,
0x2d,0x60,0x81,0xef,0x80,0x11,0x8a,0x9f,0xeb,0x11,0xb2,0x0e,0xff,0xd5,0x61,0x60,
0x81,0xef,0xf7,0x09,0x8a,0x9f,0x29,0x12,0xb2,0x0d,0xff,0xd5,0x61,0x60,0x80,0xc3,
0xa5,0x81,0xef,0x77,0x02,0xb2,0x0b,0xff,0xd5,0x61,0x8a,0x9f,0x05,0x12,0x81,0xc7,
0x00,0x05,0xb2,0x04,0xff,0xd5,0x4e,0x0f,0x89,0x6b,0xff,0xbb,0xff,0x02,0x8b,0xf3,
0xad,0x97,0xe8,0x22,0x01,0x81,0xef,0x7c,0x16,0x8b,0xde,0xe8,0x81,0x00,0xfe,0xca,
0x75,0xec,0xc6,0x44,0xdb,0xaa,0xbd,0x08,0x00,0xbb,0x01,0x00,0xbf,0x40,0xfa,0xcd,
0x1a,0x8b,0xf2,0x46,0xcd,0x1a,0x3b,0xf2,0x73,0xfa,0x8d,0xb5,0x40,0x01,0xb1,0xc1,
0x26,0xf3,0xa4,0x83,0xc7,0x7f,0x4b,0x75,0xf1,0x80,0x3e,0x0c,0x02,0x54,0x74,0x0a,
0xfe,0x06,0x0c,0x02,0x81,0x2e,0x0f,0x02,0x40,0x01,0xe4,0x60,0x3c,0xbb,0x74,0x02,
0x78,0x28,0x4d,0x75,0xc4,0x80,0xc2,0x07,0x73,0xfb,0x42,0x60,0xbe,0x02,0x07,0xb6,
0x18,0xac,0x93,0xe8,0x7f,0x00,0xfe,0xce,0x75,0xf7,0x81,0xfe,0x20,0x0d,0x72,0x03,
0xbe,0x02,0x07,0x89,0x36,0x4f,0x02,0x61,0xeb,0x9c,0x1f,0x07,0xcb,0x80,0xeb,0xa4,
0x72,0x5c,0x8b,0xcb,0xbb,0x95,0x10,0x80,0x3f,0x80,0x43,0x72,0xfa,0xe2,0xf8,0x56,
0x8a,0x07,0x25,0x5f,0x00,0x74,0x27,0x2c,0x41,0x3c,0x19,0x73,0x29,0x03,0xc0,0x05,
0x2e,0x03,0x96,0xad,0xb1,0x05,0x51,0xb1,0x03,0xd1,0xe0,0x73,0x03,0x26,0x88,0x15,
0x47,0xe2,0xf6,0x81,0xc7,0x3d,0x01,0x59,0xe2,0xec,0x81,0xef,0x3c,0x06,0x80,0x3f,
0x80,0x43,0x72,0xcc,0x5e,0xc3,0x5e,0x81,0xc7,0x3e,0x06,0x8a,0x07,0x24,0x7f,0x2c,
0x20,0x53,0x93,0xe8,0x0f,0x00,0x5b,0x80,0x3f,0x80,0x43,0x72,0xee,0xc3,0x80,0xc3,
0x84,0x81,0xc7,0x40,0x06,0xb1,0x07,0xc1,0xe3,0x03,0x80,0xc7,0x4d,0xb4,0x08,0x8a,
0xc1,0xd7,0x8a,0xe8,0x8a,0xc2,0xd0,0xe5,0x73,0x02,0xaa,0x3d,0xd6,0x47,0xfe,0xcc,
0x75,0xf2,0x81,0xef,0x48,0x01,0xe2,0xe5,0x81,0xc7,0xc8,0x08,0xc3,0x22,0x47,0x45,
0x4e,0x54,0x45,0xd2,0x02,0x69,0x43,0x41,0x50,0xd3,0x02,0x6a,0x53,0x59,0x4d,0xc2,
0x22,0x6a,0x53,0x50,0x41,0x43,0xc5,0xb9,0x19,0x00,0x51,0xd6,0x2a,0xc1,0xb1,0x1a,
0xd2,0xc0,0xf3,0xaa,0x81,0xc7,0x26,0x01,0x59,0xe2,0xef,0xc3,0xda,0x57,0x5c,0xd7,
0x46,0x72,0xdc,0xd6,0x4e,0xf3,0x48,0xf3,0x5e,0xf2,0xda,0xb7,0x2e,0xe9,0xd6,0x64,
0x5a,0xb7,0x4e,0x92,0xda,0x5f,0xda,0xd6,0xd4,0x56,0x48,0xd7,0xa2,0x56,0x5a,0xd7,
0x1c,0x71,0x24,0xe9,0xde,0xb6,0xd4,0xb6,0xf4,0xb7,0x5a,0xb5,0x24,0xb5,0x01,0x03,
0x08,0x45,0x46,0x4c,0xa0,0x80,0x00,0xa5,0x00,0x08,0xf0,0x06,0x39,0x63,0x42,0x55,
0x04,0xc0,0x54,0x9b,0x90,0x04,0x04,0x59,0x12,0x86,0x52,0xce,0x18,0x05,0x02,0x3a,
0xec,0xbf,0x45,0x0a,0x6e,0xdc,0x34,0xa3,0x2e,0xc8,0xa1,0x72,0x93,0x5a,0x84,0xbf,
0xf6,0x0d,0x65,0x40,0x2a,0xf4,0x24,0x2f,0xb9,0xfa,0x9c,0xae,0x0a,0x10,0x01,0xd6,
0x3c,0x45,0x4a,0x40,0xfa,0x21,0x01,0xea,0x91,0x09,0xb9,0x39,0xa1,0x11,0x84,0x11,
0xaf,0x72,0x72,0xff,0x79,0xa4,0x16,0x00,0x4f,0x46,0x8d,0x40,0x21,0x40,0x54,0x24,
0x7c,0xea,0x17,0xd6,0x58,0xf0,0x80,0x1c,0xa3,0x7d,0x09,0x1a,0x44,0xa3,0xc8,0xf7,
0xbb,0xd5,0x98,0xff,0x7f,0x4b,0x03,0xdc,0xd8,0x24,0xc8,0x5a,0xc8,0x3d,0x5f,0x3f,
0xf6,0x60,0x99,0xe3,0xe6,0x9a,0x48,0x87,0x45,0x50,0xaa,0x68,0x1b,0xd8,0x5c,0xa2,
0x46,0x0a,0x34,0xda,0x90,0x52,0x94,0x45,0x05,0x06,0xa1,0x63,0xc6,0x67,0xaf,0x64,
0x7c,0x8b,0x2f,0xf5,0x07,0x70,0x0a,0x10,0x05,0x04,0x4c,0x6f,0x9a,0xa2,0xc3,0x51,
0xa8,0x51,0xcf,0xb4,0x40,0x83,0x34,0x6e,0xf3,0x40,0x8c,0x19,0x3a,0x8e,0x73,0xaf,
0x65,0xf9,0xb1,0x45,0x42,0x54,0x6a,0x8e,0x70,0x04,0xea,0x8f,0x73,0xa9,0x7e,0x1d,
0xc0,0x04,0x40,0xe4,0x4a,0x37,0x94,0x50,0x8f,0x04,0xeb,0xfc,0xe1,0x14,0x64,0x61,
0x16,0x57,0xe6,0x9b,0xb5,0x29,0x06,0x72,0x41,0x6f,0xb9,0xa3,0xb3,0xab,0xba,0x4d,
0xe4,0x4d,0x09,0xa0,0x37,0x12,0x33,0xbd,0x7a,0xbd,0x86,0x16,0x47,0x3d,0xc3,0x1c,
0xf7,0x09,0x82,0xa1,0xaa,0x14,0xe6,0x8a,0xa1,0x47,0x2f,0x44,0x13,0x60,0x24,0xe9,
0xfe,0x1d,0xcf,0x40,0x41,0x95,0xe0,0xcf,0xab,0x41,0x3e,0x22,0x2a,0xa7,0xeb,0xff,
0x4f,0xaa,0xbc,0xa5,0x7b,0x4d,0x56,0xde,0xf9,0x4d,0x3d,0xcd,0x1e,0x6a,0x81,0x32,
0x88,0x28,0xf0,0x8d,0xdd,0x4e,0x0e,0x1c,0x09,0x65,0x23,0xac,0xe7,0x5a,0xca,0x8a,
0x82,0x51,0x5b,0x92,0x46,0xee,0x36,0x4f,0xef,0x22,0x90,0xdb,0xda,0x4c,0x24,0xf2,
0x84,0xcf,0xff,0x62,0x38,0x9e,0x57,0x60,0x65,0x1c,0xa8,0xf0,0x12,0x97,0xe8,0x09,
0x35,0x8a,0x6c,0x0a,0x01,0x90,0x83,0x1a,0xa1,0x62,0x0f,0x08,0x42,0x90,0xcc,0x8b,
0x58,0xe1,0x8f,0x42,0xa1,0x45,0x24,0x45,0x4a,0x08,0x84,0x23,0x04,0x0e,0x19,0x3a,
0x9e,0xa8,0x8e,0x81,0x02,0x34,0x34,0xc2,0x28,0xff,0xa0,0xf1,0x11,0x85,0x9a,0x88,
0x28,0xef,0xbc,0xaa,0x34,0x19,0x25,0x8a,0xae,0x19,0xb5,0xa4,0x3c,0x2c,0x23,0xbc,
0x5e,0x38,0x43,0x02,0x6a,0xa3,0xc4,0x06,0x4c,0x8d,0x64,0x8a,0x0d,0x4b,0xaa,0xa1,
0xc4,0xd0,0x15,0x03,0x47,0x40,0x01,0xb5,0x66,0x40,0xfa,0x87,0x05,0xeb,0x08,0x66,
0x51,0xe9,0xc8,0x66,0x00,0xf7,0xb4,0x1b,0x57,0x71,0x59,0xb1,0xa0,0x1a,0xb9,0xa2,
0x45,0x00,0x14,0x63,0x61,0xc1,0x14,0x52,0x42,0x10,0xd2,0x87,0x1f,0xa7,0xe6,0x3e,
0xeb,0x4a,0x8c,0x5c,0x6f,0xba,0x8f,0x12,0x90,0x2b,0x82,0x55,0xc0,0x78,0xc6,0x3c,
0xcc,0x76,0x61,0xf7,0x6a,0x5a,0x1e,0x23,0x7c,0x38,0xa5,0x00,0x45,0x34,0x08,0x4c,
0x23,0x80,0x70,0x42,0x10,0xd2,0x87,0x1f,0x6f,0x26,0x3e,0xeb,0x4a,0x8c,0x5c,0x6f,
0xba,0x8f,0x12,0x90,0xe0,0x15,0x78,0x16,0xb3,0xa1,0x04,0x2b,0x20,0x2c,0x0d,0x8a,
0xcb,0x16,0xc4,0x1c,0x50,0x24,0xf3,0xb9,0x06,0x03,0x53,0x69,0xd8,0xe0,0x80,0x70,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x10,0x00,0x10,0x00,
0x00,0x24,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x7e,0x24,0x24,0x7e,0x24,0x00,
0x00,0x08,0x3e,0x28,0x3e,0x0a,0x3e,0x08,0x00,0x62,0x64,0x08,0x10,0x26,0x46,0x00,
0x00,0x10,0x28,0x10,0x2a,0x44,0x3a,0x00,0x00,0x08,0x10,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x08,0x08,0x08,0x08,0x04,0x00,0x00,0x20,0x10,0x10,0x10,0x10,0x20,0x00,
0x00,0x00,0x14,0x08,0x3e,0x08,0x14,0x00,0x00,0x00,0x08,0x08,0x3e,0x08,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x10,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x00,
0x00,0x3c,0x46,0x4a,0x52,0x62,0x3c,0x00,0x00,0x18,0x28,0x08,0x08,0x08,0x3e,0x00,
0x00,0x3c,0x42,0x02,0x3c,0x40,0x7e,0x00,0x00,0x3c,0x42,0x0c,0x02,0x42,0x3c,0x00,
0x00,0x08,0x18,0x28,0x48,0x7e,0x08,0x00,0x00,0x7e,0x40,0x7c,0x02,0x42,0x3c,0x00,
0x00,0x3c,0x40,0x7c,0x42,0x42,0x3c,0x00,0x00,0x7e,0x02,0x04,0x08,0x10,0x10,0x00,
0x00,0x3c,0x42,0x3c,0x42,0x42,0x3c,0x00,0x00,0x3c,0x42,0x42,0x3e,0x02,0x3c,0x00,
0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x10,0x10,0x20,
0x00,0x00,0x04,0x08,0x10,0x08,0x04,0x00,0x00,0x00,0x00,0x3e,0x00,0x3e,0x00,0x00,
0x00,0x00,0x10,0x08,0x04,0x08,0x10,0x00,0x00,0x3c,0x42,0x04,0x08,0x00,0x08,0x00,
0x00,0x3c,0x4a,0x56,0x5e,0x40,0x3c,0x00,0x00,0x3c,0x42,0x42,0x7e,0x42,0x42,0x00,
0x00,0x7c,0x42,0x7c,0x42,0x42,0x7c,0x00,0x00,0x3c,0x42,0x40,0x40,0x42,0x3c,0x00,
0x00,0x78,0x44,0x42,0x42,0x44,0x78,0x00,0x00,0x7e,0x40,0x7c,0x40,0x40,0x7e,0x00,
0x00,0x7e,0x40,0x7c,0x40,0x40,0x40,0x00,0x00,0x3c,0x42,0x40,0x4e,0x42,0x3c,0x00,
0x00,0x42,0x42,0x7e,0x42,0x42,0x42,0x00,0x00,0x3e,0x08,0x08,0x08,0x08,0x3e,0x00,
0x00,0x02,0x02,0x02,0x42,0x42,0x3c,0x00,0x00,0x44,0x48,0x70,0x48,0x44,0x42,0x00,
0x00,0x40,0x40,0x40,0x40,0x40,0x7e,0x00,0x00,0x42,0x66,0x5a,0x42,0x42,0x42,0x00,
0x00,0x42,0x62,0x52,0x4a,0x46,0x42,0x00,0x00,0x3c,0x42,0x42,0x42,0x42,0x3c,0x00,
0x00,0x7c,0x42,0x42,0x7c,0x40,0x40,0x00,0x00,0x3c,0x42,0x42,0x52,0x4a,0x3c,0x00,
0x00,0x7c,0x42,0x42,0x7c,0x44,0x42,0x00,0x00,0x3c,0x40,0x3c,0x02,0x42,0x3c,0x00,
0x00,0xfe,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x42,0x42,0x42,0x42,0x42,0x3c,0x00,
0x00,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,0x42,0x42,0x42,0x42,0x5a,0x24,0x00,
0x00,0x42,0x24,0x18,0x18,0x24,0x42,0x00,0x00,0x82,0x44,0x28,0x10,0x10,0x10,0x00,
0x00,0x7e,0x04,0x08,0x10,0x20,0x7e,0x00,0x00,0x0e,0x08,0x08,0x08,0x08,0x0e,0x00,
0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x00,0x00,0x70,0x10,0x10,0x10,0x10,0x70,0x00,
0x00,0x10,0x38,0x54,0x10,0x10,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
0x00,0x1c,0x22,0x78,0x20,0x20,0x7e,0x00,0x00,0x00,0x38,0x04,0x3c,0x44,0x3c,0x00,
0x00,0x20,0x20,0x3c,0x22,0x22,0x3c,0x00,0x00,0x00,0x1c,0x20,0x20,0x20,0x1c,0x00,
0x00,0x04,0x04,0x3c,0x44,0x44,0x3c,0x00,0x00,0x00,0x38,0x44,0x78,0x40,0x3c,0x00,
0x00,0x0c,0x10,0x18,0x10,0x10,0x10,0x00,0x00,0x00,0x3c,0x44,0x44,0x3c,0x04,0x38,
0x00,0x40,0x40,0x78,0x44,0x44,0x44,0x00,0x00,0x10,0x00,0x30,0x10,0x10,0x38,0x00,
0x00,0x04,0x00,0x04,0x04,0x04,0x24,0x18,0x00,0x20,0x28,0x30,0x30,0x28,0x24,0x00,
0x00,0x10,0x10,0x10,0x10,0x10,0x0c,0x00,0x00,0x00,0x68,0x54,0x54,0x54,0x54,0x00,
0x00,0x00,0x78,0x44,0x44,0x44,0x44,0x00,0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00,
0x00,0x00,0x78,0x44,0x44,0x78,0x40,0x40,0x00,0x00,0x3c,0x44,0x44,0x3c,0x04,0x06,
0x00,0x00,0x1c,0x20,0x20,0x20,0x20,0x00,0x00,0x00,0x38,0x40,0x38,0x04,0x78,0x00,
0x00,0x10,0x38,0x10,0x10,0x10,0x0c,0x00,0x00,0x00,0x44,0x44,0x44,0x44,0x38,0x00,
0x00,0x00,0x44,0x44,0x28,0x28,0x10,0x00,0x00,0x00,0x44,0x54,0x54,0x54,0x28,0x00,
0x00,0x00,0x44,0x28,0x10,0x28,0x44,0x00,0x00,0x00,0x44,0x44,0x44,0x3c,0x04,0x38,
0x00,0x00,0x7c,0x08,0x10,0x20,0x7c,0x00,0x00,0x0e,0x08,0x30,0x08,0x08,0x0e,0x00,
0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x70,0x10,0x0c,0x10,0x10,0x70,0x00,
0x00,0x14,0x28,0x00,0x00,0x00,0x00,0x00,0x3c,0x42,0x99,0xa1,0xa1,0x99,0x42,0x3c,
 
};
/programs/emulator/e80/trunk/asm_code.asm
0,0 → 1,39
 
format MS COFF
 
public Start
public _hStack
public _KOL_PATH
public _KOL_PARAM
 
extrn Memory
extrn hEnd
 
extrn _kol_main
 
section ".text" code
db "MENUET01"
dd 1, Start, hEnd, Memory, _hStack, _KOL_PARAM, _KOL_PATH
 
Start:
 
; èíèöèàëèçàöèÿ êó÷è
mov eax, 68
mov ebx, 11
int 0x40
 
; âûçîâ ãëàâíîé ïðîöåäóðû
mov eax, _kol_main
call eax
 
; çàâåðøåíèå ðàáîòû ïðîãðàììû
mov eax, -1
int 0x40
 
section ".bss"
 
_KOL_PARAM rb 256
_KOL_PATH rb 256
 
rb 16*1024
_hStack:
/programs/emulator/e80/trunk/clean.bat
0,0 → 1,3
del e80.kex
del backup.sna
del *.o
/programs/emulator/e80/trunk/compile.bat
0,0 → 1,11
del *.o
fasm asm_code.asm start.o
gcc -c z80/z80.c
gcc -c system/kolibri.c
gcc -c system/stdlib.c
gcc -c system/string.c
gcc -c e80.c
ld -nostdlib -T kolibri.ld -o e80.kex start.o kolibri.o stdlib.o string.o z80.o e80.o
objcopy e80.kex -O binary
kpack e80.kex
pause
/programs/emulator/e80/trunk/e80.c
0,0 → 1,534
 
#include "system/kolibri.h"
#include "system/stdlib.h"
#include "system/string.h"
#include "z80/z80.h"
#include "48.h"
 
#include "system/msgbox.c"
 
///=============================
 
#define TYPE_NO 0
#define TYPE_SNA 1
#define TYPE_Z80 2
 
#define SCREEN_LEN 3*3*256*192*3
 
char WND_CAPTION[] = {"e80 v0.5.1"};
 
extern char KOL_PARAM[256];
extern char KOL_PATH[256];
 
char szBackup[256];
char szScreen[256];
 
int fila[5][5];
int main_tecla, hay_tecla;
int SSCS = 0;
 
int debug=0, scanl=0;
int frame_counter;
int target_cycle;
Z80Regs spectrumZ80;
 
char *screen;
unsigned screen_w, screen_h;
#define screen_a_w 512
#define screen_a_h 384
int flash = 0;
unsigned time = 0;
 
///=============================
 
#include "keyboard.c"
 
///=============================
 
int get_ext(char *filename)
{
 
return TYPE_SNA;
}
 
///=============================
 
void memory_print(Z80Regs *regs, char *filename)
{
kol_struct70 file;
 
file.p00 = 2;
file.p04 = 0;
file.p08 = 0;
file.p12 = 64*1024;
file.p16 = (unsigned)(regs->RAM);
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
}
 
 
///=============================
 
void all_print(Z80Regs *regs, char *filename)
{
kol_struct70 file;
 
file.p00 = 2;
file.p04 = 0;
file.p08 = 0;
file.p12 = sizeof (Z80Regs);
file.p16 = (unsigned)regs;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
}
 
///=============================
 
void screen_print(Z80Regs *regs)
{
 
kol_struct70 file;
 
char palette[]=
{
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xB0, 0x00, 0x00, 0xB0, 0x00, 0x00,
0x00, 0x00, 0xB0, 0x00, 0x00, 0xB0,
0xB0, 0x00, 0xB0, 0xB0, 0x00, 0xB0,
0x00, 0xB0, 0x00, 0x00, 0xB0, 0x00,
0xB0, 0xB0, 0x00, 0xB0, 0xB0, 0x00,
0x00, 0xB0, 0xB0, 0x00, 0xB0, 0xB0,
0xB0, 0xB0, 0xB0, 0xB0, 0xB0, 0xB0,
 
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xFF, 0x00, 0x00, 0xFF, 0x00, 0x00,
0x00, 0x00, 0xFF, 0x00, 0x00, 0xFF,
0xFF, 0x00, 0xFF, 0xFF, 0x00, 0xFF,
0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00,
0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0x00,
0x00, 0xFF, 0xFF, 0x00, 0xFF, 0xFF,
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF
};
 
char *scr;
char *atr;
 
char a, c, s;
int i, j, k, l, m;
unsigned bri;
char *color;
char *addr;
int n = 0;
int z = 0;
int x, y;
 
scr = malloc(6144);
atr = malloc(768);
 
memcpy(scr, regs->RAM + 0x4000 , 6144);
memcpy(atr, regs->RAM + 0x5800 , 768);
 
for (j = 0; j < 3 ; j++)
for (i = 0; i < 8; i++)
for (k = 0; k < 8; k++)
for (l = 0; l < 32; l++)
{
c = scr[j*2048 + k*256 + i*32 + l];
for (m = 0; m < 8; m++)
{
s = (c & 128) >> 7;
a = atr[j*256 + i*32 + l];
 
if ( (a & 64) == 64 )
bri = 8;
else
bri = 0;
 
if ( 0 == s )
{
if (!(flash && (128 == (a&128))))
color = &palette[6*(bri+((a>>3)&7))];
else
color = &palette[6*(bri+(a&7))];
 
addr = screen + 2*screen_a_w*3*z + 2*3*n;
 
for (y = 0; y < 2; y++)
memcpy( addr + y*screen_a_w*3,
color, 6);
}
else
{
if (!(flash && (128 == (a&128))))
color = &palette[6*(bri+(a&7))];
else
color = &palette[6*(bri+((a>>3)&7))];
addr = screen + 2*screen_a_w*3*z + 2*3*n;
 
for (y = 0; y < 2; y++)
memcpy( addr + y*screen_a_w*3,
color, 6);
}
 
n++;
if (256 == n)
{
n = 0;
z++;
}
 
c <<= 1;
}
}
 
if ( 33 < (kol_time_tick() - time))
{
if (0 == flash)
flash = 1;
else
flash = 0;
time = kol_time_tick();
}
 
free(scr);
free(atr);
 
}
 
///=============================
 
void memory_load_z80(Z80Regs *regs, char *filename)
{
char header[30];
kol_struct70 file;
 
file.p00 = 0;
file.p04 = 0;
file.p08 = 0;
file.p12 = 30;
file.p16 = (unsigned) header;
file.p20 = 0;
file.p21 = filename;
}
 
///=============================
 
void memory_load_sna(Z80Regs *regs, char *filename)
{
char buffer[27];
kol_struct70 file;
 
file.p00 = 0;
file.p04 = 0;
file.p08 = 0;
file.p12 = 27;
file.p16 = (unsigned) buffer;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
 
regs->I = buffer[ 0];
regs->HLs.B.l = buffer[ 1];
regs->HLs.B.h = buffer[ 2];
regs->DEs.B.l = buffer[ 3];
regs->DEs.B.h = buffer[ 4];
regs->BCs.B.l = buffer[ 5];
regs->BCs.B.h = buffer[ 6];
regs->AFs.B.l = buffer[ 7];
regs->AFs.B.h = buffer[ 8];
regs->HL.B.l = buffer[ 9];
regs->HL.B.h = buffer[10];
regs->DE.B.l = buffer[11];
regs->DE.B.h = buffer[12];
regs->BC.B.l = buffer[13];
regs->BC.B.h = buffer[14];
regs->IY.B.l = buffer[15];
regs->IY.B.h = buffer[16];
regs->IX.B.l = buffer[17];
regs->IX.B.h = buffer[18];
regs->IFF1 = regs->IFF2 = (buffer[19]&0x04) >>2;
regs->R.W = buffer[20];
regs->AF.B.l = buffer[21];
regs->AF.B.h = buffer[22];
regs->SP.B.l =buffer[23];
regs->SP.B.h =buffer[24];
regs->IM = buffer[25];
regs->BorderColor = buffer[26];
 
file.p00 = 0;
file.p04 = 27;
file.p08 = 0;
file.p12 = 0x4000*3;
file.p16 = (unsigned) regs->RAM+16384;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
 
regs->PC.B.l = Z80MemRead(regs->SP.W, regs);
regs->SP.W++;
regs->PC.B.h = Z80MemRead(regs->SP.W, regs);
regs->SP.W++;
 
}
 
 
///=============================
 
void memory_save_sna(Z80Regs *regs, char *filename)
{
char buffer[27];
unsigned char sptmpl, sptmph;
kol_struct70 file;
 
buffer[ 0] = regs->I;
buffer[ 1] = regs->HLs.B.l;
buffer[ 2] = regs->HLs.B.h;
buffer[ 3] = regs->DEs.B.l;
buffer[ 4] = regs->DEs.B.h;
buffer[ 5] = regs->BCs.B.l;
buffer[ 6] = regs->BCs.B.h;
buffer[ 7] = regs->AFs.B.l;
buffer[ 8] = regs->AFs.B.h;
buffer[ 9] = regs->HL.B.l;
buffer[10] = regs->HL.B.h;
buffer[11] = regs->DE.B.l;
buffer[12] = regs->DE.B.h;
buffer[13] = regs->BC.B.l;
buffer[14] = regs->BC.B.h;
buffer[15] = regs->IY.B.l;
buffer[16] = regs->IY.B.h;
buffer[17] = regs->IX.B.l;
buffer[18] = regs->IX.B.h;
buffer[19] = regs->IFF1 << 2;
buffer[20] = regs->R.W & 0xFF;
buffer[21] = regs->AF.B.l;
buffer[22] = regs->AF.B.h;
 
sptmpl = Z80MemRead( regs->SP.W-1, regs );
sptmph = Z80MemRead( regs->SP.W-2, regs );
 
Z80MemWrite( --(regs->SP.W), regs->PC.B.h, regs);
Z80MemWrite( --(regs->SP.W), regs->PC.B.l, regs);
 
buffer[23] = regs->SP.B.l;
buffer[24] = regs->SP.B.h;
buffer[25] = regs->IM;
buffer[26] = regs->BorderColor;
 
file.p00 = 2;
file.p04 = 0;
file.p08 = 0;
file.p12 = 27;
file.p16 = (unsigned) buffer;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
 
file.p00 = 3;
file.p04 = 27;
file.p08 = 0;
file.p12 = 0x4000*3;
file.p16 = (unsigned) regs->RAM+16384;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
 
regs->SP.W += 2;
Z80MemWrite( regs->SP.W-1, sptmpl, regs );
Z80MemWrite( regs->SP.W-2, sptmph, regs );
 
}
 
 
///=============================
 
void memory_save_scr(Z80Regs *regs, char *filename)
{
kol_struct70 file;
 
 
file.p00 = 2;
file.p04 = 0x4000;
file.p08 = 0;
file.p12 = 6912;
file.p16 = (unsigned) regs->RAM+16384;
file.p20 = 0;
file.p21 = filename;
 
kol_file_70(&file);
 
}
 
 
///=============================
 
void wnd_draw()
{
kol_paint_start();
kol_wnd_define( (screen_w-540)/2, (screen_h-440)/2, 540, 440, 0x34b0b0b0);
kol_wnd_caption(WND_CAPTION);
screen_print(&spectrumZ80);
kol_paint_image((540 - screen_a_w)/2-5,
(440 - screen_a_h-kol_skin_height())/2,
screen_a_w, screen_a_h, screen);
kol_paint_end();
}
 
///=============================
 
void kol_main()
{
 
unsigned event;
unsigned key;
 
for (event = strlen(KOL_PATH); event > 0; --event)
if ( '/' == KOL_PATH[event] )
{
KOL_PATH[event+1]=0;
break;
}
 
strcpy(szBackup, KOL_PATH);
strcpy(szScreen, KOL_PATH);
strcat(szBackup, "backup.sna");
strcat(szScreen, "screen.scr");
 
kol_screen_get_size(&screen_w, &screen_h);
 
screen = malloc(SCREEN_LEN);
spectrumZ80.RAM = (char*) malloc(64*1024);
memcpy(spectrumZ80.RAM, BIOS48, 16*1024);
 
Z80Reset( &spectrumZ80, 69888 );
Z80FlagTables();
 
fila[1][1] = fila[1][2] = fila[2][2] = fila[3][2] = fila[4][2] =
fila[4][1] = fila[3][1] = fila[2][1] = 0xFF;
 
debug = 0;
 
if (KOL_PARAM != NULL)
{
int type = get_ext(KOL_PARAM);
if (TYPE_SNA == type)
memory_load_sna(&spectrumZ80, KOL_PARAM);
}
 
hay_tecla = main_tecla = 0;
//keyboard_process(0);
 
kol_key_mode_set(1);
 
for (;;)
{
 
// event = kol_event_check();
event = kol_event_wait_time(1);
 
switch (event)
{
 
case 1:
wnd_draw();
break;
 
case 2:
key = (kol_key_get()>>8)&0xff;
switch (key)
{
case 60: // F2
if ( IDOK == MessageBox("Save snapshot?",
WND_CAPTION, MB_OKCANCEL) )
memory_save_sna(&spectrumZ80,
szBackup);
break;
 
case 61: // F3
if ( IDOK == MessageBox("Load snapshot?",
WND_CAPTION, MB_OKCANCEL) )
memory_load_sna(&spectrumZ80,
szBackup);
break;
 
case 62: // F4
if ( IDOK == MessageBox("Save screenshot?",
WND_CAPTION, MB_OKCANCEL) )
memory_save_scr(&spectrumZ80,
szScreen);
break;
 
case 88: // F12 Reset
if ( IDOK == MessageBox("Reset?",
WND_CAPTION, MB_OKCANCEL) )
{
Z80Reset( &spectrumZ80, 69888 );
Z80FlagTables();
fila[1][1] = fila[1][2] =
fila[2][2] = fila[3][2] =
fila[4][2] = fila[4][1] =
fila[3][1] = fila[2][1] = 0xFF;
}
break;
 
default:
keyboard_process(key);
};
 
break;
 
case 3:
if ( 1 == (kol_btn_get() & 0xff00)>>8 )
{
free(screen);
free(spectrumZ80.RAM);
kol_exit();
}
break;
 
default:
if (0 == debug)
{
 
Z80Run( &spectrumZ80, 224*64 );
for( scanl=0; scanl<192; scanl++ )
Z80Run( &spectrumZ80, 224 );
 
Z80Run( &spectrumZ80, 224*56 );
 
if( target_cycle < 2 || frame_counter == 0 )
{
screen_print(&spectrumZ80);
kol_screen_wait_rr();
kol_paint_image((540 - screen_a_w)/2-5,
(440 - screen_a_h-kol_skin_height())/2,
screen_a_w, screen_a_h, screen);
}
 
while( target_cycle == 0 )
{
target_cycle--;
frame_counter++;
}
}
break;
 
};
 
}
 
}
 
///=============================
 
/programs/emulator/e80/trunk/games/othello.sna
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/e80/trunk/games
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/e80/trunk/keyboard.c
0,0 → 1,408
 
///=============================
 
void keyboard_process(unsigned key)
{
 
switch (key)
{
 
case 42: // L-Shift Down
case 54: // R-Shift Down
fila[4][1] &= 0xFE;
break;
 
case 42+128: // L-Shift Up
case 54+128: // R-Shift Up
fila[4][1] |= 1;
break;
 
case 29: // Ctrl Down
fila[4][2] &= 0xFD;
break;
 
case 29+128: // Ctrl Up
fila[4][2] |= 2;
break;
 
case 56: // Alt Down
fila[4][1] &= 0xFE;
fila[4][2] &= 0xFD;
break;
 
case 56+128: // Alt Up
fila[4][1] |= 1;
fila[4][2] |= 2;
break;
 
case 28: // Enter Down
fila[3][2] &= 0xFE;
break;
 
case 28+128: // Enter Up
fila[3][2] |= 1;
break;
 
 
case 2: // 1 Down
fila[1][1] &= 0xFE;
break;
 
case 2+128: // 1 Up
fila[1][1] |= 1;
break;
 
case 3: // 2 Down
fila[1][1] &= 0xFD;
break;
 
case 3+128: // 2 Up
fila[1][1] |= 2;
break;
 
case 4: // 3 Down
fila[1][1] &= 0xFB;
break;
 
case 4+128: // 3 Up
fila[1][1] |= 4;
break;
 
case 5: // 4 Down
fila[1][1] &= 0xF7;
break;
 
case 5+128: // 4 Up
fila[1][1] |= 8;
break;
 
case 6: // 5 Down
fila[1][1] &= 0xEF;
break;
 
case 6+128: // 5 Up
fila[1][1] |= 16;
break;
 
case 7: // 6 Down
fila[1][2] &= 0xEF;
break;
 
case 7+128: // 6 Up
fila[1][2] |= 16;
break;
 
case 8: // 7 Down
fila[1][2] &= 0xF7;
break;
 
case 8+128: // 7 Up
fila[1][2] |= 8;
break;
 
case 9: // 8 Down
fila[1][2] &= 0xFB;
break;
 
case 9+128: // 8 Up
fila[1][2] |= 4;
break;
 
case 10: // 9 Down
fila[1][2] &= 0xFD;
break;
 
case 10+128: // 9 Up
fila[1][2] |= 2;
break;
 
case 11: // 0 Down
fila[1][2] &= 0xFE;
break;
 
case 11+128: // 0 Up
fila[1][2] |= 1;
break;
 
case 16: // Q Down
fila[2][1] &= 0xFE;
break;
 
case 16+128: // Q Up
fila[2][1] |= 1;
break;
 
case 17: // W Down
fila[2][1] &= 0xFD;
break;
 
case 17+128: // W Up
fila[2][1] |= 2;
break;
 
case 18: // E Down
fila[2][1] &= 0xFB;
break;
 
case 18+128: // E Up
fila[2][1] |= 4;
break;
 
case 19: // R Down
fila[2][1] &= 0xF7;
break;
 
case 19+128: // R Up
fila[2][1] |= 8;
break;
 
case 20: // T Down
fila[2][1] &= 0xEF;
break;
 
case 20+128: // T Up
fila[2][1] |= 16;
break;
 
case 21: // Y Down
fila[2][2] &= 0xEF;
break;
 
case 21+128: // Y Up
fila[2][2] |= 16;
break;
 
case 22: // U Down
fila[2][2] &= 0xF7;
break;
 
case 22+128: // U Up
fila[2][2] |= 8;
break;
 
case 23: // I Down
fila[2][2] &= 0xFB;
break;
 
case 23+128: // I Up
fila[2][2] |= 4;
break;
 
case 24: // O Down
fila[2][2] &= 0xFD;
break;
 
case 24+128: // O Up
fila[2][2] |= 2;
break;
 
case 25: // P Down
fila[2][2] &= 0xFE;
break;
 
case 25+128: // P Up
fila[2][2] |= 1;
break;
 
case 30: // A Down
fila[3][1] &= 0xFE;
break;
 
case 30+128: // A Up
fila[3][1] |= 1;
break;
 
case 31: // S Down
fila[3][1] &= 0xFD;
break;
 
case 31+128: // S Up
fila[3][1] |= 2;
break;
 
case 32: // D Down
fila[3][1] &= 0xFB;
break;
 
case 32+128: // D Up
fila[3][1] |= 4;
break;
 
case 33: // F Down
fila[3][1] &= 0xF7;
break;
 
case 33+128: // F Up
fila[3][1] |= 8;
break;
 
case 34: // G Down
fila[3][1] &= 0xEF;
break;
 
case 34+128: // G Up
fila[3][1] |= 16;
break;
 
case 35: // H Down
fila[3][2] &= 0xEF;
break;
 
case 35+128: // H Up
fila[3][2] |= 16;
break;
 
case 36: // J Down
fila[3][2] &= 0xF7;
break;
 
case 36+128: // J Up
fila[3][2] |= 8;
break;
 
case 37: // K Down
fila[3][2] &= 0xFB;
break;
 
case 37+128: // K Up
fila[3][2] |= 4;
break;
 
case 38: // L Down
fila[3][2] &= 0xFD;
break;
 
case 38+128: // L Up
fila[3][2] |= 2;
break;
 
case 44: // Z Down
fila[4][1] &= 0xFD;
break;
 
case 44+128: // Z Up
fila[4][1] |= 2;
break;
 
case 45: // X Down
fila[4][1] &= 0xFB;
break;
 
case 45+128: // X Up
fila[4][1] |= 4;
break;
 
case 46: // C Down
fila[4][1] &= 0xF7;
break;
 
case 46+128: // C Up
fila[4][1] |= 8;
break;
 
case 47: // V Down
fila[4][1] &= 0xEF;
break;
 
case 47+128: // V Up
fila[4][1] |= 16;
break;
 
case 48: // B Down
fila[4][2] &= 0xEF;
break;
 
case 48+128: // B Up
fila[4][2] |= 16;
break;
 
case 49: // N Down
fila[4][2] &= 0xF7;
break;
 
case 49+128: // N Up
fila[4][2] |= 8;
break;
 
case 50: // M Down
fila[4][2] &= 0xFB;
break;
 
case 50+128: // M Up
fila[4][2] |= 4;
break;
 
case 57: // Space Down
fila[4][2] &= 0xFE;
break;
 
case 57+128: // Space Up
fila[4][2] |= 1;
break;
 
case 14: // Backspace Down
fila[1][2] &= 0xFE;
fila[4][1] &= 0xFE;
break;
 
case 14+128: // Backspace Up
fila[1][2] |= 1;
fila[4][1] |= 1;
break;
 
case 12: // - Down
fila[3][2] &= 0xF7;
fila[4][2] &= 0xFD;
break;
 
case 12+128: // - Up
fila[3][2] |= 8;
fila[4][2] |= 2;
break;
 
case 53: // / Down
fila[4][1] &= 0xEF;
fila[4][2] &= 0xFD;
break;
 
case 53+128: // / Up
fila[4][1] |= 16;
fila[4][2] |= 2;
break;
 
case 52: // . Down
fila[4][2] &= 0xFB;
fila[4][2] &= 0xFD;
break;
 
case 52+128: // . Up
fila[4][2] |= 4;
fila[4][2] |= 2;
break;
 
case 51: // , Down
fila[4][2] &= 0xF7;
fila[4][2] &= 0xFD;
break;
 
case 51+128: // , Up
fila[4][2] |= 8;
fila[4][2] |= 2;
break;
 
case 13: // = Down
fila[3][2] &= 0xFD;
fila[4][2] &= 0xFD;
break;
 
case 13+128: // = Up
fila[3][2] |= 2;
fila[4][2] |= 2;
break;
 
};
 
}
 
///=============================
 
/programs/emulator/e80/trunk/keyboard.png
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/e80/trunk/kolibri.ld
0,0 → 1,20
/*OUTPUT_FORMAT("binary")*/
ENTRY(Start)
SECTIONS
{
.text 0x000000:
{
*(.text)
}
.data : {
*(.data)
hEnd = . ;
}
.bss :
{
*(.bss)
}
Memory = . ;
}
/programs/emulator/e80/trunk/readme.txt
0,0 → 1,45
 
============================================
e80. Âåðñèÿ 0.5.1 15 ôåâðàëÿ 2010 ãîäà
============================================
 
Ýìóëÿòîð ZX-Spectrum äëÿ ÎÑ Êîëèáðè.
Äëÿ çàïóñêà ïðîãðàìì íóæíî â KFAR
ñäåëàòü àññîöèàöèþ ñ ôàéëàìè SNA.
 
Àâòîð ÿäðà ýìóëÿòîðà Z80:
Santiago Romero Iglesias,
sromero@escomposlinux.org
 
============================================
 
Âíèìàíèå!
 
Ýìóëÿòîð ïîâòîðÿåò êëàâèàòóðó
ðåàëüíîãî Ñïåêòðóìà.
 
Ïîýòîìó ñì. ôàéë keyboard.png
 
Êëàâèøà Shift ñîîòâåòñòâóåò CS (CAPS SHIFT)
Êëàâèøà Ctrl ñîîòâåòñòâóåò SS (SYMBOL SHIFT)
Êëàâèøà Alt ñîîòâåòñòâóåò ïåðåêëþ÷åíèþ CS+SS
 
============================================
 
Äðóãèå êëàâèøè:
F12 - ïåðåçàãðóçêà ýìóëÿòîðà
 
F2 - ñîõðàíåíèå â òåêóùóþ ïàïêó
ôàéëà backup.sna
 
F3 - çàãðóçêà èç òåêóùåé ïàïêè
ôàéëà backup.sna
 
F4 - ñîõðàíåíèå â òåêóùóþ ïàïêó
ôàéëà screen.scr
 
============================================
Àëåêñàíäð Áîãîìàç, albom85@yandex.ru
http://albom06.boom.ru
/programs/emulator/e80/trunk/system/kolibri.c
0,0 → 1,412
 
#include "kolibri.h"
#include "string.h"
 
 
extern char KOL_PATH[256];
extern char KOL_PARAM[256];
extern char KOL_DIR[256];
 
 
void kol_exit()
{
asm ("int $0x40"::"a"(-1));
}
 
 
void kol_sleep(unsigned d)
{
asm ("int $0x40"::"a"(5), "b"(d));
}
 
 
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c)
{
asm ("nop"::"a"(0), "b"(x*65536+w), "c"(y*65536+h), "d"(c));
asm ("movl $0xffffff, %esi \n int $0x40");
}
 
 
void kol_wnd_move(unsigned x, unsigned y)
{
asm ("nop"::"a"(67), "b"(x), "c"(y));
asm ("movl $-1, %edx \n movl $-1, %esi \n int $0x40");
}
 
 
void kol_event_mask(unsigned e)
{
asm ("int $0x40"::"a"(40), "b"(e));
}
 
 
unsigned kol_event_wait()
{
asm ("int $0x40"::"a"(10));
}
 
 
unsigned kol_event_wait_time(unsigned time)
{
asm ("int $0x40"::"a"(23), "b"(time));
}
 
 
unsigned kol_event_check()
{
asm ("int $0x40"::"a"(11));
}
 
 
void kol_paint_start()
{
asm ("int $0x40"::"a"(12), "b"(1));
}
 
 
void kol_paint_end()
{
asm ("int $0x40"::"a"(12), "b"(2));
}
 
 
void kol_paint_pixel(unsigned x, unsigned y, unsigned c)
{
asm ("int $0x40"::"a"(1), "b"(x), "c"(y), "d"(c));
}
 
 
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c)
{
asm ("int $0x40"::"a"(13), "b"(x*65536+w), "c"(y*65536+h), "d"(c));
}
 
 
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c)
{
asm ("int $0x40"::"a"(38), "b"(x1*65536+x2), "c"(y1*65536+y2), "d"(c));
}
 
 
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c)
{
asm ("int $0x40"::"a"(4), "b"(x*65536+y), "c"(c), "d"(s));
}
 
 
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d)
{
asm ("int $0x40"::"a"(7), "c"(w*65536+h), "d"(x*65536+y), "b"(d));
}
 
 
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette)
{
asm ("nop"::"c"(w*65536+h), "d"(x*65536+y), "b"(d));
asm ("nop"::"a"(palette));
asm ("movl %eax, %edi");
asm ("xor %eax, %eax");
asm ("movl %eax, %ebp");
asm ("pushl $8");
asm ("popl %esi");
asm ("int $0x40"::"a"(65));
}
 
 
unsigned kol_key_get()
{
asm ("int $0x40"::"a"(2));
}
 
 
unsigned kol_key_control()
{
asm ("int $0x40"::"a"(66), "b"(3));
}
 
 
void kol_key_lang_set(unsigned lang)
{
asm ("int $0x40"::"a"(21), "b"(2), "c"(9), "d"(lang));
}
 
 
unsigned kol_key_lang_get()
{
asm ("int $0x40"::"a"(26), "b"(2), "c"(9));
}
 
 
void kol_key_mode_set(unsigned mode)
{
asm ("int $0x40"::"a"(66), "b"(1), "c"(mode));
}
 
 
unsigned kol_key_mode_get()
{
asm ("int $0x40"::"a"(66), "b"(2));
}
 
 
unsigned kol_btn_get()
{
asm ("int $0x40"::"a"(17));
}
 
 
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c)
{
asm ("nop"::"b"(x*65536+w), "c"(y*65536+h), "d"(d));
asm ("nop"::"a"(c));
asm ("movl %eax, %esi");
asm ("int $0x40"::"a"(8));
}
 
 
void kol_btn_type(unsigned t)
{
asm ("int $0x40"::"a"(48), "b"(1), "c"(t));
}
 
 
void kol_wnd_caption(char *s)
{
asm ("int $0x40"::"a"(71), "b"(1), "c"(s));
}
 
 
unsigned kol_mouse_pos()
{
asm ("int $0x40"::"a"(37), "b"(0));
}
 
 
unsigned kol_mouse_posw()
{
asm ("int $0x40"::"a"(37), "b"(1));
}
 
 
unsigned kol_mouse_btn()
{
asm ("int $0x40"::"a"(37), "b"(2));
}
 
 
void kol_board_putc(char c)
{
asm ("int $0x40"::"a"(63), "b"(1), "c"(c));
}
 
 
void kol_board_puts(char *s)
{
unsigned i;
i = 0;
while (*(s+i))
{
asm ("int $0x40"::"a"(63), "b"(1), "c"(*(s+i)));
i++;
}
}
 
 
void kol_board_puti(int n)
{
char c;
int i = 0;
do
{
c = n % 10 + '0';
asm ("int $0x40"::"a"(63), "b"(1), "c"(c));
i++;
}
while ((n /= 10) > 0);
}
 
 
int kol_file_70(kol_struct70 *k)
{
asm ("int $0x40"::"a"(70), "b"(k));
}
 
 
kol_struct_import* kol_cofflib_load(char *name)
{
asm ("int $0x40"::"a"(68), "b"(19), "c"(name));
}
 
 
void* kol_cofflib_procload (kol_struct_import *imp, char *name)
{
int i;
for (i=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
if ( 0 == strcmp(name, (imp+i)->name) )
return (imp+i)->data;
return NULL;
}
 
 
unsigned kol_cofflib_procnum (kol_struct_import *imp)
{
unsigned i, n;
 
for (i=n=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
n++;
 
return n;
}
 
 
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n)
{
unsigned i;
*name = 0;
 
for (i=0;;i++)
if ( NULL == ((imp+i) -> name))
break;
else
if ( i == n )
{
strcpy(name, ((imp+i)->name));
break;
}
 
}
 
 
unsigned kol_system_cpufreq()
{
asm ("int $0x40"::"a"(18), "b"(5));
}
 
 
unsigned kol_system_mem()
{
asm ("int $0x40"::"a"(18), "b"(17));
}
 
 
unsigned kol_system_memfree()
{
asm ("int $0x40"::"a"(18), "b"(16));
}
 
 
unsigned kol_system_time_get()
{
asm ("int $0x40"::"a"(3));
}
 
 
unsigned kol_system_date_get()
{
asm ("int $0x40"::"a"(29));
}
 
 
unsigned kol_system_end(unsigned param)
{
asm ("int $0x40"::"a"(18), "b"(9), "c"(param));
}
 
 
void kol_path_file2dir(char *dir, char *fname)
{
unsigned i;
strcpy (dir, fname);
for ( i = strlen(dir);; --i)
if ( '/' == dir[i])
{
dir[i] = '\0';
return;
}
}
 
 
void kol_path_full(char *full, char *fname)
{
char temp[256];
 
switch (*fname)
{
 
case '/':
strncpy(temp, fname+1, 2);
temp[2]=0;
if ( (!strcmp("rd", temp)) || (!strcmp("hd", temp)) || (!strcmp("cd", temp)) )
strcpy (full, fname);
break;
 
case '.':
break;
 
default:
break;
 
};
 
}
 
 
 
void kol_screen_wait_rr()
{
asm ("int $0x40"::"a"(18), "b"(14));
}
 
 
 
void kol_screen_get_size(unsigned *w, unsigned *h)
{
unsigned size;
asm ("int $0x40":"=a"(size):"a"(14));
*w = size / 65536;
*h = size % 65536;
}
 
 
 
unsigned kol_skin_height()
{
asm ("int $0x40"::"a"(48), "b"(4));
}
 
 
unsigned kol_thread_start(unsigned start, unsigned stack)
{
asm ("int $0x40"::"a"(51), "b"(1), "c"(start), "d"(stack));
}
 
 
unsigned kol_time_tick()
{
asm ("int $0x40"::"a"(26), "b"(9));
}
 
 
unsigned kol_sound_speaker(char data[])
{
asm ("movl %0, %%esi"::"a"(data));
asm ("int $0x40"::"a"(55), "b"(55));
}
 
 
unsigned kol_process_info(unsigned slot, char buf1k[])
{
asm ("int $0x40"::"a"(9), "b"(buf1k), "c"(slot));
}
 
 
int kol_process_kill_pid(unsigned process)
{
asm ("int $0x40"::"a"(18), "b"(18), "c"(process));
}
/programs/emulator/e80/trunk/system/kolibri.h
0,0 → 1,90
 
#define NULL ((void*)0)
 
typedef struct
{
unsigned p00 __attribute__((packed));
unsigned p04 __attribute__((packed));
unsigned p08 __attribute__((packed));
unsigned p12 __attribute__((packed));
unsigned p16 __attribute__((packed));
char p20 __attribute__((packed));
char *p21 __attribute__((packed));
} kol_struct70 __attribute__((packed));
 
 
typedef struct
{
unsigned p00 __attribute__((packed));
char p04 __attribute__((packed));
char p05[3] __attribute__((packed));
unsigned p08 __attribute__((packed));
unsigned p12 __attribute__((packed));
unsigned p16 __attribute__((packed));
unsigned p20 __attribute__((packed));
unsigned p24 __attribute__((packed));
unsigned p28 __attribute__((packed));
unsigned p32[2] __attribute__((packed));
unsigned p40 __attribute__((packed));
} kol_struct_BDVK __attribute__((packed));
 
typedef struct
{
char *name __attribute__((packed));
void *data __attribute__((packed));
} kol_struct_import __attribute__((packed));
 
 
void kol_exit();
void kol_sleep(unsigned d);
void kol_wnd_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
void kol_wnd_move(unsigned x, unsigned y);
void kol_wnd_caption(char *s);
void kol_event_mask(unsigned e);
unsigned kol_event_wait();
unsigned kol_event_wait_time(unsigned time);
unsigned kol_event_check();
void kol_paint_start();
void kol_paint_end();
void kol_paint_pixel(unsigned x, unsigned y, unsigned c);
void kol_paint_bar(unsigned x, unsigned y, unsigned w, unsigned h, unsigned c);
void kol_paint_line(unsigned x1, unsigned y1, unsigned x2, unsigned y2, unsigned c);
void kol_paint_string(unsigned x, unsigned y, char *s, unsigned c);
void kol_paint_image(unsigned x, unsigned y, unsigned w, unsigned h, char *d);
void kol_paint_image_pal(unsigned x, unsigned y, unsigned w, unsigned h, char *d, unsigned *palette);
unsigned kol_key_get();
unsigned kol_key_control();
void kol_key_lang_set(unsigned lang);
unsigned kol_key_lang_get();
void kol_key_mode_set(unsigned mode);
unsigned kol_key_mode_get();
void kol_btn_define(unsigned x, unsigned y, unsigned w, unsigned h, unsigned d, unsigned c);
unsigned kol_btn_get();
void kol_btn_type(unsigned t);
unsigned kol_mouse_pos();
unsigned kol_mouse_posw();
unsigned kol_mouse_btn();
void kol_board_putc(char c);
void kol_board_puts(char *s);
void kol_board_puti(int n);
int kol_file_70(kol_struct70 *k);
kol_struct_import* kol_cofflib_load(char *name);
void* kol_cofflib_procload (kol_struct_import *imp, char *name);
unsigned kol_cofflib_procnum (kol_struct_import *imp);
void kol_cofflib_procname (kol_struct_import *imp, char *name, unsigned n);
unsigned kol_system_end(unsigned param);
unsigned kol_system_cpufreq();
unsigned kol_system_mem();
unsigned kol_system_memfree();
unsigned kol_system_time_get();
unsigned kol_system_date_get();
void kol_path_file2dir(char *dir, char *fname);
void kol_path_full(char *full, char *fname);
void kol_screen_wait_rr();
void kol_screen_get_size(unsigned *w, unsigned *h);
unsigned kol_skin_height();
unsigned kol_thread_start(unsigned start, unsigned stack);
unsigned kol_time_tick();
unsigned kol_sound_speaker(char data[]);
unsigned kol_process_info(unsigned slot, char buf1k[]);
int kol_process_kill_pid(unsigned process);
/programs/emulator/e80/trunk/system/msgbox.c
0,0 → 1,167
 
///=============================
 
#define MB_OK 0
#define MB_OKCANCEL 1
#define MB_ABORTRETRYIGNORE 2
#define MB_YESNOCANCEL 3
#define MB_YESNO 4
#define MB_RETRYCANCEL 5
 
#define IDOK 1
#define IDCANCEL 2
#define IDABORT 3
#define IDRETRY 4
#define IDIGNORE 5
#define IDYES 6
#define IDNO 7
 
///=============================
 
#define LANG_EN
 
#ifdef LANG_RU
char BTN_OK[]={"OK"};
char BTN_CANCEL[]={"Žâ¬¥­ "};
char BTN_ABORT[]={"à¥ªà â¨âì"};
char BTN_RETRY[]={"®¢â®à¨âì"};
char BTN_INGNORE[]={"ˆ£­®à¨à®¢ âì"};
char BTN_NO[]={"¥â"};
#endif
 
#ifdef LANG_EN
char BTN_OK[]={"OK"};
char BTN_CANCEL[]={"Cancel"};
char BTN_ABORT[]={"Abort"};
char BTN_RETRY[]={"Retry"};
char BTN_INGNORE[]={"Ignore"};
char BTN_NO[]={"No"};
#endif
 
///=============================
 
kol_struct_import *MSG_BOX_IMPORT = NULL;
int (* _stdcall mb_create)(char *m, char* t);
 
char msg[1024];
char thread[1024];
 
 
///=============================
 
char MessageBox(char *text, char *caption, int type)
{
 
int i, j;
 
if (MSG_BOX_IMPORT == NULL)
{
MSG_BOX_IMPORT = kol_cofflib_load("/sys/lib/Msgbox.obj");
if (MSG_BOX_IMPORT == NULL)
kol_exit();
 
mb_create = kol_cofflib_procload (MSG_BOX_IMPORT, "mb_create");
if (mb_create == NULL)
kol_exit();
 
}
 
msg[0] = 255;
msg[1] = 0;
 
for (i = 2, j = 0; ;i++, j++)
{
msg[i] = caption[j];
if (0 == msg[i])
break;
}
 
i++;
msg[i] = 0;
 
for (j = 0; ;i++, j++)
{
msg[i] = text[j];
if (0 == msg[i])
break;
}
 
i++;
msg[i] = 0;
 
switch (type)
{
case MB_OK:
for (j = 0; ;i++, j++)
{
msg[i] = BTN_OK[j];
if (0 == msg[i])
break;
}
break;
 
case MB_OKCANCEL:
for (j = 0; ;i++, j++)
{
msg[i] = BTN_OK[j];
if (0 == msg[i])
break;
}
 
i++;
msg[i] = 0;
 
for (j = 0; ;i++, j++)
{
msg[i] = BTN_CANCEL[j];
if (0 == msg[i])
break;
}
break;
 
default:
break;
 
}
i++;
msg[i] = 0;
 
mb_create(msg, thread+1024);
 
for (;;)
{
if ( (unsigned char) msg[0] != 255 )
switch (type)
{
case MB_OK:
if (msg[0] == 1)
return IDOK;
else
return 0;
break;
 
case MB_OKCANCEL:
switch(msg[0])
{
case 1:
return IDOK;
case 2:
return IDCANCEL;
default:
return 0;
};
break;
 
default:
return 0;
 
};
 
kol_sleep(10);
}
 
 
}
 
///=============================
 
/programs/emulator/e80/trunk/system/stdlib.c
0,0 → 1,33
 
unsigned int seed_o = 0x45168297;
 
 
void srand (unsigned seed)
{
seed_o = seed;
}
 
 
int rand (void)
{
seed_o = seed_o * 0x15a4e35 + 1;
return(seed_o >> 16);
}
 
 
void* malloc(unsigned s)
{
asm ("int $0x40"::"a"(68), "b"(12), "c"(s) );
}
 
 
void free(void *p)
{
asm ("int $0x40"::"a"(68), "b"(13), "c"(p) );
}
 
 
void* realloc(void *p, unsigned s)
{
asm ("int $0x40"::"a"(68), "b"(12), "c"(p), "d"(s) );
}
/programs/emulator/e80/trunk/system/stdlib.h
0,0 → 1,14
 
#define RAND_MAX 0x7FFFU
 
#define isspace(c) ((c)==' ')
#define abs(i) (((i)<0)?(-(i)):(i))
 
#define random(num) ((rand()*(num))/((RAND_MAX+1)))
 
void* malloc(unsigned size);
void free(void *pointer);
void* realloc(void* pointer, unsigned size);
 
void srand (unsigned seed);
int rand (void);
/programs/emulator/e80/trunk/system/string.c
0,0 → 1,124
 
#include "string.h"
 
void* memset(void *mem, int c, unsigned size)
{
unsigned i;
 
for ( i = 0; i < size; i++ )
*((char *)mem+i) = (char) c;
 
return NULL;
}
 
 
void* memcpy(void *dst, const void *src, unsigned size)
{
 
unsigned i;
 
for ( i = 0; i < size; i++)
*(char *)(dst+i) = *(char *)(src+i);
 
return NULL;
}
 
 
int memcmp(const void* buf1, const void* buf2, int count)
{
int i;
for (i=0;i<count;i++)
{
if (*(unsigned char*)buf1<*(unsigned char*)buf2)
return -1;
if (*(unsigned char*)buf1>*(unsigned char*)buf2)
return 1;
}
return 0;
}
 
void strcat(char strDest[], char strSource[])
{
 
int i, j;
i = j = 0;
while (strDest[i] != '\0')
i++;
 
while ((strDest[i++] = strSource[j++]) != '\0')
;
}
 
 
int strcmp(const char* string1, const char* string2)
{
 
while (1)
{
if (*string1<*string2)
return -1;
if (*string1>*string2)
return 1;
 
if (*string1=='\0')
return 0;
 
string1++;
string2++;
}
 
}
 
 
void strcpy(char strDest[], const char strSource[])
{
unsigned i;
 
i = 0;
while ((strDest[i] = strSource[i]) != '\0')
i++;
 
}
 
 
char* strncpy(char *strDest, const char *strSource, unsigned n)
{
unsigned i;
 
if (! n )
return strDest;
 
i = 0;
while ((strDest[i] = strSource[i]) != '\0')
if ( (n-1) == i )
break;
else
i++;
 
return strDest;
}
 
 
int strlen(const char* string)
{
int i;
 
i=0;
while (*string++) i++;
return i;
}
 
 
 
char* strchr(const char* string, int c)
{
while (*string)
{
if (*string==c)
return (char*)string;
string++;
}
return (char*)0;
}
 
/programs/emulator/e80/trunk/system/string.h
0,0 → 1,15
 
#ifndef NULL
#define NULL ((void*)0)
#endif
 
void* memset(void *mem, int c, unsigned size);
void* memcpy(void *dst, const void *src, unsigned size);
int memcmp(const void* buf1, const void* buf2, int count);
 
void strcat(char strDest[], char strSource[]);
int strcmp(const char* string1, const char* string2);
void strcpy(char strDest[], const char strSource[]);
char* strncpy(char *strDest, const char *strSource, unsigned n);
int strlen(const char* string);
char *strchr(const char* string, int c);
/programs/emulator/e80/trunk/system
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/e80/trunk/z80/macros.c
0,0 → 1,447
/*=====================================================================
Macros.c -> Macros used on the opcode execution.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
======================================================================*/
 
/* defines for the registers: faster access to them when coding... */
 
#define r_PC regs->PC.W
#define r_PCl regs->PC.B.l
#define r_PCh regs->PC.B.h
#define r_SP regs->SP.W
#define r_IFF1 regs->IFF1
#define r_IFF2 regs->IFF2
#define r_R regs->R.W
 
#define r_AF regs->AF.W
#define r_A regs->AF.B.h
#define r_F regs->AF.B.l
#define r_BC regs->BC.W
#define r_B regs->BC.B.h
#define r_C regs->BC.B.l
#define r_DE regs->DE.W
#define r_D regs->DE.B.h
#define r_E regs->DE.B.l
#define r_HL regs->HL.W
#define r_H regs->HL.B.h
#define r_L regs->HL.B.l
#define r_IX regs->IX.W
#define r_IXh regs->IX.B.h
#define r_IXl regs->IX.B.l
#define r_IY regs->IY.W
#define r_IYh regs->IY.B.h
#define r_IYl regs->IY.B.l
 
#define r_AFs regs->AFs.W
#define r_As regs->AFs.B.h
#define r_Fs regs->AFs.B.l
#define r_BCs regs->BCs.W
#define r_Bs regs->BCs.B.h
#define r_Cs regs->BCs.B.l
#define r_DEs regs->DEs.W
#define r_Ds regs->DEs.B.h
#define r_Es regs->DEs.B.l
#define r_HLs regs->HLs.W
#define r_Hs regs->HLs.B.h
#define r_Ls regs->HLs.B.l
#define r_IXs regs->IX.W
#define r_IXhs regs->IX.B.h
#define r_IXls regs->IX.B.l
#define r_IYs regs->IY.W
#define r_IYhs regs->IY.B.h
#define r_IYls regs->IY.B.l
 
#define r_op ops.W
#define r_oph ops.B.h
#define r_opl ops.B.l
#define r_tmp tmpreg2.W
#define r_tmph tmpreg2.B.h
#define r_tmpl tmpreg2.B.l
#define r_mem mread.W
#define r_memh mread.B.h
#define r_meml mread.B.l
 
#ifndef _DISASM_
/*--- Flag tables by Philip Kendall, taken from it's fuse emulator -*/
/*--- I was having headache trying to emulate correctly the FLAGS,
so I finished using the FLAG tables used by P. Kendall. ------*/
#define FLAG_C 0x01
#define FLAG_N 0x02
#define FLAG_P 0x04
#define FLAG_V FLAG_P
#define FLAG_3 0x08
#define FLAG_H 0x10
#define FLAG_5 0x20
#define FLAG_Z 0x40
#define FLAG_S 0x80
 
/* Whether a half carry occured or not can be determined by looking at
the 3rd bit of the two arguments and the result; these are hashed
into this table in the form r12, where r is the 3rd bit of the
result, 1 is the 3rd bit of the 1st argument and 2 is the
third bit of the 2nd argument; the tables differ for add and subtract
operations */
 
/* Whether a half carry occured or not can be determined by looking at
the 3rd bit of the two arguments and the result; these are hashed
into this table in the form r12, where r is the 3rd bit of the
result, 1 is the 3rd bit of the 1st argument and 2 is the
third bit of the 2nd argument; the tables differ for add and subtract
operations */
byte halfcarry_add_table[] = { 0, FLAG_H, FLAG_H, FLAG_H, 0, 0, 0, FLAG_H };
byte halfcarry_sub_table[] = { 0, 0, FLAG_H, 0, FLAG_H, 0, FLAG_H, FLAG_H };
 
/* Similarly, overflow can be determined by looking at the 7th bits; again
the hash into this table is r12 */
byte overflow_add_table[] = { 0, 0, 0, FLAG_V, FLAG_V, 0, 0, 0 };
byte overflow_sub_table[] = { 0, FLAG_V, 0, 0, 0, 0, FLAG_V, 0 };
 
/* Some more tables; initialised in z80_init_tables() */
byte sz53_table[0x100]; /* The S, Z, 5 and 3 bits of the temp value */
byte parity_table[0x100]; /* The parity of the temp value */
byte sz53p_table[0x100]; /* OR the above two tables together */
/*------------------------------------------------------------------*/
 
// Contributed by Metalbrain to implement OUTI, etc.
byte ioblock_inc1_table[64];
byte ioblock_dec1_table[64];
byte ioblock_2_table[0x100];
 
/*--- Memory Write on the A address on no bank machines -------------*/
void Z80WriteMem( word where, word A, Z80Regs *regs)
{
if( where >= 16384 )
regs->RAM[where] = A;
}
 
#endif
 
 
/*--- Memory Read from the A address on no bank machines -------------*/
#define Z80ReadMem(A) ((regs->RAM[(A)]))
 
// return( regs->RAM[A] );
 
 
/* macros to change the ICount register */
#define AddCycles(n) regs->ICount-=(n)
 
#define SubCycles(n) regs->ICount+=(n)
 
//#define AddR(n) r_R = (r_R+(n))
#define AddR(n) r_R = ((r_R & 0x80) | ((r_R+(n)) & 0x7f ))
#define SubR(n) r_R = ((r_R & 0x80) | ((r_R-(n)) & 0x7f ))
 
 
/* setting and resetting the flag bits: */
#define SET_FLAG(flag) (r_F |= (flag))
 
#define RESET_FLAG(flag) (r_F &= ~(flag))
 
#define TEST_FLAG(flag) (r_F & (flag))
 
 
/* store a given register in the stack (hi and lo bytes) */
#define PUSH(rreg) \
Z80WriteMem( --(r_SP), regs->rreg.B.h, regs); \
Z80WriteMem( --(r_SP), regs->rreg.B.l, regs)
 
#define POP(rreg)\
regs->rreg.B.l = Z80ReadMem(r_SP); r_SP++;\
regs->rreg.B.h = Z80ReadMem(r_SP); r_SP++
 
#define PUSH_IXYr() \
Z80WriteMem( --(r_SP), REGH, regs); \
Z80WriteMem( --(r_SP), REGL, regs)
 
#define POP_IXYr()\
REGL = Z80ReadMem(r_SP); r_SP++; \
REGH = Z80ReadMem(r_SP); r_SP++
 
#define RST(rstval) PUSH(PC); r_PC=(rstval)
 
 
/*--- Move data to mem or regs --------------------------------------*/
#define LD_r_r(dreg, sreg) (dreg) = (sreg)
 
#define STORE_r(daddreg, sreg) Z80WriteMem((daddreg), (sreg), regs)
 
#define STORE_nn_rr(dreg) \
r_opl = Z80ReadMem(r_PC); r_PC++;\
r_oph = Z80ReadMem(r_PC); r_PC++; \
r_tmp = dreg; \
Z80WriteMem((r_op),r_tmpl, regs); \
Z80WriteMem((r_op+1),r_tmph, regs)
 
#define STORE_nn_r(sreg) \
r_opl = Z80ReadMem(r_PC); r_PC++; \
r_oph = Z80ReadMem(r_PC); r_PC++; \
Z80WriteMem((r_op),(sreg), regs)
 
#define LOAD_r(dreg, saddreg) (dreg)=Z80ReadMem((saddreg))
 
#define LOAD_rr_nn(dreg) r_opl = Z80ReadMem(r_PC); r_PC++; \
r_oph = Z80ReadMem(r_PC); r_PC++; \
r_tmpl = Z80ReadMem(r_op); \
r_tmph = Z80ReadMem((r_op)+1); \
dreg=r_tmp
 
 
#define LOAD_r_nn(dreg) r_opl = Z80ReadMem(r_PC); r_PC++; \
r_oph = Z80ReadMem(r_PC); r_PC++; \
dreg = Z80ReadMem(r_op)
 
#define LD_r_n(reg) (reg) = Z80ReadMem(r_PC++)
 
#define LD_rr_nn(reg) r_opl = Z80ReadMem(r_PC); r_PC++; \
r_oph = Z80ReadMem(r_PC); r_PC++; \
reg = r_op
 
#define EX(reg1,reg2) r_opl=(reg1); (reg1)=(reg2); (reg2)=r_opl
 
#define EX_WORD(reg1,reg2) r_op=(reg1); (reg1)=(reg2); (reg2)=r_op
 
/*--- Increments/Decrements -----------------------------------------*/
#define INC(reg) (reg)++; \
r_F = ( r_F & FLAG_C ) | ( (reg)==0x80 ? FLAG_V : 0 ) | \
( (reg)&0x0f ? 0 : FLAG_H ) | ( (reg) ? 0 : FLAG_Z ) | \
sz53_table[(reg)]
 
#define DEC(reg) \
r_F = ( r_F & FLAG_C ) | ( (reg)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(reg)--; \
r_F |= ( (reg)==0x7f ? FLAG_V : 0 ) | sz53_table[(reg)]
 
// it was:
// r_F |= ( (reg)==0x79 ? FLAG_V : 0 ) | sz53_table[(reg)]
// But Kak pointed my was not 0x79 -> 0x7F, changed 7-3-2001
 
 
/*--- Bit operations ------------------------------------------------*/
#define BIT_RES(b,reg) reg &= ~(0x1<<b)
 
#define BIT_SET(b,reg) reg |= (0x1<<b)
 
#define BIT_mem_RES(b,addr) r_opl = Z80ReadMem(addr); \
r_opl &= ~(0x1<<b); \
Z80WriteMem(addr, r_opl, regs)
 
#define BIT_mem_SET(b,addr) r_opl = Z80ReadMem(addr); \
r_opl |= (0x1<<b); \
Z80WriteMem(addr, r_opl, regs)
 
#define BIT_RES_mem(b,addr,reg) reg &= ~(0x1<<b); \
Z80WriteMem((addr), (reg), regs)
 
#define BIT_SET_mem(b,addr,reg) reg |= (0x1<<b); \
Z80WriteMem((addr), (reg), regs)
 
#define BIT_BIT(b,reg) r_F = ( r_F & FLAG_C ) | \
( (reg) & ( FLAG_3 | FLAG_5 ) ) |\
(((reg) & ( 0x01 << b ) ) ? FLAG_H : \
(FLAG_P|FLAG_H|FLAG_Z ) )
 
#define BIT_mem_BIT(b,reg) r_opl = Z80ReadMem(reg); \
r_F = ( r_F & FLAG_C ) | \
( (r_opl) & ( FLAG_3 | FLAG_5 ) ) |\
(((r_opl) & ( 0x01 << b ) ) ? FLAG_H : \
(FLAG_P|FLAG_H|FLAG_Z ) )
 
#define BIT_BIT7(reg) r_F = ( r_F & FLAG_C ) | ( (reg) & \
( FLAG_3 | FLAG_5 ) ) |\
(((reg) & 0x80 ) ? ( FLAG_H | FLAG_S ) :\
( FLAG_P | FLAG_H | FLAG_Z ) )
 
#define BIT_mem_BIT7(reg) r_opl = Z80ReadMem(reg); \
r_F = ( r_F & FLAG_C ) | ( (r_opl) & \
( FLAG_3 | FLAG_5 ) ) |\
(((r_opl) & 0x80 ) ? ( FLAG_H | FLAG_S ) :\
( FLAG_P | FLAG_H | FLAG_Z ) )
 
 
#define RLC(reg) (reg) = ( (reg)<<1 ) | ( (reg)>>7 ); \
r_F = ( (reg) & FLAG_C ) | sz53p_table[(reg)]
 
#define RRC(reg) r_F = (reg) & FLAG_C; \
(reg) = ( (reg)>>1 ) | ( (reg)<<7 );\
r_F |= sz53p_table[(reg)]
 
#define RL(reg) r_opl = (reg); \
(reg) = ( (reg)<<1 ) | ( r_F & FLAG_C ); \
r_F = ( r_opl >> 7 ) | sz53p_table[(reg)]
 
#define RR(reg) r_opl = (reg); \
(reg) = ( (reg)>>1 ) | ( r_F << 7 );\
r_F = ( r_opl & FLAG_C ) | sz53p_table[(reg)]
 
#define SLA(reg) r_F = (reg) >> 7;\
(reg) <<= 1;\
r_F |= sz53p_table[(reg)]
 
#define SRA(reg) r_F = (reg) & FLAG_C; \
(reg) = ( (reg) & 0x80 ) | ( (reg) >> 1 );\
r_F |= sz53p_table[(reg)]
 
#define SLL(reg) r_F = (reg) >> 7;\
(reg) = ( (reg) << 1 ) | 0x01;\
r_F |= sz53p_table[(reg)]
 
#define SRL(reg) r_F = (reg) & FLAG_C;\
(reg) >>= 1;\
r_F |= sz53p_table[(reg)]
 
 
 
/*--- JP operations -------------------------------------------------*/
#define JP_nn() r_opl = Z80ReadMem(r_PC); \
r_PC++; \
r_oph = Z80ReadMem(r_PC); \
r_PC = r_op
 
#define JR_n() r_PC += (offset) (Z80ReadMem(r_PC)); r_PC++
 
#define RET_nn() r_PCl = Z80ReadMem (r_SP); r_SP++; \
r_PCh = Z80ReadMem (r_SP); r_SP++;
 
#define CALL_nn() r_opl = Z80ReadMem (r_PC); r_PC++; \
r_oph = Z80ReadMem (r_PC); r_PC++; \
Z80WriteMem( --(r_SP), r_PCh, regs ); \
Z80WriteMem( --(r_SP), r_PCl, regs ); \
r_PC = r_op
 
 
/*--- ALU operations ------------------------------------------------*/
#define AND(reg) r_A &= (reg); \
r_F = FLAG_H | sz53p_table[r_A]
 
#define OR(reg) r_A |= (reg); \
r_F = sz53p_table[r_A]
 
#define XOR(reg) r_A ^= (reg); \
r_F = sz53p_table[r_A]
 
#define AND_mem(raddress) r_opl = Z80ReadMem(raddress); \
r_A &= (r_opl); \
r_F = FLAG_H | sz53p_table[r_A]
 
#define OR_mem(raddress) r_opl = Z80ReadMem(raddress); \
r_A |= (r_opl); \
r_F = sz53p_table[r_A]
 
#define XOR_mem(raddress) r_opl = Z80ReadMem(raddress); \
r_A ^= (r_opl); \
r_F = sz53p_table[r_A]
 
#define ADD(val) tempword = r_A + (val); \
r_oph = ((r_A&0x88)>>3)|(((val)&0x88)>>2) | \
( (tempword & 0x88) >> 1 ); \
r_A = tempword; \
r_F = ( tempword & 0x100 ? FLAG_C : 0 ) | \
halfcarry_add_table[ r_oph & 0x07] | \
overflow_add_table[ r_oph >> 4] | \
sz53_table[r_A]
 
#define ADD_WORD(value1,value2) \
tempdword = (value1) + (value2); \
r_oph = ( ( (value1) & 0x0800 ) >> 11 ) | \
( ( (value2) & 0x0800 ) >> 10 ) | \
( ( tempdword & 0x0800 ) >> 9 ); \
(value1) = tempdword; \
r_F = ( r_F & ( FLAG_V | FLAG_Z | FLAG_S ) ) | \
( tempdword & 0x10000 ? FLAG_C : 0 ) | \
(( tempdword >> 8 ) & ( FLAG_3 | FLAG_5 ) ) | \
halfcarry_add_table[r_oph]
 
#define ADC(value) \
tempword = r_A + (value) + ( r_F & FLAG_C ); \
r_oph = ( (r_A & 0x88) >> 3 ) | ( ( (value) & 0x88 ) >> 2 ) |\
( (tempword & 0x88) >> 1 ); \
r_A = tempword; \
r_F = ( tempword & 0x100 ? FLAG_C : 0 ) | \
halfcarry_add_table[r_oph & 0x07] | \
overflow_add_table[r_oph >> 4] | \
sz53_table[r_A]
 
#define ADC_WORD(value) \
tempdword= r_HL + (value) + ( r_F & FLAG_C ); \
r_oph = ( ( r_HL & 0x8800 ) >> 11 ) | \
( ( (value) & 0x8800 ) >> 10 ) | \
( ( tempdword & 0x8800 ) >> 9 ); \
r_HL = tempdword; \
r_F = ( tempdword & 0x10000 ? FLAG_C : 0 )| \
overflow_add_table[r_oph >> 4] | \
( r_H & ( FLAG_3 | FLAG_5 | FLAG_S ) ) | \
halfcarry_add_table[ r_oph & 0x0f ]| \
( r_HL ? 0 : FLAG_Z )
 
#define SUB(value) \
tempword = r_A - (value);\
r_opl = ( (r_A & 0x88) >> 3 ) | \
( ( (value) & 0x88 ) >> 2 ) | \
( (tempword & 0x88) >> 1 ); \
r_A = tempword; \
r_F = ( tempword & 0x100 ? FLAG_C : 0 ) | FLAG_N | \
halfcarry_sub_table[r_opl & 0x07] | \
overflow_sub_table[r_opl >> 4] | \
sz53_table[r_A]
 
#define SBC(value) \
tempword = r_A - (value) - ( r_F & FLAG_C ); \
r_opl = ( (r_A & 0x88) >> 3 ) | \
( ( (value) & 0x88 ) >> 2 ) | \
( (tempword & 0x88) >> 1 ); \
r_A = tempword; \
r_F = ( tempword & 0x100 ? FLAG_C : 0 ) | FLAG_N | \
halfcarry_sub_table[r_opl & 0x07] | \
overflow_sub_table[r_opl >> 4] | \
sz53_table[r_A]
 
 
#define SBC_WORD(Rg) \
tempword=r_F & C_FLAG; r_op=(r_HL-Rg-tempword)&0xFFFF; \
r_F= \
N_FLAG| \
(((long)r_HL-(long)Rg-(long)tempword)&0x10000? C_FLAG:0)| \
((r_HL^Rg)&(r_HL^r_op)&0x8000? O_FLAG:0)| \
((r_HL^Rg^r_op)&0x1000? H_FLAG:0)| \
(r_op? 0:Z_FLAG)|(r_oph&S_FLAG); \
r_HL=r_op
 
#define CP(value) \
tempword = r_A - (value);\
r_opl = ( (r_A & 0x88) >> 3 ) | ( ( (value) & 0x88 ) >> 2 ) | \
( (tempword & 0x88) >> 1 ); \
r_F = ( tempword & 0x100 ? FLAG_C : ( tempword ? 0 : FLAG_Z ) ) | FLAG_N |\
halfcarry_sub_table[r_opl & 0x07] | \
overflow_sub_table[r_opl >> 4] | \
( value & ( FLAG_3 | FLAG_5 ) ) | \
( tempword & FLAG_S )
 
#define NEG_A() r_opl = r_A; r_A=0; SUB(r_opl)
 
/*--- MISC operations -----------------------------------------------*/
#define IN(reg,port) (reg)=Z80InPort((port)); \
r_F = ( r_F & FLAG_C) | sz53p_table[(reg)]
 
 
 
 
 
 
 
/programs/emulator/e80/trunk/z80/op_cb.c
0,0 → 1,356
/*====================================================================/*
opcodes_cb.c -> This file executes the CB PREFIX opcodes.
 
When you find the CB opcode, it means that you must fetch another
byte from memory and treat it as a new opcode with different
meaning than the single-byte opcodes. This is a common way to extend
the number of opcodes (8 bits of instruction word = just 256 opcodes)
and it's called an OPCODE PREFIX (now we have another 256 new opcodes
by using this trick).
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
=====================================================================*/
 
/* 8 clock cycles minimum = CB opcode = 4+4 */
 
opcode = Z80ReadMem( r_PC );
r_PC++;
 
switch(opcode)
{
 
case RLC_B : RLC(r_B); AddCycles( 4+4 ); break;
case RLC_C : RLC(r_C); AddCycles( 4+4 ); break;
case RLC_D : RLC(r_D); AddCycles( 4+4 ); break;
case RLC_E : RLC(r_E); AddCycles( 4+4 ); break;
case RLC_H : RLC(r_H); AddCycles( 4+4 ); break;
case RLC_L : RLC(r_L); AddCycles( 4+4 ); break;
case RLC_xHL : r_meml = Z80ReadMem( r_HL );
RLC(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case RLC_A : RLC(r_A); AddCycles( 4+4 ); break;
 
case RRC_B : RRC(r_B); AddCycles( 4+4 ); break;
case RRC_C : RRC(r_C); AddCycles( 4+4 ); break;
case RRC_D : RRC(r_D); AddCycles( 4+4 ); break;
case RRC_E : RRC(r_E); AddCycles( 4+4 ); break;
case RRC_H : RRC(r_H); AddCycles( 4+4 ); break;
case RRC_L : RRC(r_L); AddCycles( 4+4 ); break;
case RRC_xHL : r_meml = Z80ReadMem( r_HL );
RRC(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case RRC_A : RRC(r_A); AddCycles( 4+4 ); break;
 
case RL_B : RL(r_B); AddCycles( 4+4 ); break;
case RL_C : RL(r_C); AddCycles( 4+4 ); break;
case RL_D : RL(r_D); AddCycles( 4+4 ); break;
case RL_E : RL(r_E); AddCycles( 4+4 ); break;
case RL_H : RL(r_H); AddCycles( 4+4 ); break;
case RL_L : RL(r_L); AddCycles( 4+4 ); break;
case RL_xHL : r_meml = Z80ReadMem( r_HL );
RL(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case RL_A : RL(r_A); AddCycles( 4+4 ); break;
 
case RR_B : RR(r_B); AddCycles( 4+4 ); break;
case RR_C : RR(r_C); AddCycles( 4+4 ); break;
case RR_D : RR(r_D); AddCycles( 4+4 ); break;
case RR_E : RR(r_E); AddCycles( 4+4 ); break;
case RR_H : RR(r_H); AddCycles( 4+4 ); break;
case RR_L : RR(r_L); AddCycles( 4+4 ); break;
case RR_xHL : r_meml = Z80ReadMem( r_HL );
RR(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case RR_A : RR(r_A); AddCycles( 4+4 ); break;
 
case SLA_B : SLA(r_B); AddCycles( 4+4 ); break;
case SLA_C : SLA(r_C); AddCycles( 4+4 ); break;
case SLA_D : SLA(r_D); AddCycles( 4+4 ); break;
case SLA_E : SLA(r_E); AddCycles( 4+4 ); break;
case SLA_H : SLA(r_H); AddCycles( 4+4 ); break;
case SLA_L : SLA(r_L); AddCycles( 4+4 ); break;
case SLA_xHL : r_meml = Z80ReadMem( r_HL );
SLA(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case SLA_A : SLA(r_A); AddCycles( 4+4 ); break;
 
case SRA_B : SRA(r_B); AddCycles( 4+4 ); break;
case SRA_C : SRA(r_C); AddCycles( 4+4 ); break;
case SRA_D : SRA(r_D); AddCycles( 4+4 ); break;
case SRA_E : SRA(r_E); AddCycles( 4+4 ); break;
case SRA_H : SRA(r_H); AddCycles( 4+4 ); break;
case SRA_L : SRA(r_L); AddCycles( 4+4 ); break;
case SRA_xHL : r_meml = Z80ReadMem( r_HL );
SRA(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case SRA_A : SRA(r_A); AddCycles( 4+4 ); break;
 
case SLL_B : SLL(r_B); AddCycles( 4+4 ); break;
case SLL_C : SLL(r_C); AddCycles( 4+4 ); break;
case SLL_D : SLL(r_D); AddCycles( 4+4 ); break;
case SLL_E : SLL(r_E); AddCycles( 4+4 ); break;
case SLL_H : SLL(r_H); AddCycles( 4+4 ); break;
case SLL_L : SLL(r_L); AddCycles( 4+4 ); break;
case SLL_xHL : r_meml = Z80ReadMem( r_HL );
SLL(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case SLL_A : SLL(r_A); AddCycles( 4+4 ); break;
 
case SRL_B : SRL(r_B); AddCycles( 4+4 ); break;
case SRL_C : SRL(r_C); AddCycles( 4+4 ); break;
case SRL_D : SRL(r_D); AddCycles( 4+4 ); break;
case SRL_E : SRL(r_E); AddCycles( 4+4 ); break;
case SRL_H : SRL(r_H); AddCycles( 4+4 ); break;
case SRL_L : SRL(r_L); AddCycles( 4+4 ); break;
case SRL_xHL : r_meml = Z80ReadMem( r_HL );
SRL(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+4+3+3+1 ); break;
case SRL_A : SRL(r_A); AddCycles( 4+4 ); break;
 
case BIT_0_B : BIT_BIT(0, r_B); AddCycles( 4+4 ); break;
case BIT_0_C : BIT_BIT(0, r_C); AddCycles( 4+4 ); break;
case BIT_0_D : BIT_BIT(0, r_D); AddCycles( 4+4 ); break;
case BIT_0_E : BIT_BIT(0, r_E); AddCycles( 4+4 ); break;
case BIT_0_H : BIT_BIT(0, r_H); AddCycles( 4+4 ); break;
case BIT_0_L : BIT_BIT(0, r_L); AddCycles( 4+4 ); break;
case BIT_0_xHL : BIT_mem_BIT(0, r_HL); AddCycles( 12 ); break;
case BIT_0_A : BIT_BIT(0, r_A); AddCycles( 4+4 ); break;
 
case BIT_1_B : BIT_BIT(1, r_B); AddCycles( 4+4 ); break;
case BIT_1_C : BIT_BIT(1, r_C); AddCycles( 4+4 ); break;
case BIT_1_D : BIT_BIT(1, r_D); AddCycles( 4+4 ); break;
case BIT_1_E : BIT_BIT(1, r_E); AddCycles( 4+4 ); break;
case BIT_1_H : BIT_BIT(1, r_H); AddCycles( 4+4 ); break;
case BIT_1_L : BIT_BIT(1, r_L); AddCycles( 4+4 ); break;
case BIT_1_xHL : BIT_mem_BIT(1, r_HL); AddCycles( 12 ); break;
case BIT_1_A : BIT_BIT(1, r_A); AddCycles( 4+4 ); break;
 
case BIT_2_B : BIT_BIT(2, r_B); AddCycles( 4+4 ); break;
case BIT_2_C : BIT_BIT(2, r_C); AddCycles( 4+4 ); break;
case BIT_2_D : BIT_BIT(2, r_D); AddCycles( 4+4 ); break;
case BIT_2_E : BIT_BIT(2, r_E); AddCycles( 4+4 ); break;
case BIT_2_H : BIT_BIT(2, r_H); AddCycles( 4+4 ); break;
case BIT_2_L : BIT_BIT(2, r_L); AddCycles( 4+4 ); break;
case BIT_2_xHL : BIT_mem_BIT(2, r_HL); AddCycles( 12 ); break;
case BIT_2_A : BIT_BIT(2, r_A); AddCycles( 4+4 ); break;
 
case BIT_3_B : BIT_BIT(3, r_B); AddCycles( 4+4 ); break;
case BIT_3_C : BIT_BIT(3, r_C); AddCycles( 4+4 ); break;
case BIT_3_D : BIT_BIT(3, r_D); AddCycles( 4+4 ); break;
case BIT_3_E : BIT_BIT(3, r_E); AddCycles( 4+4 ); break;
case BIT_3_H : BIT_BIT(3, r_H); AddCycles( 4+4 ); break;
case BIT_3_L : BIT_BIT(3, r_L); AddCycles( 4+4 ); break;
case BIT_3_xHL : BIT_mem_BIT(3, r_HL); AddCycles( 12 ); break;
case BIT_3_A : BIT_BIT(3, r_A); AddCycles( 4+4 ); break;
 
case BIT_4_B : BIT_BIT(4, r_B); AddCycles( 4+4 ); break;
case BIT_4_C : BIT_BIT(4, r_C); AddCycles( 4+4 ); break;
case BIT_4_D : BIT_BIT(4, r_D); AddCycles( 4+4 ); break;
case BIT_4_E : BIT_BIT(4, r_E); AddCycles( 4+4 ); break;
case BIT_4_H : BIT_BIT(4, r_H); AddCycles( 4+4 ); break;
case BIT_4_L : BIT_BIT(4, r_L); AddCycles( 4+4 ); break;
case BIT_4_xHL : BIT_mem_BIT(4, r_HL); AddCycles( 12 ); break;
case BIT_4_A : BIT_BIT(4, r_A); AddCycles( 4+4 ); break;
 
case BIT_5_B : BIT_BIT(5, r_B); AddCycles( 4+4 ); break;
case BIT_5_C : BIT_BIT(5, r_C); AddCycles( 4+4 ); break;
case BIT_5_D : BIT_BIT(5, r_D); AddCycles( 4+4 ); break;
case BIT_5_E : BIT_BIT(5, r_E); AddCycles( 4+4 ); break;
case BIT_5_H : BIT_BIT(5, r_H); AddCycles( 4+4 ); break;
case BIT_5_L : BIT_BIT(5, r_L); AddCycles( 4+4 ); break;
case BIT_5_xHL : BIT_mem_BIT(5, r_HL); AddCycles( 12 ); break;
case BIT_5_A : BIT_BIT(5, r_A); AddCycles( 4+4 ); break;
 
case BIT_6_B : BIT_BIT(6, r_B); AddCycles( 4+4 ); break;
case BIT_6_C : BIT_BIT(6, r_C); AddCycles( 4+4 ); break;
case BIT_6_D : BIT_BIT(6, r_D); AddCycles( 4+4 ); break;
case BIT_6_E : BIT_BIT(6, r_E); AddCycles( 4+4 ); break;
case BIT_6_H : BIT_BIT(6, r_H); AddCycles( 4+4 ); break;
case BIT_6_L : BIT_BIT(6, r_L); AddCycles( 4+4 ); break;
case BIT_6_xHL : BIT_mem_BIT(6, r_HL); AddCycles( 12 ); break;
case BIT_6_A : BIT_BIT(6, r_A); AddCycles( 4+4 ); break;
 
case BIT_7_B : BIT_BIT7(r_B); AddCycles( 4+4 ); break;
case BIT_7_C : BIT_BIT7(r_C); AddCycles( 4+4 ); break;
case BIT_7_D : BIT_BIT7(r_D); AddCycles( 4+4 ); break;
case BIT_7_E : BIT_BIT7(r_E); AddCycles( 4+4 ); break;
case BIT_7_H : BIT_BIT7(r_H); AddCycles( 4+4 ); break;
case BIT_7_L : BIT_BIT7(r_L); AddCycles( 4+4 ); break;
case BIT_7_xHL : BIT_mem_BIT7(r_HL); AddCycles( 12 ); break;
case BIT_7_A : BIT_BIT7(r_A); AddCycles( 4+4 ); break;
 
case RES_0_B : BIT_RES(0, r_B); AddCycles( 4+4 ); break;
case RES_0_C : BIT_RES(0, r_C); AddCycles( 4+4 ); break;
case RES_0_D : BIT_RES(0, r_D); AddCycles( 4+4 ); break;
case RES_0_E : BIT_RES(0, r_E); AddCycles( 4+4 ); break;
case RES_0_H : BIT_RES(0, r_H); AddCycles( 4+4 ); break;
case RES_0_L : BIT_RES(0, r_L); AddCycles( 4+4 ); break;
case RES_0_xHL : BIT_mem_RES(0, r_HL); AddCycles( 4+4+7 ); break;
case RES_0_A : BIT_RES(0, r_A); AddCycles( 4+4 ); break;
 
case RES_1_B : BIT_RES(1, r_B); AddCycles( 4+4 ); break;
case RES_1_C : BIT_RES(1, r_C); AddCycles( 4+4 ); break;
case RES_1_D : BIT_RES(1, r_D); AddCycles( 4+4 ); break;
case RES_1_E : BIT_RES(1, r_E); AddCycles( 4+4 ); break;
case RES_1_H : BIT_RES(1, r_H); AddCycles( 4+4 ); break;
case RES_1_L : BIT_RES(1, r_L); AddCycles( 4+4 ); break;
case RES_1_xHL : BIT_mem_RES(1, r_HL); AddCycles( 4+4+7 ); break;
case RES_1_A : BIT_RES(1, r_A); AddCycles( 4+4 ); break;
 
case RES_2_B : BIT_RES(2, r_B); AddCycles( 4+4 ); break;
case RES_2_C : BIT_RES(2, r_C); AddCycles( 4+4 ); break;
case RES_2_D : BIT_RES(2, r_D); AddCycles( 4+4 ); break;
case RES_2_E : BIT_RES(2, r_E); AddCycles( 4+4 ); break;
case RES_2_H : BIT_RES(2, r_H); AddCycles( 4+4 ); break;
case RES_2_L : BIT_RES(2, r_L); AddCycles( 4+4 ); break;
case RES_2_xHL : BIT_mem_RES(2, r_HL); AddCycles( 4+4+7 ); break;
case RES_2_A : BIT_RES(2, r_A); AddCycles( 4+4 ); break;
 
case RES_3_B : BIT_RES(3, r_B); AddCycles( 4+4 ); break;
case RES_3_C : BIT_RES(3, r_C); AddCycles( 4+4 ); break;
case RES_3_D : BIT_RES(3, r_D); AddCycles( 4+4 ); break;
case RES_3_E : BIT_RES(3, r_E); AddCycles( 4+4 ); break;
case RES_3_H : BIT_RES(3, r_H); AddCycles( 4+4 ); break;
case RES_3_L : BIT_RES(3, r_L); AddCycles( 4+4 ); break;
case RES_3_xHL : BIT_mem_RES(3, r_HL); AddCycles( 4+4+7 ); break;
case RES_3_A : BIT_RES(3, r_A); AddCycles( 4+4 ); break;
 
case RES_4_B : BIT_RES(4, r_B); AddCycles( 4+4 ); break;
case RES_4_C : BIT_RES(4, r_C); AddCycles( 4+4 ); break;
case RES_4_D : BIT_RES(4, r_D); AddCycles( 4+4 ); break;
case RES_4_E : BIT_RES(4, r_E); AddCycles( 4+4 ); break;
case RES_4_H : BIT_RES(4, r_H); AddCycles( 4+4 ); break;
case RES_4_L : BIT_RES(4, r_L); AddCycles( 4+4 ); break;
case RES_4_xHL : BIT_mem_RES(4, r_HL); AddCycles( 4+4+7 ); break;
case RES_4_A : BIT_RES(4, r_A); AddCycles( 4+4 ); break;
 
case RES_5_B : BIT_RES(5, r_B); AddCycles( 4+4 ); break;
case RES_5_C : BIT_RES(5, r_C); AddCycles( 4+4 ); break;
case RES_5_D : BIT_RES(5, r_D); AddCycles( 4+4 ); break;
case RES_5_E : BIT_RES(5, r_E); AddCycles( 4+4 ); break;
case RES_5_H : BIT_RES(5, r_H); AddCycles( 4+4 ); break;
case RES_5_L : BIT_RES(5, r_L); AddCycles( 4+4 ); break;
case RES_5_xHL : BIT_mem_RES(5, r_HL); AddCycles( 4+4+7 ); break;
case RES_5_A : BIT_RES(5, r_A); AddCycles( 4+4 ); break;
 
case RES_6_B : BIT_RES(6, r_B); AddCycles( 4+4 ); break;
case RES_6_C : BIT_RES(6, r_C); AddCycles( 4+4 ); break;
case RES_6_D : BIT_RES(6, r_D); AddCycles( 4+4 ); break;
case RES_6_E : BIT_RES(6, r_E); AddCycles( 4+4 ); break;
case RES_6_H : BIT_RES(6, r_H); AddCycles( 4+4 ); break;
case RES_6_L : BIT_RES(6, r_L); AddCycles( 4+4 ); break;
case RES_6_xHL : BIT_mem_RES(6, r_HL); AddCycles( 4+4+7 ); break;
case RES_6_A : BIT_RES(6, r_A); AddCycles( 4+4 ); break;
 
case RES_7_B : BIT_RES(7, r_B); AddCycles( 4+4 ); break;
case RES_7_C : BIT_RES(7, r_C); AddCycles( 4+4 ); break;
case RES_7_D : BIT_RES(7, r_D); AddCycles( 4+4 ); break;
case RES_7_E : BIT_RES(7, r_E); AddCycles( 4+4 ); break;
case RES_7_H : BIT_RES(7, r_H); AddCycles( 4+4 ); break;
case RES_7_L : BIT_RES(7, r_L); AddCycles( 4+4 ); break;
case RES_7_xHL : BIT_mem_RES(7, r_HL); AddCycles( 4+4+7 ); break;
case RES_7_A : BIT_RES(7, r_A); AddCycles( 4+4 ); break;
 
case SET_0_B : BIT_SET(0, r_B); AddCycles( 4+4 ); break;
case SET_0_C : BIT_SET(0, r_C); AddCycles( 4+4 ); break;
case SET_0_D : BIT_SET(0, r_D); AddCycles( 4+4 ); break;
case SET_0_E : BIT_SET(0, r_E); AddCycles( 4+4 ); break;
case SET_0_H : BIT_SET(0, r_H); AddCycles( 4+4 ); break;
case SET_0_L : BIT_SET(0, r_L); AddCycles( 4+4 ); break;
case SET_0_xHL : BIT_mem_SET(0, r_HL); AddCycles( 4+4+7 ); break;
case SET_0_A : BIT_SET(0, r_A); AddCycles( 4+4 ); break;
 
case SET_1_B : BIT_SET(1, r_B); AddCycles( 4+4 ); break;
case SET_1_C : BIT_SET(1, r_C); AddCycles( 4+4 ); break;
case SET_1_D : BIT_SET(1, r_D); AddCycles( 4+4 ); break;
case SET_1_E : BIT_SET(1, r_E); AddCycles( 4+4 ); break;
case SET_1_H : BIT_SET(1, r_H); AddCycles( 4+4 ); break;
case SET_1_L : BIT_SET(1, r_L); AddCycles( 4+4 ); break;
case SET_1_xHL : BIT_mem_SET(1, r_HL); AddCycles( 4+4+7 ); break;
case SET_1_A : BIT_SET(1, r_A); AddCycles( 4+4 ); break;
 
case SET_2_B : BIT_SET(2, r_B); AddCycles( 4+4 ); break;
case SET_2_C : BIT_SET(2, r_C); AddCycles( 4+4 ); break;
case SET_2_D : BIT_SET(2, r_D); AddCycles( 4+4 ); break;
case SET_2_E : BIT_SET(2, r_E); AddCycles( 4+4 ); break;
case SET_2_H : BIT_SET(2, r_H); AddCycles( 4+4 ); break;
case SET_2_L : BIT_SET(2, r_L); AddCycles( 4+4 ); break;
case SET_2_xHL : BIT_mem_SET(2, r_HL); AddCycles( 4+4+7 ); break;
case SET_2_A : BIT_SET(2, r_A); AddCycles( 4+4 ); break;
 
case SET_3_B : BIT_SET(3, r_B); AddCycles( 4+4 ); break;
case SET_3_C : BIT_SET(3, r_C); AddCycles( 4+4 ); break;
case SET_3_D : BIT_SET(3, r_D); AddCycles( 4+4 ); break;
case SET_3_E : BIT_SET(3, r_E); AddCycles( 4+4 ); break;
case SET_3_H : BIT_SET(3, r_H); AddCycles( 4+4 ); break;
case SET_3_L : BIT_SET(3, r_L); AddCycles( 4+4 ); break;
case SET_3_xHL : BIT_mem_SET(3, r_HL); AddCycles( 4+4+7 ); break;
case SET_3_A : BIT_SET(3, r_A); AddCycles( 4+4 ); break;
 
case SET_4_B : BIT_SET(4, r_B); AddCycles( 4+4 ); break;
case SET_4_C : BIT_SET(4, r_C); AddCycles( 4+4 ); break;
case SET_4_D : BIT_SET(4, r_D); AddCycles( 4+4 ); break;
case SET_4_E : BIT_SET(4, r_E); AddCycles( 4+4 ); break;
case SET_4_H : BIT_SET(4, r_H); AddCycles( 4+4 ); break;
case SET_4_L : BIT_SET(4, r_L); AddCycles( 4+4 ); break;
case SET_4_xHL : BIT_mem_SET(4, r_HL); AddCycles( 4+4+7 ); break;
case SET_4_A : BIT_SET(4, r_A); AddCycles( 4+4 ); break;
 
case SET_5_B : BIT_SET(5, r_B); AddCycles( 4+4 ); break;
case SET_5_C : BIT_SET(5, r_C); AddCycles( 4+4 ); break;
case SET_5_D : BIT_SET(5, r_D); AddCycles( 4+4 ); break;
case SET_5_E : BIT_SET(5, r_E); AddCycles( 4+4 ); break;
case SET_5_H : BIT_SET(5, r_H); AddCycles( 4+4 ); break;
case SET_5_L : BIT_SET(5, r_L); AddCycles( 4+4 ); break;
case SET_5_xHL : BIT_mem_SET(5, r_HL); AddCycles( 4+4+7 ); break;
case SET_5_A : BIT_SET(5, r_A); AddCycles( 4+4 ); break;
 
case SET_6_B : BIT_SET(6, r_B); AddCycles( 4+4 ); break;
case SET_6_C : BIT_SET(6, r_C); AddCycles( 4+4 ); break;
case SET_6_D : BIT_SET(6, r_D); AddCycles( 4+4 ); break;
case SET_6_E : BIT_SET(6, r_E); AddCycles( 4+4 ); break;
case SET_6_H : BIT_SET(6, r_H); AddCycles( 4+4 ); break;
case SET_6_L : BIT_SET(6, r_L); AddCycles( 4+4 ); break;
case SET_6_xHL : BIT_mem_SET(6, r_HL); AddCycles( 4+4+7 ); break;
case SET_6_A : BIT_SET(6, r_A); AddCycles( 4+4 ); break;
 
case SET_7_B : BIT_SET(7, r_B); AddCycles( 4+4 ); break;
case SET_7_C : BIT_SET(7, r_C); AddCycles( 4+4 ); break;
case SET_7_D : BIT_SET(7, r_D); AddCycles( 4+4 ); break;
case SET_7_E : BIT_SET(7, r_E); AddCycles( 4+4 ); break;
case SET_7_H : BIT_SET(7, r_H); AddCycles( 4+4 ); break;
case SET_7_L : BIT_SET(7, r_L); AddCycles( 4+4 ); break;
case SET_7_xHL : BIT_mem_SET(7, r_HL); AddCycles( 4+4+7 ); break;
case SET_7_A : BIT_SET(7, r_A); AddCycles( 4+4 ); break;
 
default:
// exit(1);
///!!! if( regs->DecodingErrors )
///!!! printf("z80 core: Unknown instruction: CB %02Xh at PC=%04Xh.\n",
///!!! Z80ReadMem(r_PC-1), r_PC-2 );
break;
}
 
/programs/emulator/e80/trunk/z80/op_dd_fd.c
0,0 → 1,239
/*====================================================================/*
opcodes_dd_fd.c -> This file executes the DD/FD PREFIX opcodes.
 
The DD prefix "creates" some new instructions by changing HL to IX
on the opcode defined by the next byte on memory.
 
The FD prefix "creates" some new instructions by changing HL to IY
on the opcode defined by the next byte on memory.
 
Change the REGISTER variable to IX or HY before including this file.
Something like:
 
#define REGISTER regs->IX
#include "op_dd_fd.c"
#undef REGISTER
 
On this code, this REGISTER variable is used as REGISTER.W or
REGISTER.B.h and REGISTER.B.l ...
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
=====================================================================*/
 
/* 8 clock cycles minimum = DD opcode = FD opcode = 4 + 4 */
 
#define REG REGISTER.W
#define REGL REGISTER.B.l
#define REGH REGISTER.B.h
 
opcode = Z80ReadMem( r_PC );
r_PC++;
 
switch(opcode)
{
case ADD_IXY_BC : ADD_WORD(REG, r_BC); AddCycles( 4+4+7 ); break;
case ADD_IXY_DE : ADD_WORD(REG, r_DE); AddCycles( 4+4+7 ); break;
case ADD_IXY_SP : ADD_WORD(REG, r_SP); AddCycles( 4+4+7 ); break;
case ADD_IXY_IXY : ADD_WORD(REG, REG); AddCycles( 4+4+7 ); break;
case DEC_IXY : REG--; AddCycles( 4+4+2 ); break;
case INC_IXY : REG++; AddCycles( 4+4 ); break;
 
case JP_IXY : r_PC = REG; AddCycles( 4+4 );break;
case LD_SP_IXY : r_SP = REG; AddCycles( 4+4+2 ); break;
 
case PUSH_IXY : PUSH_IXYr(); AddCycles( 4+4+3+3+1 ); break;
case POP_IXY : POP_IXYr(); AddCycles( 4+4+3+3 ); break;
 
case EX_IXY_xSP : r_meml = Z80ReadMem(r_SP);
r_memh = Z80ReadMem(r_SP+1);
Z80WriteMem( r_SP, REGL, regs );
Z80WriteMem( r_SP+1, REGH, regs );
REGL=r_meml; REGH=r_memh;
AddCycles( 4+4+3+3+3+3+3 ); break;
 
case LD_A_xIXY : r_A = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_B_xIXY : r_B = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_C_xIXY : r_C = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_D_xIXY : r_D = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_E_xIXY : r_E = Z80ReadMem( REG+ ((offset) Z80ReadMem(r_PC)) );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
 
case LD_xIXY_A : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_A, regs );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_xIXY_B : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_B, regs );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_xIXY_C : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_C, regs );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_xIXY_D : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_D, regs );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
case LD_xIXY_E : Z80WriteMem( REG+(offset)Z80ReadMem(r_PC), r_E, regs );
r_PC++; AddCycles( 4+3+3+3+3+3 ); break;
 
case INC_xIXY : r_mem = REG+(offset)Z80ReadMem(r_PC);
r_PC++;
tmpreg.B.l = Z80ReadMem(r_mem);
INC(tmpreg.B.l);
Z80WriteMem(r_mem, tmpreg.B.l, regs );
AddCycles( 4+3+3 + 3+3+3+ 3+1); break;
case DEC_xIXY : r_mem = REG+(offset)Z80ReadMem(r_PC);
r_PC++;
tmpreg.B.l = Z80ReadMem(r_mem);
DEC(tmpreg.B.l);
Z80WriteMem(r_mem, tmpreg.B.l, regs );
AddCycles( 4+3+3 + 3+3+3+ 3+1); break;
 
case ADC_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC)); r_PC++;
ADC(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case SBC_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
SBC(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case ADD_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
ADD(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case SUB_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
SUB(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case AND_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
AND(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case OR_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
OR(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
case XOR_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
XOR(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
 
case CP_xIXY : r_meml = Z80ReadMem(REG+(offset)Z80ReadMem(r_PC));
r_PC++;
CP(r_meml); AddCycles( 4+3+3+3+3+3 ); break;
 
case LD_IXY_NN : REGL = Z80ReadMem(r_PC); r_PC++;
REGH = Z80ReadMem(r_PC); r_PC++;
AddCycles( 4+1+3+3+3 ); break;
 
case LD_xIXY_N : r_mem = REG + (offset) Z80ReadMem(r_PC); r_PC++;
Z80WriteMem( r_mem, Z80ReadMem(r_PC), regs ); r_PC++;
AddCycles( 4+3+3+3+3+3 ); break;
 
case LD_IXY_xNN : LOAD_rr_nn(REG);
AddCycles( 4+3+3+3+3+3+1 ); break;
 
case LD_xNN_IXY : STORE_nn_rr(REG);
AddCycles( 4+3+3+ 3+3+3+1 ); break;
 
 
/* some undocumented opcodes: may be wrong: */
case LD_A_IXYh : r_A = REGH; AddCycles(4+4); break;
case LD_A_IXYl : r_A = REGL; AddCycles(4+4); break;
case LD_B_IXYh : r_B = REGH; AddCycles(4+4); break;
case LD_B_IXYl : r_B = REGL; AddCycles(4+4); break;
case LD_C_IXYh : r_C = REGH; AddCycles(4+4); break;
case LD_C_IXYl : r_C = REGL; AddCycles(4+4); break;
case LD_D_IXYh : r_D = REGH; AddCycles(4+4); break;
case LD_D_IXYl : r_D = REGL; AddCycles(4+4); break;
case LD_E_IXYh : r_E = REGH; AddCycles(4+4); break;
case LD_E_IXYl : r_E = REGL; AddCycles(4+4); break;
case LD_IXYh_A : REGH = r_A; AddCycles(4+4); break;
case LD_IXYh_B : REGH = r_B; AddCycles(4+4); break;
case LD_IXYh_C : REGH = r_C; AddCycles(4+4); break;
case LD_IXYh_D : REGH = r_D; AddCycles(4+4); break;
case LD_IXYh_E : REGH = r_E; AddCycles(4+4); break;
case LD_IXYh_IXYh : AddCycles(4+4); break;
case LD_IXYh_IXYl : REGH = REGL; AddCycles(4+4); break;
case LD_IXYl_A : REGL = r_A; AddCycles(4+4); break;
case LD_IXYl_B : REGL = r_B; AddCycles(4+4); break;
case LD_IXYl_C : REGL = r_C; AddCycles(4+4); break;
case LD_IXYl_D : REGL = r_D; AddCycles(4+4); break;
case LD_IXYl_E : REGL = r_E; AddCycles(4+4); break;
case LD_IXYl_IXYh : REGL = REGH; AddCycles(4+4); break;
case LD_IXYl_IXYl : AddCycles(4+4); break;
case LD_IXYh_N : REGH = Z80ReadMem(r_PC); r_PC++;
AddCycles(4+4+3); break;
case LD_IXYl_N : REGL = Z80ReadMem(r_PC); r_PC++;
AddCycles(4+4+3); break;
 
 
case ADD_IXYh : ADD(REGH); AddCycles(4+4); break;
case ADD_IXYl : ADD(REGL); AddCycles(4+4); break;
case ADC_IXYh : ADC(REGH); AddCycles(4+4); break;
case ADC_IXYl : ADC(REGL); AddCycles(4+4); break;
case SUB_IXYh : SUB(REGH); AddCycles(4+4); break;
case SUB_IXYl : SUB(REGL); AddCycles(4+4); break;
case SBC_IXYh : SBC(REGH); AddCycles(4+4); break;
case SBC_IXYl : SBC(REGL); AddCycles(4+4); break;
case AND_IXYh : AND(REGH); AddCycles(4+4); break;
case AND_IXYl : AND(REGL); AddCycles(4+4); break;
case XOR_IXYh : XOR(REGH); AddCycles(4+4); break;
case XOR_IXYl : XOR(REGL); AddCycles(4+4); break;
case OR_IXYh : OR(REGH); AddCycles(4+4); break;
case OR_IXYl : OR(REGL); AddCycles(4+4); break;
case CP_IXYh : CP(REGH); AddCycles(4+4); break;
case CP_IXYl : CP(REGL); AddCycles(4+4); break;
case INC_IXYh : INC(REGH); AddCycles(4+4); break;
case INC_IXYl : INC(REGL); AddCycles(4+4); break;
case DEC_IXYh : DEC(REGH); AddCycles(4+4); break;
case DEC_IXYl : DEC(REGL); AddCycles(4+4); break;
 
case LD_xIXY_H : r_meml =Z80ReadMem(r_PC); r_PC++;
Z80WriteMem( REG+(offset)(r_meml), r_H, regs );
AddCycles( 4+3+3+3+3+3 ); break;
case LD_xIXY_L : r_meml =Z80ReadMem(r_PC); r_PC++;
Z80WriteMem( REG+(offset)(r_meml), r_L, regs );
AddCycles( 4+3+3+3+3+3 ); break;
case LD_H_xIXY : r_meml =Z80ReadMem(r_PC); r_PC++;
r_H = Z80ReadMem( REG+(offset)(r_meml));
AddCycles( 4+3+3+3+3+3 ); break;
case LD_L_xIXY : r_meml =Z80ReadMem(r_PC); r_PC++;
r_L = Z80ReadMem( REG+(offset)(r_meml));
AddCycles( 4+3+3+3+3+3 ); break;
 
case PREFIX_CB:
#include "opddfdcb.c"
break;
 
/*
case PREFIX_DD:
case PREFIX_FD: AddCycles( 4 );
r_PC--; // decode it the next time :)
break;
*/
 
default: AddCycles( 4 );
r_PC--; /* decode it the next time :) */
SubR(1);
 
// exit(1);
// if( regs->DecodingErrors )
// {
// printf("z80 core: Unknown instruction: ");
// if ( regs->we_are_on_ddfd == WE_ARE_ON_DD )
// printf("DD ");
// else
// printf("FD ");
// printf("%02Xh at PC=%04Xh.\n", Z80ReadMem(r_PC-1), r_PC-2 );
// }
break;
}
 
#undef REG
#undef REGL
#undef REGH
/programs/emulator/e80/trunk/z80/op_ed.c
0,0 → 1,417
/*====================================================================/*
opcodes_ed.c -> This file executes the ED opcodes.
 
Another prefix that "creates" new instructions. This prefix also
introduces some undocumented opcodes that we've tried to include
here. Maybe their implementation it's wrong: if you can find any
mistake about how we have implemented/interpreted them, please
let us know.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
=====================================================================*/
 
/* 8 clock cycles minimum = ED opcode = 4 + 4 */
 
opcode = Z80ReadMem( r_PC );
r_PC++;
 
switch(opcode)
{
case LD_BC_xNNe : LOAD_rr_nn(r_BC); AddCycles( 4+4+12 ); break;
case LD_DE_xNNe : LOAD_rr_nn(r_DE); AddCycles( 4+4+12 ); break;
case LD_HL_xNNe : LOAD_rr_nn(r_HL); AddCycles( 4+4+12 ); break;
case LD_SP_xNNe : LOAD_rr_nn(r_SP); AddCycles( 4+4+12 ); break;
 
case LD_xNNe_BC : STORE_nn_rr(r_BC); AddCycles( 4+4+12 ); break;
case LD_xNNe_DE : STORE_nn_rr(r_DE); AddCycles( 4+4+12 ); break;
case LD_xNNe_HL : STORE_nn_rr(r_HL); AddCycles( 4+4+12 ); break;
case LD_xNNe_SP : STORE_nn_rr(r_SP); AddCycles( 4+4+12 ); break;
 
case NEG :
case ED_5C :
case ED_74 :
case ED_7C :
case ED_6C :
case ED_54 :
case ED_4C :
case ED_64 : NEG_A(); AddCycles( 4+4 ); break;
 
case RETI :
case RETN :
case ED_65 :
case ED_6D :
case ED_75 :
case ED_7D :
case ED_5D :
case ED_55 :
r_IFF1 = r_IFF2;
RET_nn();
AddCycles( 4+4+6 ); break;
 
case IM_0 :
case ED_4E : /* * IM 0/1 */
case ED_6E :
case ED_66 : regs->IM = 0;
AddCycles( 4+4 ); break; /* * IM 0 */
 
 
case IM_1 :
case ED_76 : regs->IM = 1;
AddCycles( 4+4 ); break;
 
case IM_2 :
case ED_7E : regs->IM = 2;
AddCycles( 4+4 ); break;
 
case ED_77 :
case ED_7F : AddCycles( 4+4 ); break; /* * NOP */
 
case OUT_xC_B : Z80OutPort(regs,r_BC, r_B); AddCycles( 4+4+4 ); break;
case OUT_xC_C : Z80OutPort(regs,r_BC, r_C); AddCycles( 4+4+4 ); break;
case OUT_xC_D : Z80OutPort(regs,r_BC, r_D); AddCycles( 4+4+4 ); break;
case OUT_xC_E : Z80OutPort(regs,r_BC, r_E); AddCycles( 4+4+4 ); break;
case OUT_xC_H : Z80OutPort(regs,r_BC, r_H); AddCycles( 4+4+4 ); break;
case OUT_xC_L : Z80OutPort(regs,r_BC, r_L); AddCycles( 4+4+4 ); break;
case OUT_xC_A : Z80OutPort(regs,r_BC, r_A); AddCycles( 4+4+4 ); break;
/* * OUT (C), 0 */
case ED_71 : Z80OutPort(regs,r_BC, 0); AddCycles( 4+4+4 ); break;
 
case IN_B_xC : IN(r_B, r_BC); AddCycles( 4+4+4 ); break;
case IN_C_xC : IN(r_C, r_BC); AddCycles( 4+4+4 ); break;
case IN_D_xC : IN(r_D, r_BC); AddCycles( 4+4+4 ); break;
case IN_E_xC : IN(r_E, r_BC); AddCycles( 4+4+4 ); break;
case IN_L_xC : IN(r_L, r_BC); AddCycles( 4+4+4 ); break;
case IN_H_xC : IN(r_H, r_BC); AddCycles( 4+4+4 ); break;
case IN_A_xC : IN(r_A, r_BC); AddCycles( 4+4+4 ); break;
case IN_F_xC : IN(r_meml, r_BC); AddCycles( 4+4+4 ); break;
 
case LD_A_I : r_A = regs->I;
r_F = ( r_F & FLAG_C )|sz53_table[r_A]|
( regs->IFF2 ? FLAG_V:0 );
AddCycles( 4+4+1 ); break;
 
case LD_I_A : regs->I = r_A; AddCycles( 4+4+1 ); break;
 
 
case LD_A_R : r_A = ( regs->R.W & 0x7f ) | (regs->R.W & 0x80);
r_F = (r_F&FLAG_C)|sz53_table[r_A] | (regs->IFF2?FLAG_V:0);
AddCycles( 4+4+1 ); break;
 
case LD_R_A : regs->R.W = r_A;
AddCycles( 4+4+1 ); break;
 
 
case ADC_HL_BC : ADC_WORD(r_BC); AddCycles( 4+4+4+1+2 ); break;
case ADC_HL_DE : ADC_WORD(r_DE); AddCycles( 4+4+4+1+2 ); break;
case ADC_HL_HL : ADC_WORD(r_HL); AddCycles( 4+4+4+1+2 ); break;
case ADC_HL_SP : ADC_WORD(r_SP); AddCycles( 4+4+4+1+2 ); break;
 
case SBC_HL_BC : SBC_WORD(r_BC); AddCycles( 4+4+4+1+2 ); break;
case SBC_HL_DE : SBC_WORD(r_DE); AddCycles( 4+4+4+1+2 ); break;
case SBC_HL_HL : SBC_WORD(r_HL); AddCycles( 4+4+4+1+2 ); break;
case SBC_HL_SP : SBC_WORD(r_SP); AddCycles( 4+4+4+1+2 ); break;
 
case RRD : r_meml = Z80ReadMem(r_HL);
Z80WriteMem(r_HL, ( r_A << 4 ) | ( r_meml >> 4 ), regs );
r_A = ( r_A & 0xf0 ) | ( r_meml & 0x0f );
r_F = ( r_F & FLAG_C ) | sz53p_table[r_A];
AddCycles( 4+4+10 ); break;
 
case RLD : r_meml = Z80ReadMem(r_HL);
Z80WriteMem(r_HL, (r_meml << 4 ) | ( r_A & 0x0f ), regs );
r_A = ( r_A & 0xf0 ) | ( r_meml >> 4 );
r_F = ( r_F & FLAG_C ) | sz53p_table[r_A];
AddCycles( 4+4+10 ); break;
 
case LDI : r_meml = Z80ReadMem(r_HL); r_HL++;
Z80WriteMem( r_DE, r_meml, regs ); r_DE++;
r_BC--; r_meml += r_A;
r_F = ( r_F & ( FLAG_C|FLAG_Z|FLAG_S ) ) |
( r_BC ? FLAG_V:0 ) | ( r_meml & FLAG_3 ) |
((r_meml & 0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4 ); break;
 
case LDIR : r_meml = Z80ReadMem(r_HL); r_HL++;
Z80WriteMem( r_DE, r_meml, regs ); r_DE++;
r_BC--; r_meml += r_A;
r_F = ( r_F & ( FLAG_C|FLAG_Z|FLAG_S ) ) |
( r_BC ? FLAG_V:0 ) | ( r_meml & FLAG_3 ) |
((r_meml & 0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4 );
if( r_BC ) { r_PC-=2; AddCycles(5); }
break;
 
case LDD : r_meml = Z80ReadMem(r_HL); r_HL--;
Z80WriteMem( r_DE, r_meml, regs ); r_DE--;
r_BC--; r_meml += r_A;
r_F = ( r_F & ( FLAG_C | FLAG_Z | FLAG_S ) ) |
(r_BC ? FLAG_V : 0 ) | ( r_meml & FLAG_3 ) |
((r_meml & 0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4 ); break;
 
 
case LDDR : r_meml = Z80ReadMem(r_HL);
Z80WriteMem( r_DE, r_meml, regs );
r_HL--; r_DE--; r_BC--; r_meml += r_A;
r_F = ( r_F & ( FLAG_C | FLAG_Z | FLAG_S ) ) |
(r_BC ? FLAG_V : 0 ) | ( r_meml & FLAG_3 ) |
((r_meml & 0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4+1 );
if( r_BC ) { r_PC-=2; AddCycles(4); }
break;
 
// I had lots of problems with CPI, INI, CPD, IND, OUTI, OUTD and so...
// Thanks a lot to Philip Kendall for letting me to take a look to his
// fuse emulator and allowing me to use their flag routines :-)
case CPI : r_meml = Z80ReadMem(r_HL);
r_memh = r_A - r_meml;
r_opl = ( (r_A & 0x08) >> 3 ) |
( ( (r_meml) & 0x08 ) >> 2 ) |
( (r_meml & 0x08) >> 1 );
r_HL++; r_BC--;
r_F = ( r_F & FLAG_C ) |
( r_BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) |
halfcarry_sub_table[r_opl] |
( r_memh ? 0 : FLAG_Z ) |
( r_memh & FLAG_S );
if( r_F & FLAG_H) r_memh--;
r_F |= ( r_memh & FLAG_3 ) |
( (r_memh&0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4); break;
 
case CPIR : r_meml = Z80ReadMem(r_HL);
r_memh = r_A - r_meml;
r_opl = ( (r_A & 0x08) >> 3 ) |
( ( (r_meml) & 0x08 ) >> 2 ) |
( (r_meml & 0x08) >> 1 );
r_HL++; r_BC--;
r_F = ( r_F & FLAG_C ) |
( r_BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) |
halfcarry_sub_table[r_opl] |
( r_memh ? 0 : FLAG_Z ) |
( r_memh & FLAG_S );
if( r_F & FLAG_H) r_memh--;
r_F |= ( r_memh & FLAG_3 ) |
( (r_memh&0x02) ? FLAG_5 : 0 );
if( ( r_F & ( FLAG_V | FLAG_Z ) ) == FLAG_V )
{ AddCycles(5); r_PC-=2; }
AddCycles( 4+4+4+4); break;
 
case CPD : r_meml = Z80ReadMem(r_HL);
r_memh = r_A-r_meml;
r_opl = ( (r_A & 0x08) >> 3 ) |
( ( (r_meml) & 0x08 ) >> 2 ) |
( (r_memh & 0x08) >> 1 );
r_HL--; r_BC--;
r_F = ( r_F & FLAG_C ) |
( r_BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) |
halfcarry_sub_table[r_opl] |
( r_memh ? 0 : FLAG_Z ) |
( r_memh & FLAG_S );
if(r_F & FLAG_H) r_memh--;
r_F |= ( r_memh & FLAG_3 ) |
( (r_memh&0x02) ? FLAG_5 : 0 );
AddCycles( 4+4+4+4); break;
 
case CPDR : r_meml = Z80ReadMem(r_HL);
r_memh = r_A-r_meml;
r_opl = ( (r_A & 0x08) >> 3 ) |
( ( (r_meml) & 0x08 ) >> 2 ) |
( (r_memh & 0x08) >> 1 );
r_HL--; r_BC--;
r_F = ( r_F & FLAG_C ) |
( r_BC ? ( FLAG_V | FLAG_N ) : FLAG_N ) |
halfcarry_sub_table[r_opl] |
( r_memh ? 0 : FLAG_Z ) |
( r_memh & FLAG_S );
if(r_F & FLAG_H) r_memh--;
r_F |= ( r_memh & FLAG_3 ) |
( (r_memh&0x02) ? FLAG_5 : 0 );
if( ( r_F & ( FLAG_V | FLAG_Z ) ) == FLAG_V )
{ AddCycles(5); r_PC-=2; }
AddCycles( 4+4+4+4 ); break;
 
/*
// OUTI contributed by Alvaro Alea
case OUTI : Z80OutPort( regs, r_BC, Z80ReadMem( r_HL )) ;
r_HL++ ; r_B-- ;
if (r_B==0)
r_F |= FLAG_Z;
else
r_F &= !FLAG_Z;
r_F |= FLAG_N;
AddCycles( 4+4+4+4 ); break;
*/
// I/O block instructions by Metalbrain - 14-5-2001
case IND : r_meml = Z80InPort((r_BC)); r_memh=0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80WriteMem( r_HL, r_meml, regs );
r_F |= ( (r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph = 0;
r_opl--;
r_op += r_mem;
r_oph += (r_oph << 4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_dec1_table[(r_opl)] );
r_HL--;
AddCycles( 4+4+4+4); break;
 
case INDR : r_meml = Z80InPort((r_BC)); r_memh=0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80WriteMem( r_HL, r_meml, regs );
r_F |= ( (r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph = 0;
r_opl--;
r_op += r_mem;
r_oph += (r_oph << 4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_dec1_table[(r_opl)] );
r_HL--;
if( r_B ) { r_PC-=2; AddCycles(5); }
AddCycles( 4+4+4+4); break;
 
case INI : r_meml = Z80InPort((r_BC)); r_memh=0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80WriteMem( r_HL, r_meml, regs );
r_F |= ( (r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph = 0;
r_opl++;
r_op += r_mem;
r_oph += (r_oph << 4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_inc1_table[(r_opl)] );
r_HL++;
AddCycles( 4+4+4+4); break;
 
 
case INIR : r_meml = Z80InPort((r_BC)); r_memh=0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80WriteMem( r_HL, r_meml, regs );
r_F |= ( (r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph = 0;
r_opl++;
r_op += r_mem;
r_oph += (r_oph << 4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_inc1_table[(r_opl)] );
r_HL++;
if( r_B ) { r_PC-=2; AddCycles(5); }
AddCycles( 4+4+4+4); break;
 
case OUTI : r_meml = Z80ReadMem(r_HL); r_memh = 0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80OutPort( regs, r_BC, r_meml);
r_F |= ((r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph=0;
r_opl++;
r_op += r_mem;
r_oph += (r_oph<<4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_inc1_table[(r_opl)] );
r_HL++;
AddCycles( 4+4+4+4); break;
 
case OTIR : r_meml = Z80ReadMem(r_HL); r_memh = 0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80OutPort( regs, r_BC, r_meml);
r_F |= ((r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph=0;
r_opl++;
r_op += r_mem;
r_oph += (r_oph<<4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_inc1_table[(r_opl)] );
r_HL++;
if( r_B ) { r_PC-=2; AddCycles(5); }
AddCycles( 4+4+4+4); break;
 
 
case OUTD : r_meml = Z80ReadMem(r_HL); r_memh = 0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80OutPort( regs, r_BC, r_meml);
r_F |= ((r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph=0;
r_opl--;
r_op += r_mem;
r_oph += (r_oph<<4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_dec1_table[(r_opl)] );
r_HL--;
AddCycles( 4+4+4+4); break;
 
case OTDR : r_meml = Z80ReadMem(r_HL); r_memh = 0;
r_F = ( r_F & FLAG_C ) | ( (r_B)&0x0f ? 0 : FLAG_H ) | FLAG_N; \
(r_B)--;
r_F |= ( (r_B)==0x7f ? FLAG_V : 0 ) | sz53_table[(r_B)];
r_F &= 0xE8;
Z80OutPort( regs, r_BC, r_meml);
r_F |= ((r_meml & 0x80 ) >> 6);
r_opl = r_C; r_oph=0;
r_opl--;
r_op += r_mem;
r_oph += (r_oph<<4);
r_F |= r_oph;
r_opl = (r_meml & 7) + ( (r_C & 7) << 3 );
r_F |= ( ioblock_2_table[(r_B)] ^ ioblock_dec1_table[(r_opl)] );
r_HL--;
if( r_B ) { r_PC-=2; AddCycles(5); }
AddCycles( 4+4+4+4); break;
 
// End of Metalbrain's contribution
 
case PREFIX_ED: AddCycles( 4 ); /* ED ED xx = 12 cycles min = 4+8 */
r_PC-- ;
break;
 
default:
// exit(1);
AddCycles( 4+4 ); /* Just a NOP */
///!!! if(regs->DecodingErrors)
///!!! printf( "z80 core: Unknown instruction: ED %02Xh at PC=%04Xh.\n",
///!!! Z80ReadMem(r_PC-1),r_PC-2 );
break;
}
/programs/emulator/e80/trunk/z80/opcodes.c
0,0 → 1,901
/*====================================================================/*
opcodes.c -> This file executes the single-byte Z80 opcodes.
 
The CPU fetchs the byte pointed by the PC register (Program Counter)
into de IR (Instruction Register) and decodes it. The value of this
fetched byte (opcode) determines what operation the CPU must do.
On Z80 (which uses 8 bit for the IW register) this means that we
can have 256 (2^8) different opcodes. The z80 uses a simple trick
called PREFIXES to obtain more opcodes by using more than one byte
in the decoding (see opcodes_cb.c to know how it does it).
 
This file executes the whole list of single-byte opcodes.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
=====================================================================*/
 
/* About the AddCycles(4) -> Remember that reading from memory
takes 3 cycles plus 1 of the decoding.
Add 3 cycles for each operand fetch, and
3 more for each memory write/read. */
 
 
case NOP : AddCycles( 4 ); break;
case LD_BC_NN : LD_rr_nn(r_BC); AddCycles( 4+3+3 ); break;
case LD_xBC_A : STORE_r(r_BC, r_A); AddCycles( 4+3 ); break;
case INC_BC : r_BC++; AddCycles( 4+2 ); break;
 
case INC_B : INC(r_B); AddCycles( 4 ); break;
case DEC_B : DEC(r_B); AddCycles( 4 ); break;
 
case LD_B_N : LD_r_n(r_B);
AddCycles( 4+3 );
break;
 
case EX_AF_AF : EX_WORD(r_AF, r_AFs);
AddCycles( 4 );
break;
 
case LD_A_xBC : LOAD_r(r_A, r_BC);
AddCycles( 4+3 );
break;
 
case DEC_BC : r_BC--;
AddCycles( 4+2 );
break;
 
case INC_C : INC(r_C);
AddCycles( 4 );
break;
 
case DEC_C : DEC(r_C);
AddCycles( 4 );
break;
 
case LD_C_N : LD_r_n(r_C);
AddCycles( 4+3 );
break;
 
case LD_DE_NN : LD_rr_nn(r_DE);
AddCycles( 4+3+3 );
break;
 
case LD_xDE_A : STORE_r(r_DE, r_A);
AddCycles( 4+3 );
break;
 
case INC_DE : r_DE++;
AddCycles( 4+2 );
break;
 
case INC_D : INC(r_D);
AddCycles( 4 );
break;
 
case DEC_D : DEC(r_D);
AddCycles( 4 );
break;
 
case LD_D_N : LD_r_n(r_D);
AddCycles( 4+3 );
break;
 
case ADD_HL_BC : ADD_WORD(r_HL, r_BC); AddCycles( 4+3+3+1 ); break;
case ADD_HL_DE : ADD_WORD(r_HL, r_DE); AddCycles( 4+3+3+1 ); break;
case ADD_HL_HL : ADD_WORD(r_HL, r_HL); AddCycles( 4+3+3+1 ); break;
case ADD_HL_SP : ADD_WORD(r_HL, r_SP); AddCycles( 4+3+3+1 ); break;
 
case LD_A_xDE : LOAD_r(r_A, r_DE);
AddCycles( 4+3 );
break;
 
case DEC_DE : r_DE--;
AddCycles( 4+2 );
break;
 
case INC_E : INC(r_E);
AddCycles( 4 );
break;
 
case DEC_E : DEC(r_E);
AddCycles( 4 );
break;
 
case LD_E_N : LD_r_n(r_E);
AddCycles( 4+3 );
break;
 
case LD_HL_NN : LD_rr_nn(r_HL);
AddCycles( 4+3+3 );
break;
 
case LD_xNN_HL : STORE_nn_rr(r_HL);
AddCycles( 4+3+3+3+3 );
break;
 
case INC_HL : r_HL++;
AddCycles( 4+2 );
break;
 
case INC_H : INC(r_H);
AddCycles( 4 );
break;
 
case DEC_H : DEC(r_H);
AddCycles( 4 );
break;
 
case LD_H_N : LD_r_n(r_H);
AddCycles( 4+3 );
break;
 
case LD_HL_xNN : LOAD_rr_nn(r_HL);
AddCycles( 4+3+3+3+3 );
break;
 
case DEC_HL : r_HL--;
AddCycles( 4+2 );
break;
 
case INC_L : INC(r_L);
AddCycles( 4 );
break;
 
case DEC_L : DEC(r_L);
AddCycles( 4 );
break;
 
case LD_L_N : LD_r_n(r_L);
AddCycles( 4+3 );
break;
 
case LD_SP_NN : LD_rr_nn(r_SP);
AddCycles( 10 );
break;
 
case LD_xNN_A : STORE_nn_r(r_A);
AddCycles( 13 );
break;
 
case INC_SP : r_SP++;
AddCycles( 6 );
break;
 
case LD_xHL_N : r_meml = Z80ReadMem(r_PC); r_PC++;
STORE_r( r_HL, r_meml );
AddCycles( 10 );
break;
 
case LD_A_xNN : LOAD_r_nn( r_A );
AddCycles( 13 );
break;
 
case DEC_SP : r_SP--;
AddCycles( 6 );
break;
 
case INC_A : INC(r_A);
AddCycles( 4 );
break;
 
case DEC_A : DEC(r_A);
AddCycles( 4 );
break;
 
case LD_A_N : LD_r_n(r_A);
AddCycles( 4+3 );
break;
 
case LD_B_B : LD_r_r( r_B, r_B );
AddCycles( 4 );
break;
 
case LD_B_C : LD_r_r( r_B, r_C );
AddCycles( 4 );
break;
 
case LD_B_D : LD_r_r( r_B, r_D );
AddCycles( 4 );
break;
 
case LD_B_E : LD_r_r( r_B, r_E );
AddCycles( 4 );
break;
 
case LD_B_H : LD_r_r( r_B, r_H );
AddCycles( 4 );
break;
 
case LD_B_L : LD_r_r( r_B, r_L );
AddCycles( 4 );
break;
 
case LD_B_xHL : LOAD_r(r_B, r_HL);
AddCycles( 4+3 );
break;
 
case LD_B_A : LD_r_r( r_B, r_A );
AddCycles( 4 );
break;
 
case LD_C_B : LD_r_r( r_C, r_B );
AddCycles( 4 );
break;
 
case LD_C_C : LD_r_r( r_C, r_C );
AddCycles( 4 );
break;
 
case LD_C_D : LD_r_r( r_C, r_D );
AddCycles( 4 );
break;
 
case LD_C_E : LD_r_r( r_C, r_E );
AddCycles( 4 );
break;
case LD_C_H : LD_r_r( r_C, r_H );
AddCycles( 4 );
break;
 
case LD_C_L : LD_r_r( r_C, r_L );
AddCycles( 4 );
break;
 
case LD_C_xHL : LOAD_r(r_C, r_HL);
AddCycles( 4+3 );
break;
 
case LD_C_A : LD_r_r( r_C, r_A );
AddCycles( 4 );
break;
 
case LD_D_B : LD_r_r( r_D, r_B );
AddCycles( 4 );
break;
 
case LD_D_C : LD_r_r( r_D, r_C );
AddCycles( 4 );
break;
 
case LD_D_D : LD_r_r( r_D, r_D );
AddCycles( 4 );
break;
 
case LD_D_E : LD_r_r( r_D, r_E );
AddCycles( 4 );
break;
 
case LD_D_H : LD_r_r( r_D, r_H );
AddCycles( 4 );
break;
 
case LD_D_L : LD_r_r( r_D, r_L );
AddCycles( 4 );
break;
 
case LD_D_xHL : LOAD_r(r_D, r_HL);
AddCycles( 4+3 );
break;
 
case LD_D_A : LD_r_r( r_D, r_A );
AddCycles( 4 );
break;
 
case LD_E_B : LD_r_r( r_E, r_B );
AddCycles( 4 );
break;
 
case LD_E_C : LD_r_r( r_E, r_C );
AddCycles( 4 );
break;
 
case LD_E_D : LD_r_r( r_E, r_D );
AddCycles( 4 );
break;
 
case LD_E_E : LD_r_r( r_E, r_E );
AddCycles( 4 );
break;
 
case LD_E_H : LD_r_r( r_E, r_H );
AddCycles( 4 );
break;
 
case LD_E_L : LD_r_r( r_E, r_L );
AddCycles( 4 );
break;
 
case LD_E_xHL : LOAD_r(r_E, r_HL);
AddCycles( 4+3 );
break;
 
case LD_E_A : LD_r_r( r_E, r_A );
AddCycles( 4 );
break;
 
case LD_H_B : LD_r_r( r_H, r_B );
AddCycles( 4 );
break;
 
case LD_H_C : LD_r_r( r_H, r_C );
AddCycles( 4 );
break;
 
case LD_H_D : LD_r_r( r_H, r_D );
AddCycles( 4 );
break;
 
case LD_H_E : LD_r_r( r_H, r_E );
AddCycles( 4 );
break;
 
case LD_H_H : LD_r_r( r_H, r_H );
AddCycles( 4 );
break;
 
case LD_H_L : LD_r_r( r_H, r_L );
AddCycles( 4 );
break;
 
case LD_H_xHL : LOAD_r(r_H, r_HL);
AddCycles( 4+3 );
break;
 
case LD_H_A : LD_r_r( r_H, r_A );
AddCycles( 4 );
break;
 
case LD_L_B : LD_r_r( r_L, r_B );
AddCycles( 4 );
break;
 
case LD_L_C : LD_r_r( r_L, r_C );
AddCycles( 4 );
break;
 
case LD_L_D : LD_r_r( r_L, r_D );
AddCycles( 4 );
break;
 
case LD_L_E : LD_r_r( r_L, r_E );
AddCycles( 4 );
break;
 
case LD_L_H : LD_r_r( r_L, r_H );
AddCycles( 4 );
break;
 
case LD_L_L : LD_r_r( r_L, r_L );
AddCycles( 4 );
break;
 
case LD_L_xHL : LOAD_r(r_L, r_HL);
AddCycles( 7 );
break;
 
case LD_L_A : LD_r_r( r_L, r_A );
AddCycles( 4 );
break;
 
case LD_xHL_B : STORE_r( r_HL, r_B );
AddCycles( 4+3 );
break;
 
case LD_xHL_C : STORE_r( r_HL, r_C );
AddCycles( 4+3 );
break;
 
case LD_xHL_D : STORE_r( r_HL, r_D );
AddCycles( 4+3 );
break;
 
case LD_xHL_E : STORE_r( r_HL, r_E );
AddCycles( 4+3 );
break;
 
case LD_xHL_H : STORE_r( r_HL, r_H );
AddCycles( 4+3 );
break;
 
case LD_xHL_L : STORE_r( r_HL, r_L );
AddCycles( 4+3 );
break;
 
case LD_xHL_A : STORE_r(r_HL, r_A );
AddCycles( 4+3 );
break;
 
case LD_A_B : LD_r_r( r_A, r_B );
AddCycles( 4 );
break;
 
case LD_A_C : LD_r_r( r_A, r_C );
AddCycles( 4 );
break;
 
case LD_A_D : LD_r_r( r_A, r_D );
AddCycles( 4 );
break;
 
case LD_A_E : LD_r_r( r_A, r_E );
AddCycles( 4 );
break;
 
case LD_A_H : LD_r_r( r_A, r_H );
AddCycles( 4 );
break;
 
case LD_A_L : LD_r_r( r_A, r_L );
AddCycles( 4 );
break;
 
case LD_A_xHL : LOAD_r( r_A, r_HL);
AddCycles( 4+3 );
break;
 
case LD_A_A : LD_r_r( r_A, r_A );
AddCycles( 4 );
break;
 
case LD_SP_HL : LD_r_r( r_SP, r_HL );
AddCycles( 6 ); break;
 
case ADD_B : ADD(r_B); AddCycles( 4 ); break;
case ADD_C : ADD(r_C); AddCycles( 4 ); break;
case ADD_D : ADD(r_D); AddCycles( 4 ); break;
case ADD_E : ADD(r_E); AddCycles( 4 ); break;
case ADD_H : ADD(r_H); AddCycles( 4 ); break;
case ADD_L : ADD(r_L); AddCycles( 4 ); break;
case ADD_xHL : r_meml = Z80ReadMem(r_HL);
ADD(r_meml);
AddCycles( 4+3 );
break;
case ADD_A : ADD(r_A); AddCycles( 4 ); break;
case ADC_B : ADC(r_B); AddCycles( 4 ); break;
case ADC_C : ADC(r_C); AddCycles( 4 ); break;
case ADC_D : ADC(r_D); AddCycles( 4 ); break;
case ADC_E : ADC(r_E); AddCycles( 4 ); break;
case ADC_H : ADC(r_H); AddCycles( 4 ); break;
case ADC_L : ADC(r_L); AddCycles( 4 ); break;
case ADC_xHL : r_meml = Z80ReadMem(r_HL);
ADC(r_meml);
AddCycles( 4+3 );
break;
case ADC_A : ADC(r_A); AddCycles( 4 ); break;
case ADC_N : r_meml = Z80ReadMem(r_PC); r_PC++;
ADC(r_meml);
AddCycles( 4+3 );
break;
 
case SUB_A : SUB(r_A); AddCycles( 4 ); break;
case SUB_B : SUB(r_B); AddCycles( 4 ); break;
case SUB_C : SUB(r_C); AddCycles( 4 ); break;
case SUB_D : SUB(r_D); AddCycles( 4 ); break;
case SUB_E : SUB(r_E); AddCycles( 4 ); break;
case SUB_H : SUB(r_H); AddCycles( 4 ); break;
case SUB_L : SUB(r_L); AddCycles( 4 ); break;
case SUB_xHL : r_meml = Z80ReadMem(r_HL);
SUB(r_meml);
AddCycles( 4+3 );
break;
case SUB_N : r_meml = Z80ReadMem(r_PC); r_PC++;
SUB(r_meml);
AddCycles( 4+3 );
break;
 
case SBC_A : SBC(r_A); AddCycles( 4 ); break;
case SBC_B : SBC(r_B); AddCycles( 4 ); break;
case SBC_C : SBC(r_C); AddCycles( 4 ); break;
case SBC_D : SBC(r_D); AddCycles( 4 ); break;
case SBC_E : SBC(r_E); AddCycles( 4 ); break;
case SBC_H : SBC(r_H); AddCycles( 4 ); break;
case SBC_L : SBC(r_L); AddCycles( 4 ); break;
case SBC_xHL : r_meml = Z80ReadMem(r_HL);
SBC(r_meml);
AddCycles( 4+3 );
break;
case SBC_N : r_meml = Z80ReadMem(r_PC); r_PC++;
SBC(r_meml);
AddCycles( 4 );
break;
 
case AND_B : AND( r_B ); AddCycles( 4 ); break;
case AND_C : AND( r_C ); AddCycles( 4 ); break;
case AND_D : AND( r_D ); AddCycles( 4 ); break;
case AND_E : AND( r_E ); AddCycles( 4 ); break;
case AND_H : AND( r_H ); AddCycles( 4 ); break;
case AND_L : AND( r_L ); AddCycles( 4 ); break;
case AND_xHL : AND_mem( r_HL ); AddCycles( 4+3 ); break;
case AND_A : AND( r_A ); AddCycles( 4 ); break;
case XOR_B : XOR( r_B ); AddCycles( 4 ); break;
case XOR_C : XOR( r_C ); AddCycles( 4 ); break;
case XOR_D : XOR( r_D ); AddCycles( 4 ); break;
case XOR_E : XOR( r_E ); AddCycles( 4 ); break;
case XOR_H : XOR( r_H ); AddCycles( 4 ); break;
case XOR_L : XOR( r_L ); AddCycles( 4 ); break;
case XOR_xHL : XOR_mem( r_HL ); AddCycles( 4+3 ); break;
case XOR_A : XOR( r_A ); AddCycles( 4 ); break;
case OR_B : OR( r_B ); AddCycles( 4 ); break;
case OR_C : OR( r_C ); AddCycles( 4 ); break;
case OR_D : OR( r_D ); AddCycles( 4 ); break;
case OR_E : OR( r_E ); AddCycles( 4 ); break;
case OR_H : OR( r_H ); AddCycles( 4 ); break;
case OR_L : OR( r_L ); AddCycles( 4 ); break;
case OR_xHL : OR_mem( r_HL ); AddCycles( 4+3 ); break;
case OR_A : OR( r_A ); AddCycles( 4 ); break;
case CP_A : CP(r_A); AddCycles( 4 ); break;
case CP_B : CP(r_B); AddCycles( 4 ); break;
case CP_C : CP(r_C); AddCycles( 4 ); break;
case CP_D : CP(r_D); AddCycles( 4 ); break;
case CP_E : CP(r_E); AddCycles( 4 ); break;
case CP_H : CP(r_H); AddCycles( 4 ); break;
case CP_L : CP(r_L); AddCycles( 4 ); break;
case CP_xHL : r_meml = Z80ReadMem( r_HL );
CP(r_meml); AddCycles( 4+3 ); break;
case CP_N : r_meml = Z80ReadMem(r_PC); r_PC++;
CP(r_meml);
AddCycles( 4+3);
break;
 
case RET_Z : if( TEST_FLAG(Z_FLAG) )
{ RET_nn(); AddCycles( 4+1+3+3 ); }
else { AddCycles( 4+1 ); }
break;
 
case RET_C : if( TEST_FLAG(C_FLAG) )
{ RET_nn(); AddCycles( 4+1+3+3 ); }
else { AddCycles( 4+1 ); }
break;
 
case RET_M : if( TEST_FLAG(S_FLAG) )
{ RET_nn(); AddCycles( 4+1+3+3 ); }
else { AddCycles( 4+1 ); }
break;
 
case RET_PE : if( TEST_FLAG(P_FLAG) )
{ RET_nn(); AddCycles( 4+1+3+3 ); }
else { AddCycles( 4+1 ); }
break;
 
case RET_PO : if( TEST_FLAG(P_FLAG) )
{ AddCycles( 4+1 ); }
else { RET_nn(); AddCycles( 4+1+3+3 ); }
break;
 
case RET_P : if( TEST_FLAG(S_FLAG) )
{ AddCycles( 4+1 ); }
else { RET_nn(); AddCycles( 4+1+3+3 ); }
break;
 
case RET : RET_nn();
AddCycles( 4+3+3 );
break;
 
case RET_NZ : if( TEST_FLAG(Z_FLAG) )
{ AddCycles( 4+1 ); }
else { RET_nn(); AddCycles( 4+1+3+3 ); }
break;
 
case RET_NC : if( TEST_FLAG(C_FLAG) )
{ AddCycles( 4+1 ); }
else { RET_nn(); AddCycles( 4+1+3+3 ); }
break;
 
case ADD_N : r_meml = Z80ReadMem(r_PC); r_PC++;
ADD(r_meml);
AddCycles( 4+3 );
break;
 
case JR : JR_n();
AddCycles( 4+3+3+2 );
break;
 
case JR_NZ : if( TEST_FLAG(Z_FLAG) )
{ r_PC++; AddCycles( 4+3 ); }
else
{ JR_n(); AddCycles( 4+8 ); }
break;
 
case JR_Z : if( TEST_FLAG(Z_FLAG) )
{ JR_n(); AddCycles( 4+8 ); }
else
{ r_PC++; AddCycles( 4+3 ); }
break;
 
case JR_NC : if( TEST_FLAG(C_FLAG) )
{ r_PC++; AddCycles( 4+3 ); }
else
{ JR_n(); AddCycles( 4+8 ); }
break;
 
case JR_C : if( TEST_FLAG(C_FLAG) )
{ JR_n(); AddCycles( 4+8 ); }
else
{ r_PC++; AddCycles( 4+3 ); }
break;
 
case JP_NZ : if( TEST_FLAG(Z_FLAG) ) { r_PC += 2; }
else { JP_nn(); }
AddCycles( 4+3+3 );
break;
 
case JP : JP_nn();
AddCycles( 4+3+3 );
break;
 
case JP_Z : if( TEST_FLAG(Z_FLAG) ) { JP_nn(); }
else { r_PC += 2; }
AddCycles( 4+3+3 );
break;
 
case JP_NC : if( TEST_FLAG(C_FLAG) ) { r_PC += 2; }
else { JP_nn(); }
AddCycles( 4+3+3 );
break;
 
case JP_C : if( TEST_FLAG(C_FLAG) ) { JP_nn(); }
else { r_PC += 2; }
AddCycles( 4+3+3 );
break;
 
case JP_PO : if( TEST_FLAG(P_FLAG) ) { r_PC += 2; }
else { JP_nn(); }
AddCycles( 4+3+3 );
break;
 
case JP_PE : if( TEST_FLAG(P_FLAG) ) { JP_nn(); }
else { r_PC += 2; }
AddCycles( 4+3+3 );
break;
 
case JP_P : if( TEST_FLAG(S_FLAG) ) { r_PC += 2; }
else { JP_nn(); }
AddCycles( 4+3+3 );
break;
 
 
case JP_M : if( TEST_FLAG(S_FLAG) ) { JP_nn(); }
else { r_PC += 2; }
AddCycles( 4+3+3 );
break;
 
case JP_xHL : r_PC = r_HL; AddCycles( 4 ); break;
 
case CPL : r_A ^= 0xFF;
r_F = ( r_F & (FLAG_C|FLAG_P|FLAG_Z|FLAG_S)) |
( r_A & (FLAG_3|FLAG_5))|(FLAG_N|FLAG_H);
AddCycles( 4 ); break;
 
case INC_xHL : r_meml = Z80ReadMem( r_HL );
INC(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+3+3+1 ); break;
 
case DEC_xHL : r_meml = Z80ReadMem( r_HL );
DEC(r_meml);
Z80WriteMem( r_HL, r_meml, regs );
AddCycles( 4+3+3+1 ); break;
 
case SCF : r_F = r_F | FLAG_C;
r_F &= FLAG_Z | FLAG_S | FLAG_P;
if(r_F & FLAG_H) r_F ^= FLAG_H;
r_F |= FLAG_C;
AddCycles( 4 ); break;
 
case CCF : r_F = (r_F & (FLAG_P|FLAG_Z|FLAG_S) ) |
((r_F & FLAG_C) ? FLAG_H : FLAG_C) |
( r_A & (FLAG_3 | FLAG_5) );
AddCycles( 4 ); break;
 
case HALT : regs->halted = 1;
AddCycles(4);
break;
 
case POP_BC : POP(BC); AddCycles( 10 ); break;
case PUSH_BC : PUSH(BC); AddCycles( 11 ); break;
case POP_HL : POP(HL); AddCycles( 10 ); break;
case PUSH_HL : PUSH(HL); AddCycles( 11 ); break;
case POP_AF : POP(AF); AddCycles( 10 ); break;
case PUSH_AF : PUSH(AF); AddCycles( 11 ); break;
case POP_DE : POP(DE); AddCycles( 10 ); break;
case PUSH_DE : PUSH(DE); AddCycles( 11 ); break;
 
case RLCA : r_A = (r_A << 1) | (r_A >> 7);
r_F = ( r_F & (FLAG_P|FLAG_Z|FLAG_S)) |
( r_A & (FLAG_C|FLAG_3|FLAG_5) );
AddCycles( 4 ); break;
 
case RRCA : r_F = ( r_F & (FLAG_P|FLAG_Z|FLAG_S)) |
( r_A & FLAG_C );
r_A = ( r_A >> 1) | ( r_A << 7 );
r_F |= ( r_A & ( FLAG_3 | FLAG_5 ) );
AddCycles( 4 ); break;
 
case DJNZ : r_B--;
if( r_B ) { JR_n(); AddCycles(13); }
else { r_PC++ ; AddCycles(8); }
break;
 
case RLA : r_meml = r_A;
r_A = ( r_A << 1 ) | ( r_F & FLAG_C );
r_F = ( r_F & ( FLAG_P | FLAG_Z | FLAG_S ) ) |
(r_A & ( FLAG_3 | FLAG_5 ) ) | ( r_meml >> 7);
AddCycles( 4 ); break;
 
case RRA : r_meml = r_A;
r_A = ( r_A >> 1 ) | ( r_F << 7 );
r_F = ( r_F & ( FLAG_P | FLAG_Z | FLAG_S ) ) |
( r_A & ( FLAG_3 | FLAG_5 ) ) | ( r_meml & FLAG_C );
AddCycles( 4 ); break;
 
case DAA : r_meml = 0;
r_memh = ( r_F & FLAG_C );
if( ( r_F & FLAG_H ) || ( (r_A & 0x0f)>9 ) ) r_meml=6;
if( r_memh || (r_A > 0x9f ) ) r_meml |= 0x60;
if( r_A > 0x99 ) r_memh=1;
if ( r_F & FLAG_N ) { SUB(r_meml); }
else
{
if( (r_A>0x90) && ( (r_A & 0x0f)>9) ) r_meml|=0x60;
ADD(r_meml);
}
r_F = ( r_F & ~( FLAG_C | FLAG_P) ) | r_memh |
parity_table[r_A];
AddCycles( 4 ); break;
 
case OUT_N_A : Z80OutPort( regs, Z80ReadMem( r_PC ), r_A ); r_PC++;
AddCycles( 11 ); break;
 
case IN_A_N : r_A = Z80InPort( Z80ReadMem( r_PC ) + (r_A << 8));
r_PC++; AddCycles( 11 ); break;
 
case EX_HL_xSP : r_meml = Z80ReadMem(r_SP);
r_memh = Z80ReadMem(r_SP+1);
Z80WriteMem(r_SP, r_L, regs);
Z80WriteMem(r_SP+1, r_H, regs);
r_L = r_meml;
r_H = r_memh;
AddCycles( 19 ); break;
 
case EXX : EX_WORD(r_BC, r_BCs); EX_WORD(r_DE, r_DEs);
EX_WORD(r_HL, r_HLs);
AddCycles( 4 ); break;
 
case EX_DE_HL : EX_WORD( r_DE, r_HL );
AddCycles( 4 );
break;
 
case AND_N : AND_mem( r_PC );
r_PC++;
AddCycles( 4+3 );
break;
 
case XOR_N : XOR_mem( r_PC );
r_PC++;
AddCycles( 4+3 );
break;
 
case OR_N : OR_mem( r_PC );
r_PC++;
AddCycles( 4+3 );
break;
 
case DI : r_IFF1 = r_IFF2 = 0;
AddCycles( 4 );
break;
 
case CALL :
CALL_nn();
AddCycles( 4+3+3+3+3+1 );
break;
 
case CALL_NZ : if( TEST_FLAG(Z_FLAG) )
{ r_PC += 2; AddCycles( 4+3+3 ); }
else
{
CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
break;
 
case CALL_NC : if( TEST_FLAG(C_FLAG) )
{ r_PC += 2; AddCycles( 4+3+3 ); }
else
{ CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
break;
 
case CALL_PO : if( TEST_FLAG(P_FLAG) )
{ r_PC += 2; AddCycles( 4+3+3 ); }
else
{ CALL_nn();
AddCycles( 4+3+3+ 3+3+1 );
}
break;
 
case CALL_P : if( TEST_FLAG(S_FLAG) )
{ r_PC += 2; AddCycles( 4+3+3 ); }
else
{ CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
break;
 
 
case CALL_Z : if( TEST_FLAG(Z_FLAG) )
{ CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
else
{ r_PC += 2; AddCycles( 4+3+3 ); }
break;
 
case CALL_C : if( TEST_FLAG(C_FLAG) )
{ CALL_nn();
AddCycles( 4+3+3+ 3+3+4 );
}
else
{ r_PC += 2; AddCycles( 4+3+3 ); }
break;
 
case CALL_PE : if( TEST_FLAG(P_FLAG) )
{ CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
else
{ r_PC += 2; AddCycles( 4+3+3 ); }
break;
 
case CALL_M : if( TEST_FLAG(S_FLAG) )
{ CALL_nn();
AddCycles( 4+3+3+3+3+1 );
}
else
{ r_PC += 2; AddCycles( 4+3+3 ); }
break;
 
case EI : r_IFF1 = r_IFF2 = 1;
/*
Why Marat Fayzullin does this? ->
 
regs->IFF2 |= 0x01;
if( regs->IRequest != INT_NOINT )
{
regs->IBackup = regs->ICount;
regs->ICount = 0x1;
r_IFF |= 0x20;
}*/
AddCycles( 4 );
break;
 
case RST_00 : RST(0x00); AddCycles( 11 ); break;
case RST_08 : RST(0x08); AddCycles( 11 ); break;
case RST_10 : RST(0x10); AddCycles( 11 ); break;
case RST_18 : RST(0x18); AddCycles( 11 ); break;
case RST_20 : RST(0x20); AddCycles( 11 ); break;
case RST_28 : RST(0x28); AddCycles( 11 ); break;
case RST_30 : RST(0x30); AddCycles( 11 ); break;
case RST_38 : RST(0x38); AddCycles( 11 ); break;
 
default:
// exit(1);
///!!! if( regs->DecodingErrors )
///!!! printf("z80 core: Unknown instruction: %02Xh at PC=%04Xh.\n",
///!!! Z80ReadMem(r_PC-1), r_PC-1 );
break;
/programs/emulator/e80/trunk/z80/opddfdcb.c
0,0 → 1,196
/*====================================================================/*
opcodes_ddfdcb.c -> This file executes the DD/FD CB PREFIX opcodes.
 
Those are the double prefix opcodes. We found the DD prefix, which
means that we must treat HL as IX, and then we found the CB prefix,
so we must apply this rule to the CB PREFIX list of opcodes. A
signed byte displacement is also added, and it's located BEFORE
the DD CB opcode:
 
ie: CB 2E = SRA (HL)
DD CB xx 2E = SRA (IX+xx)
 
(or...)
 
Those are the double prefix opcodes. We found the FD prefix, which
means that we must treat HL as IY, and then we found the CB prefix,
so we must apply this rule to the CB PREFIX list of opcodes. A
signed byte displacement is also added, and it's located BEFORE
the FD CB opcode:
 
ie: CB 2E = SRA (HL)
FD CB xx 2E = SRA (IY+xx)
 
Call here using something like #define REGISTER regs->IX
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
=====================================================================*/
 
/* 15 clock cycles minimum = FD/DD CB xx opcode = 4 + 4 + 3 + 4 */
 
tmpreg.W = REGISTER.W + (offset) Z80ReadMem( r_PC );
r_PC++;
r_meml = Z80ReadMem( tmpreg.W );
opcode = Z80ReadMem( r_PC );
r_PC++;
 
switch(opcode)
{
 
case RLC_xIXY : RLC(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case RRC_xIXY : RRC(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case RL_xIXY : RL(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case RR_xIXY : RR(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case SLA_xIXY : SLA(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case SRA_xIXY : SRA(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case SLL_xIXY : SLL(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case SRL_xIXY : SRL(r_meml); Z80WriteMem(tmpreg.W, r_meml, regs);
AddCycles( 23 ); break;
case 0x40:
case 0x41:
case 0x42:
case 0x43:
case 0x44:
case 0x45:
case 0x47:
case BIT_0_xIXY : BIT_BIT(0, r_meml); AddCycles( 15+5 ); break;
 
case 0x48:
case 0x49:
case 0x4a:
case 0x4b:
case 0x4c:
case 0x4d:
case 0x4f:
case BIT_1_xIXY :
BIT_BIT(1, r_meml); AddCycles( 15+5 ); break;
 
case 0x50:
case 0x51:
case 0x52:
case 0x53:
case 0x54:
case 0x55:
case 0x57:
case BIT_2_xIXY : BIT_BIT(2, r_meml); AddCycles( 15+5 ); break;
 
case 0x58:
case 0x59:
case 0x5a:
case 0x5b:
case 0x5c:
case 0x5d:
case 0x5f:
case BIT_3_xIXY : BIT_BIT(3, r_meml); AddCycles( 15+5 ); break;
 
case 0x60:
case 0x61:
case 0x62:
case 0x63:
case 0x64:
case 0x65:
case 0x67:
case BIT_4_xIXY : BIT_BIT(4, r_meml); AddCycles( 15+5 ); break;
 
case 0x68:
case 0x69:
case 0x6a:
case 0x6b:
case 0x6c:
case 0x6d:
case 0x6f:
case BIT_5_xIXY : BIT_BIT(5, r_meml); AddCycles( 15+5 ); break;
 
case 0x70:
case 0x71:
case 0x72:
case 0x73:
case 0x74:
case 0x75:
case 0x77:
case BIT_6_xIXY : BIT_BIT(6, r_meml); AddCycles( 15+5 ); break;
case 0x78:
case 0x79:
case 0x7a:
case 0x7b:
case 0x7c:
case 0x7d:
case 0x7f:
case BIT_7_xIXY : BIT_BIT7(r_meml); AddCycles( 15+5 ); break;
 
case RES_0_xIXY : BIT_RES_mem(0, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_1_xIXY : BIT_RES_mem(1, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_2_xIXY : BIT_RES_mem(2, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_3_xIXY : BIT_RES_mem(3, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_4_xIXY : BIT_RES_mem(4, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_5_xIXY : BIT_RES_mem(5, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_6_xIXY : BIT_RES_mem(6, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case RES_7_xIXY : BIT_RES_mem(7, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_0_xIXY : BIT_SET_mem(0, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_1_xIXY : BIT_SET_mem(1, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_2_xIXY : BIT_SET_mem(2, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_3_xIXY : BIT_SET_mem(3, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_4_xIXY : BIT_SET_mem(4, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_5_xIXY : BIT_SET_mem(5, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_6_xIXY : BIT_SET_mem(6, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
case SET_7_xIXY : BIT_SET_mem(7, tmpreg.W, r_meml );
AddCycles( 15+5+3 ); break;
 
 
/*
I must still include the undocumented opcodes such as:
LD B, RLC(REGISTER+dd) and so on ...
 
*/
default:
AddCycles( 15 );
// exit(1);
///!!! if(regs->DecodingErrors)
///!!! {
///!!! printf("z80 core: Unknown instruction: ");
///!!! if( regs->we_are_on_ddfd == WE_ARE_ON_DD )
///!!! printf("DD");
///!!! else
///!!! printf("FD");
///!!! printf("CB %02Xh %02Xh at PC=%04Xh.\n",
///!!! Z80ReadMem(r_PC-2), Z80ReadMem(r_PC-1), r_PC-4 );
///!!! }
break;
}
/programs/emulator/e80/trunk/z80/tables.h
0,0 → 1,829
/*=====================================================================
tables.h -> Header file containing the defines for Z80 opcodes.
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
======================================================================*/
 
#ifndef TABLES_H
#define TABLES_H
 
/*--- One byte opcodes: ----------------------------------------------*/
#define NOP 0
#define LD_BC_NN 1
#define LD_xBC_A 2
#define INC_BC 3
#define INC_B 4
#define DEC_B 5
#define LD_B_N 6
#define RLCA 7
#define EX_AF_AF 8
#define ADD_HL_BC 9
#define LD_A_xBC 10
#define DEC_BC 11
#define INC_C 12
#define DEC_C 13
#define LD_C_N 14
#define RRCA 15
#define DJNZ 16
#define LD_DE_NN 17
#define LD_xDE_A 18
#define INC_DE 19
#define INC_D 20
#define DEC_D 21
#define LD_D_N 22
#define RLA 23
#define JR 24
#define ADD_HL_DE 25
#define LD_A_xDE 26
#define DEC_DE 27
#define INC_E 28
#define DEC_E 29
#define LD_E_N 30
#define RRA 31
#define JR_NZ 32
#define LD_HL_NN 33
#define LD_xNN_HL 34
#define INC_HL 35
#define INC_H 36
#define DEC_H 37
#define LD_H_N 38
#define DAA 39
#define JR_Z 40
#define ADD_HL_HL 41
#define LD_HL_xNN 42
#define DEC_HL 43
#define INC_L 44
#define DEC_L 45
#define LD_L_N 46
#define CPL 47
#define JR_NC 48
#define LD_SP_NN 49
#define LD_xNN_A 50
#define INC_SP 51
#define INC_xHL 52
#define DEC_xHL 53
#define LD_xHL_N 54
#define SCF 55
#define JR_C 56
#define ADD_HL_SP 57
#define LD_A_xNN 58
#define DEC_SP 59
#define INC_A 60
#define DEC_A 61
#define LD_A_N 62
#define CCF 63
#define LD_B_B 64
#define LD_B_C 65
#define LD_B_D 66
#define LD_B_E 67
#define LD_B_H 68
#define LD_B_L 69
#define LD_B_xHL 70
#define LD_B_A 71
#define LD_C_B 72
#define LD_C_C 73
#define LD_C_D 74
#define LD_C_E 75
#define LD_C_H 76
#define LD_C_L 77
#define LD_C_xHL 78
#define LD_C_A 79
#define LD_D_B 80
#define LD_D_C 81
#define LD_D_D 82
#define LD_D_E 83
#define LD_D_H 84
#define LD_D_L 85
#define LD_D_xHL 86
#define LD_D_A 87
#define LD_E_B 88
#define LD_E_C 89
#define LD_E_D 90
#define LD_E_E 91
#define LD_E_H 92
#define LD_E_L 93
#define LD_E_xHL 94
#define LD_E_A 95
#define LD_H_B 96
#define LD_H_C 97
#define LD_H_D 98
#define LD_H_E 99
#define LD_H_H 100
#define LD_H_L 101
#define LD_H_xHL 102
#define LD_H_A 103
#define LD_L_B 104
#define LD_L_C 105
#define LD_L_D 106
#define LD_L_E 107
#define LD_L_H 108
#define LD_L_L 109
#define LD_L_xHL 110
#define LD_L_A 111
#define LD_xHL_B 112
#define LD_xHL_C 113
#define LD_xHL_D 114
#define LD_xHL_E 115
#define LD_xHL_H 116
#define LD_xHL_L 117
#define HALT 118
#define LD_xHL_A 119
#define LD_A_B 120
#define LD_A_C 121
#define LD_A_D 122
#define LD_A_E 123
#define LD_A_H 124
#define LD_A_L 125
#define LD_A_xHL 126
#define LD_A_A 127
#define ADD_B 128
#define ADD_C 129
#define ADD_D 130
#define ADD_E 131
#define ADD_H 132
#define ADD_L 133
#define ADD_xHL 134
#define ADD_A 135
#define ADC_B 136
#define ADC_C 137
#define ADC_D 138
#define ADC_E 139
#define ADC_H 140
#define ADC_L 141
#define ADC_xHL 142
#define ADC_A 143
#define SUB_B 144
#define SUB_C 145
#define SUB_D 146
#define SUB_E 147
#define SUB_H 148
#define SUB_L 149
#define SUB_xHL 150
#define SUB_A 151
#define SBC_B 152
#define SBC_C 153
#define SBC_D 154
#define SBC_E 155
#define SBC_H 156
#define SBC_L 157
#define SBC_xHL 158
#define SBC_A 159
#define AND_B 160
#define AND_C 161
#define AND_D 162
#define AND_E 163
#define AND_H 164
#define AND_L 165
#define AND_xHL 166
#define AND_A 167
#define XOR_B 168
#define XOR_C 169
#define XOR_D 170
#define XOR_E 171
#define XOR_H 172
#define XOR_L 173
#define XOR_xHL 174
#define XOR_A 175
#define OR_B 176
#define OR_C 177
#define OR_D 178
#define OR_E 179
#define OR_H 180
#define OR_L 181
#define OR_xHL 182
#define OR_A 183
#define CP_B 184
#define CP_C 185
#define CP_D 186
#define CP_E 187
#define CP_H 188
#define CP_L 189
#define CP_xHL 190
#define CP_A 191
#define RET_NZ 192
#define POP_BC 193
#define JP_NZ 194
#define JP 195
#define CALL_NZ 196
#define PUSH_BC 197
#define ADD_N 198
#define RST_00 199
#define RET_Z 200
#define RET 201
#define JP_Z 202
#define PREFIX_CB 203
#define CALL_Z 204
#define CALL 205
#define ADC_N 206
#define RST_08 207
#define RET_NC 208
#define POP_DE 209
#define JP_NC 210
#define OUT_N_A 211
#define CALL_NC 212
#define PUSH_DE 213
#define SUB_N 214
#define RST_10 215
#define RET_C 216
#define EXX 217
#define JP_C 218
#define IN_A_N 219
#define CALL_C 220
#define PREFIX_DD 221
#define SBC_N 222
#define RST_18 223
#define RET_PO 224
#define POP_HL 225
#define JP_PO 226
#define EX_HL_xSP 227
#define CALL_PO 228
#define PUSH_HL 229
#define AND_N 230
#define RST_20 231
#define RET_PE 232
#define JP_xHL 233
#define JP_PE 234
#define EX_DE_HL 235
#define CALL_PE 236
#define PREFIX_ED 237
#define XOR_N 238
#define RST_28 239
#define RET_P 240
#define POP_AF 241
#define JP_P 242
#define DI 243
#define CALL_P 244
#define PUSH_AF 245
#define OR_N 246
#define RST_30 247
#define RET_M 248
#define LD_SP_HL 249
#define JP_M 250
#define EI 251
#define CALL_M 252
#define PREFIX_FD 253
#define CP_N 254
#define RST_38 255
 
 
 
/*--- CB Prefix opcodes: ---------------------------------------------*/
#define RLC_B 0
#define RLC_C 1
#define RLC_D 2
#define RLC_E 3
#define RLC_H 4
#define RLC_L 5
#define RLC_xHL 6
#define RLC_A 7
#define RRC_B 8
#define RRC_C 9
#define RRC_D 10
#define RRC_E 11
#define RRC_H 12
#define RRC_L 13
#define RRC_xHL 14
#define RRC_A 15
#define RL_B 16
#define RL_C 17
#define RL_D 18
#define RL_E 19
#define RL_H 20
#define RL_L 21
#define RL_xHL 22
#define RL_A 23
#define RR_B 24
#define RR_C 25
#define RR_D 26
#define RR_E 27
#define RR_H 28
#define RR_L 29
#define RR_xHL 30
#define RR_A 31
#define SLA_B 32
#define SLA_C 33
#define SLA_D 34
#define SLA_E 35
#define SLA_H 36
#define SLA_L 37
#define SLA_xHL 38
#define SLA_A 39
#define SRA_B 40
#define SRA_C 41
#define SRA_D 42
#define SRA_E 43
#define SRA_H 44
#define SRA_L 45
#define SRA_xHL 46
#define SRA_A 47
#define SLL_B 48
#define SLL_C 49
#define SLL_D 50
#define SLL_E 51
#define SLL_H 52
#define SLL_L 53
#define SLL_xHL 54
#define SLL_A 55
#define SRL_B 56
#define SRL_C 57
#define SRL_D 58
#define SRL_E 59
#define SRL_H 60
#define SRL_L 61
#define SRL_xHL 62
#define SRL_A 63
#define BIT_0_B 64
#define BIT_0_C 65
#define BIT_0_D 66
#define BIT_0_E 67
#define BIT_0_H 68
#define BIT_0_L 69
#define BIT_0_xHL 70
#define BIT_0_A 71
#define BIT_1_B 72
#define BIT_1_C 73
#define BIT_1_D 74
#define BIT_1_E 75
#define BIT_1_H 76
#define BIT_1_L 77
#define BIT_1_xHL 78
#define BIT_1_A 79
#define BIT_2_B 80
#define BIT_2_C 81
#define BIT_2_D 82
#define BIT_2_E 83
#define BIT_2_H 84
#define BIT_2_L 85
#define BIT_2_xHL 86
#define BIT_2_A 87
#define BIT_3_B 88
#define BIT_3_C 89
#define BIT_3_D 90
#define BIT_3_E 91
#define BIT_3_H 92
#define BIT_3_L 93
#define BIT_3_xHL 94
#define BIT_3_A 95
#define BIT_4_B 96
#define BIT_4_C 97
#define BIT_4_D 98
#define BIT_4_E 99
#define BIT_4_H 100
#define BIT_4_L 101
#define BIT_4_xHL 102
#define BIT_4_A 103
#define BIT_5_B 104
#define BIT_5_C 105
#define BIT_5_D 106
#define BIT_5_E 107
#define BIT_5_H 108
#define BIT_5_L 109
#define BIT_5_xHL 110
#define BIT_5_A 111
#define BIT_6_B 112
#define BIT_6_C 113
#define BIT_6_D 114
#define BIT_6_E 115
#define BIT_6_H 116
#define BIT_6_L 117
#define BIT_6_xHL 118
#define BIT_6_A 119
#define BIT_7_B 120
#define BIT_7_C 121
#define BIT_7_D 122
#define BIT_7_E 123
#define BIT_7_H 124
#define BIT_7_L 125
#define BIT_7_xHL 126
#define BIT_7_A 127
#define RES_0_B 128
#define RES_0_C 129
#define RES_0_D 130
#define RES_0_E 131
#define RES_0_H 132
#define RES_0_L 133
#define RES_0_xHL 134
#define RES_0_A 135
#define RES_1_B 136
#define RES_1_C 137
#define RES_1_D 138
#define RES_1_E 139
#define RES_1_H 140
#define RES_1_L 141
#define RES_1_xHL 142
#define RES_1_A 143
#define RES_2_B 144
#define RES_2_C 145
#define RES_2_D 146
#define RES_2_E 147
#define RES_2_H 148
#define RES_2_L 149
#define RES_2_xHL 150
#define RES_2_A 151
#define RES_3_B 152
#define RES_3_C 153
#define RES_3_D 154
#define RES_3_E 155
#define RES_3_H 156
#define RES_3_L 157
#define RES_3_xHL 158
#define RES_3_A 159
#define RES_4_B 160
#define RES_4_C 161
#define RES_4_D 162
#define RES_4_E 163
#define RES_4_H 164
#define RES_4_L 165
#define RES_4_xHL 166
#define RES_4_A 167
#define RES_5_B 168
#define RES_5_C 169
#define RES_5_D 170
#define RES_5_E 171
#define RES_5_H 172
#define RES_5_L 173
#define RES_5_xHL 174
#define RES_5_A 175
#define RES_6_B 176
#define RES_6_C 177
#define RES_6_D 178
#define RES_6_E 179
#define RES_6_H 180
#define RES_6_L 181
#define RES_6_xHL 182
#define RES_6_A 183
#define RES_7_B 184
#define RES_7_C 185
#define RES_7_D 186
#define RES_7_E 187
#define RES_7_H 188
#define RES_7_L 189
#define RES_7_xHL 190
#define RES_7_A 191
#define SET_0_B 192
#define SET_0_C 193
#define SET_0_D 194
#define SET_0_E 195
#define SET_0_H 196
#define SET_0_L 197
#define SET_0_xHL 198
#define SET_0_A 199
#define SET_1_B 200
#define SET_1_C 201
#define SET_1_D 202
#define SET_1_E 203
#define SET_1_H 204
#define SET_1_L 205
#define SET_1_xHL 206
#define SET_1_A 207
#define SET_2_B 208
#define SET_2_C 209
#define SET_2_D 210
#define SET_2_E 211
#define SET_2_H 212
#define SET_2_L 213
#define SET_2_xHL 214
#define SET_2_A 215
#define SET_3_B 216
#define SET_3_C 217
#define SET_3_D 218
#define SET_3_E 219
#define SET_3_H 220
#define SET_3_L 221
#define SET_3_xHL 222
#define SET_3_A 223
#define SET_4_B 224
#define SET_4_C 225
#define SET_4_D 226
#define SET_4_E 227
#define SET_4_H 228
#define SET_4_L 229
#define SET_4_xHL 230
#define SET_4_A 231
#define SET_5_B 232
#define SET_5_C 233
#define SET_5_D 234
#define SET_5_E 235
#define SET_5_H 236
#define SET_5_L 237
#define SET_5_xHL 238
#define SET_5_A 239
#define SET_6_B 240
#define SET_6_C 241
#define SET_6_D 242
#define SET_6_E 243
#define SET_6_H 244
#define SET_6_L 245
#define SET_6_xHL 246
#define SET_6_A 247
#define SET_7_B 248
#define SET_7_C 249
#define SET_7_D 250
#define SET_7_E 251
#define SET_7_H 252
#define SET_7_L 253
#define SET_7_xHL 254
#define SET_7_A 255
 
 
/*--- ED opcodes: ----------------------------------------------------*/
#define IN_B_xC 64
#define OUT_xC_B 65
#define SBC_HL_BC 66
#define LD_xNNe_BC 67
#define NEG 68
#define RETN 69
#define IM_0 70
#define LD_I_A 71
#define IN_C_xC 72
#define OUT_xC_C 73
#define ADC_HL_BC 74
#define LD_BC_xNNe 75
#define ED_4C 76 /* * NEG */
#define RETI 77
#define ED_4E 78 /* * IM 0/1 */
#define LD_R_A 79
#define IN_D_xC 80
#define OUT_xC_D 81
#define SBC_HL_DE 82
#define LD_xNNe_DE 83
#define ED_54 84 /* * NEG */
#define ED_55 85 /* * RET */
#define IM_1 86
#define LD_A_I 87
#define IN_E_xC 88
#define OUT_xC_E 89
#define ADC_HL_DE 90
#define LD_DE_xNNe 91
#define ED_5C 92 /* * NEG */
#define ED_5D 93 /* * RET */
#define IM_2 94
#define LD_A_R 95
#define IN_H_xC 96
#define OUT_xC_H 97
#define SBC_HL_HL 98
#define LD_xNNe_HL 99
#define ED_64 100 /* * NEG */
#define ED_65 101 /* * RET */
#define ED_66 102 /* * IM 0 */
#define RRD 103
#define IN_L_xC 104
#define OUT_xC_L 105
#define ADC_HL_HL 106
#define LD_HL_xNNe 107
#define ED_6C 108 /* * NEG */
#define ED_6D 109 /* * RET */
#define ED_6E 110 /* * IM 0 */
#define RLD 111
#define IN_F_xC 112
#define ED_71 113 /* * OUT (C), 0 */
#define SBC_HL_SP 114
#define LD_xNNe_SP 115
#define ED_74 116 /* * NEG */
#define ED_75 117 /* * RET */
#define ED_76 118 /* * IM 1 */
#define ED_77 119 /* * NOP */
#define IN_A_xC 120
#define OUT_xC_A 121
#define ADC_HL_SP 122
#define LD_SP_xNNe 123
#define ED_7C 124 /* * NEG */
#define ED_7D 125 /* * RET */
#define ED_7E 126 /* * IM 2 */
#define ED_7F 127 /* * NOP */
#define LDI 160
#define CPI 161
#define INI 162
#define OUTI 163
#define LDD 168
#define CPD 169
#define IND 170
#define OUTD 171
#define LDIR 176
#define CPIR 177
#define INIR 178
#define OTIR 179
#define LDDR 184
#define CPDR 185
#define INDR 186
#define OTDR 187
#define ED_FE 254
 
 
/*--- DD xx opcodes: -------------------------------------------------*/
/* Those are the DD xx opcodes where HL is treated as IX + a
signed byte displacement n when required: DD opcode n: */
 
/*--- FD xx opcodes: -------------------------------------------------*/
/* Those are the FD xx opcodes where HL is treated as IY + a
signed byte displacement n when required: FD opcode n: */
 
#define ADD_IXY_BC 9
#define ADD_IXY_DE 25
#define LD_IXY_NN 33
#define LD_xNN_IXY 34
#define INC_IXY 35
#define INC_IXYh 36
#define DEC_IXYh 37
#define LD_IXYh_N 38
#define ADD_IXY_IXY 41
#define LD_IXY_xNN 42
#define DEC_IXY 43
#define INC_IXYl 44
#define DEC_IXYl 45
#define LD_IXYl_N 46
#define INC_xIXY 52
#define DEC_xIXY 53
#define LD_xIXY_N 54
#define ADD_IXY_SP 57
#define LD_B_IXYh 68
#define LD_B_IXYl 69
#define LD_B_xIXY 70
#define LD_C_IXYh 76
#define LD_C_IXYl 77
#define LD_C_xIXY 78
#define LD_D_IXYh 84
#define LD_D_IXYl 85
#define LD_D_xIXY 86
#define LD_E_IXYh 92
#define LD_E_IXYl 93
#define LD_E_xIXY 94
#define LD_IXYh_B 96
#define LD_IXYh_C 97
#define LD_IXYh_D 98
#define LD_IXYh_E 99
#define LD_IXYh_IXYh 100
#define LD_IXYh_IXYl 101
#define LD_H_xIXY 102
#define LD_IXYh_A 103
#define LD_IXYl_B 104
#define LD_IXYl_C 105
#define LD_IXYl_D 106
#define LD_IXYl_E 107
#define LD_IXYl_IXYh 108
#define LD_IXYl_IXYl 109
#define LD_L_xIXY 110
#define LD_IXYl_A 111
#define LD_xIXY_B 112
#define LD_xIXY_C 113
#define LD_xIXY_D 114
#define LD_xIXY_E 115
#define LD_xIXY_H 116
#define LD_xIXY_L 117
#define LD_xIXY_A 119
#define LD_A_IXYh 124
#define LD_A_IXYl 125
#define LD_A_xIXY 126
#define ADD_IXYh 132
#define ADD_IXYl 133
#define ADD_xIXY 134
#define ADC_IXYh 140
#define ADC_IXYl 141
#define ADC_xIXY 142
#define SUB_IXYh 148
#define SUB_IXYl 149
#define SUB_xIXY 150
#define SBC_IXYh 156
#define SBC_IXYl 157
#define SBC_xIXY 158
#define AND_IXYh 164
#define AND_IXYl 165
#define AND_xIXY 166
#define XOR_IXYh 172
#define XOR_IXYl 173
#define XOR_xIXY 174
#define OR_IXYh 180
#define OR_IXYl 181
#define OR_xIXY 182
#define CP_IXYh 188
#define CP_IXYl 189
#define CP_xIXY 190
#define POP_IXY 225
#define EX_IXY_xSP 227
#define PUSH_IXY 229
#define JP_IXY 233
#define LD_SP_IXY 249
 
 
 
 
/*--- DD CB Prefix opcodes: ------------------------------------------*/
/* Those are the CB xx opcodes where HL is treated as IX + a
signed byte displacement n: DD CB n opcode: */
/*--- FD CB Prefix opcodes: ------------------------------------------*/
/* Those are the CB xx opcodes where HL is treated as IY + a
signed byte displacement n: FD CB n opcode: */
 
#define RLC_IXYh 4
#define RLC_IXYl 5
#define RLC_xIXY 6
#define RRC_IXYh 12
#define RRC_IXYl 13
#define RRC_xIXY 14
#define RL_IXYh 20
#define RL_IXYl 21
#define RL_xIXY 22
#define RR_IXYh 28
#define RR_IXYl 29
#define RR_xIXY 30
#define SLA_IXYh 36
#define SLA_IXYl 37
#define SLA_xIXY 38
#define SRA_IXYh 44
#define SRA_IXYl 45
#define SRA_xIXY 46
#define SLL_IXYh 52
#define SLL_IXYl 53
#define SLL_xIXY 54
#define SRL_IXYh 60
#define SRL_IXYl 61
#define SRL_xIXY 62
#define BIT_0_IXYh 68
#define BIT_0_IXYl 69
#define BIT_0_xIXY 70
#define BIT_1_IXYh 76
#define BIT_1_IXYl 77
#define BIT_1_xIXY 78
#define BIT_2_IXYh 84
#define BIT_2_IXYl 85
#define BIT_2_xIXY 86
#define BIT_3_IXYh 92
#define BIT_3_IXYl 93
#define BIT_3_xIXY 94
#define BIT_4_IXYh 100
#define BIT_4_IXYl 101
#define BIT_4_xIXY 102
#define BIT_5_IXYh 108
#define BIT_5_IXYl 109
#define BIT_5_xIXY 110
#define BIT_6_IXYh 116
#define BIT_6_IXYl 117
#define BIT_6_xIXY 118
#define BIT_7_IXYh 124
#define BIT_7_IXYl 125
#define BIT_7_xIXY 126
#define RES_0_IXYh 132
#define RES_0_IXYl 133
#define RES_0_xIXY 134
#define RES_1_IXYh 140
#define RES_1_IXYl 141
#define RES_1_xIXY 142
#define RES_2_IXYh 148
#define RES_2_IXYl 149
#define RES_2_xIXY 150
#define RES_3_IXYh 156
#define RES_3_IXYl 157
#define RES_3_xIXY 158
#define RES_4_IXYh 164
#define RES_4_IXYl 165
#define RES_4_xIXY 166
#define RES_5_IXYh 172
#define RES_5_IXYl 173
#define RES_5_xIXY 174
#define RES_6_IXYh 180
#define RES_6_IXYl 181
#define RES_6_xIXY 182
#define RES_7_IXYh 188
#define RES_7_IXYl 189
#define RES_7_xIXY 190
#define SET_0_IXYh 196
#define SET_0_IXYl 197
#define SET_0_xIXY 198
#define SET_1_IXYh 204
#define SET_1_IXYl 205
#define SET_1_xIXY 206
#define SET_2_IXYh 212
#define SET_2_IXYl 213
#define SET_2_xIXY 214
#define SET_3_IXYh 220
#define SET_3_IXYl 221
#define SET_3_xIXY 222
#define SET_4_IXYh 228
#define SET_4_IXYl 229
#define SET_4_xIXY 230
#define SET_5_IXYh 236
#define SET_5_IXYl 237
#define SET_5_xIXY 238
#define SET_6_IXYh 244
#define SET_6_IXYl 245
#define SET_6_xIXY 246
#define SET_7_IXYh 252
#define SET_7_IXYl 253
#define SET_7_xIXY 254
 
#endif
/programs/emulator/e80/trunk/z80/z80.c
0,0 → 1,407
/*=====================================================================
z80.c -> Main File related to the Z80 emulation code.
 
Please read documentation files to know how this works :)
 
Thanks go to Marat Fayzullin (read z80.h for more info), Raúl Gomez
(check his great R80 Spectrum emulator!), Philip Kendall (some code
of this emulator, such as the flags lookup tabled are from his fuse
Spectrum emulator) and more people I forget to name here ...
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
======================================================================*/
 
#include "z80.h"
#include "tables.h"
 
 
/* RAM variable, debug toggle variable, pressed key and
row variables for keyboard emulation */
extern byte *RAM;
extern int debug, main_tecla, scanl;
 
extern int fila[5][5];
 
//extern char *tapfile;
//extern FILE *tapfile;
extern char *tfont;
 
#include "macros.c"
 
 
/*====================================================================
void Z80Reset( Z80Regs *regs, int cycles )
 
This function simulates a z80 reset by setting the registers
to the values they are supposed to take on a real z80 reset.
You must pass it the Z80 register structure and the number
of cycles required to check for interrupts and do special
hardware checking/updating.
===================================================================*/
void Z80Reset( Z80Regs *regs, int int_cycles )
{
/* reset PC and the rest of main registers: */
regs->PC.W = regs->R.W = 0x0000;
 
regs->AF.W = regs->BC.W = regs->DE.W = regs->HL.W =
regs->AFs.W = regs->BCs.W = regs->DEs.W = regs->HLs.W =
regs->IX.W = regs->IY.W = 0x0000;
 
/* Make the stack point to $F000 */
regs->SP.W = 0xF000;
 
/* reset variables to their default values */
regs->I = 0x00;
regs->IFF1 = regs->IFF2 = regs->IM = regs->halted = 0x00;
regs->ICount = regs->IPeriod = int_cycles;
 
regs->IRequest = INT_NOINT;
regs->we_are_on_ddfd = regs->dobreak = regs->BorderColor = 0;
 
//#ifdef _DEBUG_
regs->DecodingErrors = 1;
//#endif
 
}
 
 
/*====================================================================
word Z80Run( Z80Regs *regs, int numopcodes )
 
This function does the whole Z80 simulation. It consists on a
for(;;) loop (as stated on Marat's Fayzullin HOWTO -How to
Write a Computer Emulator-) which fetchs the next opcode,
interprets it (using a switch statement) and then it's
executed in the right CASE: of that switch. I've put the different
case statements into C files included here with #include to
make this more readable (and programming easier! :).
 
This function will change regs->ICount register and will execute
an interrupt when it reaches 0 (or <0). You can then do anything
related to your machine emulation here, using the Z80Hardware()
function. This function must be filled by yourself: put there
the code related to the emulated machine hardware, such as
screen redrawing, sound playing and so on. This functions can
return an special value to make Z80Run stop the emulation (and
return to the caller): that's INT_QUIT. If there is time to
execute an interrupt, please return INT_IRQ or INT_NMI. Return
INT_NOINT if there is no time for an interrupt :) .
 
Z80Execute() will change PC and all the z80 registers acording
to the executed opcode, and those values will be returned when
a INT_QUIT is received.
 
Pass as numcycles the number of clock cycle you want to execute
z80 opcodes for or < 0 (negative) to execute "infinite" opcodes.
===================================================================*/
word Z80Run( Z80Regs *regs, int numcycles )
{
/* opcode and temp variables */
register byte opcode;
eword tmpreg, ops, mread, tmpreg2;
unsigned long tempdword;
register int loop;
unsigned short tempword;
 
/* emulate <numcycles> cycles */
loop = (regs->ICount - numcycles);
 
/* this is the emulation main loop */
while( regs->ICount > loop )
{
#ifdef DEBUG
/* test if we have reached the trap address */
if( regs->PC.W == regs->TrapAddress && regs->dobreak != 0 )
return(regs->PC.W);
#endif
 
if( regs->halted == 1 )
{ r_PC--; AddCycles(4); }
 
/* read the opcode from memory (pointed by PC) */
opcode = Z80ReadMem(regs->PC.W);
regs->PC.W++;
 
/* increment the R register and decode the instruction */
AddR(1);
switch(opcode)
{
#include "opcodes.c"
case PREFIX_CB:
AddR(1);
#include "op_cb.c"
break;
case PREFIX_ED:
AddR(1);
#include "op_ed.c"
break;
case PREFIX_DD:
case PREFIX_FD:
AddR(1);
if( opcode == PREFIX_DD )
{
#define REGISTER regs->IX
regs->we_are_on_ddfd = WE_ARE_ON_DD;
#include "op_dd_fd.c"
#undef REGISTER
}
else
{
#define REGISTER regs->IY
regs->we_are_on_ddfd = WE_ARE_ON_FD;
#include "op_dd_fd.c"
#undef REGISTER
}
regs->we_are_on_ddfd = 0;
break;
}
 
/* patch ROM loading routine */
// address contributed by Ignacio Burgueño :)
// if( r_PC == 0x0569 )
if( r_PC >= 0x0556 && r_PC <= 0x056c )
Z80Patch( regs );
 
/* check if it's time to do other hardware emulation */
if( regs->ICount <= 0 )
{
tmpreg.W = Z80Hardware(regs);
regs->ICount += regs->IPeriod;
loop = regs->ICount + loop;
 
/* check if we must exit the emulation or there is an INT */
if( tmpreg.W == INT_QUIT )
return( regs->PC.W );
if( tmpreg.W != INT_NOINT )
Z80Interrupt( regs, tmpreg.W );
}
}
 
return(regs->PC.W);
}
 
 
 
/*====================================================================
void Z80Interrupt( Z80Regs *regs, word ivec )
===================================================================*/
void Z80Interrupt( Z80Regs *regs, word ivec )
{
word intaddress;
 
/* unhalt the computer */
if( regs->halted == 1 )
regs->halted = 0;
if( regs->IFF1 )
{
PUSH(PC);
regs->IFF1 = 0;
switch(regs->IM)
{
case 0: r_PC = 0x0038; AddCycles(12); break;
case 1: r_PC = 0x0038; AddCycles(13); break;
case 2: intaddress = (((regs->I & 0xFF)<<8) | 0xFF);
regs->PC.B.l = Z80ReadMem(intaddress);
regs->PC.B.h = Z80ReadMem(intaddress+1);
AddCycles(19);
break;
}
 
}
 
}
 
 
/*====================================================================
word Z80Hardware(register Z80Regs *regs)
 
Do here your emulated machine hardware emulation. Read Z80Execute()
to know about how to quit emulation and generate interrupts.
===================================================================*/
word Z80Hardware( register Z80Regs *regs )
{
if(
debug != 1 // && scanl >= 224
)
{
;
}
return( INT_IRQ );
}
 
 
/*====================================================================
void Z80Patch( register Z80Regs *regs )
 
Write here your patches to some z80 opcodes that are quite related
to the emulated machines (i.e. maybe accessing to the I/O ports
and so on), such as ED_FE opcode:
 
case ED_FE: Z80Patch(regs);
break;
 
This allows "BIOS" patching (cassette loading, keyboard ...).
===================================================================*/
void Z80Patch( register Z80Regs *regs )
{
 
///!!! if( tapfile != NULL )
///!!! {
///!!! LoadTAP( regs, tapfile );
///!!! POP(PC);
///!!! }
 
/*
if( strlen(tapfile) != 0 )
{
if( LoadTapFile( regs, tapfile ) )
{ POP(PC); }
}
else
{
FileMenu( tfont, 3, tapfile );
if( strlen(tapfile) != 0 )
if( LoadTapFile( regs, tapfile ) )
{ POP(PC); }
}
*/
}
 
 
/*====================================================================
byte Z80Debug( register Z80Regs *regs )
 
This function is written for debugging purposes (it's supposed to
be a debugger by itself!). It will debug a single opcode, given
by the current PC address.
 
Return DEBUG_OK to state success and DEBUG_QUIT to quit emulation.
===================================================================*/
byte Z80Debug( register Z80Regs *regs )
{
return( DEBUG_QUIT );
}
 
 
 
/*====================================================================
byte Z80MemRead( register word address )
 
This function reads from the given memory address. It is not inlined,
and it's written for debugging purposes.
===================================================================*/
byte Z80MemRead( register word address, Z80Regs *regs )
{
return(Z80ReadMem(address));
}
 
 
/*====================================================================
void Z80MemWrite( register word address, register byte value )
 
This function writes on memory the given value. It is not inlined,
ands it's written for debugging purposes.
===================================================================*/
void Z80MemWrite( register word address, register byte value, Z80Regs *regs )
{
Z80WriteMem( address, value, regs );
}
 
 
/*====================================================================
byte Z80InPort( register word port )
 
This function reads from the given I/O port. It is not inlined,
and it's written for debugging purposes.
===================================================================*/
byte Z80InPort( register word port )
{
int porth;
int code = 0xFF;
 
porth = port >> 8;
 
if (!(porth & 0x01)) code &= fila[4][1];
if (!(porth & 0x02)) code &= fila[3][1];
if (!(porth & 0x04)) code &= fila[2][1];
if (!(porth & 0x08)) code &= fila[1][1];
if (!(porth & 0x10)) code &= fila[1][2];
if (!(porth & 0x20)) code &= fila[2][2];
if (!(porth & 0x40)) code &= fila[3][2];
if (!(porth & 0x80)) code &= fila[4][2];
 
/*
issue 2 emulation, thx to Raul Gomez!!!!!
I should implement this also:
if( !ear_on && mic_on )
code &= 0xbf;
where earon = bit 4 of the last OUT to the 0xFE port
and micon = bit 3 of the last OUT to the 0xFE port
*/
code &= 0xbf;
 
if( (port & 0xFF) == 0xFF )
{
if( (rand() % 10) > 7 ) return(0xff);
else return( rand()%0xFF );
}
 
return( code );
}
 
 
/*====================================================================
void Z80OutPort( register word port, register byte value )
 
This function outs a value to a given I/O port. It is not inlined,
and it's written for debugging purposes.
===================================================================*/
void Z80OutPort( register Z80Regs *regs,
register word port, register byte value )
{
/* change border colour */
if( ! (port & 0x01) )
regs->BorderColor = (value & 0x07);
}
 
 
 
/*====================================================================
static void Z80FlagTables ( void );
 
Creates a look-up table for future flag setting...
Taken from fuse's sources. Thanks to Philip Kendall.
===================================================================*/
void Z80FlagTables(void)
{
int i,j,k;
byte parity;
 
for(i=0;i<0x100;i++) {
sz53_table[i]= i & ( FLAG_3 | FLAG_5 | FLAG_S );
j=i; parity=0;
for(k=0;k<8;k++) { parity ^= j & 1; j >>=1; }
parity_table[i]= ( parity ? 0 : FLAG_P );
sz53p_table[i] = sz53_table[i] | parity_table[i];
}
 
sz53_table[0] |= FLAG_Z;
sz53p_table[0] |= FLAG_Z;
}
 
/programs/emulator/e80/trunk/z80/z80.h
0,0 → 1,188
/*=====================================================================
z80.c -> Header file related to the Z80 emulation code.
 
Please read documentation files to know how this works :)
 
Thanks to Marat Fayzullin for writing the "How to write a Computer
Eemulator" HOWTO. This emulator is based on his tutorials and the
code organization (very readable!) of his "Z80 Portable Emulator".
I've learnt a lot from it, and I've taken some ideas of his code
to write this emulator.I think that almost all of the undocumented
Z80 opcodes are covered on this emulator. I also asked Marat
Fayzullin (by email) about ideas and so on (his Z80 emulator is
quite good, so go check it :-).
 
Of course, I can't forget Raúl Gomez (he answered me thousands
of email questions) and Philip Kendall. Whitout his ___kind___
people surely you won't be reading this file now...
 
"Programming the Z80" (from Rodnay Zaks) and the comp.sys.sinclair
FAQ were another excelent sources of info!
 
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
 
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
Copyright (c) 2000 Santiago Romero Iglesias.
Email: sromero@escomposlinux.org
======================================================================*/
 
 
#ifndef Z80_H
#define Z80_H
 
#define USING_ALLEGRO
#define DEBUG
#define _DEV_DEBUG_ /* development debugging */
#define LOW_ENDIAN
/*#define HI_ENDIAN */
 
/* Used by the Z80Debug() function */
#define DEBUG_OK 1
#define DEBUG_QUIT 0
 
 
#define video vscreen
 
 
/*=== Some common standard data types: ==============================*/
typedef unsigned char byte;
typedef unsigned short word;
typedef unsigned long dword;
typedef signed char offset;
 
 
/*--- Thanks to Philip Kendall for it's help using the flags --------*/
extern byte halfcarry_add_table[];
extern byte halfcarry_sub_table[];
extern byte overflow_add_table[];
extern byte overflow_sub_table[];
extern byte sz53_table[];
extern byte sz53p_table[];
extern byte parity_table[];
 
extern byte ioblock_inc1_table[];
extern byte ioblock_dec1_table[];
extern byte ioblock_2_table[];
 
 
/*=====================================================================
Z80 Flag Register: ---------------------------------
| 7 6 5 4 3 2 1 0 |
---------------------------------
| S Z x H x O/P N C |
---------------------------------
If (1) means that: S = Negative result.
Z = Zero result.
x = special cases (by opcode)
H = Halfcarry/borrow.
O/P = Overflow/Parity Flag.
N = Substraction.
C = Carry/borrow.
====================================================================*/
#define S_FLAG 0x80
#define Z_FLAG 0x40
#define H_FLAG 0x10
#define P_FLAG 0x04
#define O_FLAG 0x04
#define N_FLAG 0x02
#define C_FLAG 0x01
 
 
/*
Defines for interrupts and special Z80Hardware() codes:
=======================================================================
INT_QUIT = Exit the emulation (for Z80Run())
INT_NOINT = No interrupt required
INT_IRQ = Standard RST 38h interrupt
INT_NMI = Non-maskerable interrupt
*/
#define INT_QUIT 0xFFFE
#define INT_NOINT 0xFFFF
#define INT_IRQ 0x0038
#define INT_NMI 0x0066
 
 
 
/*=== A register is defined as follows: =============================*/
typedef union
{
#ifdef LOW_ENDIAN
struct
{
byte l,h;
} B;
#else
struct
{
byte h,l;
} B;
#endif
word W;
} eword;
 
 
#define WE_ARE_ON_DD 1
#define WE_ARE_ON_FD 2
 
/*=== Now we define the Z80 registers using the previous definition =*/
typedef struct
{
char machine_type;
byte *RAM;
int we_are_on_ddfd;
 
/* general and shadow z80 registers */
eword AF, BC, DE, HL, IX, IY, PC, SP, R,
AFs, BCs, DEs, HLs;
 
/* IFF and I registers, used on interrupts. */
byte IFF1, IFF2, I, halted;
char IM;
word IRequest;
 
/* the following is to take care of cycle counting */
int IPeriod, ICount, IBackup;
 
/* DecodingErrors = set this to 1 for debugging purposes in order
to trap undocumented or non implemented opcodes.
Trace = set this to 1 to start tracing. It's also set
when PC reaches TrapAddress value. */
byte DecodingErrors;
word TrapAddress;
byte Trace, dobreak;
byte BorderColor;
 
} Z80Regs;
 
 
/*====================================================================
Function declarations, read the .c file to know what they do.
===================================================================*/
void Z80Reset( register Z80Regs *regs, int );
void Z80Interrupt( register Z80Regs *, register word );
word Z80Run( register Z80Regs *, int );
byte Z80MemRead( register word, Z80Regs * );
void Z80MemWrite( register word, register byte, Z80Regs * );
byte Z80InPort( register word );
void Z80OutPort( register Z80Regs *regs, register word, register byte );
void Z80Patch( register Z80Regs * );
byte Z80Debug( register Z80Regs * );
word Z80Hardware( register Z80Regs * );
 
void Z80FlagTables(void);
word ParseOpcode( char *, char *, char *, word, Z80Regs * );
word Z80Dissasembler ( Z80Regs *, char *, char * );
 
#endif
/programs/emulator/e80/trunk/z80
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/e80/trunk
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/e80
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/fceu/ChangeLog.txt
0,0 → 1,2183
0.98.12:
 
Win32: Fixed the behavior of the sound logging function.
 
Fixed a bug that was causing 2xscale/3xscale to be broken
when clipping the leftmost and rightmost 8 columns.
 
Added an iNES header correction entry for JustBreed.
 
Modified the MMC5 "ELROM" board emulation to not emulate WRAM.
 
Corrected various pieces of code that were causing compiler warnings.
 
Win32: Scaling settings(x, y, stretch to fill screen) are now respected while
using a special scaler in full screen mode, though if x or y scale is
less than what is needed for a particular scaler, it will be
adjusted.
 
Win32: The window will be reblitted when it becomes invalidated while
a game is loaded(such as when you're resizing the window).
 
When the PPU is in a "dead" state after starting up, the graphics
buffer is now cleared. Previously, particularly in the Windows port, when
a game was closed, and a new game was loaded, the last image from
the previous game would be displayed for a short time.
 
Win32: Blit skipping will now occur when sound is disabled and FCE Ultra is
running behind the desired frame rate.
 
Win32: Blit-skipping behavior can now be configured to some extent in the "Timing" configuration
window.
 
Win32: Added a "Recent Directories" submenu to the "File" menu.
 
Removed some debugging code that shouldn't have been enabled in 0.98.11.
 
0.98.11:
 
Win32: Special scalers are now also supported in windowed mode. For Scale2x/Scale3x,
the fastest "desktop" bit depth is 16bpp. For hq2x/hq3x, it is 32bpp.
 
The shared video blitting code(drivers/common/vidblit.c) can now blit using Scale2x
and Scale3x to any target bit depth(8bpp, 16bpp, 24bpp, and 32bpp) instead of just
8bpp, as it was before.
HQ2x and HQ3x can now blit to 16bpp, 24bpp(untested), and 32bpp. The 16bpp and
24bpp targets are done doing post-processing conversion, after HQ2x/HQ3x, which
really does hurt speed.
 
Changed a few names in the credits section of the documentation to their
aliases. Names you didn't get to pick to have are so troublesome. :b
I also made various fixes/updates to the documentation.
 
Updated the FAQ with some information regard video mode bit depths and speed.
 
SDL: Disabled the fast-forward-key speed-limiting code. I thought I had
done this before...
 
Fixed a major bug in the movie recording code, and added some code to automatically detect
and fix playback of broken movies from earlier versions.
 
Did a little swapping thing with mapper 90 and 209. I moved back Mortal Kombat 3
to mapper 90, and moved Shin Samurai Spirits 2 to mapper 209. Sorry for any confusion.
Mapper 90 should be considered as having the fancy nametable select mode disabled, with
mapper 209 having it enabled.
 
Added support for mapper 160, which turns out to be the same hardware as mapper
90. Joy.
 
Improved mapper 90 emulation. This mapper really needs low-level
emulation for IRQs to work right, though. :/
 
Win32: Fixed the "hide left/right 8 video columns" feature.
 
Since FCE Ultra is ending(or has already exceeded? :b) its actively-updated life,
I've gone ahead and added per-game hacks for "Kick Master" and the PAL version
of "Star Wars". See the documentation for more details.
 
Minor optimizations to the high-quality sound emulation code. The FIR filter
code is the bottleneck, though, so these changes won't have much of an effect
on overall speed.
 
Altered MMC3 IRQ emulation(and the hooks in ppu.c for it).
 
Fixed a rather major typo in the VRC7-emulation code.
 
0.98.10:
 
Reimplemented network play. It now requires a standalone network play server, which
will be released as a later time. For fun, "starmen.net" is running this server,
which is publicly accessible.
I also made various code fixes/improvements to allow for network play, particularly
with the command handling code.
 
Reworked much of the VS Unisystem emulation code, partially based on information from
MAME. The following games are now supported:
 
Battle City
Castlevania
Clu Clu Land
Dr. Mario
Duck Hunt
Excitebike
Excitebike (Japanese)
Freedom Force
Goonies, The
Gradius
Gumshoe
Hogan's Alley
Ice Climber
Ladies Golf
Mach Rider
Mach Rider (Japanese)
Mighty Bomb Jack (Japanese)
Ninja Jajamaru Kun (Japanese)
Pinball
Pinball (Japanese)
Platoon
RBI Baseball
Slalom
Soccer
Star Luster
Stroke and Match Golf
Stroke and Match Golf - Ladies
Stroke and Match Golf (Japanese)
Super Mario Bros.
Super Sky Kid
Super Xevious
Tetris
TKO Boxing
Top Gun
 
Win32-native: Fixed a bug in the debugger's breakpoint list that appeared when
one tried to delete a breakpoint(the control accidentally had auto-sort enabled,
causing a discrepancy between what was displayed and what was contained in internal
data structures).
 
The current disk image XOR original disk image is now stored in save states. This
should greatly increase compressability(important for network play), and make
it a little more legal to distribute such save states now.
 
Modified the save state format to allow for more precise and larger version numbers.
 
Various minor code changes.
 
Fixed initialization of the FCEUGameInfo structure, which previously led
to problems with sound output on the SexyAL-using ports(Linux).
 
Apparently I added support for mapper 255 a while back. Documentation updated.
 
Added iNES header correction information for Armored Scrum Object and Alpha Mission.
 
Merged banksw.h into ines.c, fixed some of its prototypes in ines.h.
 
0.98.9:
 
Win32-native: Fixed the speed throttling used when sound is disabled. In previous
0.98.x Win32-native releases, emulation was running at 1/2 the speed it should
have been when sound was disabled.
 
Win32-native: Moved settings in the "Miscellaneous" configuration window
to where they should have been in the first place, and added "GUI" and "Timing"
configuration windows to accommodate some.
 
Win32-native: Fixed the handling of the "Scroll Lock" key used to disable and
enable Family BASIC Keyboard input.
 
Updated documentation to handle some slight differences in the Win32-native
port("Win32-native" is what the Win32 port using native APIs, as opposed to something
like GTK+ and SDL, will be referred to in documentation now). I also made
some other minor wording adjustments to the documentation.
 
Added an iNES header correction for Dragonball.
 
0.98.8:
 
Fixed a typo in sound.c that caused only part of the sound registers
to be saved in save states.
 
Win32: Switched over to the DirectDraw7 interface, from DirectDraw4's.
The surface Flip() method will now block, which results in somewhat
smoother animation/scrolling, especially when combined with the
auto blit-skip implemented in 0.98.6 when sound is enabled.
 
Win32: Undid a change made in the last release that limited the
speed of fast-forwarding when using the tilde key. I really do
need to implement some sort of unified timing/blit skip system...
 
Win32: Added an option, disabled by default, to ask for confirmation
before exiting FCE Ultra.
 
Win32: Added an option, enabled by default, to disable the system
screen saver while a game is loaded.
 
Win32: Added a new video synchronization mode, a "lazy" wait for
vblank/vertical retrace. It calls Sleep(0) in its wait loop. This
still uses all available cpu cycles, but it is much more friendly
to other processes than the old-style wait for vblank.
 
Win32: Added support for joystick POV hats.
 
0.98.7:
 
Fixed a bug in the debugger's disassembler when disassembling
opcode 0xBC.
 
Fixed the behavior of the right mouse button with zapper emulation, to
correspond with what it is documented as doing.
 
Win32: Added proper support for maximizing the window.
 
Win32: Rewrote most of the input and input configuration code.
 
Win32: Changed the configurable aspect ratio to something sensical, the current
display's pixel aspect ratio, default of 1:1(square pixels).
 
Win32: Made the default full-screen video mode the custom video mode. I should have
done this a long time ago to make custom video mode configuration more straighforward
for users...
 
Added some JACK audio code to be used by the SDL build. I'll test it and complete
it later.
 
0.98.6: Made several code modifications to work with older versions of gcc.
 
Fixed more header file network play #ifdef-age.
 
Fixed a typo in cart.h.
 
Fixed some funky code in FCEU_memmove().
Fixed some source code causing compiler warnings.
 
Fixed SexyAL's format conversion code to not rely on deprecated casting semantics.
 
Readded the native Win32 code, and made many improvements. The major thing
that needs to be done now with it is to rewrite the input handling code and input
configuration code.
 
0.98.5:
Added LL to the 64-bit integer constants in ines.c
 
Fixed OpenGL support under Mac OS X.
 
Added the ability to hide background and/or sprites with the F4 key.
 
0.98.4:
Moved NETWORK #ifdef's to netplay.c to simplify things.
 
Fixed gzip file loading code(I think). I'm still a bit unsure about the semantics
of dup() and close(), though.
 
Corrected FDS code to try loading the FDS image before loading the BIOS.
 
Readded "native" SDL sound code, used for Mac OS X(and maybe BeOS).
 
0.98.3:
Removed the wxWindows GUI code. GTK+ 2 code will take its place,
once it is ready.
 
Added reset and power commands to the movie format. More commands(such as insert
disk, eject disk, flip dip switch, etc.) will be added simultaneously as work
on network play continues.
 
Modified SexyAL OSS code to not adjust the number of fragments to a power of 2.
It works fine on my card, allowing finer-grained buffer size control,
but I'm not sure it will work with all chips.
 
Fixed parsing of the "-specialfs" command-line argument.
 
Added the hq3x scaler.
 
Updated to the latest Scale2x code. I also added the Scale3x scaler.
 
Changed the keyboard assignments for toggling full screen to "Alt" + "Enter".
 
FCEUI_SaveState() and FCEUI_LoadState() changed. Porters should read
driver.h.
 
Miscellaneous changes to accommodate new network play plan. It's not close
to being finished.
 
Altered RTI emulation. In Paris Dakar Rally's NMI handler, it does "CLI ; RTI".
Previously, FCE Ultra would generate an interrupt right after RTI occured, due to the
presumed latency that RTI had with the I flag. I changed it so there is no latency, so
no interrupt will occur in this case(interrupts kill this game). The interrupt source
is the "frame IRQ", which it never disables, if anyone cares.
This change does break the "Stars SE" demo, though. Hmm.
 
"FCEUGameInfo" is now a pointer, rather than just a statically-allocated structure.
This may cause some null-dereferencing-related crashes, but it should help keep
code a little cleaner(maybe?).
 
Played around with the FDS FM code some more. It's still not right. Bah.
 
Hacked in support for entering Datach/Barcode World barcodes without a GUI, using the
F8 key and the numeric keys.
 
Added code to save/load movies. Movie support will only record/play back the
states of the four emulated gamepads.
 
Modified the sound code to use timestamp/timestampbase differently. In addition,
timestampbase is now saved in save states("timestamp" doesn't need to be saved, since
it's reset to 0 at the end of each emulated frame).
 
0.98.2:
Fixed a few problems with the SDL command-line build code
for Win32. Also, SDL 1.2.7 seems to have a bug that breaks FCE Ultra's
full-screen/windowed switching capabilities(at least under Win32).
Stupid everything.
 
Minor SexyAL changes.
 
Updated documentation.
 
0.98.1:
 
Increased the volume of the FME07 sound channels.
 
Fixed a bug in the SexyAL endian conversion code.
 
Made the SexyAL chunk conversion loop work.
 
Replaced the old OPL2 emulator with a modified version of
Mitsutaka Okazaki's YM2413 emulator for the VRC7 sound emulation.
 
Decreased the pitch of the FME 07 expansion sound channels by one octave.
 
Decreased volume of output of $5011 in MMC5 emulation code.
 
 
0.98.0: Some changes I made aren't listed below. Ah well. The magnitude
of the changes was too great...
 
 
Default sound volume is 100(%), which makes a lot more sense than 75%, but not much.
It's multiplied by 3/4 internally now.
 
Added support for the Datach barcode reader(GUI interface only). The emulation code
was adapted from the VirtuaNES source code.
 
Reassigned the Datach games to mapper 157, from 16, with CRC32 checks.
 
Increased the maximum number of screen snapshots in the snapshots directory
to 99999(from 999).
 
Reassigned the following games to mapper 210, using CRC32 checks:
Chibi Maruko Chan
Dream Master
Family Circuit '91
Famista '92
Famista '93
Famista '94
Heisei Tensai Bakabon
Top Striker
Wagyan Land 2
Wagyan Land 3
If you use a hack/translation of one or more of these games, you will of course
need to manually change the mapper number in the header for it to work properly in
FCE Ultra. Family Circuit '91 still may not fit in with the rest of these games,
but it's definitely not a "stock" mapper 19 setup.
 
Fixed an OpenGL palette bug when using scanlines(previously, I think it was
setting the palette of the scanlines overlay texture instead of the actual image
texture in some instances). The bug showed up on games that make use of the color
deemphasis bits.
 
Rewrote a lot of the PPU background rendering code to be more accurate(and
obfuscated!). This eliminates the X-offset hack I made earlier.
 
Removed some of the NSF visualization code, and altered the look of the NSF
display slightly. The NSF waveform visualization code will now take into
account the current volume setting.
 
Changed the default key bindings for the standard emulated gamepad
to something more compatible with window managers. I may change it back, but probably
not, since it is easily configurable now.
 
Updated the MMC5, VRC6, and FME07 low-quality sound emulation code
with the compatible parts of the high-quality sound emulation code for those chips.
 
Adjusted timing of horizontal scroll update(near the beginning of hblank. I made
it occur sooner). I also added a hack to allow X-offset(fine X scroll) changes mid
scanline, however, it is extremely ugly, and may not work correctly for everything
(doing it correctly would probably kill speed).
I mainly did it to fix games like F-1 Race and Mach Rider, and other racing
games that are extremely sensitive to horizontal scrolling timing.
 
Some FDS IRQ emulation changes to fix some screen corruption problems
in "Kaettekita Mario Bros".
 
Removed zlib(the code, not support).
I also removed support for compiling without zlib(it's small, simple, provides
very useful functions, and may provide critical features for fceu in the future).
 
*undone, breaks debugger, FIXME.* Replaced some inline functions with macros in x6502.c.
 
Increased the speed of Namco 106 sound emulation in HQ sound mode.
 
Many many sound emulation changes and adjustments based on blargg's tests.
The default sound volume is about 150% what it was before, because the sound range
has changed(now -soundvol 100 is like -soundvol 200 on older builds), and the
default "soundvol" setting is 75. 100 clips on some Namco games, and 200 clips
on many games, so I'll probably have the configurable volume range as [0:125].
What exactly is "%" supposed to mean in this case.... 100% of what?!
 
When using low-quality sound emulation mode, total emulation speed is about 10%
less than previous builds. The change in speed for high-quality sound emulation
mode is significantly less.
 
Added beginnings of SexyAL to source code tree, removed SDL sound support, and
old OSS code.
 
Copied over some autoconf/automake stuff from phamicom. It stills needs a bit
of work...
 
Fixed DMC IRQ emulation. Fixes many CodeMasters games. Finally. ^_^
 
Restructured a lot of files, changed the interface between driver and
emulator code slightly.
 
* Insert stuff here *
 
November 28, 2003 - Snapshot
 
Removed the DOS, Linux SVGAlib, and Win32 targets. *GASP*
Win32 support will return(eventually), using SDL + wxWindows.
SDL can use svgalib or GGI anyway, so it shouldn't be a huge loss.
DOS support will only return if someone ports SDL to DOS. ^_^
It would be nice if SDL could accept modelines. Maybe in SDL 2.0...
Merged fce.c and svga.c into fceu.c, and fce.h and svga.h into fceu.h.
 
Reassigned "Mortal Kombat 3 - Special 56 Peoples" to mapper 209.
 
Added emulation of the "Oeka Kids" tablet.
 
Added emulation of the Family Trainer.
 
Added emulation of the "Ultimate Quiz King" buzzers.
 
Added emulation of the Mahjong controller.
 
Added emulation of HyperShot controllers.
 
Fixed loading of NSFs with load addresses below $8000.
 
Cleaned and simplified some of the NES APU code.
 
Altered mapper 65 emulation. Fixes Kaiketsu Yanchamaru 3. Does it break anything?
 
Wrote a small FAQ file.
 
Fixed displaying of garbage and other unpleasantness on the first scanline. I need
to clean up that code, though.
 
Fixed color deemphasis emulation when all bits are set. For some
reason, I had commented out the code. Bleh.
 
NSF player now writes $C0 to $4017 if the FDS is being used(the FDS
BIOS writes $C0 to $4017). $40 for all other NSFs.
 
Added support for iNES mapper 58(nnnesterj).
 
Added support for iNES mapper 208.
 
Reassigned "Fudou Myouou Den" to mapper 207(CRC32 checks).
 
Reassigned "Karnov" to mapper 206(CRC32 checks).
 
Fixed the mapper 95 code, which was horribly broken.
 
Differentiated between mappers 33 and 48. Added CRC checks to assign
some games to mapper 48. "Flintstones 2" and "Don Doko Don 2" are
the games that need to be assigned to 48. Are there others?
 
Replaced usage of TriggerIRQ to X6502_IRQBegin/X6502_IRQEnd combos in
various mapper emulation files. 67, 33/48, 40, 73, 42, 65, 6, 182
Removed function TriggerIRQ() from x6502.c
 
Fixed the sound volume of the VRC7 emulation in high-quality sound mode.
Decreased(slightly) the volume of VRC7 emulation in both high-quality sound modes.
 
Decreased the volume of the MMC5 expansion sound channels.
 
Decreased the volume of the FME-7/mapper 69 expansion sound channels.
 
Added FCEU_gmalloc(), which will call exit() if memory allocation fails,
otherwise it is guaranteed to return a memory block.
This will be used in the mapper code mainly. It should only
be used for small memory chunks. The reasoning is that if 64 some like KB of
RAM or less can't be allocated, for example, it'd probably be best to
exit the emulator ASAP. It also helps to simplify code logic, and
help (me) with modularization.
The behavior of this may change in the future. I still need to think about it.
I should probably save the configuration file regularly(or much better,
use the registry) on the Windows port, though.
 
Cleaned up the save-state saving/loading code a bit, and added
support for linked save state structures for better modularity and
less code duplication.
 
Merged the iNES and UNIF MMC1, MMC3, and MMC5 code more completely.
I may need to sanify CHR RAM and WRAM allocation for pedanticness,
though. Also worked on Tengen RAMBO-1 emulation, and mapper 90 emulation.
***THIS MAKES SAVE STATES FOR GAMES THAT USE THESE EXPANSION CHIPS INCOMPATIBLE
WITH PREVIOUS VERSIONS***
I plan on doing the same thing with other mappers/boards in the future, though.
Always on the quest for 1.0...
 
November 12, 2003 - 0.97.5 Release
 
Windows: Added limited support for arguments that change configuration
to be passed to FCE Ultra. Example: fceu -pal 1 c:\streetgangs.nes
It may be useful in frontends.
 
Fixed filename generation for automatic IPS patching when a file
with no extension is loaded. Before this change, FCEU would
look for "game..ips" with a file named "game".
 
Converted and updated the cheat guide in(to) HTML.
 
Added support for iNES mappers 202,203,231 from info from cah4e3.
Fixed support for mappers 60, 200.
 
Fixed various major bugs in the breakpoint deletion code.
 
UN*X: Added support for OSS(/dev/dsp) devices that don't support mono
sound.
 
Increased PPU startup idle time to 2 frames. Fixes that
unlicensed "Earthworm Jim 3" game. Does it break anything?
 
November 9, 2003 - 0.97.4 Release
 
Fixed another obscure PPU emulation screen corruption bug.
 
Added support for Game Genie cheats in the cheat interface.
 
Windows: Reworked the cheat interface, merging the cheat search
and cheat list windows into one.
 
Windows: Greatly improved the CPU debugger.
The code still needs a lot of cleaning, though.
 
Readjusted VRC6 IRQ emulation timing.
 
Added support for the UNIF MMC3 board TEROM. The maximum PRG/CHR sizes
may not be correct in this implementation, though.
 
November 8, 2003 - 0.97.3 Release
 
Added a control to set the highest quality sound mode in Windows.
This change requires that any users who previously set
"high quality sound" to set it again.
 
Fixed the volume of high-quality sound mode again. The changes
I made earlier didn't affect all the filter coefficients.
 
November 8, 2003 - 0.97.2 Release
 
Made a minor optimization to writes to palette memory.
 
Altered VRC6 IRQ emulation timing slightly.
 
Fixed a weirdo PPU emulation bug that could cause garbage on the right
side of the screen in certain situations. Thanks to FrenziedPanda for
bugging me enough to make me look into the problem and fix it.
I should be on the lookout to see if the fix breaks anything, though.
 
Fixed the volume of high-quality sound mode(-soundq 1). It was
at 1/4 the volume it should have been. I compensated by increasing
the precision of the filter coefficients, which increased the sound
quality of that mode slightly without hurting performance.
 
November 7, 2003 - 0.97.1 Release
 
Fixed mapper 105 emulation. I had begun merging it into the
rest of the MMC1 code for 0.97, but I hadn't finished it.
 
Changed things like RdMem(_PC++); to RdMem(_PC); _PC++;
Darn evil global variables. I need to fix them. Screw speed.
 
Expanded checks for the global variable "fceuindbg"(used in debug
mode to prevent reads in the debugger from altering any registers).
 
November 6, 2003 - 0.97 Release
* Note: I still had much more I had wanted to get done for 0.97,
but I lost even more interest. The Windows port still doesn't
have a way to enable the "highest" sound emulation mode, nor the
low pass filter code, not to mention that the lowpass filter code
isn't complete(I would need to design a high-order FIR filter from an IIR
filter to work properly-have the correct rolloff, among other
things-at finite playback rates).
 
Fixed a bug in the IPS patcher. The recorded size wasn't being updated
after a successful realloc() was made, which could lead to corrupted patch
data from some patches.
 
Added support for mappers 200, 201 from submitted code.
 
Rewrote mapper 15 support to make more sense(well, depending
on your point of view...).
 
Fixed 256KB CHR select support for mapper 115.
 
Added support for mapper 12 from code from cah4e3.
 
October 16, 2003 - Snapshot
 
Fixed support for mapper 245(for nonencrypted/non-smynes-screwed up
ROM images only. Fixes "Yong Zhe Dou E Long [...] Dragon Quest 7".
 
Added support for mappers 60, 62, 230, 244 from submitted code.
 
Modified mapper 90 emulation to allow game-select on reset
for "Final Fight 3".
 
Modified mapper 45 emulation to allow "Super 8-in-1" to work.
 
Added a low-pass filter, and an option to enable it(CLI ports).
 
0x00 is now written to $4011 in the NSF player code instead of 0x40.
Fixed some other similar sound register init problems that I had fixed
in Festalon but forgot to fix in FCEU. Grrr.
 
Removed some unnecessary 64-bit integer usage from FIR sound filtering
code.
 
Added a new sound quality mode. Higher than high, it's highest(in
FCE Ultra, for now). Still need to fix the interface to allow
enabling it in the Windows port.
 
Added some code for lower-level MMC3 IRQ emulation. It isn't completed
, and will not work properly as-is. I'm still playing around with
it occasionally.
Fixed the sprite overflow flag(I think I fixed it), that was broken in an earlier
pre-0.97 release.
 
Fixed support for iNES mapper 193.
 
Command line arguments "-pal" and "-gg" now take extra arguments(1/0)
and are remembered in the configuration file.
 
September 27, 2003 - Snapshot
 
Added support for iNES mapper 50.
 
Modified the UNIF board initialization code. Hopefully, this
new interface will eventually be used with the iNES code.
 
Miscellaneous code cleanups.
 
/dev/dsp is now set to 8(previously 9) buffers of 128 samples in length
in the SDL code.
 
Tried to make the save state code more expandable and modular.
 
Moved a lot of the PPU code into ppu.c.
 
Added more extensive debugging code to the 6502 emulator, to allow
for memory read/write hooks(including zero page addressing modes).
 
Readadjusted DMC timings when PAL emulation is enabled. It looks
like it was correct before I had made the August 2 change. Thanks
to Bananmos for the information. I think. :/
 
Added support for iNES mapper 193 from information from virtuanes.
I think my dump of it is "bad", though. PRG and CHR pages look
like they are in the wrong order(logical vs physical? Who's to say
what's physical?).
 
September 1, 2003 - Snapshot
 
Fixed some minor initialization issues with iNES mappers 7 and 34.
 
Added support for UNIF board NES-GNROM.
 
Removed support for save states created with versions of FCE Ultra
less than 0.56.
 
Replaced SDL sound buffering code with a lock-free FIFO implementation
written by David Olofson, with a few modifications by myself.
 
Fixed a VRC7 NSF bug(it showed up under the reworked driver/file
loading order in the cli code).
 
The board in "Rolling Thunder" has "RAMBO 1" on it, not "RAMBO-1".
 
August 9, 2003 - Snapshot
 
Removed the old plain text documentation and replaced it with
a new document in HTML. It is not completed yet, though.
 
Rewrote the SDL-native audio code to be less wacky and more
thread-safe(hopefully). I'm still waiting for a new SDL audio
API...
 
Altered the MMC5 IRQ timing. Fixes minor graphical glitches
in Castlevania 3. Does it break anything?
 
Removed some debugging code that got into the last snapshot.
 
August 5, 2003 - Snapshot
 
Added some code in the IPS patcher to allow for expanding the size of files.
 
Fixed a double free() bug with a mapper 51 game(in ines.c).
 
Added support for "Alien Syndrome" (US release) as iNES mapper 158.
It looks like a derivative of the normal RAMBO-1 board(or is that
the name of the chip?), similar to TKSROM/TLSROM(mapper 118).
 
Improved the "native" SDL sound code. It will now call SDL_Delay(),
among other nice things. The code could probably be improved more,
though.
 
Added support for decimal components in xscale/yscale in the SDL
port. Set the default xscale for windowed mode to 2.40(to get a
more correct aspect ratio, assuming the display is currently at
a 4:3 aspect ratio).
 
Modified args.c to handle floating-point numbers.
 
August 2, 2003 - Snapshot.
 
Disabled texture wrapping with OpenGL(there were problems at the edges
of the screen with linear interpolation). Bah. Now the edges
are too bright...
 
Improved the accuracy of the DMC timing when PAL emulation is enabled.
I still don't think it's totally correct, though.
 
Changed the default settings for the SDL code. Full screen
is now 640x480x8bpp by default, xscale and yscale are 2 for both full
screen and windowed, opengl support is enabled, linear interpolation
for OpenGL is enabled, and X-axis stretching is
enabled(in full screen).
 
"Scanlines" were enabled in 8bpp to 8bpp blits in
drivers/common/vidblit.c when they shouldn't have been. Fixed.
 
Fixed OpenGL code under big-endian platforms.
 
August 1, 2003 - Snapshot.
Various code clean-ups.
 
Played around with adding a GTK+ GUI to the SDL code.
 
Rewrote part of the hq sound rectangle wave code.
 
Replaced the high-quality sound inline assembly filter code with
slightly faster C code.
 
Hacked around with GP32 support. I don't know if the GP32 would
be fast enough, though.
 
Skipped frames will now have D5 of $2002 set at the beginning
of the frame. Fixes "Bee 52". I must see if it breaks anything.
 
Added OpenGL support to the SDL code.
 
Removed the PPU drawing inline assembly code, replacing it with a faster
algorithm written in C.
 
"Disabling" the 8-sprite limitation will no longer cause
"Bee 52" to break. However, the "Solstice" wizard will still
have the weird thing growing out of his face in the introduction,
since it depends on no more sprites to be rendered.
 
Added entry for that Black Bass game for header corrections in
ines.c
 
Strip color burst bit(D0 of $2001) is only "emulated" if bg or
sprite rendering are turned on, at the end of the scanline.
Doing it with pixel/tile granularity would require modifying
the sprite graphics data copying routine, which I don't
feel like doing. Fixes that crazy Sayoonara demo by Chris Covell.
I also modified the NES RAM initialization code.
 
Adjusted VRC7 IRQ emulation for better Lagrange Point goodness.
 
Added support for iNES mapper 91. (VirtuaNES)
 
0.96:
Improved RAMBO-1(mapper 64) emulation. "Skull and Crossbones" is
now playable.
 
0.95:
 
timestamp and timestampbase are no longer saved/loaded to/from
save states. They were causing too many problems I didn't
want to fix, and I never intended them to be saved in save states
when I wrote the code that uses them.
I think the reason they were being saved was that I wanted to make it
possible to add movie support and network play save state loading
(distributing the save state over the network). So if someone in
the future wants to add these features, the issues(primarily with
zapper emulation and sound emulation) with saving the time stamp will
need to be resolved.
 
Fixed some crashing bugs when save states are loaded when
high-quality sound emulation is enabled. It is like patching
holes in a swiss-cheese boat. All the holes may be patched, but
it looks ugly. At least it tastes good...
TODO: Look into saving more data in the save states, especially
data that is based off of "timestamp" and "timestampbase". Also
look into validating this data. Right now, corrupt save state data
might cause memory corruption in FCE Ultra.
 
Fixed some bugs in the NSF player.
 
Cleaned up more code.
 
Reduced the usage of TriggerIRQ().
 
Split the palette code into a new file, palette.c, from svga.c
 
Low-G-Man(NTSC and PAL versions) are now recognized by CRC32 value,
and WRAM will be disabled if they are loaded. A warning/status message
will also be printed regarding this issue.
 
Decreased the volume of the DMC/PCM channel in low-quality sound
emulation.
 
Low-quality sound emulation now uses 32-bit integers for much
better speed.
 
FCEUI_CRC32() wasn't returning anything. D'oh. Fixed.
 
Added somewhat crude support for games that switch background CHR data
mid-scanline (this is needed in games such as Mother, Pirates!,
Business Wars, and Marble Madness).
Altered NMI, IRQ, and BRK emulation again. Fixes some games,
like Bases Loaded 2 and Dynamite Bowling, and maybe some others.
I had to increase the size of the IRQlow variable for delayed
NMI execution... I also had to add a delay between PPU reset
and the PPU actually doing anything, to fix "Knight Rider".
 
Fixed a mapper 90 save state bug.
 
/dev/dsp code now searches for /dev/dsp before /dev/dspX (where X is
a non-negative integer).
 
SDL joystick axes configuration is now done from the joystick.
 
Tweaked various Konami mappers' IRQ counter emulation.
 
Added custom SDL throttle code that gives up time slices instead of
using 100% cpu.
 
Fixed an issue with sprite priorities on MSB-first platforms.
 
Modified powerpad.c to avoid a symbol conflict when compiling on the
Power PC architecture.
 
0.94r3:
sound.c:
Fixed a divide-by-zero bug that occurred when a virtual
reset(like by pressing F10) occurred when sound emulation was
disabled.
 
0.94r2:
drivers/common/vidblit.c:
Fixed code for 32bpp blur effect.
 
drivers/cli/sdl-video.c:
Added error message for unsupported bit depths.
 
mappers/simple.c, ines.c:
Used this bug fix pseudo-release as an excuse to add
support for mapper 107. Information taken from virtuanes.
 
0.94(fixed release)
---
Fixed call to InitUNIXDSPSound in svgalib.c
 
Added man pages.
 
0.94
---
Added support for rapid fire A/B buttons on physical joysticks
in SDL/svgalib/DOS code.
 
Implemented "high-quality" Namco 106 emulation(used for hq sound mode).
In this case, "high-quality" means sounding more like it should,
not necessarily cleaner. I'm not certain that it's totally correct,
but it's in the right direction.
 
RAM cheats should no longer affect Game Genie emulation. I still
need to completely verify this. There may be some sort of race
condition.
 
Removed various minor speed hacks in the name of style and
correctness(and to make maintaining FCE Ultra easier for those
people who are not me). :)
 
Removed NSF cpu hacks, as I changed code to make them unnecessary.
 
Fixed another FDS IRQ emulation bug. "Famicom Grand Prix II" works
now.
 
Fixed a memory leak and a heap corruption bug in "file.c".
 
Added support for on-the-fly IPS patching.
Place the IPS file in the same directory as the file to load,
and name it filename.ips.
 
Examples: Boat.nes - Boat.nes.ips
Boat.zip - Boat.zip.ips
Boat.nes.gz - Boat.nes.gz.ips
Boat - Boat.ips
 
Some operating systems and environments will hide file extensions.
Keep this in mind if you are having trouble.
Patching is supported for all supported formats(iNES, FDS, UNIF, and
NSF), but it will probably only be useful for the iNES format. It
can be used with the FDS format, but be warned that it will permanently
patch your disk image, as the disk image is written back to disk
when the game is unloaded(unless the disk image is in a zip file, in
which case it isn't written back to disk). UNIF files can't be
patched well with the IPS format because they are chunk-based with no
fixed offsets. Support for a UNIF patching format may be added
in the future(probably by someone else.).
 
Added more games to the list in ines.c for having battery-backed
WRAM, for header corrections.
Copied over the 96KHz filter coefficients from Festalon that I forgot
to do in 0.92. Oops.
 
 
0.93
---
 
Reduced the volume of the FDS sound channel.
 
Fixed a bug in the FDS IRQ emulation code that caused "Lutter" to not work.
 
Fixed a bug in unif.c that would cause a crash if a unif file were
loaded without a board name being specified(as could happen
with a corrupted nsf).
 
Fixed a bug in general.c relating to relative filenames(running
fce ultra like "./fceu ../big.nes" would work, but "./fceu ../big"
would not work- it crashed).
 
 
0.92r2
---
Fixed dpcm irq bug that broke Cobra Triangle.
 
.92
---
 
Removed NSF player background, and added some special effects goodies.
 
Changed the NSF player to use the emulated gamepad as input instead
of having special NSF-player-only keys.
 
Added support for mapper 249(using nonencrypted games), thanks to SARO
for info. SMYNES sucks.
 
Updated video blitting library-thing(vidblit.c) with more special
effects, and removed 24bpp support.
 
SDL cleanupification.
 
Added support for mapper 61.
 
nnnesterj: Added support for mapper 57.
 
Fixed mapper number for "Golden Game 150 in 1". Changed it to 235
from 43.
 
DDraw back buffer surfaces are now created in system memory if the
hardware blitter can't do stretching.
 
Restructured file wrapping code.
 
Added new cheat search methods.
 
Fixed a major cheat unloading memory bug(and memory leak).
 
Emulated that funky nonlinear DAC effect for hi-quality sound.
 
More fixes/cleanups to FDS emulation code.
 
Tweaked PPU timing a bit.
 
Improved network play.
 
Holding the enter key down will no longer do fun stuff to the nsf
player.
 
Improved NSF player. It should support streaming pcm nsfs now...
 
Changed FDS keyboard keys around a bit. F6 is the disk select key,
and F8 is the disk insert/eject key.
F8 to insert VS Unisystem coin, F6 to view/toggle dip switches.
Hopefully people won't complain after blindly hitting the save state
buttons. :)
 
Many fixes and improvements to the Windows port. No more cpu-consuming
wait loops(specifically, sound). Added a message window.
 
FDS sound emulation improvements.
 
FDS disks are now auto-inserted on power on(or was it loading a new
game...).
 
Changed the default last rendered scanline to 231.
 
ines header corrections are now printed as status messages, not errors.
 
Rearranged input updating code.
 
Fixed a sprite transfer bug. Fixes PAL version of Rainbow Islands.
 
Debugger hooks added.
 
Small optimizations in Refreshline and FetchSpriteData to hopefully
offset the slight slowdown in the cpu core.
 
MapperHBIRQHook is now called differently(depending on hi/low bg/spr
addresses).
 
Added support for unif board UNL-8237.
 
Added support for mapper 144(death race).
 
Added partial support for mapper 74.
 
Fixed a cpu emulation bug in GETIYWR. It would sometimes set "target"
to 0x10000, which was a BAD THING(overflow; now it wraps).
 
Tried to add support for mapper 241. Needs special keyboard emulation.
I think.
 
Internal RAM is now initialized to something other than 0. Fixes
Minna no Taabou no Nakayoshi Dai Sakusen.
 
Reassigned "The Money Game" to mapper 155. It doesn't seem to
respect the WRAM enable/disable bits. Silly game. And
Tatakae!! Rahmen Man.
 
Added support for mapper 115(still needs 256KB CHR select), 241, 114,88.
 
Attempted to add support for mappers 91, 187.
 
Modified frame IRQ to not break so many damn games.
 
Fixed sprite hit detection loop.
 
Improved support for mappers 80, 90,117,154, 189.
nnnester and virtuanes.
 
Reassigned "Devil Man" to mapper 154.
 
Removed bogus Trojan header fix in ines.c.
 
 
 
.81-post:
----
Fixed/Worked around(?) compilation problems on gcc 3.2.x.
 
.81:
----
 
More SDL goodies.
 
Renamed "Makefile.olinuxsdl" to "Makefile.unixsdl"
 
More SDL fixes and cleanups.
 
BeOS port is now compiled with the "-no-fpic" flag, which allows
me to use my inline assembly. The executable work fine as far as
I can tell.
 
Added "Makefile.beos". gcc doesn't like my inline assembly
used in RefreshLine(),so this port will likely be slightly slower than
other x86 ports.
 
Added a check to make sure SIGBUS is not equal to SIGSEGV in
drivers/cli/main.c. Needed for compiling under BeOS.
 
Renamed the "PI" member of the X6502 structure due to conflicts with
a defined symbol with some math header files.
 
Merged fcelineasm.h into fceline.h
 
Fixed(possibly) a possible problem in fcelineasm.h with input register
clobbering.
 
More SDL changes.
 
Added speed throttling code to the CLI code, and added a command
line switch "-nothrottle".
 
Lots of restructuring/rewriting/merging of the MMC3 code.
 
Updated DOS code to use the generic CLI wrapper.
 
Reads from $4090 and $4092 now return the current envelope setting
in FDS sound emulation. I'm not sure if this is correct... Affects
"Ai Senshi Nicole" and "Bio Miracle Bokutte Upa".
 
Added native SDL sound support to the SDL code. the "olinuxsdl"
now uses this code by default instead of the unixdsp sound code.
 
Modified MMC3 IRQ counter emulation. I'll need to watch out to see
if it breaks any games. Fixes: MegaMan 3, Gun Nac, Klax(Japanese).
 
Changed a few memory reads in x6502.c to use RdRAM instead of RdMem,
resulting in a slight speed increase.
 
Cleaned up mapper 250 emulation code.
 
Added support for iNES mapper 51(thanks to Kevin Horton for the
information).
 
Merged some iNES mappers corresponding to bootleg multicarts
based on MMC3s with mbshare/mmc3.c.
 
Added support for iNES mapper 52(thanks to Kevin Horton for the
information).
 
Made some hacks to the MMC3 emulation code so that I can add support
for pirate MMC3 multicarts more easily. I should clean it up later.
Moved mapper 44 emulation code to mbshare/mmc3.c.
 
Saving screen snapshots will no longer corrupt the frame buffer
for one frame(unless memory couldn't be allocated).
 
Fixed screen snapshot saving(it was sort of broken due to the
changes made to the driver<->emulator interface code; status
messages were being saved to the image). FCEUI_SaveSnapshot()
no longer returns a value(the request to save a screen snapshot is
serviced before status information would be written in the next frame).
 
nosprites is now set to 0 before RefreshSprite() returns, to prevent
problems if a game turns off the bg and sprites when FetchSpriteData()
for the next scanline is called but then turns on sprites when
the actual scanline is drawn.
 
PPU_hook() is now called more often if PPU_hook is non-null.
Made changes to mappers 118, 95, 9, and 10 to compensate.
No games seem to be broken, and I added support for mapper 96
(though the games aren't very playable because the special controller
isn't emulated).
 
Romance of the 3 Kingdoms is now recognized to use 16KB ex-WRAM.
 
Added support for mapper 185...sort of. I think this is another
instance of incompatible hardware being lumped onto one mapper number.
Sigh.
 
Added support for "Famicom Jump 2" as iNES mapper 153.
If a good(as far as I can tell) dump is loaded, FCE Ultra will
automatically fix the mapper number.
I also made some changes to the mapper 16 IRQ emulation code.
 
BRK now sets the I flag.
 
Reads from $4015 no longer reset DPCM IRQ.
 
Changed emulation of RTI instruction slightly.
 
X.IRQlow is now set to 0 in PowerNES().
 
The VS Unisystem bit in the iNES header is no longer looked at(
I was having too many problems with this bit being set when it
shouldn't have been). Now, VS Unisystem emulation is enabled
when a known VS Unisystem game is loaded. I also rewrote the VS
Unisystem detection function.
 
iNES mapper 1 now supports pageable CHR RAM if no CHR ROM is present.
Fixes "Family School".
 
Mapper 70 no longer has a mirroring control emulated, and I extended
the number of 8KB CHR pages supported to 16.
 
Cleaned up iNES MMC5 save RAM loading/saving code and added
support for MMC1 games with 16KB of RAM(the second 8KB are saved),
via CRC32s(currently only Genghis Khan(USA) and Nobunaga's Ambition(
USA and Japan) are recognized).
 
Added support for the MMC5 Koei game "Ishin no Arashi", in the iNES
format(I added an entry with its CRC32 value and the number of 8KB
WRAM banks it needs).
 
Better iNES mapper 33/48 IRQ counter emulation.
 
Added the game "Uchuusen - Cosmo Carrier" to this list. I'm
beginning to hate the iNES format more and more...or maybe
just Fanwen. :)
 
Added the mapper 32 game "Major League" to the list of games
that usually need iNES header correction...but in this case, the
iNES header cannot specify that this game needs to have one-screen
mirroring.
 
iNES header information is now printed before any header corrections
are made based on a database.
 
Fixed a bug in mapper 32 emulation. "Ai Sensei no Oshiete"
works now.
 
Tried to add support for iNES mappers 245 and 249.
 
Fixed the MMC5 read handler to return the data last on the data
bus instead of 0xFF when a read was made to an unmapped address.
This seems to fix the lockup problems in "Bandit Kings of Ancient
China".
 
Reversed "Modified the time at which the "y scroll" register is updated
during hblank." The changes broke Klax.
 
Added an unsigned 64-bit base timestamp variable "timestampbase".
Adding this to the 32-bit variable "timestamp" will return
the number of cycles executed since emulation started(in the future
I'll probably change it to since reset or power toggle).
This allowed me to replace "lastn" hack in the MMC1 code with
something better.
 
Changed my mind and undid the removal of support for old save states.
 
Removed support for old save states and in general I won't
try to support save states made with previous versions.
 
MMC1: Writes to $8000-$FFFF with D7 set will now cause
the first MMC1 register to be OR'ed with 0x0C. I'm not sure
if this is correct, but it doesn't seem to break anything
and it fixes Robocop 3. I'll see if anyone reports games
not working in .81 that worked in .80.
Worked on a generic driver interface wrapper very similar
to the driver interface FCE Ultra used to use(I'm getting
tired of all of the duplicated driver code). Eventually,
the DOS, SVGAlib, and SDL ports will use this wrapper.
 
Similar change to the argument parsing code.
 
Changed configuration file saving-loading routines and the
configuration structure to allow for linking config structures
to each other).
 
Small fix to the emulation of the MMC5 split screen mode.
 
Made Linux SDL code compilable again.
 
Changes to MMC5 EXRAM emulation(read/write).
 
Fixes to the emulation of the MMC5's split screen mode, based on
observations while using CastleVania 3 and a Game Genie(on a real
NES).
 
Fixed a bug in ines.c that caused any calls to AddExState() from
a mapper initialization function to be effectively "erased"(ResetExState()
was called after the mapper was initialized). Fixes the VRC7 sound
state saving/loading stuff.
 
Finished adding support for the MMC5's split screen mode(this does
not mean that the support is complete, but at least the intro in
"Uchuu Keibitai SDF" works correctly now).
 
Worked on adding support for the MMC5's split screen mode. Not
completed.
 
Reverted to .80's FDS sound code.
 
Modified the time at which the "y scroll" register is updated
during hblank.
 
NSF playing code will now disable FDS sound output on song init
(fixes some problems with the Zelda no Densetsu NSF rip).
 
Increased the emulated clock speed of the FDS sound emulation code
to give better quality output.
 
Modified NMI to occur a few cycles later. Fixes BattleToads...but
it may have broken other games. Also modified the way NMI's are
handled in x6502.c.
 
Modified ines.c to memset() GameMemBlock to 0 on virtual power toggle.
Also, trainers are now loaded into their own buffer instead of
directly into emulated WRAM and copied into emulated WRAM on
power toggle; I've been meaning to do this for quite some time.
 
Changes to the way the zapper cursor is drawn on the screen.
 
FCEUD_WriteSoundData(), FCEUD_BlitScreen(), and FCEUD_UpdateInput()
have been combined into one function: FCEUD_Update().
 
More fixes to the network play code, and a fix to the Windows network
play driver code that fixes(hopefully) a rather evil bug that caused
lockups when the remote stopped network play.
 
Added code to set the battery-backed bit in RAM if a game needs it,
based on CRC32.
 
Added more games to the list of games that commonly have bad iNES
headers, in ines.c
 
Updated docs and usage.h for DOS and Linux regarding the new video
mode and the new refresh rates.
 
Linux: Fixed a bug with video mode 6(a few upper scanlines were being
cut off). Increased the refresh rate of video mode 3 to 120hz.
 
Increased the refresh rate of video mode 2 to 65 hz in the Linux port.
 
Screen snapshots can now be taken while playing an NSF.
Added a new sexy tweaked vga mode that I created to the Linux svgalib
port. It's 256x224 at a refresh rate of 103hz. Hopefully it won't
blow up anyone's monitor. ;)
DOS port will follow eventually.
 
Modified Makefile.base to produce an executable named "fceu" instead
of "fce".
 
The plans(cycle-accurate ppu emulation) for .90 were a bit ambitious,
and I still need to make other fixes before then.
 
Fixed some minor(usually) bugs with setting 256x240 tweaked VGA mode
in DOS and Linux ports.
 
.80:
----
 
Cleaned/fixed a few things in the mapper 19 emulation code.
Family Circuit '91 still doesn't work quite right... I wonder if
it's a bad dump.
 
Added input override code to Windows port.
 
Added code to fix iNES header information in RAM and suggest
changes to the user.
 
Added support for iNES mapper 152(to be used with games set to
mapper 70, that use one-screen mirroring instead of h/v mirroring).
 
Blits using the DirectX blitting function(method?) to the primary
surface are now done with the asynchronous flag set(if that
fails, a "normal" blit is tried).
The DirectX blit buffer(secondary surface that FCE Ultra writes to
directly and then uses the DirectDraw blit function on to blit
to the primary buffer) is now created without specifying it
should be in system memory or video memory, except in the case
when no hardware blitting is available, and then DDraw is explicitly
told to create the surface in system memory.
 
Added Family Keyboard support to the DOS port.
 
Cleaned up the VRC7 sound emulation code. I need to find a way
to save the current sound state in a save state.
 
Found out the real name of the "Space Shadow" gun; it's
called the "Hyper Shot". I'm still not sure who made it, though.
Possibly Bandai did. The interesting thing is that Konami
also made a Famicom accessory(dual square boxy things with two buttons
on each) with the same name(though there might not be a space in the
name).
 
Only the upper two bits read from $4016/$4017 are undefined.
Bit5 is always 0, though. Fixed the bug in "input.c".
Silly kevtris' old documents. New kevtris' brain is always good.
 
Family Keyboard support for the Windows port.
 
Added support for the Family Basic Keyboard to the Linux port, other
ports todo.
Might want to add support for the tape recorder at some time.
Also mapped the "Scroll Lock" key to disable/enable command keys
so that the FBK is more useable. It doesn't disable CTRL C,
though...
 
Changed a lot of inlined functions in x6502.c to macros so that
I could test out some optimization ideas.
 
DOS code updates for game input override support.
 
Small optimzation to opcode $4c, and relative jumps.
 
Added some code to ines.c to set controller information in
FCEUGameInfo(returned by FCEUI_LoadGame()) based on crc32 values.
 
Updated user documentation and usage.h for DOS and SVGAlib input
command-line changes.
 
Added an option to disable the four-score(to Windows and Linux ports
so far).
 
Updated Windows interface to support the new Famicom expansion
devices.
 
(Re)Added support for the Famicom 4-player device.
 
Improved Zapper emulation...sort of. It still needs a lot of work. :/
 
Added *partial* support for the "Space Shadow" gun.
 
Added support for the Arkanoid controller(both NES and Famicom style).
 
Added code to support the extension Famicom input devices.
 
Added PAL scanline start/end drawing settings to Windows port.
 
Added pause emulation key(F2) to Windows port.
In the process of rewriting/fixing up input code stuff.
 
Minor bug fix to Power Pad emulation code.
 
VS Hogan's Alley and VS Duck Hunt automatically select the zapper
now(though it only works on the SVGAlib port).
 
Undid some FDS sound code changes introduced in 0.76 that totally
screwed up sound. Oops.
 
Added code to allow different settings for first/last scanline
drawn while in PAL emulation mode, to the Linux and DOS ports.
 
Added convenience(it's not necessary, but it reduces redundant and
confusing code in the driver code) function
FCEUI_GetCurrentVidSystem(int *slstart, int *slend).
 
Updated file "TODO".
 
Changed #include <unzip.h> to #include "zlib/unzip.h"
in file.c.
 
NSF 6502 player now initialized the stack pointer on reset.
 
Worked on de-emphasis emulation code quite a bit.
The deemphasized palette calculated at the end of the frame is now
based on what deemphasis bits were set for the longest during
the screen(sampling interval is a scanline) update loop.
Added a "static" deemphasized palette at $40-$7F in the palette table.
This corresponds to the colors when all of the deemphasis bits are set.
I did this to fix the PAL game "Noah's Ark", without breaking
anything else. The only downside is a slight speed loss(~2% on
my system when sound is disabled), but this is acceptable to me,
at least.
Maybe it's time to write hi/true-color ppu drawing code...
 
 
Fixed an out of bounds array access in svga.c in SetNESDeemph().
The variable "lastd" in svga.c was being initialized to the wrong value.
Thanks to "Jarod CANAL" for pointing this out.
 
Removed FCEUI_SetFirstRenderedLine or whatever it was called and
the function to set the last line. Replaced with:
void FCEUI_SetRenderedLines(int ntscf, int ntscl, int palf, int pall);
 
Changed SetVidSys(int w) to ResetVidSys() in fce.c. Reenabled
PAL/NTSC emulation overrides based on game loaded(really only useful
for NSFs and UNIFs now).
 
UNIF loading code now recognizes the chunk "CTRL" and tries
to use it. Only the svgalib code supports overriding of input
settings based on game loaded, now, though...
The user is still going to have to configure powerpad settings
on his/her own.
 
Fixed return values of FCEU_fseek() and fixed a problem in unif.c
related to it.
 
Changed mechanism for how FCE Ultra tells the driver
code what type of system is being emulated. A structure of
type "FCEUGI" is returned from FCEUI_LoadGame().
 
Fixed a major mapper 64 emulation bug introduced in 0.76.
 
Modified BlitVidHi() in drivers/win/video.c to speed it up.
 
Added support for loading the iNES-format Game Genie ROM image.
 
Removed ggrom.h and added code to load the Game Genie ROM
image from a file.
 
Added Windows netplay.c. (new: the user exiting the emulator
while stuck in a blocking recv() or send() loop now works.)
 
Fixed a vram address register bug in fce.c that I created when I got
rid of the pair/dpair data types.
 
Added new mappers/92.c
 
Removed mappers/92.c until I can contact LULU or rewrite it.
 
drivers/win changes. Removed netplay.c until I can rewrite it.
 
Got rid of pair/dpair data types.
 
Got rid of silly "TempArray" thing.
 
Began adding GPL headers to files. FCE Ultra is going to be in
a state of legal limbo for the next few days...
 
Replaced crc32.c and crc32.h, and added some #ifdef's and #defines
to use the crc32 code in zlib instead if zlib is linked with
FCE Ultra.
 
More fixes to sb.c.
 
Cleaned up drawing.h and ggrom.h(even though ggrom.h will *probably*
be removed before the next release).
 
Redid frameskip code.
 
Rewrote necessary pieces of sb.c and sb.h and fixed quite a few
bugs. I still need to test it on various other sound cards, though.
 
Rewrote(more like "recreated in my own image") DOS keyboard driver.
Removed unused "keyscan.h" from drivers/svgalib
 
Rewrote part of(the parts that Marat wrote - the connection and
closing parts) the Linux TCP/IP network play code. I guess it works,
but I haven't tested it very much. In any case, it's still dangerous
to use network play in FCE Ultra with SVGAlib, since recv() or send()
might block and since the keyboard is in raw mode, you have a problem.
Maybe a future SVGAlib will fix the general problem of lockups if
keyboard_update() isn't called, though it is only partly SVGAlib's
problem...
 
Fixed FCEU_fseek() when used with a compressed file in the PKZIP
format that has been loaded. Fixes a UNIF loading problem.
Also added a check to the return value of FCEU_fseek() in unif.c.
 
Replaced Marat's 6502 emulation core with my own.
It should be fully functional, but as always, I don't know if
I implemented the undocumented instructions correctly.
Several things are correct in this new core that were not in
Marat's(D flag is no longer cleared by interrupts, for example).
 
Altered mapper 16 irq counter emulation slightly.
 
Fixed the behavior of the SXA, SYA, and XAS opcodes based on the
documentation I have. I'm not sure what happens when page crossing
occurs with those instructions on a real NES, though.
Also CHANGED(not fixed) emulation of opcode $8B("XAA").
 
Changed some of the M* functions(absolute indexed and maybe some others)
to perform dummy reads.
 
Changed some of the macros in m6502.c to inlined functions so
that I can modify and examine them more easily.
 
.77:
----
 
Fixed a silly network play bug(in the global network play code)
that caused excessive lag.
 
Added a "niceness" setting to the sound configuration dialog.
Removed obsolete information from the dialog.
 
Fixed speed throttling code in Windows port when PAL emulation is
disabled/enabled and a new game hasn't been loaded yet.
 
Commented out a printf() to debug stuff in fds.c(oops).
 
Applied PK's joystick patch to the osdl code. It allows the user
to map axes and it fixes a joystick button mapping configuration saving
bug.
 
Added two command line options new to Linux port to DOS port.
Just need to test them...
 
Added some stuff to unif.c to allow for boards that can support
CHR RAM instead of CHR ROM(darn Sachen boards...). Fixes UNIF
version of "Q-Boy".
 
Added command line option "-snapname" to Linux port. I'll add it
to the Windows port as well, but probably not to the DOS port.
 
Added clip option to Linux port.
 
Fixed sound logging(in Windows port) so that multiple recording
sessions now work.
 
Added an option to clip the leftmost and rightmost 8 columns
of graphics in the Windows port.
 
Added a submenu that lists recently opened files, in the Windows
port.
.76:
----
 
Updated porting.txt.
 
Added speed throttling code to Windows port that's used when sound is
disabled(and an option in the "Miscellaneous"
configuration window to disable it).
 
Added cheat interface to DOS build.
 
A few tweaks to the text cheat interface code in the cheat listing code.
Added a command to quickly toggle the status of the cheat(though a
cheat can still be disabled/enabled by (M)odifying the cheat).
 
Support for UNIF UNL-TC-U01-1.5M board added. Same credits as below.
 
Rewrote mapper 228 code just for the heck of it(actually, I couldn't
figure out why some(about two) of the games in the Action 52 cart
weren't working in .75(and .76). I traced it back to .71, where an apparent bug in
the undocumented 6502 opcode emulation allowed it to work, which
was later fixed for the .72 release(opcode 0x7C)). I'm thinking
that the dump is bad...
 
Added a few crc32 checks to ines.c to check for and report when
a known(by me) bad(hacked or bad dump) game is loaded.
 
Added support for the following UNIF boards. Thanks to Quietust
and Kevin Horton for the information. Some problems still exist
with a few games that use these boards, though...
 
UNL-Sachen-8259B
UNL-Sachen-8259A
UNL-Sachen-74LS374N
UNL-SA-016-1M
UNL-SA-72007
UNL-SA-72008
UNL-SA-0036
UNL-SA-0037
 
Fixes to some stuff in cart.c(for example, calling setprg32() when
only 16kb of prg data is present now works).
 
Added support for iNES mapper 189.
 
Tried to add support for the UNIF board "UNL-H2288". Failed.
 
Updated "cheat.txt" to fix a few typos and added an example of finding
and adding a cheat using the Linux port's text interface. The actual
section on the Linux cheat interface still needs to be written, however.
 
Changed network play code in the Windows port and fixed a bug.
Fixed a similar bug in the Linux netplay code....sort of.
 
A few cosmetic changes to the dialogs in the Windows port.
 
Fixed sound initialization on the Windows port(it was being initialized
when FCE Ultra started even if it was disabled by the user. Oops.).
 
Joystick button configuration code in Windows port changed slightly
to be more useable.
 
Changed reference to video mode 5 in the linux port to "1 per 4".
It may not be very meaningful, but it is certainly better
than "TV Emulation". I'll change the Windows port reference later.
 
Documented video mode 7(320x240) for the Linux port. Also added
a check for the FBDev driver in order to use this mode instead
of a tweaked vga mode if that driver is being used.
 
Added/Fixed cheat interface for Linux port. It's still not perfect,
though. The code is ugly...
 
Callback function for FCEUI_ListCheats() now receives
status information(enabled/disabled).
 
Callback functions for cheat functions now must return 0 to
stop listing cheats or 1 to continue.
 
Fixed a problem(the cheat code was reading in cheats
for address $0000 from cheat files if any blank lines were present).
 
SDL port zlib changes(linked dynamically to zlib now).
 
More changes to envelope decay + looping on code. No longer
depends on value @ $4017. It now sounds correct based on some
tests I did with SMB3 and a GG, but Goonies 2 doesn't sound right(
based on a sound file sent to me by another person).
 
Added support for iNES mapper 140. Thanks to Quietust for the
information.
 
I need to figure out how to deal with the problem of so many
bad NSFs that most people consider good...
 
Changed envelope decays a bit. Their behavior now depends on bit
7 of $4017. I don't know if this is right...
 
Addition of debug.c for some debugging stuff.
 
Updated zlib to 1.1.4.
 
Modified code in various files to allow UNIF games to override
current selected video system emulation(NTSC or PAL). Need to
make sure this really works.
 
Changed sound.c to prevent desynchronization during network play.
This might slow down sound emulation slightly, especially when
sound emulation is disabled. I really don't care...
 
Updating network play code. More info later...
 
Moved the sound/video/etc output code in EmLoop() to the top of the
for(;;) loop so that initialization prior to calling EmLoop() will
be the same as initialization done during a call to a FCEUD_* function.
 
A few very small changes to sound emulation in fds.c.
 
Changed unlink() to remove() in cheat.c and removed the including
of the header file unistd.h.
 
Split up the cc=... statement in RefreshLine() to make it easier
to read and not ambiguous(to Borland's C compiler).
 
Changed a lot of the function declarations in cheat.c. I'll need
to verify that cheat searching still works ok and that cheats still work
ok. I'll also need to update the Windows(and Linux console) cheat code
to prevent compiler warnings.
 
Fixed various minor code problems(not minor if you want to use a
compiler besides gcc). This is an ongoing process...
 
Removed bit fields after reading about and thinking about possible
portability problems, though I kept some optimizations in fceline.h
 
Minor code simplification in drivers/win/joystick.c(replaced
"case 200 ... 207" and "case 208 ... 215".
 
Modified some code to use bit-fields in the graphics rendering code
in fce.c and fceline.h. gcc seems to be able to optimize the new
code to run faster.
 
Fixed m6502.c and fce.c to initialize variables on virtual power
toggle. This should fix network play on the Windows port.
I'm also in the process of cleaning up fce.c.
 
.75:
----
Fixed directories configuration stuff in Windows port(corresponds
to .75r2).
 
More changes to square wave channel envelope/volume emulation...
Changes described in the large paragraph some lines down have been
abandoned.
 
Added a command line switch to set the volume in the dos port.
 
Changed Windows sound configuration dialog. Now buffer length is
specified in time, not samples. I also added a volume control.
 
Reduced the volume on 8-bit sound output on all ports by 1/2.
 
Added a function FCEUI_SetSoundVolume(). Added support for setting
the volume via the command line in the Linux port, other ports coming
soon.
 
Changed FCEUD_WriteSoundData() again. No longer has a "Check"
argument. All clipping(ugh) is done internally now.
 
Added a directories configuration dialog to the Windows port. I worked
on it too long and I became a zombie, so it might have a few bugs.
That's what guine...err...users are for. ;) Don't expect me to do
anything like this for any other port, though. I don't feel like
doing it on the DOS port, and the Linux and other UNIXy ports shouldn't
really need it.
 
Made some changes to the rectangle/square wave channel emulation to
fix the pops in SMB. I have no idea if what I did is correct. To
be honest, I'm not sure I know EXACTLY what I did, but it's something
like this: Writes to $4003/$4007 now reset the duty cycle count
and reload the cycle counter with the current wavelength. Writes to
$4003/$4007 now do not update the amplitude output of the channels; they
will be updated after the cycle counter hits 0(or below).
 
More information in iNES informational output.
Minor changes to mappers/16.c.
 
Increased the volume of the VRC6's sawtooth wave channel.
 
Added more information to the RAM cheat guide.
 
Changed the triangle wave generation code slightly. I decided
to remove support for the higher-frequency triangle waves, as they
are too cpu-costly to create and are probably not very audible on a
real NES anyway.
 
Major changes to how sound is mixed. This necessitated a high pass
DC-offset removing filter, and a low-pass filter just to make things
sound better. ^_^
Note: FCEUD_WriteSoundData() no longer needs to clear the waveform
data referenced by the passed pointer; it's done internally now.
 
Fixed JMP ($xxxx) - now handles wrapping like it occurs on a real 6502
(hopefully; I'm assuming that the same holds true for the NES' cpu).
 
Added the ability to load a custom global palette in the DOS port.
 
Fixed bug in drivers/common/unixdsp.c(wrong return value if sample
rate was out of range).
 
Many sound fixes... - Frequency sweeps, length counter stuff,...
 
Changed Windows port to use IDirectInput7 and IDirectInputDevice7
interfaces.
 
Fixed a Game Genie bug in the core emulation code. It only appeared
in the Windows port, though. (Enabling gg emulation, loading a game,
and then disabling gg emulation and loading a new game while in the
gg code entry screen would cause the new loaded game to not work
correctly).
 
Modified windows port to use the config saving/loading stuff in
drivers/common/config.c
 
Mapper 45 cleanups/fixes.
 
Added the ability to load a custom global palette in the Linux port.
Yay.
 
Fixed a large number of overcomplicated code and silly bugs in
drivers/common/config.c. This changes the format of the configuration
structure, too. Also added support for saving/loading strings with
automatic memory allocation when strings are loaded.
 
Minor change in InitNetplay().
 
Fixed bad type conversions for pointers to functions and fixed
some bad declarations of functions.
 
Reenabled zlib support for the sdl build. I need to pay attention
to patches that modify lines than don't fit on my screen.
 
Fixed vidblit.c to not emit so many warnings when compiling.
 
.74:
----
 
Stop sound in Windows port when user clicks l/m/r mouse buttons
in the non-client area of the window.
 
Added "Drag and drop" file open support to Windows port.
 
Various code cleanups.
 
mappers/33.c optimization.
 
Rewrote the function "FCEU_MakeFName()".
 
Removed crc32.h from mappers directory.
 
Modified some of the window resizing code in the Windows port.
 
Added support for waiting for vblank/double buffering to the Windows
port.
 
Added/Fixed support for iNES mapper 248.
 
After an NSF file is loaded, information about its header is now
displayed.
 
Fixed a typo in the Namco 106 extra ram handling code.
 
Improved the quality of the Namco 106's extra sound channels.
- Thank Mamiya and Applepie(real name?) for info.
 
When an NSF file is being played, FCE Ultra will no longer go through
its scanline rendering loop. This speeds up NSF playback considerably.
 
Updated "porting.txt".
 
Moved some stuff from DriverInterface() to their own functions.
 
Fixed some iNES mapper 18 IRQ counter emulation bugs. "Ninja Jajamaru -
Ginga Dai Sakusen" now works.
 
Rewrote large pieces of the mapper 64 code. "Skull and Crossbones"
still doesn't work, though.
 
Changed format of iNES header information output, added "ROM CRC32" info.
 
Modified the way cycle timing is done slightly. No change
for NTSC emulation, but PAL emulation is a little more accurate.
 
Changed the behavior of indirect indexed(I hope I got that right ;))
instructions to behave more like a real 6502(junk reads are now
performed).
 
A few optimizations/cleanups in m6502.c.
 
0.73
----
 
* Fixed several bugs with sprite emulation. Several games(such
as "Trojan" and "VS Duck Hunt") that were broken in .71 and .72 now
work ok.
* Added support for iNES mapper 82. Thanks to those who work on
"unofficial nester".
* Added support for iNES mapper 250(used by "Time Diver Avenger").
* Fixed the documentation to show that iNES mappers 48, 83, and 232
are supported.
* Removed various pieces of stale code and fixed a few minor bugs.
* Fixed a triangle wave channel bug(the channel was sometimes enabled
when it shouldn't have been).
* Writing to $4010 with the upper bit clear now acknowledges the DPCM
IRQ. This appears to fix "Stunt Buggies".
* Rewrote pieces of the Zapper emulation code to be cleaner and more
accurate.
* Rewrote the VS Unisystem dip switch drawing code.
* Simplified the setting of VS Unisystem dip switches. The "V" key
now toggles viewing AND editing of dip switches.
 
0.72
----
 
* Various minor bug fixes.
* Various code cleanups and size and speed optimizations.
* Removed some (apparently) unused MMC5 sound emulation code.
* Changed the behavior of $2003 and $4014 to better simulate what occurs
in a real NES.
* Fixed a few bugs in the undocumented 6502 opcode emulation code.
The Game Genie code "NUTANT" for SMB 3 works correctly now, at
least(previously it caused the game to lock up at the end of levels).
* Rewrote large pieces of the 6502 memory fetching code, resulting
in a slight slowdown in the speed of emulation. Benefits include:
Game Genie emulation now works(again) and 6502 emulation is more
accurate.
* Added support for iNES mapper 72. Thanks to rinao for the information.
* Fixed support for iNES mapper 77(used by Napoleon Senki).
* Fixed/Added support for iNES mapper 226. Apparently I made a mistake
in the documentation. Thanks to Mark K. for the information.
* Added support for iNES mapper 227. Thanks to Mark K. for the
information.
* Added support for iNES mapper 234(used by the Maxi-15). Thanks
to Mark K. for the information. Note that many of the Maxi-15
ROM images on the Internet have corrupt CHR data(graphics), or the
mapper number is set incorrectly(usually to 11). Use a utility to
fix the mapper number.
* Added support for the following UNIF boards(prefixes omitted):
- EKROM (and fixed the reference to "Gemfire" in the documentation).
- HKROM
* Added the ability to enable and disable individual RAM cheats.
* Fixed some problems with the cheat search code(the NES' internal
RAM was being searched differently than any external RAM, which
was being search incorrectly).
 
0.71
----
 
* Fixed a 6502 emulation bug that was causing some Koei games
(ex: Nobunaga's Ambition, Genghis Khan) to not work.
* Extensive PPU/CPU timing adjustments.
* Fixed support for iNES mapper 40.
* Added support for the following UNIF boards(prefixes omitted):
- ETROM
- ELROM
- EWROM
* Fixed a few bugs in the UNIF code.
* Added support for loading and saving cheat files and an interface
to search for/add/delete/list cheats(no interface yet on Linux/DOS).
* Fixed a few minor bugs in the Windows DX code.
* Command line options to control the number of sound fragments
and the fragment size have been added(Linux).
 
0.70
----
 
* Adjusted PPU/CPU timing.
* Removed(until I understand the problem) a hack to get one of the
games in the Caltron 6-in-1 to work.
* Fixed an MMC3 IRQ emulation bug("Project Q" works better now).
* Fixed a problem/misunderstanding regarding the upper scanline.
It can now be displayed again.
* More accurate sprite hit emulation(fixes the title screen of
"Ultimate Stuntman").
* VRAM bank switching for iNES mapper 4 is now possible(and enabled
for all mapper 4 games without CHR ROM). Fixes "Tenchi o Kurau 2".
* Added support for the Famicom's four-player adapter and the ability
to enable it(it is disabled by default to prevent compatibility
problems).
* Added an option(under miscellaneous configuration) to automatically
open the "File Open" dialog box when FCE Ultra is started.
* Sound sampling rate is now configurable.
* Fixed some bugs in the DirectSound code.
* Joystick button configuration is a little more user friendly(and
stable, hopefully) (Linux).
 
0.62
----
 
* Added support for the Famicom Disk System's extra sound channel.
* Updated the version of Tatsuyuki Satoh's OPL2 emulator used in
FCE Ultra from .36f to .37a. The sound quality in "Lagrange Point"
seems to have improved.
* Added support for iNES mapper 242(used by "Wai Xing Zhan Shi").
* Fixed a network play bug that could cause desynchronizations
if more than one network play session occured since FCE Ultra
was started. This bug only showed up on the Windows port, though.
* Increased the volume of the noise and triangle sound channels.
* Fixed a save state loading bug.
* Fixed a small memory leak that was being caused by the VRC7
state loading code.
* Fixed a bug that could cause FCE Ultra to crash if a virtual disk
was being read and the user ejected the virtual disk.
* Various minor bug fixes/code cleanups.
* NTSC color "emulation" can now be enabled again(the code to
enable it was broken in the last version). (Linux)
 
0.61
----
 
* Speed optimizations in sprite rendering code.
* Screen snapshots are now saved in the PNG format instead of the PCX
format.
* Fixed Game Genie emulation(it wasn't working in the last release).
Also added support for Game Genie emulation to the UNIF code.
* Rewrote command line option parsing code.
* Fixed a problem(if FCE Ultra was configured to connect to a remote
host and the remote host was given as an IP address, and the IP
address couldn't be reverse resolved, which is commonly the case
on home LANs, the connection attempt would fail) in the network
play code. I had misinterpreted the Winsock API documentation
when I wrote the code. (Windows)
 
0.60
----
 
* Various speed optimizations.
* Sound is no longer messed up when a JAM/KIL opcode is emulated.
* Fixed an overflow bug that occured when $4014 was written to
during certain(rare) conditions.
* Fixed a few save state bugs.
* Fixed a MMC1 CHR bank switching bug.
* Added emulation of the MMC5's WRAM write-enable/disable registers.
* Fixed a sound frame IRQ emulation bug. "Qix" works now.
* Added UNIF support. Some of the board emulation is still a bit
buggy, though. Look at the documentation for a list of supported
boards.
* Updated the "Palette Notes" section of the documentation. Also
fixed a few other problems with the documentation.
* Added support for loading files in the PKZIP and gzip
compressed file formats via zlib.
* Added the ability to configure the first scanline and the last
scanline to draw to the screen. Enabling PAL emulation no longer
will cause all 239 scanlines to be displayed, though an option
to override these settings for when PAL emulation is enabled may
be in the next version.
* Fixed a bug that would cause the emulated D-pad of virtual gamepads
emulated through the keyboard to be duplicated through "higher"
virtual gamepads(gamepad 1 would affect 2,3,4; gamepad 2 would
affect 3,4; etc.). (Windows)
 
0.55
----
* Rewrote window resizing code. The window will now resize itself
to a multiple of the NES' screen dimensions nearest to the user
selected dimensions. (Windows)
* Added an option to use buttons instead of axes on physical joysticks
for the emulated D-Pad. This is useful for some digital joysticks. (Windows)
* Fixed a bug that would cause FCE Ultra to crash if sound were
disabled during emulation. (Windows)
* Added the ability to "fast forward" emulation.
* Added an option to allow more than 8 sprites per scanline to be
displayed.
* Added an option to save all extra non-volatile game data
(such as battery-backed RAM) in a directory under FCE Ultra's
base directory(as opposed to the directory the game is located in).
* Added an option to allow the emulator to change to a full screen
video mode once a new game is loaded. (Windows)
* Rewrote pieces of DirectInput joystick handling code. Hopefully
it should increase compatibility. (Windows)
* Added the ability to automatically obtain button numbers when
configuring joysticks, by pressing buttons on the joystick.
* Added the ability to close the current game(decreases CPU usage). (windows)
* Increased the speed of various function calls by passing
arguments to functions through registers instead of through the
stack.
* Added emulation of the MMC5's raw PCM register.
* Added the ability to save/load save states while network play
is occuring.
* Having PAL emulation enabled will no longer override the
NTSC/PAL settings in NSF headers.
* Fixed a bug that got into the .54 release. Extraneous data was
being returned on reads from $2002, which caused problems
with some games(such as "Choujin Sentai Jetman").
 
0.54
----
* Fixed a bug that would cause a wrong battery-backed WRAM file
name to be produced if FCE Ultra was passed a file name without
any directory component(such as "fceu SuperBlah.nes").
* Fixed an iNES mapper 118 emulation bug that got into the code
in a recent code cleanup. "Armadillo" is playable again.
* Fixed a typo(and bug) in the MMC5 emulation code.
* Data returned from emulated reads to "unmapped" areas or
memory locations where bits are undefined should now be correct.
* Fixed emulation of the sprite memory transfer register $4014.
It now takes into account the last value written to $2003 and
starts the transfer to that location in sprite memory(like on
a real NES).
* Added a video configuration dialog box. (Windows)
* Added the ability to configure a custom video mode. Aspects
that are configurable include width, height, bits per pixel,
and size transforming(stretching and scaling). (Windows)
 
0.53
----
 
* Fixed a bug with joysticks that occured on systems with multiple
joysticks. (Windows)
* Added support for iNES mappers 77 and 92(thanks to LULU for the code for both).
* Added partial(timer is non-configurable) support for iNES mapper 105.
* Changed save state format again. Save states made with previous
versions should still be compatible, though this may change in
future versions.
* Small optimization to sprite emulation code.
* Rewrote color-deemphasis code to use integer math instead of
floating-point math.
* Rewrote and restructured input code. (Linux)
* Added command line option "-f8bit" to force 8-bit sound. (Linux)
* Rewrote and restructured input code. Among other new features,
keyboard keys are now somewhat configurable. (Windows)
* Writes to $4003/$4007 will now reset the emulated square wave
duty cycle generator.
* Added emulation of the Power Pad.
* Rewrote joystick device reading code to use the event-driven
interface. This should fix various problems regarding support
for joysticks with many buttons. (linux)
 
0.52
----
 
* Fixed a PCM emulation bug(digitized voices in "Ikari Warriors 2"
and "The Immortal", among others, work now).
* Fixed noise channel's LSFR update frequencies(hopefully).
* Various minor bug fixes.
 
0.51
----
 
* Added support for iNES mappers 86 and 89.
* Reduced byte size of the NSF player's background.
* Adjusted CPU/PPU timing.
* Fixed sound channel frequency calculations for when PAL emulation is enabled.
* Rewrote large pieces of the sound code and got rid of the sound queue. Sound quality should be slightly better now.
* Various minor bug fixes.
 
Windows:
 
* Fixed an FDS side reset bug when a new game is loaded.
* Screen width/depth/height changes while FCE Ultra is in windowed mode are handled now.
* Changed the configuration file format.
* Added a palette configuration dialog.
* Added the ability to load a custom NES palette.
* Added an option to double 16-bit sound volume.
* Added an option to force 8-bit sound.
* Added an option to use a secondary sound buffer(versus the primary).
* Added an option to wait for vertical blank if sound is disabled.
* Added an option to run while focus is lost.
 
0.50
----
* Many bug fixes.
* Sound code partially rewritten to improve quality(near-perfect
raw PCM now) and eliminate the need for a separate thread.
This created a small problem with network play, though, so read
the network play notes section. Also, synchronizing to
vertical blank has been removed.
* Rewrote other pieces of sound code. No more "buzzing" in MegaMan 2,
Codemasters games' intros, etc.
* Added support for the NES Zapper and the VS Unisystem's light
gun. Be sure to read "Light Gun Notes".
* Changed save state format. Save states should now be much
smaller for most games. Most(not all) save states created with
an older version should work.
* Added support for VS Duck Hunt and VS Hogan's Alley.
 
/programs/emulator/fceu/FCEU ReadMe.txt
0,0 → 1,152
 
*******************************RUSSIAN****************************************
 
==Î ïðîãðàììå FCEU==
FCE Ultra - îäèí èç ëó÷øèõ ýìóëÿòîðîâ NES íà Linux, DOS, Windows,
BeOS, Mac OS X, à òåïåðü è íà Kolibri è Menuet!
 
Ñàéò: http://fceultra.sourceforge.net
 
Ïîääåðæèâàåìûå ìàïïåðû: 0-11, 13, 15-19, 21-26, 32-34, 40-49, 51, 52, 57, 61, 64-80,
82, 83, 85-90, 92-97, 99, 105, 107, 112-119, 140, 144,
151-156, 180, 182, 184, 189, 225-229, 232, 234, 235, 240,
242, 246, 248-250
 
Ïîñëå çàïóñêà ïðîãðàììû íóæíî ïðîïèñàòü ïîëíûé ïóòü ê íóæíîìó ôàéëó NES
è íàæàòü Enter (ïóòü îòîáðàæàåòñÿ â âåðõíåé ÷àñòè îêíà).
 
Âåðñèÿ ýìóëÿòîðà: 0.96
Âåðñèÿ ïîðòà: 0.3
 
==Ïîðòåð==
Asper
Ïèñàòü ñþäà: asper.85@mail.ru
 
Îñíîâíûå êëàâèøè:
 
Äëÿ ýìóëèðóåìîãî óñòðîéñòâà Family BASIC Keyboard:
Âêëþ÷èòü/Âûêëþ÷èòü Ââîä Êëàâèàòóðû Scroll Lock
(âêëþ÷åíèå ââîäà ñ ýìóëèðóåìîé êëàâèàòóðû îòêëþ÷àåò
êîììàíäíûå êëàâèøè)
Âñå ýìóëèðóåìûå êëàâèøè îòîáðàæàþòñÿ íà áëèæàéøóþ äîñòóïíóþ êëàâèøó
íà êëàâèàòóðå ÏÊ çà íåáîëüøèìè èñêëþ÷åíèÿìè. Ýìóëèðóåìàÿ êëàâèøà "@"
îòîáðàæàåòñÿ íà êëàâèøó "`"(grave), è ýìóëèðóåìàÿ êëàâèøà "kana"
îòîáðàæàåòñÿ íà êëàâèøó "Insert" (â áëîêå êëàâèø ðàçìåðà 3x2 íàä
êóðñîðíûìè êëàâèøàìè).
 
Äëÿ ýìóëèðóåìûõ óñòðîéñòâ game pads:
A Turbo B
S Turbo A
Left Control or Z or Space B
Left Alt or X A
Enter/Return Ñòàðò
Tab or BackSpace Ñåëåêò
Cursor Down Âíèç
Cursor Up Ââåðõ
Cursor Left Âëåâî
Cursor Right Âïðàâî
 
Äëÿ ýìóëèðóåìûõ óñòðîéñòâ power pads(êëàâèøè ñîîòâåòñòâóþò ðàñïîëîæåíèþ
êíîïîê íà ñòîðîíå "B"):
O P [ ]
K L ; '
M , . /
 
Äëÿ FDS èãð:
F6 Âûáðàòü äèñê/ñòîðîíó äèñêà.
F8 Èçâëå÷ü/Âñòàâèòü äèñê.
Äëÿ VS Unisystem èãð:
F8 Âñòàâèòü ìîíåòó.
F6 Îòîáðàçèòü/Ñêðûòü dip ïåðåêëþ÷àòåëè.
1-8 Ïåðåêëþ÷èòü dip ïåðåêëþ÷àòåëè (êîãäà dip
ïåðåêëþ÷àòåëè îòîáàæàþòñÿ).
 
0-9 Âûáðàòü ñëîò ñîõðàíåíèÿ.
Caps Lock Âûáðàòü âèðòóàëüíûé äæîéñòèê.
 
F2 Ìàññøòàáèðîâàòü îêíî.
F3 Îòêðûòü ôàéë.
F5/F7 Ñîõðàíèòü/Çàãðóçèòü ñîõðàíåíèå.
F9 Ñîõðàíèòü ñíèìîê ýêðàíà.
F10 Ïåðåçàãðóçêà.
F11 Âûêëþ÷èòü/Âêëþ÷èòü.
ESC/F12 Âûõîä.
 
 
*******************************ENGLISH****************************************
 
 
==About program FCEU==
FCE Ultra - is is one of the best emulators of NES on Linux, DOS, Windows,
BeOS, Mac OS X, and now on Kolibri and Menuet!
 
Website: http://fceultra.sourceforge.net
 
Supported mappers: 0-11, 13, 15-19, 21-26, 32-34, 40-49, 51, 52, 57, 61, 64-80,
82, 83, 85-90, 92-97, 99, 105, 107, 112-119, 140, 144,
151-156, 180, 182, 184, 189, 225-229, 232, 234, 235, 240,
242, 246, 248-250
After program executing you have to input full path to the NES file that you want
to be executed and press Enter (the path echo on the upper part of the window).
 
Emulator version number: 0.96
Port version 0.3
 
==Porter==
Asper
mailto: asper.85@mail.ru
 
 
Main keys:
 
For emulated Family BASIC Keyboard:
Enable/Disable Keyboard Input Scroll Lock
(enabling emulated keyboard input will disable
commands keys)
All emulated keys are mapped to the closest open key on the PC
keyboard, with a few exceptions. The emulated "@" key is
mapped to the "`"(grave) key, and the emulated "kana" key
is mapped to the "Insert" key(in the 3x2 key block above the
cursor keys).
 
For emulated game pads:
A Turbo B
S Turbo A
Left Control or Z or Space B
Left Alt or X A
Enter/Return Start
Tab or BackSpace Select
Cursor Down Down
Cursor Up Up
Cursor Left Left
Cursor Right Right
 
For emulated power pads(keys correspond to button locations on
side "B"):
O P [ ]
K L ; '
M , . /
 
For FDS games:
F6 Select disk/disk side.
F8 Eject/Insert disk.
For VS Unisystem games:
F8 Insert coin.
F6 Show/Hide dip switches.
1-8 Toggle dip switches(when dip switches
are shown).
 
0-9 Select save state.
Caps Lock Select virtual joystick.
 
F2 Scale window.
F3 Open file.
F5/F7 Save/Load state.
F9 Save screen snapshot.
F10 Reset.
F11 Power off/on.
ESC/F12 Exit.
 
/programs/emulator/fceu/History.txt
0,0 → 1,33
01.09.08 == Port v0.1 == Emulator v0.42
- çàãðóçêà NES ôàéëîâ | - load NES files
- èñïîëíåíèå NES ôàéëîâ | - execute NES files
- ìàññøòàáèðîâàíèå ðàçìåðà îêíà | - scale window size
- ðàáîòàåò â ÎÑ Kolibri è Menuet | - work in OS Kolibri and Menuet
 
 
24.10.08 == Port v0.2 == Emulator v0.42
- ðàáîòà ñ ñèñ. ôóíêöèåé 70 | - working with sys. function 70
- ñîçäàíèå ñîõðàíåíèé | - make saves
- çàãðóçêà ñîõðàíåíèé | - load saves
- ñîçäàíèå ñêðèíøîòîâ | - make screenshots
- äîáàâëåíû êëàâèøè Òóðáî A è Òóðáî B | - Turbo A and Turbo B keys were added
- ðàáîòàåò òîëüêî â ÎÑ Kolibri èç-çà | - work in OS Kolibri only because of
èñïîëüçîâàíèÿ ñèñ. ôóíêöèè 70 | using sys. function 70
09.07.09 == Port v0.3 == Emulator v0.96
- äîáàâëåíî 33 íîâûõ ìàïïåðà | - 33 new mappers were add
( 48, 51, 52, 57, 61, 72, 74, 77, 82, 83, 88, 92, 96, 114, 115-117, 140,
144, 152-156, 189, 227, 232, 234, 235, 242, 248-250 )
 
- äîáàâëåíû íîâûå ýìóëèðóåìûå | - new emulated devices were add
óñòðîéñòâà |
( power pads, game pads, zapper, arkanoid, shadow, Family BASIC Keyboard )
 
- âûáîð âèðòóàëüíîãî äæîéñòèêà | - select virtual joysticks
- óñêîðåííûé âûâîä ãðàôèêè | - faster graphics output
- âûâîä fps | - fps output
- ñîîáùåíèÿ òåïåðü âûâîäÿòñÿ íà äîñêó | - messages now output to the debug board
îòëàäêè |
- ñì. ôàéë "ChangeLog.txt" ÷òîáû | - see file "ChangeLog.txt" for full list of changes
ïðîñìîòðåòü âåñü ñïèñîê èçìåíåíèé |
 
/programs/emulator/fceu/fce
Cannot display: file marked as a binary type.
svn:mime-type = application/octet-stream
Property changes:
Added: svn:mime-type
+application/octet-stream
\ No newline at end of property
/programs/emulator/fceu
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property
/programs/emulator/.
Property changes:
Added: tsvn:logminsize
+5
\ No newline at end of property