]> Shamusworld >> Repos - virtualjaguar/commitdiff
Adding 1.0.1/2 uncompressed tarballs to tags for historical purposes. 1.0.1
authorShamus Hammons <jlhamm@acm.org>
Tue, 29 May 2007 18:37:13 +0000 (18:37 +0000)
committerShamus Hammons <jlhamm@acm.org>
Tue, 29 May 2007 18:37:13 +0000 (18:37 +0000)
98 files changed:
INSTALL [new file with mode: 0644]
Makefile.unix [new file with mode: 0644]
Makefile.win32 [new file with mode: 0644]
bios/readme.txt [new file with mode: 0644]
docs/README [new file with mode: 0644]
docs/WHATSNEW [new file with mode: 0644]
docs/gpl.txt [new file with mode: 0644]
eeproms/00000000.eep [new file with mode: 0644]
fix-unix.sh [new file with mode: 0644]
src/Jagem.cpp [new file with mode: 0644]
src/anajoy.cpp [new file with mode: 0644]
src/blitter.cpp [new file with mode: 0644]
src/cdbios.cpp [new file with mode: 0644]
src/cdi.cpp [new file with mode: 0644]
src/cdrom.cpp [new file with mode: 0644]
src/clock.cpp [new file with mode: 0644]
src/crc32.cpp [new file with mode: 0644]
src/dsound_dummy.cpp [new file with mode: 0644]
src/dsp.cpp [new file with mode: 0644]
src/eeprom.cpp [new file with mode: 0644]
src/gpu.cpp [new file with mode: 0644]
src/include/SDLptc.h [new file with mode: 0644]
src/include/anajoy.h [new file with mode: 0644]
src/include/blit_c.h [new file with mode: 0644]
src/include/blit_i.h [new file with mode: 0644]
src/include/blitter.h [new file with mode: 0644]
src/include/blittertest.h [new file with mode: 0644]
src/include/cdbios.h [new file with mode: 0644]
src/include/cdi.h [new file with mode: 0644]
src/include/cdrom.h [new file with mode: 0644]
src/include/clock.h [new file with mode: 0644]
src/include/crc32.h [new file with mode: 0644]
src/include/cry2rgb.h [new file with mode: 0644]
src/include/dsnd.h [new file with mode: 0644]
src/include/dsp.h [new file with mode: 0644]
src/include/eeprom.h [new file with mode: 0644]
src/include/fbmpop1.h [new file with mode: 0644]
src/include/fbmpop16.h [new file with mode: 0644]
src/include/fbmpop16p.h [new file with mode: 0644]
src/include/fbmpop1p.h [new file with mode: 0644]
src/include/fbmpop2.h [new file with mode: 0644]
src/include/fbmpop24.h [new file with mode: 0644]
src/include/fbmpop24p.h [new file with mode: 0644]
src/include/fbmpop2p.h [new file with mode: 0644]
src/include/fbmpop4.h [new file with mode: 0644]
src/include/fbmpop4p.h [new file with mode: 0644]
src/include/fbmpop8.h [new file with mode: 0644]
src/include/fbmpop8p.h [new file with mode: 0644]
src/include/gpu.h [new file with mode: 0644]
src/include/gpuopcodes.h [new file with mode: 0644]
src/include/harddisk.h [new file with mode: 0644]
src/include/ide.h [new file with mode: 0644]
src/include/idectrl.h [new file with mode: 0644]
src/include/jagdasm.h [new file with mode: 0644]
src/include/jaguar.h [new file with mode: 0644]
src/include/jerry.h [new file with mode: 0644]
src/include/joystick.h [new file with mode: 0644]
src/include/log.h [new file with mode: 0644]
src/include/m68kdasmAG.h [new file with mode: 0644]
src/include/mamegpu.h [new file with mode: 0644]
src/include/memory.h [new file with mode: 0644]
src/include/objectp.h [new file with mode: 0644]
src/include/pcm.h [new file with mode: 0644]
src/include/tom.h [new file with mode: 0644]
src/include/types.h [new file with mode: 0644]
src/include/version.h [new file with mode: 0644]
src/include/wavetable.h [new file with mode: 0644]
src/include/zbmpop1.h [new file with mode: 0644]
src/include/zbmpop16.h [new file with mode: 0644]
src/include/zbmpop16p.h [new file with mode: 0644]
src/include/zbmpop1p.h [new file with mode: 0644]
src/include/zbmpop2.h [new file with mode: 0644]
src/include/zbmpop24.h [new file with mode: 0644]
src/include/zbmpop24p.h [new file with mode: 0644]
src/include/zbmpop2p.h [new file with mode: 0644]
src/include/zbmpop4.h [new file with mode: 0644]
src/include/zbmpop4p.h [new file with mode: 0644]
src/include/zbmpop8.h [new file with mode: 0644]
src/include/zbmpop8p.h [new file with mode: 0644]
src/jagdasm.cpp [new file with mode: 0644]
src/jaguar.cpp [new file with mode: 0644]
src/jerry.cpp [new file with mode: 0644]
src/joystick.cpp [new file with mode: 0644]
src/log.cpp [new file with mode: 0644]
src/m68k.h [new file with mode: 0644]
src/m68k_in.c [new file with mode: 0644]
src/m68kconf.h [new file with mode: 0644]
src/m68kcpu.c [new file with mode: 0644]
src/m68kcpu.h [new file with mode: 0644]
src/m68kdasm.c [new file with mode: 0644]
src/m68kdasmAG.cpp [new file with mode: 0644]
src/m68kmake.c [new file with mode: 0644]
src/memory.cpp [new file with mode: 0644]
src/objectp.cpp [new file with mode: 0644]
src/pcm.cpp [new file with mode: 0644]
src/tom.cpp [new file with mode: 0644]
src/version.cpp [new file with mode: 0644]
tools/fix-unix.sh [new file with mode: 0644]

diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..340239a
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,52 @@
+Virtual Jaguar v1.0.0 GCC/SDL release INSTALL
+---------------------------------------------
+
+- Requirements :
+
+To compile Virtual Jaguar you need to check if you have the minimum
+requirements for compiling the sources :
+
+- GCC v2.95 of v3.x;
+- SDL v1.2.5 or higher;
+- nasm v0.98.x or higher;
+- supported OS (BeOS, Linux, FreeBSD and WIN32 through mingw);
+  other OS' may work to but you may need to change some items
+  in the Makefile(s).
+
+Optionally you need a Atari Jaguar (CD) boot ROM which is available
+on the Internet. We can't include the boot ROM since it's still
+copyrighted.
+
+Also, I would recommend that you have at least 20MB of free space.
+The .o's can be quite big and the binary is likely to be about a
+1.5MB in size (with UPX or strip this could downsize to about 800K).
+
+- Compiling  :
+
+If you sure you have the minimum software requirements, you can safely
+compile Virtual Jaguar v1.0.0 GCC/SDL release by doing the following :
+
+1) On UN*X systems first do the command : sh ./fix-unix.sh
+2) Go to the src/star026c directory and start on of the scripts :
+
+   ./build_s68000.win32 (for WIN32 systems with mingw)
+   ./build_s68000.unix  (for UN*X  systems with gcc)
+
+3) After the generation of the 68000.o file, you can now compile the
+   program with the following commands :
+
+   make -f Makefile.win32 (for WIN32 systems with mingw)
+   make -f Makefile.unix  (for UN*X  systems with gcc)
+
+4) Optionally you can manually strip jag_em[.exe] to downsize the binary.
+
+That's it! You're done! You can now start the emulator with ./jag_em[.exe].
+See the output for more details or consult the docs/README for more info.
+
+For more info, go to http://sdlemu.ngemu.com or send use an e-mail to the
+following e-mail address : sdlemu AT ngemu DOT com.
+
+SDLEMU
+
+
diff --git a/Makefile.unix b/Makefile.unix
new file mode 100644 (file)
index 0000000..6f05602
--- /dev/null
@@ -0,0 +1,58 @@
+CC = gcc
+LD = gcc 
+NASM = nasm
+
+CFLAGS  = -Wall -O3 -D__PORT__ -D__GCCUNIX__ -DSPEED_CONTROL -Dstricmp="strcasecmp" -fomit-frame-pointer `sdl-config --cflags`
+
+LDFLAGS = $(CFLAGS)
+
+TARGET = jag_em
+
+OBJ = \
+       src/version.o \
+       src/tom.o \
+       src/pcm.o \
+       src/objectp.o \
+       src/memory.o \
+       src/m68kdasm.o \
+       src/log.o \
+       src/joystick.o \
+       src/jerry.o \
+       src/jaguar.o \
+       src/jagdasm.o \
+       src/Jagem.o \
+       src/gpu.o \
+       src/eeprom.o \
+       src/dsp.o \
+       src/dsound_dummy.o \
+       src/crc32.o \
+       src/clock.o \
+       src/cdrom.o \
+       src/cdi.o \
+       src/cdbios.o \
+       src/blitter.o \
+       src/anajoy.o \
+       src/star026c/s68000.o
+
+LIBS = `sdl-config --libs` -lstdc++
+
+all: $(TARGET)
+
+INCS = -I. `sdl-config --cflags`
+
+THECC = $(CC) $(CFLAGS) $(INCS)
+
+%.o: %.asm
+       $(NASM) -f elf -o $@ $<
+
+%.o: %.c
+       $(THECC) -c $< -o $@
+
+%.o: %.cpp
+       $(THECC) -c $< -o $@
+
+jag_em: $(OBJ) 
+       $(LD) $(LDFLAGS) -o $@ $(OBJ) $(LIBS)
+        
+clean:
+       rm -f jag_em *.o src/*.o src/star026c/*.o
diff --git a/Makefile.win32 b/Makefile.win32
new file mode 100644 (file)
index 0000000..65a4bdc
--- /dev/null
@@ -0,0 +1,91 @@
+CC = gcc\r
+LD = gcc \r
+NASM = nasm\r
+\r
+CFLAGS  = -Wall -O3 -D__PORT__ -D__GCCWIN32__ -Dstricmp="strcasecmp" \\r
+                       -fomit-frame-pointer `sdl-config --cflags`\r
+#                      -fomit-frame-pointer `sdl-config --cflags` -DCPU_DEBUG\r
+#                      -fomit-frame-pointer `sdl-config --cflags` -DTOM_DEBUG\r
+\r
+LDFLAGS = $(CFLAGS)\r
+\r
+TARGET = jag_em\r
+\r
+OBJS = \\r
+       obj/version.o \\r
+       obj/pcm.o \\r
+       obj/objectp.o \\r
+       obj/memory.o \\r
+       obj/m68kdasmAG.o \\r
+       obj/log.o \\r
+       obj/jerry.o \\r
+       obj/jaguar.o \\r
+       obj/jagdasm.o \\r
+       obj/eeprom.o \\r
+       obj/dsound_dummy.o \\r
+       obj/crc32.o \\r
+       obj/clock.o \\r
+       obj/cdrom.o \\r
+       obj/cdi.o \\r
+       obj/cdbios.o \\r
+       obj/blitter.o \\r
+       obj/anajoy.o \\r
+       obj/tom.o \\r
+       obj/joystick.o \\r
+       obj/Jagem.o \\r
+       obj/gpu.o \\r
+       obj/dsp.o \\r
+       obj/m68kcpu.o obj/m68kops.o obj/m68kopac.o obj/m68kopdm.o obj/m68kopnz.o\r
+\r
+LIBS = `sdl-config --libs` -lstdc++\r
+\r
+INCS = -I. -Isrc -Isrc/include `sdl-config --cflags`\r
+\r
+THECC = $(CC) $(CFLAGS) $(INCS)\r
+\r
+all: obj $(TARGET)\r
+\r
+clean:\r
+       rm -rf obj\r
+       rm -f jag_em.exe\r
+\r
+obj:\r
+       mkdir obj\r
+\r
+obj/%.o: src/%.asm\r
+       $(NASM) -f win32 -o $@ $<\r
+\r
+obj/%.o: src/%.c\r
+       $(THECC) -c $< -o $@\r
+\r
+obj/%.o: src/%.cpp\r
+       $(THECC) -c $< -o $@\r
+\r
+jag_em: $(OBJS) \r
+       $(LD) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)\r
+       upx -9 jag_em.exe\r
+\r
+#\r
+# Musashi specific stuffola\r
+#\r
+\r
+obj/m68kcpu.o: obj/m68kops.h src/m68k.h src/m68kconf.h\r
+       $(CC) $(CFLAGS) -Iobj -c src/m68kcpu.c -o obj/m68kcpu.o\r
+\r
+obj/m68kops.o: obj/m68kmake.exe obj/m68kops.h obj/m68kops.c src/m68k.h src/m68kconf.h\r
+       $(CC) $(CFLAGS) -Isrc -c obj/m68kops.c -o obj/m68kops.o\r
+\r
+obj/m68kopac.o: obj/m68kmake.exe obj/m68kops.h obj/m68kopac.c src/m68k.h src/m68kconf.h\r
+       $(CC) $(CFLAGS) -Isrc -c obj/m68kopac.c -o obj/m68kopac.o\r
+\r
+obj/m68kopdm.o: obj/m68kmake.exe obj/m68kops.h obj/m68kopdm.c src/m68k.h src/m68kconf.h\r
+       $(CC) $(CFLAGS) -Isrc -c obj/m68kopdm.c -o obj/m68kopdm.o\r
+\r
+obj/m68kopnz.o: obj/m68kmake.exe obj/m68kops.h obj/m68kopnz.c src/m68k.h src/m68kconf.h\r
+       $(CC) $(CFLAGS) -Isrc -c obj/m68kopnz.c -o obj/m68kopnz.o\r
+\r
+obj/m68kops.h: obj/m68kmake.exe\r
+       obj/m68kmake obj src/m68k_in.c\r
+\r
+obj/m68kmake.exe: src/m68kmake.c src/m68k_in.c\r
+       $(CC) $(WARNINGS) src/m68kmake.c -o obj/m68kmake.exe\r
diff --git a/bios/readme.txt b/bios/readme.txt
new file mode 100644 (file)
index 0000000..3b1d01a
--- /dev/null
@@ -0,0 +1,3 @@
+Place the bios here
+
+jagboot.rom (128 Kb)
diff --git a/docs/README b/docs/README
new file mode 100644 (file)
index 0000000..7865403
--- /dev/null
@@ -0,0 +1,106 @@
+Virtual Jaguar v1.0.0 GCC/SDL release README
+--------------------------------------------
+
+- DISCLAIMER -
+
+Ported by SDLEMU (Niels Wagenaar & Caz) and is based upon the original work
+from Potato Emulation. For requirements please consult the INSTALL file for
+more information about supported OS' and software requirements.
+
+The use of this software is entirely at your own risk. We can't be held
+responsible for damage done to you hard- and/or software. This software
+requires the use of the Atari Jaguar (CD) boot ROM and/or Commercial ROM
+images. You may only use the ROM images if you own the cartridges itself.
+The use of Commercial ROM's without owning the original cartridge is 
+illegal in most countries and could result in fines and/or legal actions.
+
+This software is released under the GPL license. For more information I
+should direct you to the GPL.TXT. You may hack/change the code anyway you
+like. You may not commercially sell this software. 
+
+If you make changes, release the sourcecode to the public and send us the
+changes you made to the original authors. 
+
+The products and brands used in these documents and/or sourcecode are owned
+but the desired company in question.
+
+- What is Virtual Jaguar GCC/SDL?
+
+Virtual Jaguar is software dedicated to emulate the Atari Jaguar hardware
+on you standard P.C. The software was originally developed by Potato Emulation
+(http://potato.emu-france.com) and was released under the GPL license on
+25 June 2003. 
+
+Virtual Jaguar GCC/SDL is a port of the MS Visual C++/SDL sourcecode so that
+we can enjoy Atari Jaguar emulation on every platform which uses the GCC
+compiler and what can make use of the Simple Directmedia Layer library (SDL).
+
+Currently Virtual Jaguar GCC/SDL compiles on WIN32, using mingw, and several
+UN*X based systems (BeOS, Linux and FreeBSD). It may run on other systems
+as well but we can not garantee that.
+
+The port was done by the SDLEMU crew (http://sdlemu.ngemu.com) and especially
+by Niels Wagenaar and Caz. You may contact us by e-mail (sdlemu@ngemu.com) or
+leave a message on the SDLEMU Official Forum (see the website).
+
+More information about SDL can be found at http://www.libsdl.org.
+
+- Using Virtual Jaguar GCC/SDL
+
+After compiling the binary (see INSTALL) you can now run original Atari Jaguar
+games. These games are distributed on cartridges and can there for not be used
+on a P.C. To use these games on Virtual Jaguar GCC/SDL you need to get ROM
+images. Besides that ROM imgaes from Commercial games you must also obtain the
+Atari Jaguar (CD) boot ROM which you must copy to the BIOS directory. 
+For legal issues concerning ROM images please consult the DISCLAIMER at the
+beginning of this file.
+
+After obaining the Atari Jaguar (CD) boot ROM and several ROM's you can now
+use Virtual Jaguar using the following command :
+
+./jag_em romfile -switch
+
+The context of ROMFILE is the filename of the UNCOMPRESSED Atari Jaguar ROM
+dump. You can also use switches. By just typing ./jag_em you get an overview
+of the options you can use. WIN32 users should look into the stdout.txt for
+that information.
+
+If you succesfully start the emulator with the game you should see a window
+(or fullscreen) which shows the game. If the game doesn't comply to a CRC
+check the game will display a black screen, this means that the game is 
+probably a hack or a new game which isn't supported. You may add the CRC
+check to the sources yourself (src/crc32.cpp).
+
+This emulator also emulates the Atari Jaguar Analog gamepads. By using the
+following keyboard or joystick settings you can (possibly) play the game :
+
+Atari Button A       : Z or joystick button 1
+Atari Button B       : X or joystick button 2
+Atari Button C       : C or joystick button 3
+Atari Buttons 1 - 10 : Keypad 0 - 9 (0 = 10)
+Atari Start/Pause    : ENTER
+Atari Select         : TAB
+Atari UP             : UP    or joystick UP
+Atari DOWN           : DOWN  or joystick DOWN
+Atari LEFT           : LEFT  or joystick LEFT
+Atari RIGHT          : RIGHT or joystick RIGHT
+
+With ESC you can easily stop Virtual Jaguar GCC/SDL which will get you back
+to you command prompt. If you want to change the key layout, simply hack the
+src/joystick.cpp and change the keys :)
+
+- Finally
+
+If you find bugs, enhance the code or simply have questions. Drop us an e-mail
+at sdlemu AT ngemu DOT com or drop a message on the SDLEMU Official Forum. 
+
+More information about this projects (releases/WIP) can be found at the SDLEMU
+website : http://sdlemu.ngemu.com.
+
+I hope you enjoy the emulator and will use it wisely! 
+
+Special thanks go to guys over at ngemu.com and #ngemu (EFNET). Also the author
+who originally developed this emulator is thanked for releasing the sources to
+the public.
+
+SDLEMU
diff --git a/docs/WHATSNEW b/docs/WHATSNEW
new file mode 100644 (file)
index 0000000..2e768ee
--- /dev/null
@@ -0,0 +1,14 @@
+Virtual Jaguar v1.0.0 GCC/SDL - initial source release
+------------------------------------------------------
+
+* Converted VC++ assembly to standard GNU assembly;
+* Fixed small bugs in SDL related items (keyboard/graphics);
+* Added *some* optimalisations to the graphics sources;
+* Added joystick support (not tested);
+* Added joystick port support (not tested);
+* Added frameskip support;
+
+Source only release. Tested on BeOS, Linux, FreeBSD and WIN32.
+SOUND emulation was NOT done. Need help with this one :)
+
+SDLEMU (Niels Wagenaar & Caz) - http://sdlemu.ngemu.com
diff --git a/docs/gpl.txt b/docs/gpl.txt
new file mode 100644 (file)
index 0000000..1bcc46f
--- /dev/null
@@ -0,0 +1,342 @@
+                   GNU GENERAL PUBLIC LICENSE
+                      Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                           Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+\f
+                   GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+\f
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+\f
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+\f
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+                           NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+                    END OF TERMS AND CONDITIONS
+\f
+           How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+
diff --git a/eeproms/00000000.eep b/eeproms/00000000.eep
new file mode 100644 (file)
index 0000000..00bc047
Binary files /dev/null and b/eeproms/00000000.eep differ
diff --git a/fix-unix.sh b/fix-unix.sh
new file mode 100644 (file)
index 0000000..4a1a732
--- /dev/null
@@ -0,0 +1,21 @@
+#! /bin/sh
+#
+#  Sets up the Allegro package for building under Unix, converting text
+#  files from CR/LF to LF format.
+
+
+echo "Converting NeoPocott files to Unix format..."
+
+find . -type f "(" \
+   -name "*.c*" -o -name "*.cfg" -o \
+   -name "*.h" -o -name "*.s" -o \
+   -name "*.txt" -o -name "*.asm" -o \
+   -name "Makefile*" -o -name "readme.*" \
+   ")" \
+   -exec sh -c "echo {};
+               mv {} _tmpfile;
+               tr -d \\\r < _tmpfile > {};
+               touch -r _tmpfile {}; 
+               rm _tmpfile" \;
+
+echo "Done!"
diff --git a/src/Jagem.cpp b/src/Jagem.cpp
new file mode 100644 (file)
index 0000000..74c12d9
--- /dev/null
@@ -0,0 +1,337 @@
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+#ifndef __PORT__\r
+#include "stdafx.h"\r
+#include <mmsystem.h>\r
+#include <direct.h>\r
+#endif // #ifndef __PORT__\r
+#include <time.h>\r
+\r
+/* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
+/* Added for GCC UNIX compatibility          */\r
+#ifdef __GCCUNIX__\r
+#include <unistd.h>\r
+#endif // #ifdef __GCCUNIX__\r
+\r
+#include <SDL.h>\r
+#include "SDLptc.h"\r
+#include "jaguar.h"\r
+\r
+/* Enable this (uncomment) for speed control */\r
+//#define SPEED_CONTROL\r
+\r
+Surface * surface;\r
+Format format(16, 0x007C00, 0x00003E0, 0x0000001F);\r
+uint8 finished = 0;\r
+Console console;\r
+\r
+int fullscreen = 0;\r
+char * jaguar_boot_dir;\r
+\r
+void main_screen_switch(void)\r
+{\r
+       fullscreen = !fullscreen;\r
+       if (fullscreen)\r
+               console.option("fullscreen output");\r
+       else\r
+               console.option("windowed output");\r
+       console.close();\r
+       console.open("WIP VERSION", tom_width, tom_height, format);\r
+}\r
+\r
+#ifdef __PORT__\r
+\r
+/* Added/changed by SDLEMU http://sdlemu.ngemu.com */\r
+\r
+int main(int argc, char * argv[])\r
+{\r
+\r
+       uint32           startTime, totalFrames, endTime, w, h;\r
+       int32        *vs;\r
+       unsigned int nNormalLast = 0;\r
+       int                      nNormalFrac = 0; \r
+       int                      i           = 0;\r
+    int          nTime       = 0;\r
+    int          nCount      = 0;\r
+    int          nFrameskip  = 1; /* Frameskip */\r
+    int          nFrame      = 0; /* No. of Frame */\r
+    int          nJoyport    = 0; /* Joystick port */\r
+\r
+       printf("Virtual Jaguar/SDL v1.0.1 (GCC/SDL Port)\n");\r
+       printf("Based upon Virtual Jaguar core v1.0.0 by Potato emulation.\n");\r
+       printf("Written by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\n");\r
+       printf("Portions massaged by James L. Hammons (WIN32)\n");\r
+       printf("Contact : http://sdlemu.ngemu.com/ | sdlemu@ngemu.com\n");\r
+\r
+       if (argc <= 1)\r
+       {\r
+           printf("Usage : \n\n");\r
+               printf("jag_em <romfile> [switches]  ]\n");\r
+               printf("                  -fullscreen     : Enable fullscreen mode           \n");\r
+               printf("                  -window         : Enable windowed   mode (default) \n");\r
+               printf("                  -frameskip 1-10 : Enable frameskip 1 (default) - 10\n");\r
+               printf("                  -joystick       : Enable joystick/gamepad          \n");\r
+               printf("                  -joyport   0-3  : Select desired joystick port     \n");\r
+               return true;\r
+       }\r
+\r
+       jaguar_boot_dir=(char*)malloc(1024);\r
+       getcwd(jaguar_boot_dir,1024);\r
+\r
+       log_init("jag_em.log");\r
+\r
+       memory_init();\r
+       version_init();\r
+       version_display(log_get());\r
+       jaguar_init(argv[1]);\r
+       jaguar_reset();\r
+       \r
+    /* Setting up the backbuffer */\r
+       int16 *backbuffer=(int16*)malloc(845*525*sizeof(int16));\r
+       memset(backbuffer,0xaa,tom_getVideoModeWidth()*tom_getVideoModeHeight()*sizeof(int16));\r
+\r
+       /* Setting up the primary SDL display */\r
+       Format format(16,0x007c00,0x00003e0,0x0000001f);\r
+       surface=new Surface(tom_getVideoModeWidth(),tom_getVideoModeHeight(), format);\r
+    console.option("windowed output");\r
+\r
+    /* Checking the switches ;) */\r
+       for(i = 0; (i < argc || argv[i] != NULL); i++)\r
+       {\r
+          if(!strcmp(argv[i], "-fullscreen")) \r
+              console.option("fullscreen output");\r
+\r
+          if(!strcmp(argv[i], "-window")) \r
+              console.option("windowed output");\r
+\r
+          if(!strcmp(argv[i], "-joystick")) \r
+              console.option("joystick enabled");\r
+\r
+          if(!strcmp(argv[i], "-joyport"))\r
+          {\r
+               nJoyport = atoi(argv[++i]) + 1;\r
+                       if(nJoyport > 3) nJoyport = 3;\r
+          }\r
+\r
+          if(!strcmp(argv[i], "-frameskip"))\r
+          {\r
+               nFrameskip = atoi(argv[++i]) + 1;\r
+                       if(nFrameskip > 10) nFrameskip = 10;\r
+                       #ifdef SPEED_CONTROL\r
+                          nFrameskip = 0;\r
+            #endif\r
+          }\r
+\r
+\r
+              \r
+    }\r
+    \r
+\r
+       /* Initialize Joystick support under SDL */\r
+       if ( console.JoyEnabled() == 1 ) {\r
+       \r
+       if(SDL_NumJoysticks() <= 0)\r
+       {\r
+        console.option("joystick disabled");\r
+               printf("No joystick(s) or joypad(s) detected on your system. Using keyboards....\n");\r
+       }\r
+       else {\r
+         if((console.joystick = SDL_JoystickOpen(nJoyport)) == 0)\r
+         {\r
+        console.option("joystick disabled");\r
+               printf("Unable to open a Joystick on port : %d\n", nJoyport);\r
+         }\r
+         else\r
+          printf("Using: %s\n", SDL_JoystickName(nJoyport));\r
+       }\r
+       }\r
+\r
+       /* Open the display and start emulating some l337 Atari Jaguar games :P */\r
+       console.open("Virtual Jaguar",tom_getVideoModeWidth(),tom_getVideoModeHeight(),format);\r
+\r
+       \r
+       totalFrames=0;\r
+       startTime=clock();\r
+       nNormalLast=0;// Last value of timeGetTime()\r
+       nNormalFrac=0; // Extra fraction we did\r
+\r
+       nNormalLast=SDL_GetTicks();//timeGetTime();\r
+       while (!finished)\r
+       {\r
+#ifdef SPEED_CONTROL\r
+               nTime=SDL_GetTicks()-nNormalLast;                                         // calcule le temps Ã©coulé depuis le dernier affichage\r
+                                                                                                                         // nTime est en mili-secondes.\r
+               // détermine le nombre de trames Ã  passer + 1\r
+               nCount=(nTime*600 - nNormalFrac) /10000;        \r
+\r
+               // si le nombre de trames Ã  passer + 1 est nul ou négatif,\r
+               // ne rien faire pendant 2 ms\r
+               if (nCount<=0) \r
+               { \r
+                       //Sleep(2); \r
+                       //SDL_Delay(1);\r
+               } // No need to do anything for a bit\r
+               else\r
+               {\r
+                       nNormalFrac+=nCount*10000;                              // \r
+                       nNormalLast+=nNormalFrac/600;                           // add the duration of nNormalFrac frames\r
+                       nNormalFrac%=600;                                                       // \r
+\r
+                       // Pas plus de 9 (10-1) trames non affichées \r
+                       if (nCount>10) \r
+                         nCount=10; \r
+                       for (i=0;i<nCount-1;i++) \r
+                               jaguar_exec(backbuffer,0);\r
+#endif\r
+            /* Setting up new backbuffer with new pixels and data */\r
+                       jaguar_exec(backbuffer,1);\r
+                       totalFrames++;\r
+\r
+                       /* Simple frameskip */\r
+                       if ( nFrame == nFrameskip ) {\r
+               w=tom_width;\r
+                  h=tom_height;\r
+                          vs = (int32 *)surface->lock();\r
+                          memcpy(vs,backbuffer,w*h*2);\r
+                          surface->unlock();\r
+                          surface->copy(console);\r
+                          console.update();\r
+                          nFrame = 0;\r
+                       }\r
+            else\r
+               nFrame++;\r
+                       joystick_exec();\r
+                       \r
+#ifdef SPEED_CONTROL\r
+               }\r
+#endif\r
+       }\r
+       int elapsedTime=clock()-startTime;\r
+       int fps=(1000*totalFrames)/elapsedTime;\r
+       printf("statistics: %i fps\n",fps);\r
+       \r
+       if ( console.JoyEnabled() == 1 ) {}\r
\r
+       jaguar_done();\r
+       version_done();\r
+       memory_done();\r
+       log_done();     \r
+       console.close(); // Close SDL items as last!\r
+    return 0;\r
+}\r
+\r
+#else\r
+\r
+int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)\r
+{\r
+       uint32           startTime, endTime, totalFrames;\r
+       unsigned int nNormalLast=0;\r
+       int                      nNormalFrac=0; \r
+       int                      nTime=0,nCount=0; int i=0;\r
+\r
+       jaguar_boot_dir=(char*)malloc(1024);\r
+       _getcwd(jaguar_boot_dir,1024);\r
+\r
+       log_init("jagem.log");\r
+       // 15 bits RGB555\r
+       SDL_Event       app_input_event;\r
+\r
+       memory_init();\r
+       version_init();\r
+       version_display(log_get());\r
+       jaguar_init();\r
+       jaguar_reset();\r
+       \r
+\r
+       int16 * backbuffer = (int16 *)malloc(845 * 525 * sizeof(int16));\r
+       memset(backbuffer, 0xAA, tom_getVideoModeWidth() * tom_getVideoModeHeight() * sizeof(int16));\r
+       surface=new Surface(tom_getVideoModeWidth(),tom_getVideoModeHeight(),format);\r
+       console.option("DirectX");\r
+       console.option("windowed output");\r
+//     console.option("fullscreen output");\r
+       console.option("center window");\r
+       console.open("WIP VERSION",tom_getVideoModeWidth(),tom_getVideoModeHeight(),format);\r
+       uint32 surfacePitch=(surface->pitch()>>1);\r
+\r
+       totalFrames=0;\r
+       startTime=clock();\r
+       nNormalLast=0;// Last value of timeGetTime()\r
+       nNormalFrac=0; // Extra fraction we did\r
+       nNormalLast=timeGetTime();\r
+       while (!finished)\r
+       {\r
+               while ( SDL_PollEvent(&app_input_event) )\r
+               {\r
+                       if ( app_input_event.type == SDL_QUIT )\r
+                       {\r
+                               finished = 1;\r
+                       }\r
+               }\r
+               joystick_exec();\r
+#define SPEED_CONTROL\r
+#ifdef SPEED_CONTROL\r
+               nTime=timeGetTime()-nNormalLast;                                          // calcule le temps Ã©coulé depuis le dernier affichage\r
+                                                                                                                         // nTime est en mili-secondes.\r
+               // détermine le nombre de trames Ã  passer + 1\r
+               nCount=(nTime*600 - nNormalFrac) /10000;        \r
+\r
+               // si le nombre de trames Ã  passer + 1 est nul ou négatif,\r
+               // ne rien faire pendant 2 ms\r
+               if (nCount<=0) \r
+               { \r
+                       Sleep(2); \r
+               } // No need to do anything for a bit\r
+               else\r
+               {\r
+                       nNormalFrac+=nCount*10000;                              // \r
+                       nNormalLast+=nNormalFrac/600;                           // add the duration of nNormalFrac frames\r
+                       nNormalFrac%=600;                                                       // \r
+\r
+                       // Pas plus de 9 (10-1) trames non affichées \r
+                       if (nCount>10) \r
+                         nCount=10; \r
+                       for (i=0;i<nCount-1;i++) \r
+                               jaguar_exec(backbuffer,0);\r
+#endif\r
+                       jaguar_exec(backbuffer,1);\r
+                       totalFrames++;\r
+\r
+                       int32 *vs = (int32 *)surface->lock();\r
+                       uint32 w,h;\r
+                       w=tom_width;\r
+                       h=tom_height;\r
+\r
+                       memcpy(vs,backbuffer,w*h*2);\r
+                       surface->unlock();\r
+                       surface->copy(console);\r
+\r
+                       console.update();\r
+#ifdef SPEED_CONTROL\r
+               }\r
+#endif\r
+       }\r
+       int elapsedTime=clock()-startTime;\r
+       int fps=(1000*totalFrames)/elapsedTime;\r
+       fprintf(log_get(),"statistics: %i fps\n",fps);\r
+       \r
+       console.close();\r
+\r
+       jaguar_done();\r
+       version_done();\r
+       memory_done();\r
+       log_done();     \r
+    return 0;\r
+    \r
+}\r
+\r
+#endif\r
+\r
diff --git a/src/anajoy.cpp b/src/anajoy.cpp
new file mode 100644 (file)
index 0000000..8994271
--- /dev/null
@@ -0,0 +1,91 @@
+#include "jaguar.h"\r
+\r
+static uint8 anajoy_ram[2];\r
+static uint8 analog_x, analog_y;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void anajoy_init(void)\r
+{\r
+       anajoy_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void anajoy_reset(void)\r
+{\r
+       memset(anajoy_ram,0x00,2);\r
+       analog_x=128;\r
+       analog_y=128;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void anajoy_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void anajoy_byte_write(uint32 offset, uint8 data)\r
+{\r
+       anajoy_ram[offset&0x01]=data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void anajoy_word_write(uint32 offset, uint16 data)\r
+{\r
+       offset&=0x01;\r
+       anajoy_ram[offset+0]=(data>>8)&0xff;\r
+       anajoy_ram[offset+1]=data&0xff;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 anajoy_byte_read(uint32 offset)\r
+{\r
+       if (anajoy_ram[1]&0x01)\r
+               return(analog_y);\r
+       else\r
+               return(analog_x);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 anajoy_word_read(uint32 offset)\r
+{\r
+       uint16 data=anajoy_byte_read((offset+0)&0x01);\r
+       data<<=8;\r
+       data|=anajoy_byte_read((offset+1)&0x01);\r
+       return(data);\r
+}\r
diff --git a/src/blitter.cpp b/src/blitter.cpp
new file mode 100644 (file)
index 0000000..0c7a6dc
--- /dev/null
@@ -0,0 +1,1523 @@
+#define GEN_CODE\r
+//#define LOG_BLITS\r
+//#define USE_GENERIC_BLITTER\r
\r
+#include "jaguar.h"\r
+\r
+#define null 0\r
+extern int jaguar_active_memory_dumps;\r
+\r
+#define REG(A)         blitter_reg_read(A)\r
+#define WREG(A,D)      blitter_reg_write(A,D)\r
+\r
+int start_logging = 0;\r
+\r
+static uint8 blitter_ram[0x100];\r
+\r
+#define A1_BASE                        ((UINT32)0x00)\r
+#define A1_FLAGS               ((UINT32)0x04)\r
+#define A1_CLIP                        ((UINT32)0x08)  // height and width values for clipping\r
+#define A1_PIXEL               ((UINT32)0x0c)  // integer part of the pixel (Y.i and X.i)\r
+#define A1_STEP                        ((UINT32)0x10)  // integer part of the step\r
+#define A1_FSTEP               ((UINT32)0x14)  // fractionnal part of the step\r
+#define A1_FPIXEL              ((UINT32)0x18)  // fractionnal part of the pixel (Y.f and X.f)\r
+#define A1_INC                 ((UINT32)0x1C)  // integer part of the increment\r
+#define A1_FINC                        ((UINT32)0x20)  // fractionnal part of the increment\r
+#define A2_BASE                        ((UINT32)0x24)\r
+#define A2_FLAGS               ((UINT32)0x28)\r
+#define A2_MASK                        ((UINT32)0x2c)  // modulo values for x and y (M.y  and M.x)\r
+#define A2_PIXEL               ((UINT32)0x30)  // integer part of the pixel (no fractionnal part for A2)\r
+#define A2_STEP                        ((UINT32)0x34)  // integer part of the step (no fractionnal part for A2)\r
+#define COMMAND                        ((UINT32)0x38)\r
+#define PIXLINECOUNTER ((UINT32)0x3C)\r
+#define SRCDATA                        ((UINT32)0x40)\r
+#define DSTDATA                        ((UINT32)0x48)\r
+#define DSTZ                   ((UINT32)0x50)\r
+#define SRCZINT                        ((UINT32)0x58)\r
+#define SRCZFRAC               ((UINT32)0x60)\r
+#define PATTERNDATA            ((UINT32)0x68)\r
+#define INTENSITYINC   ((UINT32)0x70)\r
+#define ZINC                   ((UINT32)0x74)\r
+#define COLLISIONCTRL  ((UINT32)0x78)\r
+#define PHRASEINT3             ((UINT32)0x7C)\r
+#define PHRASEINT2             ((UINT32)0x80)\r
+#define PHRASEINT1             ((UINT32)0x84)\r
+#define PHRASEINT0             ((UINT32)0x88)\r
+#define PHRASEZ3               ((UINT32)0x8C)\r
+#define PHRASEZ2               ((UINT32)0x90)\r
+#define PHRASEZ1               ((UINT32)0x94)\r
+#define PHRASEZ0               ((UINT32)0x98)\r
+\r
+#define SRCEN                  (cmd&0x00000001)\r
+#define SRCENZ                 (cmd&0x00000002)\r
+#define SRCENX                 (cmd&0x00000004)\r
+#define DSTEN                  (cmd&0x00000008)\r
+#define DSTENZ                 (cmd&0x00000010)\r
+#define DSTWRZ                 (cmd&0x00000020)\r
+#define CLIPA1                 (cmd&0x00000040)\r
+#define DSTA2                  (cmd&0x00000800)\r
+\r
+#define Z_OP_INF               (cmd&0x00040000)\r
+#define Z_OP_EQU               (cmd&0x00080000)\r
+#define Z_OP_SUP               (cmd&0x00100000)\r
+\r
+#define CMPDST                 (cmd&0x02000000)\r
+#define BCOMPEN                        (cmd&0x04000000)\r
+#define DCOMPEN                        (cmd&0x08000000)\r
+\r
+#define LFU_NAN                        (cmd&0x00200000)\r
+#define LFU_NA                 (cmd&0x00400000)\r
+#define LFU_AN                 (cmd&0x00800000)\r
+#define LFU_A                  (cmd&0x01000000)\r
+\r
+#define PATDSEL                        (cmd&0x00010000)\r
+#define INTADD                 (cmd&0x00020000)\r
+#define TOPBEN                 (cmd&0x00004000)\r
+#define TOPNEN                 (cmd&0x00008000)\r
+#define BKGWREN                        (cmd&0x10000000)\r
+#define GOURD                  (cmd&0x00001000)\r
+#define GOURZ                  (cmd&0x00002000)\r
+#define SRCSHADE               (cmd&0x40000000)\r
+\r
+\r
+#define XADDPHR         0\r
+#define XADDPIX         1\r
+#define XADD0   2\r
+#define XADDINC         3\r
+\r
+#define XSIGNSUB_A1            (REG(A1_FLAGS)&0x80000)\r
+#define XSIGNSUB_A2            (REG(A2_FLAGS)&0x80000)\r
+\r
+#define YSIGNSUB_A1            (REG(A1_FLAGS)&0x100000)\r
+#define YSIGNSUB_A2            (REG(A2_FLAGS)&0x100000)\r
+\r
+#define YADD1_A1               (REG(A1_FLAGS)&0x40000)\r
+#define YADD1_A2               (REG(A2_FLAGS)&0x40000)\r
+\r
+// 1 bpp pixel read\r
+#define PIXEL_SHIFT_1(a)      (((~a##_x) >> 16) & 7)\r
+#define PIXEL_OFFSET_1(a)     (((((UINT32)a##_y >> 16) * a##_width / 8) + (((UINT32)a##_x >> 19) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 19) & 7))\r
+#define READ_PIXEL_1(a)       ((jaguar_byte_read(a##_addr+PIXEL_OFFSET_1(a)) >> PIXEL_SHIFT_1(a)) & 0x01)\r
+\r
+// 2 bpp pixel read\r
+#define PIXEL_SHIFT_2(a)      (((~a##_x) >> 15) & 6)\r
+#define PIXEL_OFFSET_2(a)     (((((UINT32)a##_y >> 16) * a##_width / 4) + (((UINT32)a##_x >> 18) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 18) & 7))\r
+#define READ_PIXEL_2(a)       ((jaguar_byte_read(a##_addr+PIXEL_OFFSET_2(a)) >> PIXEL_SHIFT_2(a)) & 0x03)\r
+\r
+// 4 bpp pixel read\r
+#define PIXEL_SHIFT_4(a)      (((~a##_x) >> 14) & 4)\r
+#define PIXEL_OFFSET_4(a)     (((((UINT32)a##_y >> 16) * (a##_width/2)) + (((UINT32)a##_x >> 17) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 17) & 7))\r
+#define READ_PIXEL_4(a)       ((jaguar_byte_read(a##_addr+PIXEL_OFFSET_4(a)) >> PIXEL_SHIFT_4(a)) & 0x0f)\r
+\r
+// 8 bpp pixel read\r
+#define PIXEL_OFFSET_8(a)     (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~7)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 7))\r
+#define READ_PIXEL_8(a)       (jaguar_byte_read(a##_addr+PIXEL_OFFSET_8(a)))\r
+\r
+// 16 bpp pixel read\r
+#define PIXEL_OFFSET_16(a)    (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~3)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 3))\r
+#define READ_PIXEL_16(a)       (jaguar_word_read(a##_addr+(PIXEL_OFFSET_16(a)<<1)))\r
+\r
+// 32 bpp pixel read\r
+#define PIXEL_OFFSET_32(a)    (((((UINT32)a##_y >> 16) * a##_width) + (((UINT32)a##_x >> 16) & ~1)) * (1 + a##_pitch) + (((UINT32)a##_x >> 16) & 1))\r
+#define READ_PIXEL_32(a)      (jaguar_long_read(a##_addr+(PIXEL_OFFSET_32(a)<<2)))\r
+\r
+// pixel read\r
+#define READ_PIXEL(a,f) (\\r
+        (((f>>3)&0x07) == 0) ? (READ_PIXEL_1(a)) : \\r
+        (((f>>3)&0x07) == 1) ? (READ_PIXEL_2(a)) : \\r
+        (((f>>3)&0x07) == 2) ? (READ_PIXEL_4(a)) : \\r
+        (((f>>3)&0x07) == 3) ? (READ_PIXEL_8(a)) : \\r
+        (((f>>3)&0x07) == 4) ? (READ_PIXEL_16(a)) : \\r
+        (((f>>3)&0x07) == 5) ? (READ_PIXEL_32(a)) : 0)\r
+\r
+// 16 bpp z data read\r
+#define ZDATA_OFFSET_16(a)     (PIXEL_OFFSET_16(a) + a##_zoffs * 4)\r
+#define READ_ZDATA_16(a)       (jaguar_word_read(a##_addr+(ZDATA_OFFSET_16(a)<<1)))\r
+\r
+// z data read\r
+#define READ_ZDATA(a,f) (READ_ZDATA_16(a))\r
+\r
+// 16 bpp z data write\r
+#define WRITE_ZDATA_16(a,d)     {  jaguar_word_write(a##_addr+(ZDATA_OFFSET_16(a)<<1),d); }\r
+\r
+// z data write\r
+#define WRITE_ZDATA(a,f,d) WRITE_ZDATA_16(a,d); \r
+\r
+// 1 bpp r data read\r
+#define READ_RDATA_1(r,a,p)  ((p) ?  ((REG(r+(((UINT32)a##_x>>19)&4)))>>(((UINT32)a##_x>>16)&0x1f))&   0x1 : (REG(r) &    0x1))\r
+\r
+// 2 bpp r data read\r
+#define READ_RDATA_2(r,a,p)  ((p) ?  ((REG(r+(((UINT32)a##_x>>18)&4)))>>(((UINT32)a##_x>>15)&0x3e))&   0x3 : (REG(r) &    0x3))\r
+\r
+// 4 bpp r data read\r
+#define READ_RDATA_4(r,a,p)  ((p) ?  ((REG(r+(((UINT32)a##_x>>17)&4)))>>(((UINT32)a##_x>>14)&0x28))&   0xf : (REG(r) &    0xf))\r
+\r
+// 8 bpp r data read\r
+#define READ_RDATA_8(r,a,p)  ((p) ?  ((REG(r+(((UINT32)a##_x>>16)&4)))>>(((UINT32)a##_x>>13)&0x18))&  0xff : (REG(r) &   0xff))\r
+\r
+// 16 bpp r data read\r
+#define READ_RDATA_16(r,a,p)  ((p) ? ((REG(r+(((UINT32)a##_x>>15)&4)))>>(((UINT32)a##_x>>12)&0x10))&0xffff : (REG(r) & 0xffff))\r
+\r
+// 32 bpp r data read\r
+#define READ_RDATA_32(r,a,p)  ((p) ? REG(r+(((UINT32)a##_x>>14)&4)) : REG(r))\r
+\r
+\r
+// register data read\r
+#define READ_RDATA(r,a,f,p) (\\r
+        (((f>>3)&0x07) == 0) ? (READ_RDATA_1(r,a,p)) : \\r
+        (((f>>3)&0x07) == 1) ? (READ_RDATA_2(r,a,p)) : \\r
+        (((f>>3)&0x07) == 2) ? (READ_RDATA_4(r,a,p)) : \\r
+        (((f>>3)&0x07) == 3) ? (READ_RDATA_8(r,a,p)) : \\r
+        (((f>>3)&0x07) == 4) ? (READ_RDATA_16(r,a,p)) : \\r
+        (((f>>3)&0x07) == 5) ? (READ_RDATA_32(r,a,p)) : 0)\r
+\r
+// 1 bpp pixel write\r
+#define WRITE_PIXEL_1(a,d)       { jaguar_byte_write(a##_addr+PIXEL_OFFSET_1(a),(jaguar_byte_read(a##_addr+PIXEL_OFFSET_1(a))&(~(0x01 << PIXEL_SHIFT_1(a))))|(d<<PIXEL_SHIFT_1(a))); }\r
+\r
+// 2 bpp pixel write\r
+#define WRITE_PIXEL_2(a,d)       { jaguar_byte_write(a##_addr+PIXEL_OFFSET_2(a),(jaguar_byte_read(a##_addr+PIXEL_OFFSET_2(a))&(~(0x03 << PIXEL_SHIFT_2(a))))|(d<<PIXEL_SHIFT_2(a))); }\r
+\r
+// 4 bpp pixel write\r
+#define WRITE_PIXEL_4(a,d)       { jaguar_byte_write(a##_addr+PIXEL_OFFSET_4(a),(jaguar_byte_read(a##_addr+PIXEL_OFFSET_4(a))&(~(0x0f << PIXEL_SHIFT_4(a))))|(d<<PIXEL_SHIFT_4(a))); }\r
+\r
+// 8 bpp pixel write\r
+#define WRITE_PIXEL_8(a,d)       { jaguar_byte_write(a##_addr+PIXEL_OFFSET_8(a),d); }\r
+\r
+// 16 bpp pixel write\r
+#define WRITE_PIXEL_16(a,d)     {  jaguar_word_write(a##_addr+(PIXEL_OFFSET_16(a)<<1),d); }\r
+\r
+// 32 bpp pixel write\r
+#define WRITE_PIXEL_32(a,d)            { jaguar_long_write(a##_addr+(PIXEL_OFFSET_32(a)<<2),d); } \r
+\r
+// pixel write\r
+#define WRITE_PIXEL(a,f,d) {\\r
+       switch ((f>>3)&0x07) { \\r
+       case 0: WRITE_PIXEL_1(a,d);  break;  \\r
+       case 1: WRITE_PIXEL_2(a,d);  break;  \\r
+       case 2: WRITE_PIXEL_4(a,d); break;  \\r
+       case 3: WRITE_PIXEL_8(a,d);  break;  \\r
+       case 4: WRITE_PIXEL_16(a,d); break;  \\r
+       case 5: WRITE_PIXEL_32(a,d); break;  \\r
+       }} \\r
+\r
+\r
+\r
+// Width in Pixels of a Scanline\r
+static uint32 blitter_scanline_width[48] = \r
+{             \r
+     0,     0,     0,      0,      2,      0,      0,      0,      4,\r
+     0,     6,     0,      8,     10,     12,     14,     16,     20,\r
+    24,    28,    32,     40,     48,     56,     64,     80,     96,\r
+   112,   128,   160,    192,    224,    256,    320,    384,    448,\r
+   512,   640,   768,    896,   1024,   1280,   1536,   1792,   2048,\r
+  2560,  3072,  3584\r
+};\r
+\r
+static uint8 * tom_ram_8;\r
+static uint8 * paletteRam;\r
+static uint8 src;\r
+static uint8 dst;\r
+static uint8 misc;\r
+static uint8 a1ctl;\r
+static uint8 mode;\r
+static uint8 ity;\r
+static uint8 zop;\r
+static uint8 op;\r
+static uint8 ctrl;\r
+static uint32 a1_addr;\r
+static uint32 a2_addr;\r
+static int32 a1_zoffs;\r
+static int32 a2_zoffs;\r
+static uint32 xadd_a1_control;\r
+static uint32 xadd_a2_control;\r
+static int32 a1_pitch;\r
+static int32 a2_pitch;\r
+static uint32 n_pixels;\r
+static uint32 n_lines;\r
+static int32 a1_x;\r
+static int32 a1_y;\r
+static int32 a1_width;\r
+static int32 a2_x;\r
+static int32 a2_y;\r
+static int32 a2_width;\r
+static int32 a2_mask_x;\r
+static int32 a2_mask_y;\r
+static int32 a1_xadd;\r
+static int32 a1_yadd;\r
+static int32 a2_xadd;\r
+static int32 a2_yadd;\r
+static uint8 a1_phrase_mode;\r
+static uint8 a2_phrase_mode;\r
+static int32 a1_step_x=0;\r
+static int32 a1_step_y=0;\r
+static int32 a2_step_x=0;\r
+static int32 a2_step_y=0;\r
+static uint32 outer_loop;\r
+static uint32 inner_loop;\r
+static uint32 a2_psize;\r
+static uint32 a1_psize;\r
+static uint32 gouraud_add;\r
+static uint32 gouraud_data;\r
+static uint16 gint[4];\r
+static uint16 gfrac[4];\r
+static uint8  gcolour[4];\r
+static int       gd_i[4];\r
+static int    gd_c[4];\r
+static int    gd_ia,gd_ca;\r
+static int    colour_index = 0;\r
+static int32  zadd;\r
+static uint32  z_i[4];\r
+\r
+static uint8 blitter_code_cache[4096];\r
+static uint8 * blitter_ptr;\r
+uint8 blitter_working = 0;\r
+\r
+typedef void (blitter_fn)(void);\r
+\r
+typedef struct s_blitter_cache\r
+{\r
+       uint32 hashcode;\r
+       uint8  *code;\r
+       uint32 ready;\r
+       uint8   used;\r
+       struct s_blitter_cache *next;\r
+       struct s_blitter_cache *prev;\r
+} s_blitter_code_cache;\r
+\r
+s_blitter_cache *blitter_cache[256];\r
+\r
+uint8 blitter_cache_init=0;\r
+static uint8 BPP_LUT[8]={1,2,4,8,16,32,0,0};\r
+\r
+FILE *blitters_code_fp;\r
+FILE *blitters_code_init_fp;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+// build C code for the specified blitter\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_gen_c_code(FILE *fp, uint32 cmd,uint32 hashcode)\r
+{\r
+       static uint8 inhibit_modified=0;\r
+\r
+       fprintf(fp,"#ifndef blitter_code_0x%.8x\n",hashcode);\r
+       fprintf(fp,"#define blitter_code_0x%.8x\n",hashcode);\r
+\r
+       fprintf(fp,"void blitter_0x%.8x(void)\n",hashcode);\r
+       fprintf(fp,"{\n");\r
+       fprintf(fp,"\twhile (outer_loop--)\n");\r
+       fprintf(fp,"\t{\n");\r
+       fprintf(fp,"\t\tinner_loop=n_pixels;\n");\r
+       fprintf(fp,"\t\twhile (inner_loop--)\n");\r
+       fprintf(fp,"\t\t{\n");\r
+       fprintf(fp,"\t\t\tuint32 srcdata   = 0;\n");\r
+       fprintf(fp,"\t\t\tuint32 srczdata  = 0;\n");\r
+       fprintf(fp,"\t\t\tuint32 dstdata   = 0;\n");\r
+       fprintf(fp,"\t\t\tuint32 dstzdata  = 0;\n");\r
+       fprintf(fp,"\t\t\tuint32 writedata = 0;\n");\r
+       fprintf(fp,"\t\t\tuint32 inhibit   = 0;\n");\r
+       \r
+       char *src;\r
+       char *dst;\r
+       uint32 src_flags;\r
+       uint32 dst_flags;\r
+\r
+       if (!DSTA2)\r
+       {\r
+               src="a2";\r
+               dst="a1";\r
+               src_flags=A2_FLAGS;\r
+               dst_flags=A1_FLAGS;\r
+       }\r
+       else\r
+       {\r
+               src="a1";\r
+               dst="a2";\r
+               src_flags=A1_FLAGS;\r
+               dst_flags=A2_FLAGS;\r
+       }\r
+\r
+       // load src data and Z\r
+       if (SRCEN)\r
+       {\r
+               fprintf(fp,"\t\t\tsrcdata = READ_PIXEL_%i(%s);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],src);\r
+               if (SRCENZ)\r
+                       fprintf(fp,"\t\t\tsrczdata = READ_ZDATA_%i(%s);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],src);\r
+               else \r
+               if (cmd & 0x001c020)\r
+                       fprintf(fp,"\t\t\tsrczdata = READ_RDATA_%i(SRCZINT, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(src_flags))>>3)&0x07)],src,src);\r
+       }\r
+       else\r
+       {\r
+               fprintf(fp,"\t\t\tsrcdata = READ_RDATA_%i(SRCDATA, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],src,src);\r
+               if (cmd & 0x001c020)\r
+                       fprintf(fp,"\t\t\tsrczdata = READ_RDATA_%i(SRCZINT, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],src,src);\r
+       }\r
+\r
+       // load dst data and Z \r
+       if (DSTEN)\r
+       {\r
+               fprintf(fp,"\t\t\tdstdata = READ_PIXEL_%i(%s);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+               if (DSTENZ)\r
+                       fprintf(fp,"\t\t\tdstzdata = READ_ZDATA_%i(%s);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+               else\r
+                       fprintf(fp,"\t\t\tdstzdata = READ_RDATA_%i(DSTZ, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst,dst);\r
+       }\r
+       else\r
+       {\r
+               fprintf(fp,"\t\t\tdstdata = READ_RDATA_%i(DSTDATA, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst,dst);\r
+\r
+               if (DSTENZ)\r
+                       fprintf(fp,"\t\t\tdstzdata = READ_RDATA_%i(DSTZ, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst,dst);\r
+       }\r
+\r
+       // a1 clipping\r
+       if ((cmd & 0x00000040)&&(!DSTA2))\r
+\r
+       {\r
+               fprintf(fp,"\t\t\tif (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff))       inhibit = 1;\n");\r
+                inhibit_modified=1;\r
+       }\r
+       if(GOURZ) \r
+       {\r
+               fprintf(fp,"\t\t\tsrczdata=z_i[colour_index]>>16;\n");\r
+       }\r
+       // apply z comparator\r
+       if (Z_OP_INF) { fprintf(fp,"\t\t\tif (srczdata <  dstzdata)     inhibit = 1;\n"); inhibit_modified=1;}\r
+       if (Z_OP_EQU) { fprintf(fp,"\t\t\tif (srczdata == dstzdata)     inhibit = 1;\n"); inhibit_modified=1;}\r
+       if (Z_OP_SUP) { fprintf(fp,"\t\t\tif (srczdata >  dstzdata)     inhibit = 1;\n"); inhibit_modified=1;}\r
+\r
+       // apply data comparator\r
+       if (DCOMPEN)\r
+       {\r
+               if (!CMPDST)\r
+               {\r
+                       // compare source pixel with pattern pixel\r
+                       fprintf(fp,"\t\t\tif (srcdata == READ_RDATA_%i(PATTERNDATA, %s,%s_phrase_mode)) inhibit=1;\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],src,src);\r
+                       inhibit_modified=1;\r
+               }\r
+               else\r
+               {\r
+                       // compare destination pixel with pattern pixel\r
+                       fprintf(fp,"\t\t\tif (dstdata == READ_RDATA_%i(PATTERNDATA, %s,%s_phrase_mode)) inhibit=1;\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst,dst);\r
+                       inhibit_modified=1;\r
+               }\r
+       }\r
+       \r
+       // compute the write data and store\r
+               if (inhibit_modified) fprintf(fp,"\t\t\tif (!inhibit)\n\t\t\t{\n");\r
+               if (PATDSEL)\r
+               {\r
+                       // use pattern data for write data\r
+                       fprintf(fp,"\t\t\t\twritedata= READ_RDATA_%i(PATTERNDATA, %s, %s_phrase_mode);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst,dst);\r
+               }\r
+               else \r
+               if (INTADD)\r
+               {\r
+                       // intensity addition\r
+                       fprintf(fp,"\t\t\t\twritedata = (srcdata & 0xff) + (dstdata & 0xff);\n");\r
+                       if (!(TOPBEN))\r
+                               fprintf(fp,"\t\t\t\tif (writedata > 0xff) writedata = 0xff;\n");\r
+\r
+                       fprintf(fp,"\t\t\t\twritedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\n");\r
+                       if (!(TOPNEN)) fprintf(fp,"\t\t\t\tif (writedata > 0xfff) writedata = 0xfff;\n");\r
+                       fprintf(fp,"\t\t\t\twritedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\n");\r
+               }\r
+               else\r
+               {\r
+                       if (LFU_NAN) fprintf(fp,"\t\t\t\twritedata |= ~srcdata & ~dstdata;\n");\r
+                       if (LFU_NA)  fprintf(fp,"\t\t\t\twritedata |= ~srcdata & dstdata;\n");\r
+                       if (LFU_AN)  fprintf(fp,"\t\t\t\twritedata |= srcdata  & ~dstdata;\n");\r
+                       if (LFU_A)       fprintf(fp,"\t\t\t\twritedata |= srcdata  & dstdata;\n");\r
+               }\r
+               if(GOURD) \r
+               {\r
+                       fprintf(fp,"\t\t\t\twritedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\n");\r
+               }\r
+               if(SRCSHADE) \r
+               {\r
+                       fprintf(fp,"\t\t\t\t{\n");\r
+                       fprintf(fp,"\t\t\t\tint intensity = srcdata & 0xFF;\n");\r
+                       fprintf(fp,"\t\t\t\tint ia = gd_ia >> 16;\n");\r
+                       fprintf(fp,"\t\t\t\tif(ia & 0x80)\n");\r
+                       fprintf(fp,"\t\t\t\t    ia = 0xFFFFFF00 | ia;\n");\r
+                       fprintf(fp,"\t\t\t\tintensity += ia;\n");\r
+                       fprintf(fp,"\t\t\t\tif(intensity < 0)\n");\r
+                       fprintf(fp,"\t\t\t\t    intensity = 0;\n");\r
+                       fprintf(fp,"\t\t\t\tif(intensity > 0xFF)\n");\r
+                       fprintf(fp,"\t\t\t\t    intensity = 0xFF;\n");\r
+                       fprintf(fp,"\t\t\t\twritedata = (srcdata & 0xFF00) | intensity;\n");\r
+                       fprintf(fp,"\t\t\t\t}\n");\r
+               }\r
+       if (inhibit_modified)  \r
+       {\r
+               fprintf(fp,"\t\t\t} else { srczdata=dstzdata; writedata=dstdata; }\n");\r
+       }\r
+\r
+       if ((DSTA2?a2_phrase_mode:a1_phrase_mode) || BKGWREN)\r
+       {\r
+               // write to the destination\r
+               fprintf(fp,"\t\t\tWRITE_PIXEL_%i(%s, writedata);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+               if (DSTWRZ) fprintf(fp,"\t\t\tWRITE_ZDATA_%i(%s, srczdata);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+       }\r
+       else\r
+       {\r
+               if (inhibit_modified) fprintf(fp,"\t\t\tif (!inhibit)\n\t\t\t{\n");\r
+               // write to the destination\r
+               fprintf(fp,"\t\t\t\tWRITE_PIXEL_%i(%s, writedata);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+               if (DSTWRZ) fprintf(fp,"\t\t\t\tWRITE_ZDATA_%i(%s, srczdata);\n",BPP_LUT[(((REG(dst_flags))>>3)&0x07)],dst);\r
+               if (inhibit_modified) fprintf(fp,"\t\t\t}\n");\r
+       }\r
+       // update x and y\r
+       fprintf(fp,"\t\t\ta1_x += a1_xadd;\n");\r
+       fprintf(fp,"\t\t\ta1_y += a1_yadd;\n");\r
+       fprintf(fp,"\t\t\ta2_x = (a2_x + a2_xadd) & a2_mask_x;\n");\r
+       fprintf(fp,"\t\t\ta2_y = (a2_y + a2_yadd) & a2_mask_y;\n");\r
+       if (GOURZ)\r
+       {\r
+               fprintf(fp,"\t\t\tz_i[colour_index]+=zadd;\n");\r
+       }\r
+       if ((GOURD)||(SRCSHADE))\r
+       {\r
+               fprintf(fp,"\t\t\tgd_i[colour_index] += gd_ia;\n");\r
+               fprintf(fp,"\t\t\tgd_c[colour_index] += gd_ca;\n");\r
+       }\r
+       if ((GOURD)||(SRCSHADE)||(GOURZ))\r
+       {\r
+               if (a1_phrase_mode)\r
+               fprintf(fp,"\t\t\t colour_index=(colour_index+1)&0x3;\n");\r
+       }\r
+       fprintf(fp,"\t\t}\n");\r
+\r
+       fprintf(fp,"\t\ta1_x+=a1_step_x;\n");\r
+       fprintf(fp,"\t\ta1_y+=a1_step_y;\n");\r
+       fprintf(fp,"\t\ta2_x+=a2_step_x;\n");\r
+       fprintf(fp,"\t\ta2_y+=a2_step_y;\n");\r
+       fprintf(fp,"\t}\n");\r
+       \r
+       // write values back to registers \r
+       fprintf(fp,"\tWREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\n");\r
+       fprintf(fp,"\tWREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\n");\r
+       fprintf(fp,"\tWREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\n");\r
+       fprintf(fp,"}\n");\r
+       fprintf(fp,"#endif\n");\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Generate a start of function in x86 assembly\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_gen_start_of_function(void)\r
+{\r
+       *blitter_ptr++=0x55;    // push ebp\r
+       *blitter_ptr++=0x8b;    // mov  ebp,esp\r
+       *blitter_ptr++=0xec;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Generate a end of function in x86 assembly\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_gen_end_of_function(void)\r
+{\r
+       *blitter_ptr++=0x8B;    // mov         esp,ebp\r
+       *blitter_ptr++=0xE5;\r
+       *blitter_ptr++=0x5D;    // pop         ebp\r
+       *blitter_ptr++=0xC3;    // ret\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+#define HASHCODE_BIT(C,B) if (C) hashcode|=(1<<B);\r
+#define HASHCODE_BIT_TEST(B) (hashcode&(1<<B))\r
+\r
+uint32 blitter_calc_hashcode(uint32 cmd)\r
+{\r
+       uint32 hashcode=0x00000000;\r
+\r
+       // source and destination bit depth\r
+       hashcode|=((REG(A1_FLAGS)>>3)&0x07)<<0;\r
+       hashcode|=((REG(A2_FLAGS)>>3)&0x07)<<3;\r
+\r
+       HASHCODE_BIT(DSTA2,                                     6);\r
+       HASHCODE_BIT(SRCEN,                                     7);\r
+       HASHCODE_BIT(SRCENZ,                            8);\r
+       HASHCODE_BIT(DSTEN,                                     9);\r
+       HASHCODE_BIT(DSTENZ,                            10);\r
+       HASHCODE_BIT(Z_OP_INF,                          11);\r
+       HASHCODE_BIT(Z_OP_EQU,                          12);\r
+       HASHCODE_BIT(Z_OP_SUP,                          13);\r
+       HASHCODE_BIT(DCOMPEN,                           14);\r
+       HASHCODE_BIT(CMPDST,                            15);\r
+       HASHCODE_BIT(PATDSEL,                           16);\r
+       HASHCODE_BIT(INTADD,                            17);\r
+       HASHCODE_BIT(TOPBEN,                            18);\r
+       HASHCODE_BIT(TOPNEN,                            19);\r
+       HASHCODE_BIT(LFU_NAN,                           20);\r
+       HASHCODE_BIT(LFU_NA,                            21);\r
+       HASHCODE_BIT(LFU_AN,                            22);\r
+       HASHCODE_BIT(LFU_A,                                     23);\r
+       HASHCODE_BIT(BKGWREN,                           24);\r
+       HASHCODE_BIT(DSTWRZ,                            25);\r
+       HASHCODE_BIT((cmd & 0x001c020),         26); // extra data read/write\r
+       HASHCODE_BIT((cmd & 0x00000040),        27); // source clipping\r
+       HASHCODE_BIT(a1_phrase_mode,            28); \r
+       HASHCODE_BIT(a2_phrase_mode,            29); \r
+\r
+\r
+       return(hashcode);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Build the blitter code for the current blitter operation in the cache\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_build_cached_code(uint32 cmd, uint32 cache_index)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Check if the blitter code for the current blitter operation is cached\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+struct s_blitter_cache * blitter_in_cache(uint32 cmd)\r
+{\r
+       uint32 i;\r
+       uint32 hashcode=blitter_calc_hashcode(cmd);\r
+#ifdef LOG_BLITS\r
+       fprintf(log_get(),"blitter: hashcode= 0x%.8x\n",hashcode);\r
+#endif\r
+       struct s_blitter_cache *blitter_list=blitter_cache[hashcode>>24];\r
+       \r
+       i=0;\r
+       while (blitter_list->next)\r
+       {\r
+               blitter_list=blitter_list->next;\r
+\r
+               if (blitter_list->hashcode==hashcode)\r
+                       return(blitter_list);\r
+       }\r
+#ifdef GEN_CODE\r
+       blitter_list->next=(struct s_blitter_cache *)malloc(sizeof(struct s_blitter_cache));\r
+       blitter_list->next->prev=blitter_list;\r
+       blitter_list->next->next=null;\r
+       blitter_list=blitter_list->next;\r
+\r
+       blitter_list->code=(uint8*)malloc(4096);\r
+       blitter_list->hashcode=hashcode;\r
+       blitter_list->ready=0;\r
+       blitter_gen_c_code(blitters_code_fp,cmd,hashcode);\r
+       fprintf(blitters_code_init_fp,"\tblitter_add(0x%.8x,(uint8*)&blitter_0x%.8x);\n",hashcode,hashcode);\r
+#else\r
+       //fprintf(log_get(),"warning: using generic blitter for blitter 0x%.8x\n",hashcode);\r
+#endif\r
+       return(null);\r
+}\r
+#ifndef USE_GENERIC_BLITTER\r
+#include "include/blit_c.h"\r
+#endif\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Execute the cached blitter code for the current blitter operation\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 blitter_execute_cached_code(struct s_blitter_cache *blitter)\r
+{\r
+       if ((blitter==null)||(blitter->ready==0))\r
+               return 0;\r
+\r
+       blitter_fn *fn=(blitter_fn*)blitter->code;\r
+       blitter->used=1;\r
+       (*fn)();\r
+\r
+       return(1);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_add(uint32 hashcode, uint8 *code)\r
+{\r
+       struct s_blitter_cache *blitter_list=blitter_cache[(hashcode>>24)];\r
+\r
+//     fprintf(log_get(),"adding blitter for hashcode 0x%.8x\n",hashcode);\r
+\r
+       while (blitter_list->next)\r
+       {\r
+               blitter_list=blitter_list->next;\r
+\r
+               if (blitter_list->hashcode==hashcode)\r
+                       return;\r
+       }\r
+       blitter_list->next=(struct s_blitter_cache *)malloc(sizeof(struct s_blitter_cache));\r
+       blitter_list->next->prev=blitter_list;\r
+       blitter_list->next->next=null;\r
+       blitter_list=blitter_list->next;\r
+\r
+       blitter_list->code=code;\r
+       blitter_list->hashcode=hashcode;\r
+       blitter_list->ready=1;\r
+       blitter_list->used=0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_list(void)\r
+{\r
+/*\r
+       fprintf(log_get(),"Used blitters list:\n");\r
+\r
+       for (int i=0;i<256;i++)\r
+       {\r
+               struct s_blitter_cache *blitter_list=blitter_cache[i];\r
+\r
+               while (blitter_list->next)\r
+               {\r
+                       blitter_list=blitter_list->next;\r
+                       if (blitter_list->used)\r
+                               fprintf(log_get(),"\t0%.8x\n",blitter_list->hashcode);\r
+               }\r
+       }\r
+*/\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_generic(uint32 cmd)\r
+{\r
+       uint32 srcdata   = 0;\r
+       uint32  srczdata  = 0;\r
+       uint32 dstdata   = 0;\r
+       uint32  dstzdata  = 0;\r
+       uint32 writedata = 0;\r
+       uint32 inhibit   = 0;\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       srcdata   = 0;\r
+                       srczdata  = 0;\r
+                       dstdata   = 0;\r
+                       dstzdata  = 0;\r
+                       writedata = 0;\r
+                       inhibit   = 0;\r
+\r
+                       if (!DSTA2)\r
+                       {\r
+                               // load src data and Z\r
+                               if (SRCEN)\r
+                               {\r
+                                       srcdata = READ_PIXEL(a2, REG(A2_FLAGS));\r
+                                       if (SRCENZ)\r
+                                       {\r
+                                               srczdata = READ_ZDATA(a2, REG(A2_FLAGS));\r
+                                       }\r
+                                       else \r
+                                       if (cmd & 0x001c020)\r
+                                       {\r
+                                               srczdata = READ_RDATA(SRCZINT, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       srcdata = READ_RDATA(SRCDATA, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       if (cmd & 0x001c020)\r
+                                       {\r
+                                               srczdata = READ_RDATA(SRCZINT, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       }\r
+                               }\r
+\r
+                               // load dst data and Z \r
+                               if (DSTEN)\r
+                               {\r
+                                       dstdata = READ_PIXEL(a1, REG(A1_FLAGS));\r
+                                       if (DSTENZ)\r
+                                       {\r
+                                               dstzdata = READ_ZDATA(a1, REG(A1_FLAGS));\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               dstzdata = READ_RDATA(DSTZ, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       dstdata = READ_RDATA(DSTDATA, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+               \r
+                                       if (DSTENZ)\r
+                                       {\r
+                                               dstzdata = READ_RDATA(DSTZ, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       }\r
+                               }\r
+\r
+                               // a1 clipping\r
+                               if (cmd & 0x00000040)\r
+                               {\r
+                                       if ( \r
+                                                a1_x < 0 || \r
+                                                a1_y < 0 ||\r
+                                            (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) ||\r
+                                                (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)\r
+                                               )\r
+                                               inhibit = 1;\r
+                               }\r
+\r
+                               if(GOURZ) \r
+                                       srczdata=z_i[colour_index]>>16;\r
+\r
+                               // apply z comparator\r
+                               if (Z_OP_INF) if (srczdata <  dstzdata) inhibit = 1;\r
+                               if (Z_OP_EQU) if (srczdata == dstzdata) inhibit = 1;\r
+                               if (Z_OP_SUP) if (srczdata >  dstzdata) inhibit = 1;\r
+                               \r
+                               // apply data comparator\r
+                               if (DCOMPEN|BCOMPEN)\r
+                               {\r
+                                       if (!CMPDST)\r
+                                       {\r
+                                               // compare source pixel with pattern pixel\r
+                                               if (srcdata == READ_RDATA(PATTERNDATA, a2, REG(A2_FLAGS), a2_phrase_mode))\r
+                                                       inhibit=1;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               // compare destination pixel with pattern pixel\r
+                                               if (dstdata == READ_RDATA(PATTERNDATA, a1, REG(A1_FLAGS), a1_phrase_mode))\r
+                                                       inhibit=1;\r
+                                       }\r
+                                       if (a1_phrase_mode||a2_phrase_mode)\r
+                                               inhibit=!inhibit;\r
+                               }\r
+                               \r
+                               // compute the write data and store\r
+                               if (!inhibit)\r
+                               {                       \r
+                                       if (PATDSEL)\r
+                                       {\r
+                                               // use pattern data for write data\r
+                                               writedata= READ_RDATA(PATTERNDATA, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       }\r
+                                       else \r
+                                       if (INTADD)\r
+                                       {\r
+                                               // intensity addition\r
+                                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                                               if (!(TOPBEN) && writedata > 0xff)\r
+                                                       writedata = 0xff;\r
+                                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                                               if (!(TOPNEN) && writedata > 0xfff)\r
+                                                       writedata = 0xfff;\r
+                                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               if (LFU_NAN) writedata |= ~srcdata & ~dstdata;\r
+                                               if (LFU_NA)  writedata |= ~srcdata & dstdata;\r
+                                               if (LFU_AN)  writedata |= srcdata  & ~dstdata;\r
+                                               if (LFU_A)       writedata |= srcdata  & dstdata;\r
+                                       }\r
+                                       if(GOURD) \r
+                                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+\r
+                                       if(SRCSHADE) \r
+                                       {\r
+                                               int intensity = srcdata & 0xFF;\r
+                                               int ia = gd_ia >> 16;\r
+                                               if(ia & 0x80)\r
+                                                       ia = 0xFFFFFF00 | ia;\r
+                                               intensity += ia;\r
+                                               if(intensity < 0)\r
+                                                       intensity = 0;\r
+                                               if(intensity > 0xFF)\r
+                                                       intensity = 0xFF;\r
+                                               writedata = (srcdata & 0xFF00) | intensity;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       writedata=dstdata;\r
+                                       srczdata=dstzdata;\r
+                               }\r
+                               if (/*a1_phrase_mode || */BKGWREN || !inhibit)\r
+                               {\r
+                                       // write to the destination\r
+                                       WRITE_PIXEL(a1, REG(A1_FLAGS), writedata);\r
+                                       if (DSTWRZ) WRITE_ZDATA(a1, REG(A1_FLAGS), srczdata);\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               // load src data and Z\r
+                               if (SRCEN)\r
+                               {\r
+                                       srcdata = READ_PIXEL(a1, REG(A1_FLAGS));\r
+                                       if (SRCENZ)\r
+                                       {\r
+                                               srczdata = READ_ZDATA(a1, REG(A1_FLAGS));\r
+                                       }\r
+                                       else \r
+                                       if (cmd & 0x001c020)\r
+                                       {\r
+                                               srczdata = READ_RDATA(SRCZINT, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       srcdata = READ_RDATA(SRCDATA, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       if (cmd & 0x001c020)\r
+                                       {\r
+                                               srczdata = READ_RDATA(SRCZINT, a1, REG(A1_FLAGS), a1_phrase_mode);\r
+                                       }\r
+                               }\r
+\r
+                               // load dst data and Z \r
+                               if (DSTEN)\r
+                               {\r
+                                       dstdata = READ_PIXEL(a2, REG(A2_FLAGS));\r
+                                       if (DSTENZ)\r
+                                       {\r
+                                               dstzdata = READ_ZDATA(a2, REG(A2_FLAGS));\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               dstzdata = READ_RDATA(DSTZ, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       dstdata = READ_RDATA(DSTDATA, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+               \r
+                                       if (DSTENZ)\r
+                                       {\r
+                                               dstzdata = READ_RDATA(DSTZ, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       }\r
+                               }\r
+\r
+                               if(GOURZ) \r
+                                       srczdata=z_i[colour_index]>>16;\r
+\r
+                               // apply z comparator\r
+                               if (Z_OP_INF) if (srczdata < dstzdata)  inhibit = 1;\r
+                               if (Z_OP_EQU) if (srczdata == dstzdata) inhibit = 1;\r
+                               if (Z_OP_SUP) if (srczdata > dstzdata)  inhibit = 1;\r
+                               \r
+                               // apply data comparator\r
+                               if (DCOMPEN|BCOMPEN)\r
+                               {\r
+                                       if (!CMPDST)\r
+                                       {\r
+                                               // compare source pixel with pattern pixel\r
+                                               if (srcdata == READ_RDATA(PATTERNDATA, a1, REG(A1_FLAGS), a1_phrase_mode))\r
+                                                       inhibit=1;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               // compare destination pixel with pattern pixel\r
+                                               if (dstdata == READ_RDATA(PATTERNDATA, a2, REG(A2_FLAGS), a2_phrase_mode))\r
+                                                       inhibit=1;\r
+                                       }\r
+                                       if (a1_phrase_mode||a2_phrase_mode)\r
+                                               inhibit=!inhibit;\r
+                               }\r
+                               \r
+                               // compute the write data and store\r
+                               if (!inhibit)\r
+                               {                       \r
+                                       if (PATDSEL)\r
+                                       {\r
+                                               // use pattern data for write data\r
+                                               writedata= READ_RDATA(PATTERNDATA, a2, REG(A2_FLAGS), a2_phrase_mode);\r
+                                       }\r
+                                       else \r
+                                       if (INTADD)\r
+                                       {\r
+                                               // intensity addition\r
+                                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                                               if (!(TOPBEN) && writedata > 0xff)\r
+                                                       writedata = 0xff;\r
+                                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                                               if (!(TOPNEN) && writedata > 0xfff)\r
+                                                       writedata = 0xfff;\r
+                                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               if (LFU_NAN)\r
+                                                       writedata |= ~srcdata & ~dstdata;\r
+                                               if (LFU_NA)\r
+                                                       writedata |= ~srcdata & dstdata;\r
+                                               if (LFU_AN)\r
+                                                       writedata |= srcdata & ~dstdata;\r
+                                               if (LFU_A)\r
+                                                       writedata |= srcdata & dstdata;\r
+                                       }\r
+                                       if(GOURD) \r
+                                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+\r
+                                       if(SRCSHADE) \r
+                                       {\r
+                                               int intensity = srcdata & 0xFF;\r
+                                               int ia = gd_ia >> 16;\r
+                                               if(ia & 0x80)\r
+                                                       ia = 0xFFFFFF00 | ia;\r
+                                               intensity += ia;\r
+                                               if(intensity < 0)\r
+                                                       intensity = 0;\r
+                                               if(intensity > 0xFF)\r
+                                                       intensity = 0xFF;\r
+                                               writedata = (srcdata & 0xFF00) | intensity;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       writedata=dstdata;\r
+                                       srczdata=dstzdata;\r
+                               }\r
+\r
+                               if (/*a2_phrase_mode || */BKGWREN || !inhibit)\r
+                               {\r
+                                       // write to the destination\r
+                                       WRITE_PIXEL(a2, REG(A2_FLAGS), writedata);\r
+                                       if (DSTWRZ)\r
+                                               WRITE_ZDATA(a2, REG(A2_FLAGS), srczdata);\r
+                               }\r
+                       }\r
+                       // update x and y\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+\r
+                       if (GOURZ)\r
+                               z_i[colour_index]+=zadd;\r
+\r
+                       if ((GOURD)||(SRCSHADE))\r
+                       {\r
+                               gd_i[colour_index] += gd_ia;\r
+                               gd_c[colour_index] += gd_ca;\r
+                       }\r
+                       if ((GOURD)||(SRCSHADE)||(GOURZ))\r
+                       {\r
+                               if(a1_phrase_mode)\r
+                                       colour_index=(colour_index+1)&0x3;\r
+                       }\r
+               }\r
+\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+\r
+/*             if (a2_phrase_mode)\r
+               {\r
+                       a1_x+=(64/a1_psize)*a1_xadd;\r
+               }       \r
+               if (a2_phrase_mode)\r
+               {\r
+                       for (int nb=0;nb<(64/a2_psize)+1;nb++)\r
+                               a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+               }\r
+*/     }\r
+       \r
+       // write values back to registers \r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void blitter_blit(uint32 cmd)\r
+{\r
+       colour_index = 0;\r
+       src=(cmd&0x07);\r
+       dst=(cmd>>3)&0x07;\r
+       misc=(cmd>>6)&0x03;\r
+       a1ctl=(cmd>>8)&0x7;\r
+       mode=(cmd>>11)&0x07;\r
+       ity=(cmd>>14)&0x0f;\r
+       zop=(cmd>>18)&0x07;\r
+       op=(cmd>>21)&0x0f;\r
+       ctrl=(cmd>>25)&0x3f;\r
+\r
+       a1_addr=REG(A1_BASE);\r
+       a2_addr=REG(A2_BASE);\r
+\r
+       a1_zoffs = (REG(A1_FLAGS) >> 6) & 7;\r
+       a2_zoffs = (REG(A2_FLAGS) >> 6) & 7;\r
+       \r
+       xadd_a1_control=(REG(A1_FLAGS)>>16)&0x03;\r
+       xadd_a2_control=(REG(A2_FLAGS)>>16)&0x03;\r
+       a1_pitch = (REG(A1_FLAGS) & 3) ^ ((REG(A1_FLAGS) & 2) >> 1);\r
+       a2_pitch = (REG(A2_FLAGS) & 3) ^ ((REG(A2_FLAGS) & 2) >> 1);\r
+\r
+       n_pixels=(REG(PIXLINECOUNTER)&0xffff);\r
+       n_lines=((REG(PIXLINECOUNTER)>>16)&0xffff);\r
+\r
+       a1_x=(REG(A1_PIXEL)<<16)|(REG(A1_FPIXEL)&0xffff);\r
+       a1_y=(REG(A1_PIXEL)&0xffff0000)|(REG(A1_FPIXEL)>>16);\r
+       a1_width=blitter_scanline_width[((REG(A1_FLAGS)&0x00007E00)>>9)];\r
+\r
+       a2_x=(REG(A2_PIXEL)&0x0000ffff)<<16;\r
+       a2_y=(REG(A2_PIXEL)&0xffff0000);\r
+       a2_width=blitter_scanline_width[((REG(A2_FLAGS)&0x00007E00)>>9)];\r
+       a2_mask_x=0xffff|((REG(A2_MASK)&0x0000ffff)<<16);\r
+       a2_mask_y=((REG(A2_MASK)&0xffff0000)|0xffff);\r
+       \r
+       // \r
+       if (!((REG(A2_FLAGS))&0x8000))\r
+       {\r
+               a2_mask_x=0xffffffff; // must be 16.16\r
+               a2_mask_y=0xffffffff; // must be 16.16\r
+       }\r
+       \r
+       a1_phrase_mode=0;\r
+\r
+       // determine a1_yadd\r
+       if (YADD1_A1)\r
+               a1_yadd = 1 << 16;\r
+       else\r
+               a1_yadd = 0;\r
+\r
+       if (YSIGNSUB_A1)\r
+               a1_yadd=-a1_yadd;\r
+\r
+       // determine a1_xadd\r
+       switch (xadd_a1_control)\r
+       {\r
+       case XADDPHR:\r
+                               // add phrase offset to X and truncate\r
+                               a1_xadd = 1 << 16;\r
+\r
+                               a1_phrase_mode=1;\r
+                               break;\r
+       case XADDPIX:\r
+                               // add pixelsize (1) to X\r
+                               a1_xadd = 1 << 16;\r
+                               break;\r
+       case XADD0:     \r
+                               // add zero (for those nice vertical lines)\r
+                               a1_xadd = 0;\r
+                               break;\r
+       case XADDINC:\r
+                               // add the contents of the increment register\r
+                               a1_xadd = (REG(A1_INC) << 16)            | (REG(A1_FINC) & 0xffff);\r
+                               a1_yadd = (REG(A1_INC) & 0xffff0000) | (REG(A1_FINC) >> 16);\r
+                               break;\r
+       }\r
+       if (XSIGNSUB_A1)\r
+               a1_xadd=-a1_xadd;\r
+\r
+       // determine a2_yadd\r
+       if ((YADD1_A2)||(YADD1_A1))\r
+               a2_yadd = 1 << 16;\r
+       else\r
+               a2_yadd = 0;\r
+\r
+       if (YSIGNSUB_A2)\r
+               a2_yadd=-a2_yadd;\r
+\r
+       a2_phrase_mode=0;\r
+\r
+       // determine a2_xadd\r
+       switch (xadd_a2_control)\r
+       {\r
+       case XADDPHR:\r
+                               // add phrase offset to X and truncate\r
+                               a2_xadd = 1 << 16;\r
+\r
+                               a2_phrase_mode=1;\r
+                               break;\r
+       case XADDPIX:\r
+                               // add pixelsize (1) to X\r
+                               a2_xadd = 1 << 16;\r
+                               break;\r
+       case XADD0:     \r
+                               // add zero (for those nice vertical lines)\r
+                               a2_xadd = 0;\r
+                               break;\r
+       case XADDINC:\r
+                               // add the contents of the increment register\r
+                               // since there is no register for a2 we just add 1\r
+                               a2_xadd = 1 << 16;\r
+                               break;\r
+       }\r
+       if (XSIGNSUB_A2)\r
+               a2_xadd=-a2_xadd;\r
+\r
+       // modify outer loop steps based on command \r
+       a1_step_x=0;\r
+       a1_step_y=0;\r
+       a2_step_x=0;\r
+       a2_step_y=0;\r
+\r
+       if (cmd & 0x00000100)\r
+       {\r
+               a1_step_x = (REG(A1_FSTEP)&0xffff);\r
+               a1_step_y = (REG(A1_FSTEP)>>16);\r
+       }\r
+       if (cmd & 0x00000200)\r
+       {\r
+               a1_step_x += ((REG(A1_STEP)&0x0000ffff)<<16);\r
+               a1_step_y += ((REG(A1_STEP)&0xffff0000));\r
+       }\r
+       if (cmd & 0x00000400)\r
+       {\r
+               a2_step_x = (REG(A2_STEP)&0x0000ffff)<<16;\r
+               a2_step_y = (REG(A2_STEP)&0xffff0000);\r
+       }\r
+\r
+\r
+       outer_loop=n_lines;\r
+\r
+\r
+       a2_psize=1 << ((REG(A2_FLAGS) >> 3) & 7);\r
+       a1_psize=1 << ((REG(A1_FLAGS) >> 3) & 7);\r
+\r
+       // zbuffering\r
+       if (GOURZ)\r
+       {\r
+               zadd=jaguar_long_read(0xF02274);\r
+\r
+               for(int v=0;v<4;v++) \r
+                       z_i[v]=(int32)jaguar_long_read(0xF0228C+(v<<2));\r
+       }\r
+       if ((GOURD)||(GOURZ)||(SRCSHADE))\r
+       {\r
+               // gouraud shading\r
+               gouraud_add = jaguar_long_read(0xF02270);\r
+\r
+               \r
+               gd_c[0] = jaguar_byte_read(0xF02268);\r
+               gd_i[0] = jaguar_byte_read(0xF02269);\r
+               gd_i[0]<<=16;\r
+               gd_i[0]|=jaguar_word_read(0xF02240);\r
+\r
+               gd_c[1] = jaguar_byte_read(0xF0226A);\r
+               gd_i[1] = jaguar_byte_read(0xF0226b);\r
+               gd_i[1]<<=16;\r
+               gd_i[1]|=jaguar_word_read(0xF02242);\r
+\r
+               gd_c[2] = jaguar_byte_read(0xF0226C);\r
+               gd_i[2] = jaguar_byte_read(0xF0226d);\r
+               gd_i[2]<<=16;\r
+               gd_i[2]|=jaguar_word_read(0xF02244);\r
+\r
+               gd_c[3] = jaguar_byte_read(0xF0226E);\r
+               gd_i[3] = jaguar_byte_read(0xF0226f);\r
+               gd_i[3]<<=16; \r
+               gd_i[3]|=jaguar_word_read(0xF02246);\r
+\r
+               gd_ia = gouraud_add & 0xFFFFFF;\r
+               if(gd_ia & 0x800000)\r
+                       gd_ia = 0xFF000000 | gd_ia;\r
+\r
+               gd_ca = (gouraud_add>>24) & 0xFF;\r
+               if(gd_ca & 0x80)\r
+                       gd_ca = 0xFFFFFF00 | gd_ca;\r
+       }\r
+\r
+       // fix for zoop! and syndicate\r
+       if ((jaguar_mainRom_crc32==0x501be17c)||\r
+               (jaguar_mainRom_crc32==0x70895c51)||\r
+               (jaguar_mainRom_crc32==0x0f1f1497)||\r
+               (jaguar_mainRom_crc32==0xfc8f0dcd)\r
+          )\r
+       {\r
+               if (a1_step_x<0)\r
+                       a1_step_x=(-n_pixels)*65536;\r
+\r
+               if (a2_step_x<0)\r
+                       a2_step_x=(-n_pixels)*65536;;\r
+       }\r
+       else\r
+       // fix for wolfenstein 3d\r
+       if (jaguar_mainRom_crc32==0x3966698f)\r
+       {\r
+               if (n_pixels==24)\r
+               {\r
+                       if ((a1_step_x / 65536)==-28)\r
+                       {\r
+                               a1_step_x=-24*65536; // au lieu de -28\r
+                               a2_step_x=  0*65536; // au lieu de -8\r
+                       }\r
+               }\r
+       } \r
+       else\r
+       // fix for Tempest 2000\r
+       if (jaguar_mainRom_crc32==0x32816d44)\r
+       {\r
+/*\r
+               if ((n_lines!=1)&&((n_pixels==288)||(n_pixels==384)))\r
+               {\r
+                       fprintf(log_get(),"Blit!\n");\r
+                       fprintf(log_get(),"  cmd      = 0x%.8x\n",cmd);\r
+                       fprintf(log_get(),"  a1_base  = %08X\n", a1_addr);\r
+                       fprintf(log_get(),"  a1_pitch = %d\n", a1_pitch);\r
+                       fprintf(log_get(),"  a1_psize = %d\n", a1_psize);\r
+                       fprintf(log_get(),"  a1_width = %d\n", a1_width);\r
+                       fprintf(log_get(),"  a1_xadd  = %f (phrase=%d)\n", (float)a1_xadd / 65536.0, a1_phrase_mode);\r
+                       fprintf(log_get(),"  a1_yadd  = %f\n", (float)a1_yadd / 65536.0);\r
+                       fprintf(log_get(),"  a1_xstep = %f\n", (float)a1_step_x / 65536.0);\r
+                       fprintf(log_get(),"  a1_ystep = %f\n", (float)a1_step_y / 65536.0);\r
+                       fprintf(log_get(),"  a1_x     = %f\n", (float)a1_x / 65536.0);\r
+                       fprintf(log_get(),"  a1_y     = %f\n", (float)a1_y / 65536.0);\r
+                       fprintf(log_get(),"  a1_zoffs = %i\n",a1_zoffs);\r
+\r
+                       fprintf(log_get(),"  a2_base  = %08X\n", a2_addr);\r
+                       fprintf(log_get(),"  a2_pitch = %d\n", a2_pitch);\r
+                       fprintf(log_get(),"  a2_psize = %d\n", a2_psize);\r
+                       fprintf(log_get(),"  a2_width = %d\n", a2_width);\r
+                       fprintf(log_get(),"  a2_xadd  = %f (phrase=%d)\n", (float)a2_xadd / 65536.0, a2_phrase_mode);\r
+                       fprintf(log_get(),"  a2_yadd  = %f\n", (float)a2_yadd / 65536.0);\r
+                       fprintf(log_get(),"  a2_xstep = %f\n", (float)a2_step_x / 65536.0);\r
+                       fprintf(log_get(),"  a2_ystep = %f\n", (float)a2_step_y / 65536.0);\r
+                       fprintf(log_get(),"  a2_x     = %f\n", (float)a2_x / 65536.0);\r
+                       fprintf(log_get(),"  a2_y     = %f\n", (float)a2_y / 65536.0);\r
+                       fprintf(log_get(),"  a2_mask_x= 0x%.4x\n",a2_mask_x);\r
+                       fprintf(log_get(),"  a2_mask_y= 0x%.4x\n",a2_mask_y);\r
+                       fprintf(log_get(),"  a2_zoffs = %i\n",a2_zoffs);\r
+\r
+                       fprintf(log_get(),"  count    = %d x %d\n", n_pixels, n_lines);\r
+\r
+                       fprintf(log_get(),"  command  = %08X\n", cmd);\r
+                       fprintf(log_get(),"  dsten    = %i\n",DSTEN);\r
+                       fprintf(log_get(),"  srcen    = %i\n",SRCEN);\r
+                       fprintf(log_get(),"  patdsel  = %i\n",PATDSEL);\r
+                       fprintf(log_get(),"  color    = 0x%.8x\n",REG(PATTERNDATA));\r
+                       fprintf(log_get(),"  dcompen  = %i\n",DCOMPEN);\r
+                       fprintf(log_get(),"  bcompen  = %i\n",BCOMPEN);\r
+                       fprintf(log_get(),"  cmpdst   = %i\n",CMPDST);\r
+                       fprintf(log_get(),"  GOURZ    = %i\n",GOURZ);\r
+                       fprintf(log_get(),"  GOURD    = %i\n",GOURD);\r
+                       fprintf(log_get(),"  SRCSHADE = %i\n",SRCSHADE);\r
+                       fprintf(log_get(),"  DSTDATA  = 0x%.8x%.8x\n",REG(DSTDATA),REG(DSTDATA+4));\r
+               }       \r
+*/     }\r
+\r
+#ifdef LOG_BLITS\r
+//     if (start_logging)\r
+       {\r
+               fprintf(log_get(),"Blit!\n");\r
+               fprintf(log_get(),"  cmd      = 0x%.8x\n",cmd);\r
+               fprintf(log_get(),"  a1_base  = %08X\n", a1_addr);\r
+               fprintf(log_get(),"  a1_pitch = %d\n", a1_pitch);\r
+               fprintf(log_get(),"  a1_psize = %d\n", a1_psize);\r
+               fprintf(log_get(),"  a1_width = %d\n", a1_width);\r
+               fprintf(log_get(),"  a1_xadd  = %f (phrase=%d)\n", (float)a1_xadd / 65536.0, a1_phrase_mode);\r
+               fprintf(log_get(),"  a1_yadd  = %f\n", (float)a1_yadd / 65536.0);\r
+               fprintf(log_get(),"  a1_xstep = %f\n", (float)a1_step_x / 65536.0);\r
+               fprintf(log_get(),"  a1_ystep = %f\n", (float)a1_step_y / 65536.0);\r
+               fprintf(log_get(),"  a1_x     = %f\n", (float)a1_x / 65536.0);\r
+               fprintf(log_get(),"  a1_y     = %f\n", (float)a1_y / 65536.0);\r
+               fprintf(log_get(),"  a1_zoffs = %i\n",a1_zoffs);\r
+\r
+               fprintf(log_get(),"  a2_base  = %08X\n", a2_addr);\r
+               fprintf(log_get(),"  a2_pitch = %d\n", a2_pitch);\r
+               fprintf(log_get(),"  a2_psize = %d\n", a2_psize);\r
+               fprintf(log_get(),"  a2_width = %d\n", a2_width);\r
+               fprintf(log_get(),"  a2_xadd  = %f (phrase=%d)\n", (float)a2_xadd / 65536.0, a2_phrase_mode);\r
+               fprintf(log_get(),"  a2_yadd  = %f\n", (float)a2_yadd / 65536.0);\r
+               fprintf(log_get(),"  a2_xstep = %f\n", (float)a2_step_x / 65536.0);\r
+               fprintf(log_get(),"  a2_ystep = %f\n", (float)a2_step_y / 65536.0);\r
+               fprintf(log_get(),"  a2_x     = %f\n", (float)a2_x / 65536.0);\r
+               fprintf(log_get(),"  a2_y     = %f\n", (float)a2_y / 65536.0);\r
+               fprintf(log_get(),"  a2_mask_x= 0x%.4x\n",a2_mask_x);\r
+               fprintf(log_get(),"  a2_mask_y= 0x%.4x\n",a2_mask_y);\r
+               fprintf(log_get(),"  a2_zoffs = %i\n",a2_zoffs);\r
+\r
+               fprintf(log_get(),"  count    = %d x %d\n", n_pixels, n_lines);\r
+\r
+               fprintf(log_get(),"  command  = %08X\n", cmd);\r
+               fprintf(log_get(),"  dsten    = %i\n",DSTEN);\r
+               fprintf(log_get(),"  srcen    = %i\n",SRCEN);\r
+               fprintf(log_get(),"  patdsel  = %i\n",PATDSEL);\r
+               fprintf(log_get(),"  color    = 0x%.8x\n",REG(PATTERNDATA));\r
+               fprintf(log_get(),"  dcompen  = %i\n",DCOMPEN);\r
+               fprintf(log_get(),"  bcompen  = %i\n",BCOMPEN);\r
+               fprintf(log_get(),"  cmpdst   = %i\n",CMPDST);\r
+               fprintf(log_get(),"  GOURZ   = %i\n",GOURZ);\r
+               fprintf(log_get(),"  GOURD   = %i\n",GOURD);\r
+               fprintf(log_get(),"  SRCSHADE= %i\n",SRCSHADE);\r
+       }       \r
+#endif\r
+\r
+\r
+       blitter_working=1;\r
+#ifndef USE_GENERIC_BLITTER\r
+       if (!blitter_execute_cached_code(blitter_in_cache(cmd)))\r
+#endif\r
+               blitter_generic(cmd);\r
+       blitter_working=0;\r
+}\r
+\r
+uint32 blitter_reg_read(uint32 offset)\r
+{\r
+       uint32 data = blitter_ram[offset];\r
+       data <<= 8;\r
+       data |= blitter_ram[offset+1];\r
+       data <<= 8;\r
+       data |= blitter_ram[offset+2];\r
+       data <<= 8;\r
+       data |= blitter_ram[offset+3];\r
+       return data;\r
+}\r
+\r
+void blitter_reg_write(uint32 offset, uint32 data)\r
+{\r
+       blitter_ram[offset+0] = (data>>24) & 0xFF;\r
+       blitter_ram[offset+1] = (data>>16) & 0xFF;\r
+       blitter_ram[offset+2] = (data>>8) & 0xFF;\r
+       blitter_ram[offset+3] = data & 0xFF;\r
+}\r
+\r
+uint32 blitter_long_read(uint32 offset)\r
+{\r
+       return (blitter_word_read(offset) << 16) | blitter_word_read(offset+2);\r
+}\r
+\r
+void blitter_long_write(uint32 offset, uint32 data)\r
+{\r
+       blitter_word_write(offset, data >> 16);\r
+       blitter_word_write(offset+2, data & 0xFFFF);\r
+}\r
+\r
+void blitter_init(void)\r
+{\r
+       if (!blitter_cache_init)\r
+       {\r
+               for (int i=0;i<256;i++)\r
+               {\r
+                       blitter_cache[i]=(struct s_blitter_cache *)malloc(sizeof(struct s_blitter_cache));\r
+                       blitter_cache[i]->next=null;\r
+                       blitter_cache[i]->prev=null;\r
+               }\r
+               blitter_cache_init=1;\r
+       }\r
+#ifndef USE_GENERIC_BLITTER\r
+       #include "include/blit_i.h"\r
+#endif\r
+\r
+       blitter_reset();\r
+#ifdef GEN_CODE\r
+       blitters_code_fp=fopen("include/blit_c.h","awrt");\r
+       blitters_code_init_fp=fopen("include/blit_i.h","awrt");\r
+#endif\r
+}\r
+\r
+void blitter_reset(void)\r
+{\r
+       memset(blitter_ram, 0x00, 0xA0);\r
+}\r
+\r
+void blitter_done(void)\r
+{\r
+       blitter_list();\r
+#ifdef GEN_CODE\r
+       fclose(blitters_code_fp);\r
+       fclose(blitters_code_init_fp);\r
+#endif\r
+}\r
+\r
+void blitter_byte_write(uint32 offset, uint8 data)\r
+{\r
+       offset &= 0xFF;\r
+\r
+       if ((offset >= 0x7C) && (offset <= 0x9B))\r
+       {\r
+               switch (offset)\r
+               {\r
+               case 0x7C: break;\r
+               case 0x7D: blitter_ram[0x69] = data; break;\r
+               case 0x7E: blitter_ram[0x40] = data; break;\r
+               case 0x7F: blitter_ram[0x41] = data; break;\r
+\r
+               case 0x80: break;\r
+               case 0x81: blitter_ram[0x6B] = data; break;\r
+               case 0x82: blitter_ram[0x42] = data; break;\r
+               case 0x83: blitter_ram[0x43] = data; break;\r
+               \r
+               case 0x84: break;\r
+               case 0x85: blitter_ram[0x6D] = data; break;\r
+               case 0x86: blitter_ram[0x44] = data; break;\r
+               case 0x87: blitter_ram[0x45] = data; break;\r
+               \r
+               case 0x88: break;\r
+               case 0x89: blitter_ram[0x6F] = data; break;\r
+               case 0x9A: blitter_ram[0x46] = data; break;\r
+               case 0x9B: blitter_ram[0x47] = data; break;\r
+\r
+               }\r
+       }\r
+\r
+       blitter_ram[offset] = data;\r
+}\r
+\r
+void blitter_word_write(uint32 offset, uint16 data)\r
+{\r
+       blitter_byte_write(offset+0, (data>>8) & 0xFF);\r
+       blitter_byte_write(offset+1, data & 0xFF);\r
+\r
+       if ((offset & 0xFF) == 0x3A)\r
+       {\r
+               uint32 cmd = blitter_ram[0x38];\r
+               cmd <<= 8;\r
+               cmd |= blitter_ram[0x39];\r
+               cmd <<= 8;\r
+               cmd |= blitter_ram[0x3A];\r
+               cmd <<= 8;\r
+               cmd |= blitter_ram[0x3B];\r
+\r
+               blitter_blit(cmd);\r
+       }\r
+}\r
+\r
+uint8 blitter_byte_read(uint32 offset)\r
+{\r
+       offset &= 0xFF;\r
+\r
+       // status register\r
+       if (offset == (0x38+3))\r
+               return 0x01;    // always idle\r
+\r
+       return blitter_ram[offset];\r
+}\r
+\r
+uint16 blitter_word_read(uint32 offset)\r
+{\r
+       return (blitter_byte_read(offset) << 8) | blitter_byte_read(offset+1);\r
+}\r
diff --git a/src/cdbios.cpp b/src/cdbios.cpp
new file mode 100644 (file)
index 0000000..ee6b8fa
--- /dev/null
@@ -0,0 +1,840 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+// 20.02.2002: fixed sector to msf conversion\r
+// 19.02.2002: fixed a bug in toc encoding function\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+#include "include/cdbios.h"\r
+\r
+/* Added by SDLEMU (http://sdlemu.ngemu.com */\r
+/* Some GCC UNIX includes                   */\r
+#ifdef __GCCUNIX__\r
+       #include <unistd.h>\r
+#endif\r
+\r
+#define ERR_FLAG       0x3e00\r
+#define CD_TOC         0x2c00\r
+#define BIOS_VER    0x3004\r
+\r
+\r
+#define CDBIOS_INIT            0\r
+#define CDBIOS_INITM   1\r
+#define CDBIOS_INITF   2\r
+\r
+\r
+\r
+#define CD_INIT                0x3000\r
+#define CD_MODE                0x3006\r
+#define CD_ACK         0x300C\r
+#define CD_JERI                0x3012\r
+#define CD_SPIN                0x3018\r
+#define CD_STOP                0x301E\r
+#define CD_MUTE                0x3024\r
+#define CD_UMUTE       0x302A\r
+#define CD_PAUSE       0x3030\r
+#define CD_UPAUSE      0x3036\r
+#define CD_READ                0x303C\r
+#define CD_UREAD       0x3042\r
+#define CD_SETUP       0x3048\r
+#define CD_PTR         0x304E\r
+#define CD_OSAMP       0x3054\r
+#define CD_GETTOC      0x306A\r
+#define CD_INITM       0x3060\r
+#define CD_INITF       0x3066\r
+\r
+\r
+char *cdbios_command[]={"init","mode","ack","jeri","spin","stop","mute","umute","pause","upause",\r
+                                               "read","uread","setup","ptr","osamp","getoc","initm","initf",\r
+                                               0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\r
+\r
+#define CDROM_AUDIO_MODE       0\r
+#define CDROM_DATA_MODE                1\r
+\r
+#define CDROM_SINGLE_SPEED     0\r
+#define CDROM_DOUBLE_SPEED  1\r
+\r
+#define CDROM_STATUS_OK                0\r
+#define CDROM_STATUS_ERROR     1\r
+\r
+\r
+uint32 cdrom_mode                              = CDROM_DATA_MODE;\r
+uint32 cdrom_speed                             = CDROM_SINGLE_SPEED;\r
+uint32 cdrom_oversample_factor = 1;\r
+uint32 cdbios_session=0;\r
+\r
+uint32 cdrom_destination_buffer_beginning;\r
+uint32 cdrom_destination_buffer_end;\r
+uint32 cdrom_time_code;\r
+uint32 cdrom_seek_only;\r
+uint32 cdrom_partition_marker;\r
+uint32 cdrom_circular_buffer_size;\r
+\r
+uint32 cdbios_init_type;\r
+uint32 *cdbios_sector_lut;\r
+uint32 cdbios_init_done=0;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_build_sector_lut(void)\r
+{\r
+       uint32 last_sector=0;\r
+       int32 offset=0;\r
+       uint32 sector=0;\r
+\r
+       s_cdi_track *last_track=&cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1];\r
+       \r
+       last_sector=last_track->start_lba+last_track->total_length-1;\r
+\r
+\r
+       cdbios_sector_lut=(uint32*)malloc((last_sector+1)*sizeof(uint32));\r
+       memset(cdbios_sector_lut,0xff,(last_sector+1)*sizeof(uint32));\r
+\r
+       for (int session=0;session<cdi_descriptor->nb_of_sessions;session++)\r
+       {\r
+               for (int track=0;track<cdi_descriptor->sessions[session].nb_of_tracks;track++)\r
+               {\r
+                       s_cdi_track *current_track=&cdi_descriptor->sessions[session].tracks[track];\r
+\r
+                       if (offset<((int32)(current_track->start_lba-1)))\r
+                       {\r
+                               fprintf(log_get(),"cdbios: postgap between %i and %i\n",offset,current_track->start_lba-1);\r
+\r
+                               // fill-in postgap\r
+                               for (;offset<current_track->start_lba;offset++)\r
+                               {\r
+                                       cdbios_sector_lut[offset]=0xffffffff;\r
+                               }\r
+\r
+                       }                       \r
+                       fprintf(log_get(),"cdbios: data between %i and %i\n",offset,current_track->start_lba+current_track->total_length-1);\r
+                       for (;offset<current_track->start_lba+current_track->total_length;offset++)\r
+                       {\r
+                               cdbios_sector_lut[offset]=sector;\r
+                               sector++;\r
+                       }\r
+\r
+               }\r
+       }\r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_get_time(uint32 sectors, uint32 *mm, uint32 *ss, uint32 *ff)\r
+{\r
+       uint32 _sectors=sectors;\r
+\r
+       uint32 _mm=(sectors/(60*75));\r
+       sectors-=(_mm*(60*75));\r
+       uint32 _ss=(sectors/75);\r
+       sectors-=(_ss*75);\r
+       uint32 _ff=sectors;\r
+\r
+       *mm=_mm;\r
+       *ss=_ss;\r
+       *ff=_ff;\r
+       \r
+\r
+//     fprintf(log_get(),"[%.2i:%.2i:%.2i]\n",_mm,_ss,_ff);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_encode_toc(void)\r
+{\r
+       int i;\r
+       uint32 base=CD_TOC;\r
+\r
+       jaguar_byte_write(base++,0x00);\r
+       jaguar_byte_write(base++,0x00);\r
+       jaguar_byte_write(base++,0x01);\r
+\r
+       int nbtracks=0;\r
+       for (i=0;i<cdi_descriptor->nb_of_sessions;i++)\r
+               nbtracks+=cdi_descriptor->sessions[i].nb_of_tracks;\r
+\r
+       jaguar_byte_write(base++,nbtracks+1);\r
+       jaguar_byte_write(base++,cdi_descriptor->nb_of_sessions);\r
+       \r
+       uint32 mm=0;\r
+       uint32 ss=0;\r
+       uint32 ff=0;\r
+\r
+       cdbios_get_time(cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].start_lba+\r
+                                       cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].length+\r
+                                       cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].tracks[cdi_descriptor->sessions[cdi_descriptor->nb_of_sessions-1].nb_of_tracks-1].pregap_length,\r
+                                       &mm,&ss,&ff);\r
+\r
+       jaguar_byte_write(base++,mm);\r
+       jaguar_byte_write(base++,ss);\r
+       jaguar_byte_write(base++,ff);\r
+\r
+       int track_count=1;\r
+       for (i=0;i<cdi_descriptor->nb_of_sessions;i++)\r
+               for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)\r
+               {\r
+                       s_cdi_track *track=&cdi_descriptor->sessions[i].tracks[j];\r
+                       \r
+//                     fprintf(log_get(),"track %i\n",track_count);\r
+\r
+                       jaguar_byte_write(base++,track_count);\r
+                       cdbios_get_time(track->start_lba+track->pregap_length,&mm,&ss,&ff);\r
+                       jaguar_byte_write(base++,mm);\r
+                       jaguar_byte_write(base++,ss);\r
+                       jaguar_byte_write(base++,ff);\r
+                       jaguar_byte_write(base++,i);\r
+                       cdbios_get_time(track->length,&mm,&ss,&ff);\r
+                       jaguar_byte_write(base++,mm);\r
+                       jaguar_byte_write(base++,ss);\r
+                       jaguar_byte_write(base++,ff);\r
+                               \r
+                       track_count++;\r
+               }\r
+\r
+       cdi_tracks_count=track_count;\r
+       cdi_tracks=(s_cdi_track**)malloc(track_count*sizeof(s_cdi_track*));\r
+       track_count=0;\r
+       for (i=0;i<cdi_descriptor->nb_of_sessions;i++)\r
+       {\r
+               for (int j=0;j<cdi_descriptor->sessions[i].nb_of_tracks;j++)\r
+               {\r
+                       cdi_tracks[track_count]=&cdi_descriptor->sessions[i].tracks[j];\r
+                       track_count++;\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_decode_toc(void)\r
+{\r
+       uint32 addr=0x2c00;\r
+       uint32 nb_tracks;\r
+       \r
+       fprintf(log_get(),"cdbios: toc:\n");\r
+       fprintf(log_get(),"cdbios:\n");\r
+       addr+=2;\r
+       fprintf(log_get(),"cdbios: minimum track number: %i\n",jaguar_byte_read(addr++));\r
+       fprintf(log_get(),"cdbios: maximum track number: %i\n",nb_tracks=jaguar_byte_read(addr++));\r
+       fprintf(log_get(),"cdbios: number of sessions  : %i\n",jaguar_byte_read(addr++));\r
+       fprintf(log_get(),"cdbios: start of last lead out time: %.2i:%.2i:%.2i\n",\r
+                                         jaguar_byte_read(addr++),jaguar_byte_read(addr++),jaguar_byte_read(addr++));\r
+\r
+       uint32 mm,ss,ff;\r
+\r
+       nb_tracks--;\r
+\r
+       while (nb_tracks)\r
+       {\r
+               fprintf(log_get(),"cdbios:\n");\r
+               fprintf(log_get(),"cdbios: track          : %i\n",jaguar_byte_read(addr++));\r
+               \r
+               mm=jaguar_byte_read(addr++);\r
+               ss=jaguar_byte_read(addr++);\r
+               ff=jaguar_byte_read(addr++);\r
+\r
+               fprintf(log_get(),"cdbios: start at       : %.2i:%.2i:%.2i\n",mm,ss,ff);\r
+               fprintf(log_get(),"cdbios: session        : %i\n",jaguar_byte_read(addr++));\r
+               \r
+               mm=jaguar_byte_read(addr++);\r
+               ss=jaguar_byte_read(addr++);\r
+               ff=jaguar_byte_read(addr++);\r
+\r
+               fprintf(log_get(),"cdbios: duration       : %.2i:%.2i:%.2i\n",mm,ss,ff);\r
+               nb_tracks--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_boot(char *filename)\r
+{\r
+       cd_bios_init();\r
+\r
+\r
+       cdi_fp=cdi_open(filename);\r
+       cdi_descriptor=cdi_get_descriptor(cdi_fp,log_get());\r
+       if (cdi_descriptor==0)\r
+       {\r
+               fprintf(log_get(),"cdi: bad image\n");\r
+               cdi_close(cdi_fp);\r
+               return;\r
+       }\r
+       cdi_dump_descriptor(log_get(),cdi_descriptor);\r
+       cdbios_build_sector_lut();\r
+\r
+       uint8 *code=cdi_extract_boot_code(cdi_fp,cdi_descriptor);\r
+\r
+       // copy the code to ram\r
+       for (uint32 i=0;i<cdi_code_length;i++)\r
+               jaguar_byte_write(cdi_load_address+i,code[i]);\r
+\r
+       // set the boot address\r
+       jaguar_long_write(0x00000004,cdi_load_address);\r
+\r
+       // write the toc\r
+       cdbios_encode_toc();\r
+\r
+       // dump the toc\r
+       cdbios_decode_toc();\r
+\r
+//     fprintf(log_get(),"cdbios: boot code:\n");\r
+//     jaguar_dasm(cdi_load_address, cdi_code_length);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_init(void)\r
+{\r
+       fprintf(log_get(),"cd_bios: initializing\n");\r
+       for (int i=0;i<19;i++)\r
+       {\r
+               // RESET opcode\r
+               jaguar_word_write(0x3000+(i*6),0x4E70);\r
+       }\r
+       cd_bios_reset();\r
+       cdbios_init_done=1;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_reset(void)\r
+{\r
+       fprintf(log_get(), "cd_bios: reset\n");\r
+       jaguar_word_write(BIOS_VER, 0x0405);\r
+       cdrom_mode                              = CDROM_DATA_MODE;\r
+       cdrom_speed                             = CDROM_SINGLE_SPEED;\r
+       cdrom_oversample_factor = 1;\r
+       cdbios_session                  = 0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_done(void)\r
+{\r
+       fprintf(log_get(),"cd_bios: done\n");\r
+       close(cdi_fp);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_init(void)\r
+{\r
+       cdbios_init_type = CDBIOS_INIT;\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+       fprintf(log_get(), "cdbios: init(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_mode(void)\r
+{\r
+//     uint32 data = s68000context.dreg[0];\r
+       uint32 data = m68k_get_reg(NULL, M68K_REG_D0);\r
+\r
+       uint32 cdrom_mode = (data>>1) & 0x01;\r
+       uint32 cdrom_speed = data & 0x01;\r
+       jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+\r
+//     fprintf(log_get(),"cdbios: %s\n",(cdrom_mode==CDROM_AUDIO_MODE)?"audio mode":"data mode");\r
+//     fprintf(log_get(),"cdbios: %s\n",(cdrom_speed==CDROM_DOUBLE_SPEED)?"double speed":"single speed");\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_ack(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_jeri(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_spin(void)\r
+{\r
+//     uint16 spin=(1<<(s68000context.dreg[0]&0xffff));\r
+       uint16 spin = (1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF));\r
+       cdbios_session = spin;\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+//     fprintf(log_get(),"cdbios: switching to session %i\n",spin);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_stop(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_mute(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_umute(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_pause(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_upause(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+void cdi_read_block(uint32 sector, uint8 *buffer, uint32 count)\r
+{\r
+       while (count)\r
+       {\r
+               cdi_load_sector(cdbios_sector_lut[sector],buffer);\r
+               buffer+=2352;\r
+               sector++;\r
+               count--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_read(void)\r
+{\r
+       static uint8 cdbios_sector[2352];\r
+\r
+/*     cdrom_destination_buffer_beginning=s68000context.areg[0];\r
+       cdrom_destination_buffer_end=s68000context.areg[1];\r
+       cdrom_time_code=(s68000context.dreg[0])&0x7fffffff;\r
+       cdrom_seek_only=s68000context.dreg[0]&0x80000000;*/\r
+       cdrom_destination_buffer_beginning = m68k_get_reg(NULL, M68K_REG_A0);\r
+       cdrom_destination_buffer_end = m68k_get_reg(NULL, M68K_REG_A1);\r
+       cdrom_time_code = m68k_get_reg(NULL, M68K_REG_D0) & 0x7FFFFFFF;\r
+       cdrom_seek_only = m68k_get_reg(NULL, M68K_REG_D0) & 0x80000000;\r
+\r
+/*     cdrom_partition_marker=s68000context.dreg[1];\r
+       if (s68000context.dreg[2]!=0)\r
+               cdrom_circular_buffer_size=(1<<s68000context.dreg[2]);*/\r
+       cdrom_partition_marker = m68k_get_reg(NULL, M68K_REG_D1);\r
+       if (m68k_get_reg(NULL, M68K_REG_D2) != 0)\r
+               cdrom_circular_buffer_size = 1 << m68k_get_reg(NULL, M68K_REG_D2);\r
+       else\r
+               cdrom_circular_buffer_size = 0xFFFFFFFF; // no circular buffer;\r
+\r
+       uint32 mm = (10 * ((cdrom_time_code >> 20) & 0x0F)) + ((cdrom_time_code >> 16) & 0x0F);\r
+       uint32 ss = (10 * ((cdrom_time_code >> 12) & 0x0F)) + ((cdrom_time_code >> 8) & 0x0F);\r
+       uint32 ff = (10 * ((cdrom_time_code >> 4) & 0x0F)) + ((cdrom_time_code >> 0) & 0x0F);\r
+\r
+       fprintf(log_get(),"cdbios: read(0x%.8x, 0x%.8x, %.2i:%.2i:%.2i, %i) %s\n",\r
+                                               cdrom_destination_buffer_beginning,\r
+                                               cdrom_destination_buffer_end,\r
+                                               mm,ss,ff,\r
+                                               cdrom_circular_buffer_size,cdrom_seek_only?"(seek only)":"");\r
+\r
+       if (!cdrom_seek_only)\r
+       {\r
+               if (cdbios_init_type==CDBIOS_INITM)\r
+               {\r
+                       fprintf(log_get(),"cdbios: partition marker: %c%c%c%c (0x%.8x)\n",\r
+                               ((cdrom_partition_marker>>24)&0xff),\r
+                               ((cdrom_partition_marker>>16)&0xff),\r
+                               ((cdrom_partition_marker>>8)&0xff),\r
+                               (cdrom_partition_marker&0xff),\r
+                               cdrom_partition_marker\r
+                               );\r
+               }\r
+               if (((int32)cdrom_circular_buffer_size)==-1)\r
+                       cdrom_circular_buffer_size=0xffffffff;\r
+\r
+               uint32 track_offset=((ss+(60*mm))*75)+ff;\r
+\r
+               fprintf(log_get(),"cdbios: track offset: %i\n",track_offset);\r
+               uint32 nb_sectors=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)/2352;\r
+               uint32 reste=(cdrom_destination_buffer_end-cdrom_destination_buffer_beginning)%2352;\r
+               uint32 buffer_offset=0;\r
+               uint32 nb_bytes_to_read=cdrom_destination_buffer_end-cdrom_destination_buffer_beginning+1;\r
+\r
+               if (cdbios_init_type==CDBIOS_INITF)\r
+               {\r
+//                     if (cdrom_destination_buffer_beginning==0x00046000)\r
+//                             return;\r
+\r
+                       uint8 *buffer=(uint8*)malloc((nb_sectors+1)*2352);\r
+                       cdi_read_block(track_offset,buffer,nb_sectors+1);\r
+                       for (uint32 k=0;k<nb_bytes_to_read;k++)\r
+                               jaguar_byte_write(cdrom_destination_buffer_beginning+k,buffer[k]);\r
+                       free(buffer);\r
+               }\r
+               else\r
+               if (cdbios_init_type==CDBIOS_INITM)\r
+               {\r
+                       uint8 *buffer=(uint8*)malloc((31+nb_sectors+1)*2352);\r
+                       cdi_read_block(track_offset,buffer,nb_sectors+1);\r
+                       \r
+                       uint32  count=(31+nb_sectors+1)*2352;\r
+                       uint8   *alias=buffer;\r
+                       uint32  marker_count=2;\r
+\r
+                       while (count-4)\r
+                       {\r
+                               if (\r
+                                       (alias[0]==((cdrom_partition_marker>>24)&0xff))&&\r
+                                       (alias[1]==((cdrom_partition_marker>>16)&0xff))&&\r
+                                       (alias[2]==((cdrom_partition_marker>>8)&0xff))&&\r
+                                       (alias[3]==((cdrom_partition_marker>>0)&0xff))\r
+                                       )\r
+                               {\r
+                                       marker_count--;\r
+                                       if (marker_count)\r
+                                       {\r
+                                               alias+=3;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               exit(0);\r
+                                               alias+=4;\r
+                                               for (uint32 k=0;k<nb_bytes_to_read;k++)\r
+                                                       jaguar_byte_write(cdrom_destination_buffer_beginning+k,alias[k]);\r
+                                               free(buffer);\r
+                                               return;\r
+                                       }\r
+                               }\r
+                               alias++;\r
+                               count--;\r
+                       }\r
+                       free(buffer);\r
+               }\r
+               else\r
+               {\r
+                       fprintf(log_get(),"cdbios: unsupported read mode\n");\r
+               }\r
+       }\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_uread(void)\r
+{\r
+       // stop the recording started with a cd_read command\r
+       // for now, there is nothing to do\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_setup(void)\r
+{\r
+       // initialize the cd system\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_ptr(void)\r
+{\r
+//     s68000context.areg[0]=cdrom_destination_buffer_end+4;\r
+       m68k_set_reg(M68K_REG_A0, cdrom_destination_buffer_end + 4);\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_osamp(void)\r
+{\r
+//     cdrom_oversample_factor=(1<<(s68000context.dreg[0]&0xffff));\r
+       cdrom_oversample_factor = 1 << (m68k_get_reg(NULL, M68K_REG_D0) & 0xFFFF);\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_gettoc(void)\r
+{\r
+    jaguar_word_write(ERR_FLAG,CDROM_STATUS_OK);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_initm(void)\r
+{\r
+       cdbios_init_type = CDBIOS_INITM;\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+//     fprintf(log_get(),"cdbios: initm(0x%.8x)\n",s68000context.areg[0]);\r
+       fprintf(log_get(), "cdbios: initm(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdbios_cmd_initf(void)\r
+{\r
+       cdbios_init_type = CDBIOS_INITF;\r
+    jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+//     fprintf(log_get(),"cdbios: initf(0x%.8x)\n",s68000context.areg[0]);\r
+       fprintf(log_get(), "cdbios: initf(0x%.8x)\n", m68k_get_reg(NULL, M68K_REG_A0));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_process(uint32 offset)\r
+{\r
+       if (!cdbios_init_done)\r
+               return;\r
+\r
+       fprintf(log_get(), "cdbios: processing command '%s'\n", cdbios_command[(offset-0x3000) / 6]);\r
+       fprintf(log_get(), "cdbios: 68K PC=%08X SP=%08X\n", jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));\r
+\r
+       switch (offset)\r
+       {\r
+       case CD_INIT:   cdbios_cmd_init();              break;          \r
+       case CD_MODE:   cdbios_cmd_mode();              break;          \r
+       case CD_ACK:    cdbios_cmd_ack();               break;  \r
+       case CD_JERI:   cdbios_cmd_jeri();              break;\r
+       case CD_SPIN:   cdbios_cmd_spin();              break;\r
+       case CD_STOP:   cdbios_cmd_stop();              break;\r
+       case CD_MUTE:   cdbios_cmd_mute();              break;\r
+       case CD_UMUTE:  cdbios_cmd_umute();             break;\r
+       case CD_PAUSE:  cdbios_cmd_pause();             break;\r
+       case CD_UPAUSE: cdbios_cmd_upause();    break;\r
+       case CD_READ:   cdbios_cmd_read();              break;\r
+       case CD_UREAD:  cdbios_cmd_uread();             break;\r
+       case CD_SETUP:  cdbios_cmd_setup();             break;\r
+       case CD_PTR:    cdbios_cmd_ptr();               break;\r
+       case CD_OSAMP:  cdbios_cmd_osamp();             break;\r
+       case CD_GETTOC: cdbios_cmd_gettoc();    break;\r
+       case CD_INITM:  cdbios_cmd_initm();             break;\r
+       case CD_INITF:  cdbios_cmd_initf();             break;\r
+\r
+       default: fprintf(log_get(), "cdbios: unemulated entry point at %08X 68K PC=%08X SP=%08X\n", offset, jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)), m68k_get_reg(NULL, M68K_REG_A7));\r
+               jaguar_word_write(ERR_FLAG, CDROM_STATUS_OK);\r
+       }\r
+\r
+       // rts\r
+//     s68000context.pc=jaguar_long_read(s68000context.areg[7]);\r
+//     s68000context.areg[7]=(s68000context.areg[7]+4)&0xffffffff;\r
+       m68k_set_reg(M68K_REG_PC, jaguar_long_read(m68k_get_reg(NULL, M68K_REG_A7)));\r
+       m68k_set_reg(M68K_REG_A7, (m68k_get_reg(NULL, M68K_REG_A7) + 4) & 0xFFFFFFFF);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cd_bios_exec(uint32 scanline)\r
+{\r
+       // single speed mode: 150 Kb/s (153600 bytes/s)\r
+       // single speed mode: 300 Kb/s (307200 bytes/s)\r
+       uint32 bytes_per_scanline=(153600*((cdrom_speed==CDROM_DOUBLE_SPEED)?2:1))/525;\r
+}\r
diff --git a/src/cdi.cpp b/src/cdi.cpp
new file mode 100644 (file)
index 0000000..00f5e33
--- /dev/null
@@ -0,0 +1,316 @@
+#include "cdi.h"\r
+\r
+/* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
+/* Added for GCC UNIX compatibility          */\r
+#ifdef __GCCUNIX__\r
+       #include <unistd.h>\r
+       #include <sys/types.h>\r
+       #include <fcntl.h>\r
+\r
+       #define O_BINARY (0)\r
+#endif\r
+\r
+#define CDI_V2  0x80000004\r
+#define CDI_V3  0x80000005\r
+#define CDI_V35 0x80000006\r
+\r
+static uint8 cdi_track_start_mark[10] = { 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF };\r
+\r
+\r
+\r
+int cdi_fp;\r
+uint32 cdi_load_address;\r
+uint32 cdi_code_length;\r
+s_cdi_descriptor       *cdi_descriptor;\r
+s_cdi_track                    **cdi_tracks;\r
+uint32                                 cdi_tracks_count;\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+int cdi_open(char *path)\r
+{\r
+       fprintf(log_get(),"cdi: opening %s\n",path);\r
+       return(open(path,O_BINARY|O_RDONLY));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdi_close(int fp)\r
+{\r
+       fprintf(log_get(),"cdi: closing\n");\r
+       close(fp);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+#ifdef __PORT__\r
+long tell(int fd)\r
+{\r
+       return lseek(fd, 0LL, SEEK_CUR);\r
+}\r
+#endif\r
+s_cdi_descriptor *cdi_get_descriptor(int fp, FILE *stdfp)\r
+{\r
+       s_cdi_descriptor *descriptor;\r
+       \r
+       uint32 previous_position=0;\r
+\r
+       if (fp==-1)\r
+               return(0);\r
+\r
+       descriptor=(s_cdi_descriptor *)malloc(sizeof(s_cdi_descriptor));\r
+       if (descriptor==0)\r
+               return(0);\r
+\r
+       lseek(fp,0,SEEK_END);\r
+       descriptor->length=tell(fp);\r
+       if (descriptor->length<8)\r
+       {\r
+               if (stdfp) fprintf(stdfp,"cdi: image is too short (%i bytes)\n",descriptor->length);\r
+               free(descriptor);\r
+               return(0);\r
+       }\r
+       lseek(fp,descriptor->length-8,SEEK_SET);\r
+       read(fp,&descriptor->version,4);\r
+       read(fp,&descriptor->header_offset,4);\r
+       lseek(fp,descriptor->header_offset,SEEK_SET);\r
+       read(fp,&descriptor->nb_of_sessions,2);\r
+\r
+       descriptor->sessions=(s_cdi_session *)malloc(descriptor->nb_of_sessions*sizeof(s_cdi_session));\r
+       if (descriptor->sessions==0)\r
+       {\r
+               free(descriptor);\r
+               return(0);\r
+       }\r
+       if (stdfp) fprintf(stdfp,"cdi: %i sessions\n",descriptor->nb_of_sessions);\r
+       uint32 track_position=0;\r
+       for (uint16 session=0;session<descriptor->nb_of_sessions;session++)\r
+       {\r
+               read(fp,&descriptor->sessions[session].nb_of_tracks,2);\r
+               descriptor->sessions[session].tracks=(s_cdi_track*)malloc(descriptor->sessions[session].nb_of_tracks*sizeof(s_cdi_track));\r
+\r
+               if (stdfp) fprintf(stdfp,"cdi:\ncdi: reading session %i (%i tracks)\n",session,descriptor->sessions[session].nb_of_tracks);\r
+\r
+               for (uint16 track=0;track<descriptor->sessions[session].nb_of_tracks;track++)\r
+               {\r
+                       static char current_start_mark[10];\r
+                       s_cdi_track *current_track=&descriptor->sessions[session].tracks[track];\r
+                       if (stdfp) fprintf(stdfp,"cdi:\ncdi: \t\treading track %i\n",track);\r
+\r
+                       uint32 temp_value;\r
+\r
+                       read(fp,&temp_value, 4);\r
+                       if (temp_value != 0)\r
+                               lseek(fp, 8, SEEK_CUR); // extra data (DJ 3.00.780 and up)\r
+       \r
+                       read(fp,current_start_mark, 10);\r
+                       if (memcmp(cdi_track_start_mark, current_start_mark, 10)) \r
+                       {\r
+                               if (stdfp) fprintf(stdfp,"cdi: could not find the track start mark");\r
+                               return(0);\r
+                       }\r
+                       read(fp,current_start_mark, 10);\r
+                       if (memcmp(cdi_track_start_mark, current_start_mark, 10)) \r
+                       {\r
+                               if (stdfp) fprintf(stdfp,"cdi: could not find the track start mark");\r
+                               return(0);\r
+                       }\r
+\r
+                       lseek(fp, 4, SEEK_CUR);\r
+                       read(fp,&current_track->filename_length, 1);\r
+                       lseek(fp, current_track->filename_length, SEEK_CUR);\r
+\r
+                       lseek(fp, 11, SEEK_CUR);\r
+                       lseek(fp, 4, SEEK_CUR);\r
+                       lseek(fp, 4, SEEK_CUR);\r
+                       read(fp,&temp_value, 4);\r
+                       if (temp_value == 0x80000000)\r
+                               lseek(fp, 8, SEEK_CUR); // DJ4\r
+                       lseek(fp, 2, SEEK_CUR);\r
+                       \r
+                       read(fp, &current_track->pregap_length, 4);\r
+                       if (current_track->pregap_length!=150)\r
+                       {\r
+                               fprintf(log_get(),"cdi: warning: pregap different than 150\n");\r
+                       }\r
+                       read(fp, &current_track->length, 4);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\tpregap length : %i\n", current_track->pregap_length);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\tlength : %i\n", current_track->length);\r
+\r
+                       lseek(fp, 6, SEEK_CUR);\r
+                       \r
+                       read(fp, &current_track->mode, 4);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\tmode : %i\n", current_track->mode);\r
+\r
+                       lseek(fp, 12, SEEK_CUR);\r
+                       read(fp, &current_track->start_lba, 4);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\tstart lba : %i\n", current_track->start_lba);\r
+                       read(fp, &current_track->total_length, 4);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\ttotal length : %i\n", current_track->total_length);\r
+                       lseek(fp, 16, SEEK_CUR);\r
+                       read(fp, &current_track->sector_size_value, 4);\r
+                       if (stdfp) fprintf(stdfp,"cdi: \t\t\tsector size : %i\n", current_track->sector_size_value);\r
+\r
+                       switch(current_track->sector_size_value)\r
+                       {\r
+                       case 0 : current_track->sector_size = 2048; break;\r
+                       case 1 : current_track->sector_size = 2336; break;\r
+                       case 2 : current_track->sector_size = 2352; break;\r
+                       default: {\r
+                                               if (stdfp) fprintf(stdfp,"cdi: \t\t\tunsupported %i bytes sector",current_track->sector_size_value);\r
+                                               return(0);\r
+                                       }\r
+                       }\r
+                       \r
+                       if (current_track->mode > 2) \r
+                               if (stdfp) fprintf(stdfp,"cdi: \t\t\ttrack mode %i not supported",current_track->mode);\r
+\r
+                       lseek(fp, 29, SEEK_CUR);\r
+                       if (descriptor->version != CDI_V2)\r
+                       {\r
+                               lseek(fp, 5, SEEK_CUR);\r
+                               read(fp,&temp_value, 4);\r
+                               if (temp_value == 0xffffffff)\r
+                                       lseek(fp, 78, SEEK_CUR); // extra data (DJ 3.00.780 and up)\r
+                       }\r
+                       current_track->position=track_position;\r
+                       track_position+=(current_track->pregap_length+current_track->length)*current_track->sector_size;\r
+                       previous_position=track_position;\r
+               }\r
+               lseek(fp, 4, SEEK_CUR);\r
+               lseek(fp, 8, SEEK_CUR);\r
+               if (descriptor->version != CDI_V2)\r
+                       lseek(fp, 1, SEEK_CUR);\r
+\r
+       }\r
+    if (descriptor->header_offset == 0) \r
+               return(0);\r
+\r
+       return(descriptor);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdi_dump_descriptor(FILE *fp,s_cdi_descriptor *cdi_descriptor)\r
+{\r
+       fprintf(fp,"cdi: %i Mb\n",cdi_descriptor->length>>20);\r
+       fprintf(fp,"cdi: format version ");\r
+       switch(cdi_descriptor->version)\r
+       {\r
+       case CDI_V2:    fprintf(fp,"2\n"); break;\r
+       case CDI_V3:    fprintf(fp,"3\n"); break;\r
+       case CDI_V35:   fprintf(fp,"3.5\n"); break;\r
+       default:                fprintf(fp,"unknown\n"); break;\r
+       }\r
+       fprintf(fp,"cdi: %i sessions\n",cdi_descriptor->nb_of_sessions);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 *cdi_extract_boot_code(int fp, s_cdi_descriptor *cdi_descriptor)\r
+{\r
+       s_cdi_track *boot_track=&cdi_descriptor->sessions[1].tracks[0];\r
+       uint32 boot_track_size=boot_track->length*boot_track->sector_size;\r
+\r
+       uint8 *boot_track_data=(uint8*)malloc(boot_track_size);\r
+       lseek(fp,2+(boot_track->position), SEEK_SET);\r
+       read(fp,boot_track_data,boot_track_size);\r
+       \r
+       uint32 *boot_track_data_32=(uint32*)boot_track_data;\r
+       uint32 offset=0;\r
+       while (offset<(boot_track_size>>2))\r
+       {\r
+               if (boot_track_data_32[offset]==0x49205452)\r
+                       break;\r
+               offset++;\r
+       }\r
+       if (offset==(boot_track_size>>2))\r
+       {\r
+               fprintf(log_get(),"cdi: cannot find the boot code\n");\r
+               return(NULL);\r
+       }\r
+       offset=(offset<<2)+4;\r
+       uint16 *data16=(uint16*)&boot_track_data[offset];\r
+       cdi_load_address=*data16++; cdi_load_address<<=16; cdi_load_address|=*data16++;\r
+       cdi_code_length=*data16++; cdi_code_length<<=16; cdi_code_length|=*data16++;\r
+       fprintf(log_get(),"cdi: load address: 0x%.8x\n",cdi_load_address);\r
+       fprintf(log_get(),"cdi: length: 0x%.8x\n",cdi_code_length);\r
+       fprintf(log_get(),"cdi: byte swapping boot code\n");\r
+\r
+       for (uint32 i=0;i<(cdi_code_length>>1);i++)\r
+       {\r
+               uint16 sdata=data16[i];\r
+               sdata=(sdata>>8)|(sdata<<8);\r
+               data16[i]=sdata;\r
+       }\r
+       return((uint8*)data16);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdi_load_sector(uint32 sector, uint8 *buffer)\r
+{\r
+       if (sector==0xffffffff)\r
+       {\r
+               memset(buffer,0x00,2352);\r
+               return;\r
+       }\r
+\r
+       sector*=2352;\r
+\r
+       lseek(cdi_fp,2+sector,SEEK_SET);\r
+       read(cdi_fp,buffer,2352);\r
+\r
+       // byte swap\r
+       for (uint32 i=0;i<2352;i+=2)\r
+       {\r
+               uint8 sdata=buffer[i+0];\r
+               buffer[i+0]=buffer[i+1];\r
+               buffer[i+1]=sdata;\r
+       }\r
+\r
+}\r
diff --git a/src/cdrom.cpp b/src/cdrom.cpp
new file mode 100644 (file)
index 0000000..039d284
--- /dev/null
@@ -0,0 +1,177 @@
+#include "include/cdrom.h"\r
+\r
+//#define CDROM_LOG\r
+\r
+static uint8  cdrom_ram[0x100];\r
+static uint16  cdrom_cmd=0;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdrom_init(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdrom_reset(void)\r
+{\r
+       memset(cdrom_ram,0x00,0x100);\r
+       cdrom_cmd=0;\r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdrom_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdrom_byte_write(uint32 offset, uint8 data)\r
+{\r
+       offset&=0xff;\r
+       cdrom_ram[offset]=data;\r
+\r
+#ifdef CDROM_LOG\r
+       fprintf(log_get(),"cdrom: writing byte 0x%.2x at 0x%.8x\n",data,offset);\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void cdrom_word_write(uint32 offset, uint16 data)\r
+{\r
+       offset&=0xff;\r
+       cdrom_ram[offset+0]=(data>>8)&0xff;\r
+       cdrom_ram[offset+1]=data&0xff;\r
+               \r
+       // command register\r
+/*\r
+       if (offset==0x0A)\r
+       {\r
+               cdrom_cmd=data;\r
+               if ((data&0xff00)==0x1500)\r
+               {\r
+                       fprintf(log_get(),"cdrom: setting mode 0x%.2x\n",data&0xff);\r
+                       return;\r
+               }\r
+               if (data==0x7001)\r
+               {\r
+                       uint32 offset=cdrom_ram[0x00];\r
+                       offset<<=8;\r
+                       offset|=cdrom_ram[0x01];\r
+                       offset<<=8;\r
+                       offset|=cdrom_ram[0x02];\r
+                       offset<<=8;\r
+                       offset|=cdrom_ram[0x03];\r
+\r
+                       uint32 size=cdrom_ram[0x04];\r
+                       offset<<=8;\r
+                       offset|=cdrom_ram[0x05];\r
+                       \r
+                       fprintf(log_get(),"cdrom: READ(0x%.8x, 0x%.4x) [68k pc=0x%.8x]\n",offset,size,s68000readPC());\r
+                       return;\r
+               }\r
+               else\r
+                       fprintf(log_get(),"cdrom: unknown command 0x%.4x\n",data);\r
+       }\r
+*/\r
+#ifdef CDROM_LOG\r
+       fprintf(log_get(),"cdrom: writing word 0x%.4x at 0x%.8x\n",data,offset);\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 cdrom_byte_read(uint32 offset)\r
+{\r
+       offset&=0xff;\r
+#ifdef CDROM_LOG\r
+       fprintf(log_get(),"cdrom: reading byte from 0x%.8x\n",offset);\r
+#endif\r
+       return(cdrom_ram[offset]);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 cdrom_word_read(uint32 offset)\r
+{\r
+       offset&=0xff;\r
+\r
+       uint16 data=0x0000;\r
+       \r
+       if (offset==0x00) \r
+               data=0x0000;\r
+       else\r
+       if (offset==0x02) \r
+               data=0x2000;\r
+       else\r
+       if (offset==0x0a) \r
+       {\r
+               if (cdrom_cmd==0x7001)\r
+                       data=cdrom_cmd;\r
+               else\r
+                       data=0x0400;\r
+       }\r
+       else\r
+       {\r
+               data=cdrom_ram[offset+0];\r
+               data<<=8;\r
+               data|=cdrom_ram[offset+1];\r
+       }\r
+#ifdef CDROM_LOG\r
+       fprintf(log_get(),"cdrom: reading word 0x%.4x from 0x%.8x [68k pc=0x%.8x]\n",data,offset,s68000readPC());\r
+#endif\r
+       return(data);\r
+}\r
diff --git a/src/clock.cpp b/src/clock.cpp
new file mode 100644 (file)
index 0000000..6bc2b37
--- /dev/null
@@ -0,0 +1,76 @@
+#include "include/jaguar.h"\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void clock_init(void)\r
+{\r
+       clock_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void clock_reset(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void clock_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void clock_byte_write(uint32 offset, uint8 data)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void clock_word_write(uint32 offset, uint16 data)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 clock_byte_read(uint32 offset)\r
+{\r
+       return(0xff);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 clock_word_read(uint32 offset)\r
+{\r
+       return(0xffff);\r
+}\r
diff --git a/src/crc32.cpp b/src/crc32.cpp
new file mode 100644 (file)
index 0000000..48de6c8
--- /dev/null
@@ -0,0 +1,125 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include "include/crc32.h"\r
+\r
+unsigned long crctable[256] =\r
+{\r
+       0x00000000L, 0x77073096L, 0xEE0E612CL, 0x990951BAL,\r
+       0x076DC419L, 0x706AF48FL, 0xE963A535L, 0x9E6495A3L,\r
+       0x0EDB8832L, 0x79DCB8A4L, 0xE0D5E91EL, 0x97D2D988L,\r
+       0x09B64C2BL, 0x7EB17CBDL, 0xE7B82D07L, 0x90BF1D91L,\r
+       0x1DB71064L, 0x6AB020F2L, 0xF3B97148L, 0x84BE41DEL,\r
+       0x1ADAD47DL, 0x6DDDE4EBL, 0xF4D4B551L, 0x83D385C7L,\r
+       0x136C9856L, 0x646BA8C0L, 0xFD62F97AL, 0x8A65C9ECL,\r
+       0x14015C4FL, 0x63066CD9L, 0xFA0F3D63L, 0x8D080DF5L,\r
+       0x3B6E20C8L, 0x4C69105EL, 0xD56041E4L, 0xA2677172L,\r
+       0x3C03E4D1L, 0x4B04D447L, 0xD20D85FDL, 0xA50AB56BL,\r
+       0x35B5A8FAL, 0x42B2986CL, 0xDBBBC9D6L, 0xACBCF940L,\r
+       0x32D86CE3L, 0x45DF5C75L, 0xDCD60DCFL, 0xABD13D59L,\r
+       0x26D930ACL, 0x51DE003AL, 0xC8D75180L, 0xBFD06116L,\r
+       0x21B4F4B5L, 0x56B3C423L, 0xCFBA9599L, 0xB8BDA50FL,\r
+       0x2802B89EL, 0x5F058808L, 0xC60CD9B2L, 0xB10BE924L,\r
+       0x2F6F7C87L, 0x58684C11L, 0xC1611DABL, 0xB6662D3DL,\r
+       0x76DC4190L, 0x01DB7106L, 0x98D220BCL, 0xEFD5102AL,\r
+       0x71B18589L, 0x06B6B51FL, 0x9FBFE4A5L, 0xE8B8D433L,\r
+       0x7807C9A2L, 0x0F00F934L, 0x9609A88EL, 0xE10E9818L,\r
+       0x7F6A0DBBL, 0x086D3D2DL, 0x91646C97L, 0xE6635C01L,\r
+       0x6B6B51F4L, 0x1C6C6162L, 0x856530D8L, 0xF262004EL,\r
+       0x6C0695EDL, 0x1B01A57BL, 0x8208F4C1L, 0xF50FC457L,\r
+       0x65B0D9C6L, 0x12B7E950L, 0x8BBEB8EAL, 0xFCB9887CL,\r
+       0x62DD1DDFL, 0x15DA2D49L, 0x8CD37CF3L, 0xFBD44C65L,\r
+       0x4DB26158L, 0x3AB551CEL, 0xA3BC0074L, 0xD4BB30E2L,\r
+       0x4ADFA541L, 0x3DD895D7L, 0xA4D1C46DL, 0xD3D6F4FBL,\r
+       0x4369E96AL, 0x346ED9FCL, 0xAD678846L, 0xDA60B8D0L,\r
+       0x44042D73L, 0x33031DE5L, 0xAA0A4C5FL, 0xDD0D7CC9L,\r
+       0x5005713CL, 0x270241AAL, 0xBE0B1010L, 0xC90C2086L,\r
+       0x5768B525L, 0x206F85B3L, 0xB966D409L, 0xCE61E49FL,\r
+       0x5EDEF90EL, 0x29D9C998L, 0xB0D09822L, 0xC7D7A8B4L,\r
+       0x59B33D17L, 0x2EB40D81L, 0xB7BD5C3BL, 0xC0BA6CADL,\r
+       0xEDB88320L, 0x9ABFB3B6L, 0x03B6E20CL, 0x74B1D29AL,\r
+       0xEAD54739L, 0x9DD277AFL, 0x04DB2615L, 0x73DC1683L,\r
+       0xE3630B12L, 0x94643B84L, 0x0D6D6A3EL, 0x7A6A5AA8L,\r
+       0xE40ECF0BL, 0x9309FF9DL, 0x0A00AE27L, 0x7D079EB1L,\r
+       0xF00F9344L, 0x8708A3D2L, 0x1E01F268L, 0x6906C2FEL,\r
+       0xF762575DL, 0x806567CBL, 0x196C3671L, 0x6E6B06E7L,\r
+       0xFED41B76L, 0x89D32BE0L, 0x10DA7A5AL, 0x67DD4ACCL,\r
+       0xF9B9DF6FL, 0x8EBEEFF9L, 0x17B7BE43L, 0x60B08ED5L,\r
+       0xD6D6A3E8L, 0xA1D1937EL, 0x38D8C2C4L, 0x4FDFF252L,\r
+       0xD1BB67F1L, 0xA6BC5767L, 0x3FB506DDL, 0x48B2364BL,\r
+       0xD80D2BDAL, 0xAF0A1B4CL, 0x36034AF6L, 0x41047A60L,\r
+       0xDF60EFC3L, 0xA867DF55L, 0x316E8EEFL, 0x4669BE79L,\r
+       0xCB61B38CL, 0xBC66831AL, 0x256FD2A0L, 0x5268E236L,\r
+       0xCC0C7795L, 0xBB0B4703L, 0x220216B9L, 0x5505262FL,\r
+       0xC5BA3BBEL, 0xB2BD0B28L, 0x2BB45A92L, 0x5CB36A04L,\r
+       0xC2D7FFA7L, 0xB5D0CF31L, 0x2CD99E8BL, 0x5BDEAE1DL,\r
+       0x9B64C2B0L, 0xEC63F226L, 0x756AA39CL, 0x026D930AL,\r
+       0x9C0906A9L, 0xEB0E363FL, 0x72076785L, 0x05005713L,\r
+       0x95BF4A82L, 0xE2B87A14L, 0x7BB12BAEL, 0x0CB61B38L,\r
+       0x92D28E9BL, 0xE5D5BE0DL, 0x7CDCEFB7L, 0x0BDBDF21L,\r
+       0x86D3D2D4L, 0xF1D4E242L, 0x68DDB3F8L, 0x1FDA836EL,\r
+       0x81BE16CDL, 0xF6B9265BL, 0x6FB077E1L, 0x18B74777L,\r
+       0x88085AE6L, 0xFF0F6A70L, 0x66063BCAL, 0x11010B5CL,\r
+       0x8F659EFFL, 0xF862AE69L, 0x616BFFD3L, 0x166CCF45L,\r
+       0xA00AE278L, 0xD70DD2EEL, 0x4E048354L, 0x3903B3C2L,\r
+       0xA7672661L, 0xD06016F7L, 0x4969474DL, 0x3E6E77DBL,\r
+       0xAED16A4AL, 0xD9D65ADCL, 0x40DF0B66L, 0x37D83BF0L,\r
+       0xA9BCAE53L, 0xDEBB9EC5L, 0x47B2CF7FL, 0x30B5FFE9L,\r
+       0xBDBDF21CL, 0xCABAC28AL, 0x53B39330L, 0x24B4A3A6L,\r
+       0xBAD03605L, 0xCDD70693L, 0x54DE5729L, 0x23D967BFL,\r
+       0xB3667A2EL, 0xC4614AB8L, 0x5D681B02L, 0x2A6F2B94L,\r
+       0xB40BBE37L, 0xC30C8EA1L, 0x5A05DF1BL, 0x2D02EF8DL\r
+};\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static unsigned long update_crc(unsigned char *p, unsigned long crc, int reclen)\r
+{\r
+       int i;\r
+\r
+       for (i = 0; i < reclen; i++)\r
+               crc = crctable[(crc ^ *p++) & 0xFFL] ^ (crc >> 8);\r
+\r
+       return (crc);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+int crc32_calcCheckSum(unsigned char *data, unsigned int length)\r
+{\r
+       int sum;\r
+       int Xor;\r
+       unsigned int i;\r
+       int j;\r
+\r
+            \r
+    return(update_crc(data, 0xFFFFFFFFL, length)^0xFFFFFFFFL);\r
+       sum = 0;\r
+       Xor = 0;\r
+\r
+\r
+       for (i = 0;i < length;i+=2)\r
+       {\r
+        j = 256 * data[i] + data[i+1];\r
+               sum += j;\r
+               Xor ^= j;\r
+       }\r
+       sum = ((sum & 0xffff) << 16) | (Xor & 0xffff);\r
+       return sum;\r
+}\r
diff --git a/src/dsound_dummy.cpp b/src/dsound_dummy.cpp
new file mode 100644 (file)
index 0000000..ac29c19
--- /dev/null
@@ -0,0 +1,294 @@
+////////////////////////////////////////////////////////////////////////////////\r
+// Audio\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/jaguar.h"\r
+#include "include/dsnd.h"\r
+\r
+int ym2413_enable;\r
+\r
+int FREQUENCE=44100;\r
+\r
+void dsound_reset(void);\r
+\r
+#define LEFT 0\r
+#define RIGHT 1\r
+#define SOUND_BUFFER   (0.16)          //Seconds\r
+#define UNDEFINED              0xFFFFFF\r
+\r
+int chipBufferLength;  //Number of bytes to hold SOUND_BUFFER seconds.\r
+\r
+int lastChipWrite  =0;\r
+int chipWrite =UNDEFINED;      //Write Cursor\r
+\r
+INT16* buf1;\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+void ws_write_state(int fp)\r
+{\r
+}\r
+\r
+\r
+void ws_read_state(int fp)\r
+{\r
+}\r
+\r
+\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void ws_audio_init(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       dsound_init(GetForegroundWindow(),1,FREQUENCE);\r
+//     ws_audio_reset();\r
+#endif\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void ws_audio_reset(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+ int i;\r
+ dsound_reset();\r
+\r
+        chipWrite=UNDEFINED;\r
+\r
+       for (i=0;i<4;i++)\r
+       {\r
+        ws_audio_stop_channel(i);\r
+        ws_audio_play_channel(i);\r
+        ws_audio_clear_channel(i);\r
+       }\r
+\r
+        IDirectSoundBuffer_SetPan(chipBuffer,0);\r
+        IDirectSoundBuffer_SetVolume(chipBuffer,0);\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void ws_audio_done(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       system_sound_shutdown();\r
+#endif\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void ws_audio_clear_channel(int Channel)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+\r
+ switch (Channel)\r
+ {\r
+ case 0:\r
+ case 1:\r
+         memset(buf1,0,sizeof(buf1));\r
+         chipWrite = UNDEFINED;\r
+         break;\r
+\r
+ case 2:\r
+ case 3:\r
+           break;\r
+\r
+ }\r
+#endif\r
+}\r
+\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// start playing a channel\r
+////////////////////////////////////////////////////////////////////////////////\r
+int ws_audio_play_channel(int Channel)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       switch (Channel)\r
+       {\r
+       case 0:\r
+       case 1:\r
+//             if (psg_on)\r
+               IDirectSoundBuffer_Play(chipBuffer,0,0, DSBPLAY_LOOPING);\r
+               break;\r
+       case 2:\r
+       case 3:\r
+               break;\r
+       }\r
+#endif\r
+       return 0;\r
+}\r
+\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// stop playing a channel\r
+////////////////////////////////////////////////////////////////////////////////\r
+int ws_audio_stop_channel(int Channel)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       switch (Channel)\r
+       {\r
+       case 0:\r
+       case 1:\r
+               IDirectSoundBuffer_Stop(chipBuffer);\r
+               chipWrite=UNDEFINED;\r
+               break;\r
+\r
+       case 2:\r
+       case 3:\r
+               break;\r
+       }\r
+#endif\r
+       return(0);\r
+}\r
+\r
+\r
+\r
+void dsound_reset(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       BYTE    *ppvAudioPtr1, *ppvAudioPtr2;\r
+       DWORD   pdwAudioBytes1, pdwAudioBytes2;\r
+\r
+\r
+        chipWrite = UNDEFINED;\r
+        if (chipBuffer)\r
+        {\r
+               IDirectSoundBuffer_Stop(chipBuffer);\r
+               // Fill the sound buffer\r
+               if SUCCEEDED(IDirectSoundBuffer_Lock(chipBuffer,0,0, \r
+                       (LPVOID*)&ppvAudioPtr1, &pdwAudioBytes1, (LPVOID*)&ppvAudioPtr2, &pdwAudioBytes2, DSBLOCK_ENTIREBUFFER))\r
+               {\r
+                       if (ppvAudioPtr1 && pdwAudioBytes1)\r
+                               memset(ppvAudioPtr1, 0, pdwAudioBytes1);\r
+\r
+                       if (ppvAudioPtr2 && pdwAudioBytes2)\r
+                               memset(ppvAudioPtr2, 0, pdwAudioBytes2);\r
+                       \r
+                       IDirectSoundBuffer_Unlock(chipBuffer, \r
+                               ppvAudioPtr1, pdwAudioBytes1, ppvAudioPtr2, pdwAudioBytes2);\r
+               }\r
+\r
+               //Start playing\r
+//             if (psg_on)\r
+                       IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );\r
+        }\r
+IDirectSoundBuffer_Play(chipBuffer, 0,0, DSBPLAY_LOOPING );\r
+#endif\r
+}\r
+\r
+\r
+\r
+void system_sound_shutdown(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+        if (chipBuffer)        IDirectSoundBuffer_Stop(chipBuffer);\r
+        if (chipBuffer)        IDirectSoundBuffer_Release(chipBuffer);\r
+\r
+       if (primaryBuffer)      IDirectSoundBuffer_Stop(primaryBuffer);\r
+       if (primaryBuffer)      IDirectSoundBuffer_Release(primaryBuffer);\r
+       if (ds) IDirectSound_Release(ds);\r
+       if (buf1) free(buf1);\r
+#endif\r
+}\r
+\r
+\r
+void system_sound_update(void)\r
+{\r
+#ifdef _EMULATE_SOUND\r
+       LPDWORD null_ptr=NULL;\r
+       int             pdwAudioBytes1, pdwAudioBytes2;\r
+       int             Write, LengthSamples;\r
+       UINT16  *chipPtr1, *chipPtr2;\r
+\r
+        // UNDEFINED write cursors\r
+        IDirectSoundBuffer_GetCurrentPosition(chipBuffer, 0, (LPDWORD)&Write);\r
+        if ((chipWrite == UNDEFINED) )\r
+        {\r
+               lastChipWrite = chipWrite= Write - 128;\r
+               return; //Wait a frame to accumulate length.\r
+        }\r
+\r
+       \r
+               //SN76496 Sound Chips\r
+\r
+                if (Write < lastChipWrite)     //Wrap?\r
+                       lastChipWrite -= chipBufferLength;\r
+\r
+               LengthSamples = (Write - lastChipWrite) / 2; \r
+               lastChipWrite = Write;\r
+\r
+/*             if (psg_on)*/ {\r
+               pcm_updateOne(0,buf1,LengthSamples>>1);\r
+\r
+               if SUCCEEDED(IDirectSoundBuffer_Lock(\r
+                       chipBuffer, chipWrite, LengthSamples*2, \r
+                       (LPVOID*)&chipPtr1, (LPDWORD)&pdwAudioBytes1,\r
+                       (LPVOID*)&chipPtr2, (LPDWORD)&pdwAudioBytes2, 0))\r
+                {\r
+                        __asm {\r
+                                       cld\r
+                                       mov eax,buf1\r
+                                       mov ebx,buf1\r
+                                       mov edi,chipPtr1\r
+                                       mov ecx,pdwAudioBytes1\r
+                                       shr ecx,2\r
+                                       \r
+Copie1:                                mov esi,eax\r
+                                       movsw\r
+                                       add eax,2\r
+                                       mov esi,ebx\r
+                                       movsw\r
+                                       add ebx,2\r
+                                       loop Copie1\r
+                       \r
+                                       mov edi,chipPtr2\r
+                                       cmp edi,0\r
+                                       je End\r
+                                       mov ecx,pdwAudioBytes2\r
+                                       shr ecx,2\r
+\r
+Copie2:                                \r
+                                       mov esi,eax\r
+                                       movsw\r
+                                       add eax,2\r
+                                       mov esi,ebx\r
+                                       movsw\r
+                                       add ebx,2\r
+                                       loop Copie2\r
+\r
+End:                           }\r
+                               \r
+\r
+                        IDirectSoundBuffer_Unlock(chipBuffer,\r
+                               chipPtr1, pdwAudioBytes1, chipPtr2, pdwAudioBytes2);\r
+\r
+                       chipWrite+= (LengthSamples * 2);\r
+                       if (chipWrite> chipBufferLength)\r
+                               chipWrite-= chipBufferLength;\r
+               }\r
+               else\r
+               {\r
+                       DWORD status;\r
+                       chipWrite= UNDEFINED;\r
+                       IDirectSoundBuffer_GetStatus(chipBuffer, &status);\r
+                       if (status & DSBSTATUS_BUFFERLOST)\r
+                       {\r
+                               if (IDirectSoundBuffer_Restore(chipBuffer) != DS_OK) return;\r
+                               /*if (psg_on)*/ IDirectSoundBuffer_Play(chipBuffer, 0, 0, DSBPLAY_LOOPING);\r
+                       }\r
+         }\r
+        }\r
+#endif\r
+}\r
diff --git a/src/dsp.cpp b/src/dsp.cpp
new file mode 100644 (file)
index 0000000..e80fcc7
--- /dev/null
@@ -0,0 +1,3227 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/dsp.h"\r
+\r
+#define CINT0FLAG                      0x00200\r
+#define CINT1FLAG                      0x00400\r
+#define CINT2FLAG                      0x00800\r
+#define CINT3FLAG                      0x01000\r
+#define CINT4FLAG                      0x02000\r
+#define CINT04FLAGS                    (CINT0FLAG | CINT1FLAG | CINT2FLAG | CINT3FLAG | CINT4FLAG)\r
+#define CINT5FLAG                      0x20000         /* DSP only */\r
+\r
+extern uint32 jaguar_mainRom_crc32;\r
+\r
+static void dsp_opcode_addqmod(void);  \r
+static void dsp_opcode_subqmod(void);  \r
+static void dsp_opcode_mirror(void);   \r
+static void dsp_opcode_sat32s(void);   \r
+static void dsp_opcode_sat16s(void);   \r
+static void dsp_opcode_add(void);\r
+static void dsp_opcode_addc(void);\r
+static void dsp_opcode_addq(void);\r
+static void dsp_opcode_addqt(void);\r
+static void dsp_opcode_sub(void);\r
+static void dsp_opcode_subc(void);\r
+static void dsp_opcode_subq(void);\r
+static void dsp_opcode_subqt(void);\r
+static void dsp_opcode_neg(void);\r
+static void dsp_opcode_and(void);\r
+static void dsp_opcode_or(void);\r
+static void dsp_opcode_xor(void);\r
+static void dsp_opcode_not(void);\r
+static void dsp_opcode_btst(void);\r
+static void dsp_opcode_bset(void);\r
+static void dsp_opcode_bclr(void);\r
+static void dsp_opcode_mult(void);\r
+static void dsp_opcode_imult(void);\r
+static void dsp_opcode_imultn(void);\r
+static void dsp_opcode_resmac(void);\r
+static void dsp_opcode_imacn(void);\r
+static void dsp_opcode_div(void);\r
+static void dsp_opcode_abs(void);\r
+static void dsp_opcode_sh(void);\r
+static void dsp_opcode_shlq(void);\r
+static void dsp_opcode_shrq(void);\r
+static void dsp_opcode_sha(void);\r
+static void dsp_opcode_sharq(void);\r
+static void dsp_opcode_ror(void);\r
+static void dsp_opcode_rorq(void);\r
+static void dsp_opcode_cmp(void);\r
+static void dsp_opcode_cmpq(void);\r
+static void dsp_opcode_sat8(void);\r
+static void dsp_opcode_sat16(void);\r
+static void dsp_opcode_move(void);\r
+static void dsp_opcode_moveq(void);\r
+static void dsp_opcode_moveta(void);\r
+static void dsp_opcode_movefa(void);\r
+static void dsp_opcode_movei(void);\r
+static void dsp_opcode_loadb(void);\r
+static void dsp_opcode_loadw(void);\r
+static void dsp_opcode_load(void);\r
+static void dsp_opcode_loadp(void);\r
+static void dsp_opcode_load_r14_indexed(void);\r
+static void dsp_opcode_load_r15_indexed(void);\r
+static void dsp_opcode_storeb(void);\r
+static void dsp_opcode_storew(void);\r
+static void dsp_opcode_store(void);\r
+static void dsp_opcode_storep(void);\r
+static void dsp_opcode_store_r14_indexed(void);\r
+static void dsp_opcode_store_r15_indexed(void);\r
+static void dsp_opcode_move_pc(void);\r
+static void dsp_opcode_jump(void);\r
+static void dsp_opcode_jr(void);\r
+static void dsp_opcode_mmult(void);\r
+static void dsp_opcode_mtoi(void);\r
+static void dsp_opcode_normi(void);\r
+static void dsp_opcode_nop(void);\r
+static void dsp_opcode_load_r14_ri(void);\r
+static void dsp_opcode_load_r15_ri(void);\r
+static void dsp_opcode_store_r14_ri(void);\r
+static void dsp_opcode_store_r15_ri(void);\r
+static void dsp_opcode_sat24(void);\r
+\r
+uint8 dsp_opcode_cycles[64] = \r
+{\r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,\r
+       3,  3,  1,  3,  \r
+       1, 18,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,\r
+       3,  3,  2,  2,  \r
+       2,  2,  3,  4,  \r
+       5,  4,  5,  6,  \r
+       6,  1,  1,  1,\r
+       1,  2,  2,  2,  \r
+       1,  1,  9,  3,  \r
+       3,  1,  6,  6,  \r
+       2,  2,  3,  3\r
+};\r
+\r
+void (*dsp_opcode[64])()= \r
+{      \r
+       dsp_opcode_add,                                 dsp_opcode_addc,                                dsp_opcode_addq,                                dsp_opcode_addqt,\r
+       dsp_opcode_sub,                                 dsp_opcode_subc,                                dsp_opcode_subq,                                dsp_opcode_subqt,\r
+       dsp_opcode_neg,                                 dsp_opcode_and,                                 dsp_opcode_or,                                  dsp_opcode_xor,\r
+       dsp_opcode_not,                                 dsp_opcode_btst,                                dsp_opcode_bset,                                dsp_opcode_bclr,\r
+       dsp_opcode_mult,                                dsp_opcode_imult,                               dsp_opcode_imultn,                              dsp_opcode_resmac,\r
+       dsp_opcode_imacn,                               dsp_opcode_div,                                 dsp_opcode_abs,                                 dsp_opcode_sh,\r
+       dsp_opcode_shlq,                                dsp_opcode_shrq,                                dsp_opcode_sha,                                 dsp_opcode_sharq,\r
+       dsp_opcode_ror,                                 dsp_opcode_rorq,                                dsp_opcode_cmp,                                 dsp_opcode_cmpq,\r
+       dsp_opcode_subqmod,                             dsp_opcode_sat16s,                              dsp_opcode_move,                                dsp_opcode_moveq,\r
+       dsp_opcode_moveta,                              dsp_opcode_movefa,                              dsp_opcode_movei,                               dsp_opcode_loadb,\r
+       dsp_opcode_loadw,                               dsp_opcode_load,                                dsp_opcode_sat32s,                              dsp_opcode_load_r14_indexed,\r
+       dsp_opcode_load_r15_indexed,    dsp_opcode_storeb,                              dsp_opcode_storew,                              dsp_opcode_store,\r
+       dsp_opcode_mirror,                              dsp_opcode_store_r14_indexed,   dsp_opcode_store_r15_indexed,   dsp_opcode_move_pc,\r
+       dsp_opcode_jump,                                dsp_opcode_jr,                                  dsp_opcode_mmult,                               dsp_opcode_mtoi,\r
+       dsp_opcode_normi,                               dsp_opcode_nop,                                 dsp_opcode_load_r14_ri,                 dsp_opcode_load_r15_ri,\r
+       dsp_opcode_store_r14_ri,                dsp_opcode_store_r15_ri,                dsp_opcode_nop,                                 dsp_opcode_addqmod,\r
+};\r
+\r
+uint32 dsp_opcode_use[64];\r
+\r
+char *dsp_opcode_str[64]= \r
+{      \r
+       "add",                          "addc",                         "addq",                         "addqt",\r
+       "sub",                          "subc",                         "subq",                         "subqt",\r
+       "neg",                          "and",                          "or",                           "xor",\r
+       "not",                          "btst",                         "bset",                         "bclr",\r
+       "mult",                         "imult",                        "imultn",                       "resmac",\r
+       "imacn",                        "div",                          "abs",                          "sh",\r
+       "shlq",                         "shrq",                         "sha",                          "sharq",\r
+       "ror",                          "rorq",                         "cmp",                          "cmpq",\r
+       "subqmod",                      "sat16s",                       "move",                         "moveq",\r
+       "moveta",                       "movefa",                       "movei",                        "loadb",\r
+       "loadw",                        "load",                         "sat32s",                       "load_r14_indexed",\r
+       "load_r15_indexed",     "storeb",                       "storew",                       "store",\r
+       "mirror",                       "store_r14_indexed","store_r15_indexed","move_pc",\r
+       "jump",                         "jr",                           "mmult",                        "mtoi",\r
+       "normi",                        "nop",                          "load_r14_ri",          "load_r15_ri",\r
+       "store_r14_ri",         "store_r15_ri",         "nop",                          "addqmod",\r
+};\r
+\r
+static uint16  *mirror_table;\r
+static uint8   *dsp_ram_8;\r
+\r
+\r
+static uint32  dsp_pc;\r
+static uint32  dsp_acc;\r
+static uint32  dsp_remain;\r
+static uint32  dsp_modulo;\r
+static uint32  dsp_flags;\r
+static uint32  dsp_matrix_control;\r
+static uint32  dsp_pointer_to_matrix;\r
+static uint32  dsp_data_organization;\r
+static uint32  dsp_control;\r
+static uint32  dsp_div_control;\r
+static uint8   dsp_flag_z;\r
+static uint8   dsp_flag_n;\r
+static uint8   dsp_flag_c;    \r
+static uint8   dsp_alternate_flag_z;\r
+static uint8   dsp_alternate_flag_n;\r
+static uint8   dsp_alternate_flag_c;    \r
+static uint32  *dsp_reg;\r
+static uint32  *dsp_alternate_reg;\r
+static uint32  *dsp_reg_bank_0;\r
+static uint32  *dsp_reg_bank_1;\r
+\r
+static uint32  dsp_opcode_first_parameter;\r
+static uint32  dsp_opcode_second_parameter;\r
+\r
+#define dsp_running (dsp_control&0x01)\r
+\r
+#define Rm dsp_reg[dsp_opcode_first_parameter]\r
+#define Rn dsp_reg[dsp_opcode_second_parameter]\r
+#define alternate_Rm dsp_alternate_reg[dsp_opcode_first_parameter]\r
+#define alternate_Rn dsp_alternate_reg[dsp_opcode_second_parameter]\r
+#define imm_1 dsp_opcode_first_parameter\r
+#define imm_2 dsp_opcode_second_parameter\r
+\r
+#define set_flag_z(r) dsp_flag_z=(r==0); \r
+#define set_flag_n(r) dsp_flag_n=(r&0x80000000);\r
+\r
+#define reset_flag_z() dsp_flag_z=0;\r
+#define reset_flag_n() dsp_flag_n=0;\r
+#define reset_flag_c() dsp_flag_c=0;    \r
+\r
+uint32 dsp_convert_zero[32] = { 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };\r
+uint8 *dsp_branch_condition_table=0;\r
+#define branch_condition(x)    dsp_branch_condition_table[(x) + ((jaguar_flags & 7) << 5)]\r
+\r
+static uint32 dsp_in_exec=0;\r
+static uint32 dsp_releaseTimeSlice_flag=0;\r
+\r
+FILE *dsp_fp;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_reset_stats(void)\r
+{\r
+       for (uint32 i=0;i<64;i++)\r
+               dsp_opcode_use[i]=0;\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_releaseTimeslice(void)\r
+{\r
+       dsp_releaseTimeSlice_flag=1;\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_build_branch_condition_table(void)\r
+{\r
+       int i,j;\r
+       #define ZFLAG                           0x00001\r
+       #define CFLAG                           0x00002\r
+       #define NFLAG                           0x00004\r
+       \r
+       /* allocate the mirror table */\r
+       if (!mirror_table)\r
+               mirror_table = (uint16*)malloc(65536 * sizeof(mirror_table[0]));\r
+\r
+       /* fill in the mirror table */\r
+       if (mirror_table)\r
+               for (int i = 0; i < 65536; i++)\r
+                       mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) |\r
+                                         ((i >> 11) & 0x0004) | ((i >> 9)  & 0x0008) |\r
+                                         ((i >> 7)  & 0x0010) | ((i >> 5)  & 0x0020) |\r
+                                         ((i >> 3)  & 0x0040) | ((i >> 1)  & 0x0080) |\r
+                                         ((i << 1)  & 0x0100) | ((i << 3)  & 0x0200) |\r
+                                         ((i << 5)  & 0x0400) | ((i << 7)  & 0x0800) |\r
+                                         ((i << 9)  & 0x1000) | ((i << 11) & 0x2000) |\r
+                                         ((i << 13) & 0x4000) | ((i << 15) & 0x8000);\r
+\r
+       if (!dsp_branch_condition_table)\r
+       {\r
+               dsp_branch_condition_table = (uint8*)malloc(32 * 8 * sizeof(dsp_branch_condition_table[0]));\r
+\r
+               /* fill in the condition table */\r
+               if (dsp_branch_condition_table)\r
+                       for (i = 0; i < 8; i++)\r
+                               for (j = 0; j < 32; j++)\r
+                               {\r
+                                       int result = 1;\r
+                                       if (j & 1)\r
+                                               if (i & ZFLAG) result = 0;\r
+                                       if (j & 2)\r
+                                               if (!(i & ZFLAG)) result = 0;\r
+                                       if (j & 4)\r
+                                               if (i & (CFLAG << (j >> 4))) result = 0;\r
+                                       if (j & 8)\r
+                                               if (!(i & (CFLAG << (j >> 4)))) result = 0;\r
+                                       dsp_branch_condition_table[i * 32 + j] = result;\r
+                               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned dsp_byte_read(unsigned int offset)\r
+{\r
+// battlemorph\r
+//     if ((offset==0xF1CFE0)||(offset==0xF1CFE2))\r
+//             return(0xffff);\r
+       // mutant penguin\r
+       if ((jaguar_mainRom_crc32==0xbfd751a4)||(jaguar_mainRom_crc32==0x053efaf9))\r
+       {\r
+               if (offset==0xF1CFE0)\r
+                       return(0xff);\r
+       }\r
+       if ((offset>=dsp_work_ram_base)&&(offset<dsp_work_ram_base+0x2000))\r
+               return(dsp_ram_8[offset-dsp_work_ram_base]);\r
+\r
+       if ((offset>=dsp_control_ram_base)&&(offset<dsp_control_ram_base+0x20))\r
+       {\r
+               uint32 data=dsp_long_read(offset&0xfffffffc);\r
+\r
+               if ((offset&0x03)==0)\r
+                       return(data>>24);\r
+               else\r
+               if ((offset&0x03)==1)\r
+                       return((data>>16)&0xff);\r
+               else\r
+               if ((offset&0x03)==2)\r
+                       return((data>>8)&0xff);\r
+               else\r
+               if ((offset&0x03)==3)\r
+                       return(data&0xff);\r
+       }\r
+       return(jaguar_byte_read(offset));\r
+} \r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned dsp_word_read(unsigned int offset)\r
+{\r
+       offset&=0xFFFFFFFE;\r
+       // jaguar cd bios\r
+       if (jaguar_mainRom_crc32==0xa74a97cd)\r
+       {\r
+               if (offset==0xF1A114) return(0x0000);\r
+               if (offset==0xF1A116) return(0x0000);\r
+               if (offset==0xF1B000) return(0x1234);\r
+               if (offset==0xF1B002) return(0x5678);\r
+       }\r
+/*\r
+       if (jaguar_mainRom_crc32==0x7ae20823)\r
+       {\r
+               if (offset==0xF1B9D8) return(0x0000);\r
+               if (offset==0xF1B9Da) return(0x0000);\r
+               if (offset==0xF1B2C0) return(0x0000);\r
+               if (offset==0xF1B2C2) return(0x0000);\r
+       }\r
+*/\r
+       // pour permettre Ã  wolfenstein 3d de tourner sans le dsp\r
+/*     if ((offset==0xF1B0D0)||(offset==0xF1B0D2))\r
+               return(0);\r
+*/\r
+\r
+               // pour permettre Ã  nba jam de tourner sans le dsp\r
+       if (jaguar_mainRom_crc32==0x4faddb18)\r
+       {\r
+               if (offset==0xf1b2c0) return(0);\r
+               if (offset==0xf1b2c2) return(0);\r
+               if (offset==0xf1b240) return(0);\r
+               if (offset==0xf1b242) return(0);\r
+               if (offset==0xF1B340) return(0);\r
+               if (offset==0xF1B342) return(0);\r
+               if (offset==0xF1BAD8) return(0);\r
+               if (offset==0xF1BADA) return(0);\r
+               if (offset==0xF1B040) return(0);\r
+               if (offset==0xF1B042) return(0);\r
+               if (offset==0xF1B0C0) return(0);\r
+               if (offset==0xF1B0C2) return(0);\r
+               if (offset==0xF1B140) return(0);\r
+               if (offset==0xF1B142) return(0);\r
+               if (offset==0xF1B1C0) return(0);\r
+               if (offset==0xF1B1C2) return(0);\r
+       }\r
+\r
+       if ((offset>=dsp_work_ram_base)&&(offset<dsp_work_ram_base+0x2000))\r
+       {\r
+               offset-=dsp_work_ram_base;\r
+               uint16 data=(((uint16)dsp_ram_8[offset])<<8)|((uint16)dsp_ram_8[offset+1]);\r
+               return(data);\r
+       }\r
+       if ((offset>=dsp_control_ram_base)&&(offset<dsp_control_ram_base+0x20))\r
+       {\r
+               uint32 data;\r
+\r
+               data=dsp_long_read(offset&0xfffffffc);\r
+\r
+               if (offset&0x03)\r
+                       return(data&0xffff);\r
+               else\r
+                       return(data>>16);\r
+       }\r
+       return(jaguar_word_read(offset));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned dsp_long_read(unsigned int offset)\r
+{\r
+       offset&=0xFFFFFFFC;\r
+\r
+       if ((offset>=dsp_work_ram_base)&&(offset<dsp_work_ram_base+0x2000))\r
+       {\r
+               offset-=dsp_work_ram_base;\r
+               uint32 data= (((uint32)dsp_ram_8[offset]  )<<24)|\r
+                                (((uint32)dsp_ram_8[offset+1])<<16)|\r
+                                        (((uint32)dsp_ram_8[offset+2])<<8 )|\r
+                                        ( (uint32)dsp_ram_8[offset+3]);\r
+               return(data);\r
+       }\r
+       if ((offset>=dsp_control_ram_base)&&(offset<dsp_control_ram_base+0x20))\r
+       {\r
+               offset&=0x1f;\r
+               switch (offset)\r
+               {\r
+               case 0x00:      dsp_flag_c?(dsp_flag_c=1):(dsp_flag_c=0);\r
+                                       dsp_flag_z?(dsp_flag_z=1):(dsp_flag_z=0);\r
+                                       dsp_flag_n?(dsp_flag_n=1):(dsp_flag_n=0);\r
+\r
+                                       dsp_flags=(dsp_flags&0xFFFFFFF8)|(dsp_flag_n<<2)|(dsp_flag_c<<1)|dsp_flag_z;\r
+                                       \r
+                                       return(dsp_flags&0xFFFFC1FF);\r
+               case 0x04: return(dsp_matrix_control);\r
+               case 0x08: return(dsp_pointer_to_matrix);\r
+               case 0x0C: return(dsp_data_organization);\r
+               case 0x10: return(dsp_pc);\r
+               case 0x14: return(dsp_control);\r
+               case 0x18: return(dsp_modulo);\r
+               case 0x1C: return(dsp_remain);\r
+//             default:   // unaligned long read //__asm int 3\r
+               }\r
+               return(0xfffffff);\r
+       }\r
+       uint32 data=jaguar_word_read(offset);\r
+       data<<=16;\r
+       data|=jaguar_word_read(offset+2);\r
+       return(data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_byte_write(unsigned offset, unsigned data)\r
+{\r
+       if ((offset >= dsp_work_ram_base) && (offset < dsp_work_ram_base+0x2000))\r
+       {\r
+               offset -= dsp_work_ram_base;\r
+               dsp_ram_8[offset] = data;\r
+               if (dsp_in_exec == 0)\r
+               {\r
+//                     s68000releaseTimeslice();\r
+                       m68k_end_timeslice();\r
+                       gpu_releaseTimeslice();\r
+               }\r
+               return;\r
+       }\r
+       if ((offset >= dsp_control_ram_base) && (offset < dsp_control_ram_base+0x20))\r
+       {\r
+               uint32 reg = offset & 0x1C;\r
+               int bytenum = offset & 0x03;\r
+               \r
+               if ((reg >= 0x1C) && (reg <= 0x1F))\r
+                       dsp_div_control = (dsp_div_control & (~(0xFF << (bytenum << 3)))) | (data << (bytenum << 3));\r
+               else\r
+               {\r
+                       uint32 old_data = dsp_long_read(offset&0xFFFFFFC);\r
+                       bytenum = 3 - bytenum; // convention motorola !!!\r
+                       old_data = (old_data & (~(0xFF << (bytenum << 3)))) | (data << (bytenum << 3)); \r
+                       dsp_long_write(offset & 0xFFFFFFC, old_data);\r
+               }\r
+               return;\r
+       }\r
+//     fprintf(log_get(),"dsp: writing %.2x at 0x%.8x\n",data,offset);\r
+       jaguar_byte_write(offset, data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_word_write(unsigned offset, unsigned data)\r
+{\r
+       offset &= 0xFFFFFFFE;\r
+//     fprintf(log_get(),"dsp: writing %.4x at 0x%.8x\n",data,offset);\r
+       if ((offset >= dsp_work_ram_base) && (offset < dsp_work_ram_base+0x2000))\r
+       {\r
+               offset -= dsp_work_ram_base;\r
+               dsp_ram_8[offset] = data >> 8;\r
+               dsp_ram_8[offset+1] = data & 0xFF;\r
+               if (dsp_in_exec == 0)\r
+               {\r
+//                     fprintf(log_get(),"dsp: writing %.4x at 0x%.8x\n",data,offset+dsp_work_ram_base);\r
+//                     s68000releaseTimeslice();\r
+                       m68k_end_timeslice();\r
+                       gpu_releaseTimeslice();\r
+               }\r
+               return;\r
+       }\r
+       else if ((offset >= dsp_control_ram_base) && (offset < dsp_control_ram_base+0x20))\r
+       {\r
+               if ((offset & 0x1C) == 0x1C)\r
+               {\r
+                       if (offset & 0x03)\r
+                               dsp_div_control = (dsp_div_control&0xffff0000)|(data&0xffff);\r
+                       else\r
+                               dsp_div_control = (dsp_div_control&0xffff)|((data&0xffff)<<16);\r
+               }\r
+               else\r
+               {\r
+                       uint32 old_data = dsp_long_read(offset & 0xffffffc);\r
+                       if (offset & 0x03)\r
+                               old_data = (old_data&0xffff0000)|(data&0xffff);\r
+                       else\r
+                               old_data = (old_data&0xffff)|((data&0xffff)<<16);\r
+                       dsp_long_write(offset & 0xffffffc, old_data);\r
+               }\r
+               return;\r
+       }\r
+       jaguar_word_write(offset, data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_long_write(unsigned offset, unsigned data)\r
+{\r
+       offset &= 0xFFFFFFFC;\r
+//     fprintf(log_get(),"dsp: writing %.8x at 0x%.8x\n",data,offset);\r
+       if ((offset >= dsp_work_ram_base) && (offset < dsp_work_ram_base+0x2000))\r
+       {\r
+               offset -= dsp_work_ram_base;\r
+               dsp_ram_8[offset]  = data >> 24;\r
+               dsp_ram_8[offset+1] = (data>>16) & 0xFF;\r
+               dsp_ram_8[offset+2] = (data>>8) & 0xFF;\r
+               dsp_ram_8[offset+3] = data & 0xFF;\r
+               return;\r
+       }\r
+       else if ((offset >= dsp_control_ram_base) && (offset < dsp_control_ram_base+0x20))\r
+       {\r
+               offset&=0x1f;\r
+               switch (offset)\r
+               {\r
+               case 0x00:\r
+                       dsp_flags = data;\r
+                       dsp_flag_z = dsp_flags & 0x01;\r
+                       dsp_flag_c = (dsp_flags>>1) & 0x01;\r
+                       dsp_flag_n = (dsp_flags>>2) & 0x01;\r
+                       dsp_update_register_banks();\r
+                       dsp_control &= ~((dsp_flags & CINT04FLAGS) >> 3);\r
+                       dsp_control &= ~((dsp_flags & CINT5FLAG) >> 1);\r
+                       dsp_check_irqs();\r
+                       break;\r
+               case 0x04:\r
+                       dsp_matrix_control = data;\r
+                       break;\r
+               case 0x08:\r
+                       dsp_pointer_to_matrix = data;\r
+                       break;\r
+               case 0x0C:\r
+                       dsp_data_organization = data;\r
+                       break;\r
+               case 0x10:\r
+                       dsp_pc = data;\r
+                       break;\r
+               case 0x14:\r
+               {       \r
+                       uint32 dsp_was_running = dsp_running;\r
+                       // check for DSP->CPU interrupt\r
+                       if (data & 0x02)\r
+                       {\r
+//                                                     fprintf(log_get(),"DSP->CPU interrupt\n");\r
+                               if (tom_irq_enabled(IRQ_GPU) && jaguar_interrupt_handler_is_valid(64))\r
+                               {\r
+                                       tom_set_pending_gpu_int();\r
+//                                     s68000interrupt(7,64);\r
+//                                     s68000flushInterrupts();\r
+                                       m68k_set_irq(7);                        // Set 68000 NMI...\r
+                                       dsp_releaseTimeslice();\r
+                               }\r
+                               data &= ~(0x02);\r
+                       }\r
+                       // check for CPU->DSP interrupt\r
+                       if (data & 0x04)\r
+                       {\r
+//                                                     fprintf(log_get(),"CPU->DSP interrupt\n");\r
+                               dsp_set_irq_line(0, 1);\r
+//                             s68000releaseTimeslice();\r
+                               m68k_end_timeslice();\r
+                               gpu_releaseTimeslice();\r
+                               data &= ~(0x04);\r
+                       }\r
+                       // single stepping\r
+                       if (data & 0x10)\r
+                       {\r
+                                                       //fprintf(log_get(),"asked to perform a single step (single step is %senabled)\n",(data&0x8)?"":"not ");\r
+                       }\r
+                       dsp_control = data;\r
+\r
+                       // if dsp wasn't running but is now running\r
+                       // execute a few cycles\r
+#ifndef DSP_SINGLE_STEPPING\r
+                       if (!dsp_was_running && dsp_running)\r
+                       {\r
+                               dsp_exec(200);\r
+                       }\r
+#else\r
+                       if (dsp_control & 0x18)\r
+                               dsp_exec(1);\r
+#endif\r
+                       break;\r
+               }\r
+               case 0x18:\r
+                       dsp_modulo = data;\r
+                       break;\r
+               case 0x1C:\r
+                       dsp_div_control=data;\r
+                       break;\r
+//             default:   // unaligned long read\r
+                                  //__asm int 3\r
+               }\r
+               return;\r
+       }\r
+       jaguar_word_write(offset, (data>>16) & 0xFFFF);\r
+       jaguar_word_write(offset+2, data & 0xFFFF);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 * jaguar_rom_load(char * path, uint32 * romSize);\r
+void dsp_load_bin_at(char * path, uint32 offset)\r
+{\r
+       uint32 romSize;\r
+       uint8 * rom;\r
+\r
+       rom = jaguar_rom_load(path, &romSize);\r
+       for(uint32 i=0; i<romSize; i++)\r
+               jaguar_byte_write(offset+i, rom[i]);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static int go = 0;\r
+void dsp_update_register_banks(void)\r
+{\r
+       uint32 temp;\r
+       int i, bank;\r
+\r
+       bank = dsp_flags&0x4000;\r
+\r
+       if (dsp_flags & 0x8) \r
+               bank = 0;\r
+       \r
+       if ((!bank && (dsp_reg_bank_0 != dsp_reg)) || (bank && (dsp_reg_bank_1 != dsp_reg)))\r
+       {\r
+               for (i = 0; i < 32; i++)\r
+               {\r
+                       temp = dsp_reg[i];\r
+                       dsp_reg[i] = dsp_alternate_reg[i];\r
+                       dsp_alternate_reg[i]= temp;\r
+               }\r
+               // switch flags\r
+               temp=dsp_flag_z;\r
+               dsp_flag_z=dsp_alternate_flag_z;\r
+               dsp_alternate_flag_z=temp;\r
+\r
+               temp=dsp_flag_n;\r
+               dsp_flag_n=dsp_alternate_flag_n;\r
+               dsp_alternate_flag_n=temp;\r
+\r
+               temp=dsp_flag_c;\r
+               dsp_flag_c=dsp_alternate_flag_c;\r
+               dsp_alternate_flag_c=temp;\r
+       \r
+               if (!bank)\r
+               {\r
+                       dsp_reg_bank_0 = dsp_reg;\r
+                       dsp_reg_bank_1 = dsp_alternate_reg;\r
+               }\r
+               else\r
+               {\r
+                       dsp_reg_bank_0 = dsp_alternate_reg;\r
+                       dsp_reg_bank_1 = dsp_reg;\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_check_if_i2s_interrupt_needed(void)\r
+{\r
+       static uint32 count=8;\r
+\r
+       int mask;\r
+       count--;\r
+       if (count>0)\r
+               return;\r
+\r
+       count=4;\r
+       // already in an interrupt handler ?\r
+       if (dsp_flags & 0x8) \r
+               return;\r
+\r
+       // get the interrupt mask \r
+       mask = (dsp_flags >> 4) & 0x1f;\r
+       mask |= (dsp_flags >> 11) & 0x20;\r
+\r
+       if (mask & 0x02)\r
+       {\r
+               dsp_set_irq_line(1,1);\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_check_irqs(void)\r
+{\r
+       int bits, mask, which = 0;\r
+\r
+       if (dsp_flags & 0x8) \r
+               return;\r
+\r
+       // get the active interrupt bits \r
+       bits = (dsp_control >> 6) & 0x1f;\r
+       bits |= (dsp_control >> 10) & 0x20;\r
+\r
+       // get the interrupt mask \r
+       mask = (dsp_flags >> 4) & 0x1f;\r
+       mask |= (dsp_flags >> 11) & 0x20;\r
+\r
+//     fprintf(log_get(),"dsp: bits=%.2x mask=%.2x\n",bits,mask);\r
+       // bail if nothing is available\r
+       bits &= mask;\r
+\r
+       if (!bits)\r
+               return;\r
+\r
+       // determine which interrupt \r
+       if (bits & 0x01) which = 0;\r
+       if (bits & 0x02) which = 1;\r
+       if (bits & 0x04) which = 2;\r
+       if (bits & 0x08) which = 3;\r
+       if (bits & 0x10) which = 4;\r
+       if (bits & 0x20) which = 5;\r
+\r
+//     fprintf(log_get(),"dsp: generating interrupt %i\n",which);\r
+\r
+       dsp_flags |= 0x08;\r
+       dsp_update_register_banks();\r
+\r
+       // subqt  #4,r31                ; pre-decrement stack pointer \r
+       // move  pc,r30                 ; address of interrupted code \r
+       // store  r30,(r31)     ; store return address\r
+       dsp_reg[31] -= 4;\r
+       dsp_reg[30]=dsp_pc;\r
+       dsp_long_write(dsp_reg[31], dsp_pc - 2);\r
+\r
+       // movei  #service_address,r30  ; pointer to ISR entry \r
+       // jump  (r30)                                  ; jump to ISR \r
+       // nop\r
+       dsp_pc = dsp_work_ram_base;\r
+       dsp_pc += which * 0x10;\r
+       dsp_reg[30]=dsp_pc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_set_irq_line(int irqline, int state)\r
+{\r
+       int mask = 0x40 << irqline;\r
+       dsp_control &= ~mask;\r
+       if (state)\r
+       {\r
+               dsp_control |= mask;\r
+               dsp_check_irqs();\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_init(void)\r
+{\r
+       memory_malloc_secure((void**)&dsp_ram_8,0x2000,"dsp work ram");\r
+       memory_malloc_secure((void**)&dsp_reg,32*sizeof(int32),"dsp bank 0 regs");\r
+       memory_malloc_secure((void**)&dsp_alternate_reg,32*sizeof(int32),"dsp bank 1 regs");\r
+       \r
+       dsp_build_branch_condition_table();\r
+\r
+       dsp_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_reset(void)\r
+{\r
+       dsp_pc                            = 0x00f1b000;\r
+       dsp_acc                           = 0x00000000;\r
+       dsp_remain                        = 0x00000000;\r
+       dsp_modulo                        = 0xFFFFFFFF;\r
+       dsp_flags                         = 0x00040000;\r
+       dsp_matrix_control    = 0x00000000;\r
+       dsp_pointer_to_matrix = 0x00000000;\r
+       dsp_data_organization = 0xffffffff;\r
+       dsp_control                       = 0x00012800;\r
+       dsp_div_control           = 0x00000000;\r
+       dsp_in_exec                       = 0;\r
+\r
+       for (int i=0;i<32;i++)\r
+       {\r
+               dsp_reg[i]           = 0x00000000;\r
+               dsp_alternate_reg[i] = 0x00000000;\r
+       }\r
+       \r
+       dsp_reg_bank_0 = dsp_reg;\r
+       dsp_reg_bank_1 = dsp_alternate_reg;\r
+//     dsp_reg_bank_1 = dsp_reg;\r
+//     dsp_reg_bank_0 = dsp_alternate_reg;\r
+\r
+       reset_flag_z();\r
+       reset_flag_n();\r
+       reset_flag_c();\r
+\r
+       dsp_alternate_flag_z=0;\r
+       dsp_alternate_flag_n=0;\r
+       dsp_alternate_flag_c=0;\r
+\r
+       dsp_reset_stats();\r
+\r
+       memset(dsp_ram_8,                 0xff, 0x2000);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//     \r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_done(void)\r
+{\r
+       int i, j;\r
+       fprintf(log_get(),"dsp: stopped at pc=0x%.8x dsp_modulo=0x%.8x(dsp %s running)\n",dsp_pc,dsp_modulo,dsp_running?"was":"wasn't");\r
+       fprintf(log_get(),"dsp: %sin interrupt handler\n",(dsp_flags & 0x8)?"":"not ");\r
+       int bits, mask;\r
+\r
+       // get the active interrupt bits \r
+       bits = (dsp_control >> 6) & 0x1f;\r
+       bits |= (dsp_control >> 10) & 0x20;\r
+\r
+       // get the interrupt mask \r
+       mask = (dsp_flags >> 4) & 0x1f;\r
+       mask |= (dsp_flags >> 11) & 0x20;\r
+\r
+       fprintf(log_get(),"dsp: bits=0x%.8x mask=0x%.8x\n",bits,mask);\r
+       fprintf(log_get(),"\nregisters bank 0\n");\r
+       for (int j=0;j<8;j++)\r
+       {\r
+               fprintf(log_get(),"\tr%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x\n",\r
+                                                 (j<<2)+0,dsp_reg[(j<<2)+0],\r
+                                                 (j<<2)+1,dsp_reg[(j<<2)+1],\r
+                                                 (j<<2)+2,dsp_reg[(j<<2)+2],\r
+                                                 (j<<2)+3,dsp_reg[(j<<2)+3]);\r
+\r
+       }\r
+//     fprintf(log_get(),"registers bank 1\n");\r
+//     for (j=0;j<8;j++)\r
+//     {\r
+//             fprintf(log_get(),"\tr%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x\n",\r
+//                                               (j<<2)+0,dsp_alternate_reg[(j<<2)+0],\r
+//                                               (j<<2)+1,dsp_alternate_reg[(j<<2)+1],\r
+//                                               (j<<2)+2,dsp_alternate_reg[(j<<2)+2],\r
+//                                               (j<<2)+3,dsp_alternate_reg[(j<<2)+3]);\r
+//\r
+//     }\r
+       static char buffer[512];\r
+       j=dsp_work_ram_base;\r
+       for (int i=0;i<4096;i++)\r
+       {\r
+               uint32 oldj=j;\r
+               j+=dasmjag(JAGUAR_DSP,buffer,j);\r
+//             fprintf(log_get(),"\t0x%.8x: %s\n",oldj,buffer);\r
+       }\r
+\r
+/*\r
+       fprintf(log_get(),"dsp opcodes use:\n");\r
+       for (i=0;i<64;i++)\r
+       {\r
+               if (dsp_opcode_use[i])\r
+                       fprintf(log_get(),"\t%s %i\n",dsp_opcode_str[i],dsp_opcode_use[i]);\r
+       }\r
+*/\r
+       memory_free(dsp_ram_8);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void dsp_exec(int32 cycles)\r
+{\r
+       if ((cycles!=1)&&(jaguar_mainRom_crc32==0xba74c3ed))\r
+               dsp_check_if_i2s_interrupt_needed();\r
+\r
+#ifdef DSP_SINGLE_STEPPING\r
+       if (dsp_control&0x18)\r
+       {\r
+               cycles=1;\r
+               dsp_control&=~0x10;\r
+       }\r
+#endif\r
+       dsp_check_irqs();\r
+       dsp_releaseTimeSlice_flag=0;\r
+       dsp_in_exec++;\r
+       while ((cycles>0)&&(dsp_running))\r
+       {\r
+               dsp_flag_c=(dsp_flag_c?1:0);\r
+               dsp_flag_z=(dsp_flag_z?1:0);\r
+               dsp_flag_n=(dsp_flag_n?1:0);\r
+\r
+\r
+/*\r
+               if (dsp_pc==0x00f1b02c)\r
+               {\r
+                       if (dsp_fp)\r
+                       {\r
+                               fclose(dsp_fp);\r
+                               exit(0);\r
+                       }\r
+               }\r
+               else \r
+               if (dsp_pc==0x00f1b032)\r
+               {\r
+                       dsp_fp=fopen("c:\\bad.log","wrt");\r
+                       if (dsp_fp==NULL)\r
+                               MessageBox(NULL,"Cannot open dsp log","",MB_OK);\r
+               }\r
+               if (dsp_fp)\r
+               {\r
+                       fprintf(dsp_fp,"0x%.8x\n",dsp_pc);\r
+               }\r
+               \r
+//             if (dsp_pc==0x00f1b130)\r
+//                     dsp_load_bin_at("SCHRIFT.DAT",0x120000);\r
+*/             \r
+               uint16 opcode=dsp_word_read(dsp_pc);\r
+               dsp_opcode_first_parameter=(opcode&0x3e0)>>5;\r
+               dsp_opcode_second_parameter=(opcode&0x1f);\r
+               dsp_pc+=2;\r
+               dsp_opcode[opcode>>10]();\r
+               dsp_opcode_use[opcode>>10]++;\r
+               cycles-=dsp_opcode_cycles[opcode>>10];\r
+       }\r
+       dsp_in_exec--;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_jump(void)\r
+{\r
+       uint32 delayed_pc = Rm;\r
+       uint32 jaguar_flags;\r
+\r
+       // normalize flags\r
+       dsp_flag_c=dsp_flag_c?1:0;\r
+       dsp_flag_z=dsp_flag_z?1:0;\r
+       dsp_flag_n=dsp_flag_n?1:0;\r
+\r
+       jaguar_flags=(dsp_flag_n<<2)|(dsp_flag_c<<1)|dsp_flag_z;\r
+\r
+       if (branch_condition(imm_2))\r
+       {\r
+               dsp_exec(1);\r
+               dsp_pc=delayed_pc;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_jr(void)\r
+{\r
+       int32 offset=(imm_1&0x10) ? (0xFFFFFFF0|imm_1) : imm_1;\r
+\r
+       int32 delayed_pc = dsp_pc + (offset * 2);\r
+       uint32 jaguar_flags;\r
+\r
+       // normalize flags\r
+       dsp_flag_c=dsp_flag_c?1:0;\r
+       dsp_flag_z=dsp_flag_z?1:0;\r
+       dsp_flag_n=dsp_flag_n?1:0;\r
+       \r
+       jaguar_flags=(dsp_flag_n<<2)|(dsp_flag_c<<1)|dsp_flag_z;\r
+\r
+       if (branch_condition(imm_2))\r
+       {\r
+               dsp_exec(1);\r
+               dsp_pc=delayed_pc;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_add(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+    #ifdef __GCCWIN32__\r
+       asm(\r
+       "addl %1, %2\r
+    setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       asm(\r
+       "addl %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               add   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_addc(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+       We use __GCCWIN32__ for this "bug".\r
+    */\r
+\r
+    #ifdef __GCCWIN32__        \r
+       \r
+    asm(\r
+       "addl %1, %2\r
+       cmp       $0, _dsp_flag_c\r
+       clc\r
+       jz 1f\r
+       stc\r
+       1:\r
+       adc %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       #else\r
+\r
+    asm(\r
+       "addl %1, %2\r
+       cmp       $0, dsp_flag_c\r
+       clc\r
+       jz 1f\r
+       stc\r
+       1:\r
+       adc %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+    #endif     \r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               cmp       [dsp_flag_c],0\r
+               clc\r
+               jz        dsp_opcode_addc_no_carry\r
+               stc\r
+dsp_opcode_addc_no_carry:\r
+               adc   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_addq(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 _Rm=dsp_convert_zero[imm_1];\r
+       uint32 res;\r
+       \r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+    \r
+       asm(\r
+       "addl %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "addl %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               add   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sub(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+    \r
+       asm(\r
+       "subl %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "subl %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif  \r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               sub   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_subc(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "addl %1, %2\r
+       cmp       $0, _dsp_flag_c\r
+       clc\r
+       jz 1f\r
+       stc\r
+       1:\r
+       sbb %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "addl %1, %2\r
+       cmp       $0, dsp_flag_c\r
+       clc\r
+       jz 1f\r
+       stc\r
+       1:\r
+       sbb %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               cmp       [dsp_flag_c],0\r
+               clc\r
+               jz        dsp_opcode_subc_no_carry\r
+               stc\r
+dsp_opcode_subc_no_carry:\r
+               sbb   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_subq(void)\r
+{\r
+       uint32 _Rm=dsp_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "subl %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "subl %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               sub   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_cmp(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "cmpl %0, %1\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "cmpl %0, %1\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               cmp   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_cmpq(void)\r
+{\r
+       static int32 sqtable[32] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1};\r
+       int32 _Rm=sqtable[imm_1&0x1f];\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "cmpl %0, %1\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "cmpl %0, %1\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               cmp   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_and(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "andl %1, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "andl %1, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               and   eax,edx\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_or(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "orl %1, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "orl %1, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               or    eax,edx\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_xor(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "xorl %1, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "xorl %1, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               xor   eax,edx\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_not(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "notl %1\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "notl %1\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               not   eax\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_move_pc(void)\r
+{\r
+       Rn = dsp_pc-2; \r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sat8(void)\r
+{\r
+       int32 _Rn=(int32)Rn;\r
+\r
+       uint32 res= Rn = (_Rn<0) ? 0 : (_Rn > 0xff ? 0xff : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sat16(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res= Rn = (_Rn&0x80000000) ? 0 : (_Rn > 0xFFFF ? 0xFFFF : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sat24(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+\r
+       uint32 res= Rn = (_Rn&0x80000000) ? 0 : (_Rn > 0xFFFFFF ? 0xFFFFFF : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_store_r14_indexed(void)\r
+{\r
+       dsp_long_write( dsp_reg[14] + (dsp_convert_zero[imm_1] << 2),Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_store_r15_indexed(void)\r
+{\r
+       dsp_long_write( dsp_reg[15] + (dsp_convert_zero[imm_1] << 2),Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_load_r14_ri(void)\r
+{\r
+       Rn=dsp_long_read(dsp_reg[14] + Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_load_r15_ri(void)\r
+{\r
+       Rn=dsp_long_read(dsp_reg[15] + Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_store_r14_ri(void)\r
+{\r
+       dsp_long_write(dsp_reg[14] + Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_store_r15_ri(void)\r
+{\r
+       dsp_long_write(dsp_reg[15] + Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_nop(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_pack(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+\r
+       if (Rm==0)\r
+       {\r
+               Rn =((_Rn & 0x03C00000) >> 10) |\r
+                       ((_Rn & 0x0001E000) >> 5)  |\r
+                       ((_Rn & 0x000000FF));\r
+       }\r
+       else\r
+       {\r
+               Rn =((_Rn & 0x0000F000) << 10) |\r
+                       ((_Rn & 0x00000F00) << 5)  |\r
+                       ((_Rn & 0x000000FF));\r
+       }\r
+       reset_flag_z();\r
+       reset_flag_n();\r
+       set_flag_z(Rn);\r
+       set_flag_n(Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_storeb(void)\r
+{\r
+       if ((Rm >= dsp_work_ram_base) && (Rm < (dsp_work_ram_base+0x2000)))\r
+               dsp_long_write(Rm,Rn&0xff);\r
+       else\r
+               jaguar_byte_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_storew(void)\r
+{\r
+       if ((Rm >= dsp_work_ram_base) && (Rm < (dsp_work_ram_base+0x2000)))\r
+               dsp_long_write(Rm,Rn&0xffff);\r
+       else\r
+               jaguar_word_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_store(void)\r
+{\r
+       dsp_long_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_loadb(void)\r
+{\r
+       if ((Rm >= dsp_work_ram_base) && (Rm < (dsp_work_ram_base+0x2000)))\r
+               Rn=dsp_long_read(Rm)&0xff;\r
+       else\r
+               Rn=jaguar_byte_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_loadw(void)\r
+{\r
+       if ((Rm >= dsp_work_ram_base) && (Rm < (dsp_work_ram_base+0x2000)))\r
+               Rn=dsp_long_read(Rm)&0xffff;\r
+       else\r
+               Rn=jaguar_word_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_load(void)\r
+{\r
+       Rn = dsp_long_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_load_r14_indexed(void)\r
+{\r
+       Rn = dsp_long_read( dsp_reg[14] + (dsp_convert_zero[imm_1] << 2));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_load_r15_indexed(void)\r
+{\r
+       Rn = dsp_long_read( dsp_reg[15] + (dsp_convert_zero[imm_1] << 2));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_movei(void)\r
+{\r
+       Rn = ((uint32)dsp_word_read(dsp_pc)) + (((uint32)dsp_word_read(dsp_pc+2))<<16);\r
+       dsp_pc+=4;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_moveta(void)\r
+{\r
+       alternate_Rn = Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_movefa(void)\r
+{\r
+       Rn = alternate_Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_move(void)\r
+{\r
+       Rn = Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_moveq(void)\r
+{\r
+       Rn = imm_1;    \r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_resmac(void)\r
+{\r
+       Rn = dsp_acc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_imult(void)\r
+{\r
+       uint32 res=Rn=((int16)Rn)*((int16)Rm);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_mult(void)\r
+{\r
+       uint32 res=Rn =  ((uint16)Rm) * ((uint16)Rn);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_bclr(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "btrl %1, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "btrl %1, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               btr       eax,ecx\r
+               cmp   eax,0\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_btst(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "bt %0, %1\r
+       setnc _dsp_flag_z\r
+       "\r
+       :\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "bt %0, %1\r
+       setnc dsp_flag_z\r
+       "\r
+       :\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               bt        eax,ecx\r
+               setnc [dsp_flag_z]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_bset(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "btsl %1, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "btsl %1, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               bts       eax,ecx\r
+               cmp   eax,0\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_subqt(void)\r
+{\r
+       Rn -= dsp_convert_zero[imm_1];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_addqt(void)\r
+{\r
+       Rn += dsp_convert_zero[imm_1];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_imacn(void)\r
+{\r
+       uint32 res=((int16)Rm) * ((int16)(Rn));\r
+       dsp_acc += res;\r
+} \r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_mtoi(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 res=Rn=(((INT32)_Rm >> 8) & 0xff800000) | (_Rm & 0x007fffff);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_normi(void)\r
+{\r
+       uint32 _Rm = Rm;\r
+       uint32 res = 0;\r
+\r
+       if (_Rm)\r
+       {\r
+               while ((_Rm & 0xffc00000) == 0)\r
+               {\r
+                       _Rm <<= 1;\r
+                       res--;\r
+               }\r
+               while ((_Rm & 0xff800000) != 0)\r
+               {\r
+                       _Rm >>= 1;\r
+                       res++;\r
+               }\r
+       }\r
+       Rn = res;\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_mmult(void)\r
+{\r
+       int count       = dsp_matrix_control&0x0f;\r
+       uint32 addr = dsp_pointer_to_matrix; // in the gpu ram\r
+       int64 accum = 0;\r
+       uint32 res;\r
+\r
+       if (!(dsp_matrix_control & 0x10))\r
+       {\r
+               for (int i = 0; i < count; i++)\r
+               { \r
+                       int16 a;\r
+                       if (i&0x01)\r
+                               a=(int16)((dsp_alternate_reg[dsp_opcode_first_parameter + (i>>1)]>>16)&0xffff);\r
+                       else\r
+                               a=(int16)(dsp_alternate_reg[dsp_opcode_first_parameter + (i>>1)]&0xffff);\r
+                       int16 b=((int16)dsp_word_read(addr+2));\r
+                       accum += a*b;\r
+                       addr += 4;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for (int i = 0; i < count; i++)\r
+               {\r
+                       int16 a;\r
+                       if (i&0x01)\r
+                               a=(int16)((dsp_alternate_reg[dsp_opcode_first_parameter + (i>>1)]>>16)&0xffff);\r
+                       else\r
+                               a=(int16)(dsp_alternate_reg[dsp_opcode_first_parameter + (i>>1)]&0xffff);\r
+                       int16 b=((int16)dsp_word_read(addr+2));\r
+                       accum += a*b;\r
+                       addr += 4 * count;\r
+               }\r
+       }\r
+       Rn = res = (int32)accum;\r
+       // carry flag to do\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_abs(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+       \r
+       if (_Rn==0x80000000)\r
+       {\r
+               set_flag_n(1);\r
+       }\r
+       else\r
+       {\r
+               dsp_flag_c  = ((_Rn&0x80000000)>>31);\r
+               res= Rn =  (_Rn & 0x80000000) ? -_Rn : _Rn;\r
+               reset_flag_n();\r
+               set_flag_z(res);\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_div(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+\r
+       if (_Rm)\r
+       {\r
+               if (dsp_div_control & 1)\r
+               {\r
+                       dsp_remain = (((uint64)_Rn) << 16) % _Rm;\r
+                       if (dsp_remain&0x80000000)\r
+                               dsp_remain-=_Rm;\r
+                       Rn = (((uint64)_Rn) << 16) / _Rm;\r
+               }\r
+               else\r
+               {\r
+                       dsp_remain = _Rn % _Rm;\r
+                       if (dsp_remain&0x80000000)\r
+                               dsp_remain-=_Rm;\r
+                       Rn/=_Rm;\r
+               }\r
+       }\r
+       else\r
+               Rn=0xffffffff;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_imultn(void)\r
+{\r
+       uint32 res=(int32)(((int16)Rn)*((int16)Rm));\r
+       dsp_acc=(int32)res;\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_neg(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "\r
+       subl %1, %2\r
+       setc  _dsp_flag_c\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rn), "a"(0));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "\r
+       subl %1, %2\r
+       setc  dsp_flag_c\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rn), "a"(0));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               xor       eax,eax\r
+               mov   edx,_Rn\r
+               sub   eax,edx\r
+               setc  [dsp_flag_c]\r
+               setz  [dsp_flag_z]\r
+               sets  [dsp_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_shlq(void)\r
+{\r
+       uint32 shift=(32-dsp_convert_zero[imm_1]);\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz _dsp_flag_c\r
+       shl %%cl, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz dsp_flag_c\r
+       shl %%cl, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+       #endif  \r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [dsp_flag_c]\r
+               shl eax,cl\r
+               cmp eax,0\r
+               setz [dsp_flag_z]\r
+               sets [dsp_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_shrq(void)\r
+{\r
+       uint32 shift=dsp_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+       \r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x00000001, %2\r
+       setnz _dsp_flag_c\r
+       shr %%cl, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "testl $0x00000001, %2\r
+       setnz dsp_flag_c\r
+       shr %%cl, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+       #endif  \r
+\r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x00000001\r
+               setnz [dsp_flag_c]\r
+               shr eax,cl\r
+               cmp eax,0\r
+               setz [dsp_flag_z]\r
+               sets [dsp_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_ror(void)\r
+{\r
+       uint32 shift=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz _dsp_flag_c\r
+       ror %%cl, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz dsp_flag_c\r
+       ror %%cl, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [dsp_flag_c]\r
+               ror eax,cl\r
+               cmp eax,0\r
+               setz [dsp_flag_z]\r
+               sets [dsp_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_rorq(void)\r
+{\r
+       uint32 shift=dsp_convert_zero[imm_1&0x1f];\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz _dsp_flag_c\r
+       ror %%cl, %2\r
+       cmpl $0, %2\r
+       setz  _dsp_flag_z\r
+       sets  _dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "testl $0x80000000, %2\r
+       setnz dsp_flag_c\r
+       ror %%cl, %2\r
+       cmpl $0, %2\r
+       setz  dsp_flag_z\r
+       sets  dsp_flag_n\r
+       movl %%eax, %0\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [dsp_flag_c]\r
+               ror eax,cl\r
+               cmp eax,0\r
+               setz [dsp_flag_z]\r
+               sets [dsp_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sha(void)\r
+{\r
+       int32 sRm=(int32)Rm;\r
+       uint32 _Rn=Rn;\r
+\r
+       if (sRm<0)\r
+       {\r
+               uint32 shift=-sRm;\r
+               if (shift>=32) shift=32;\r
+               dsp_flag_c=(_Rn&0x80000000)>>31;\r
+               while (shift)\r
+               {\r
+                       _Rn<<=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               uint32 shift=sRm;\r
+               if (shift>=32) shift=32;\r
+               dsp_flag_c=_Rn&0x1;\r
+               while (shift)\r
+               {\r
+                       _Rn=((int32)_Rn)>>1;\r
+                       shift--;\r
+               }\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sharq(void)\r
+{\r
+       uint32 shift=dsp_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+\r
+       dsp_flag_c  = (_Rn & 0x1);\r
+       while (shift)\r
+       {\r
+               _Rn=((int32)_Rn)>>1;\r
+               shift--;\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void dsp_opcode_sh(void)\r
+{\r
+       int32 sRm=(int32)Rm;\r
+       uint32 _Rn=Rn;\r
+\r
+       if (sRm<0)\r
+       {\r
+               uint32 shift=(-sRm);\r
+               if (shift>=32) shift=32;\r
+               dsp_flag_c=(_Rn&0x80000000)>>31;\r
+               while (shift)\r
+               {\r
+                       _Rn<<=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               uint32 shift=sRm;\r
+               if (shift>=32) shift=32;\r
+               dsp_flag_c=_Rn&0x1;\r
+               while (shift)\r
+               {\r
+                       _Rn>>=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
+\r
+#define CLR_ZN  { dsp_flag_n=0; dsp_flag_z=0; };\r
+#define CLR_ZNC { dsp_flag_c=0; dsp_flag_n=0; dsp_flag_z=0; };\r
+#define SET_Z(r)                       (dsp_flag_z= ((r) == 0))\r
+#define SET_C_ADD(a,b)         (dsp_flag_c= ((UINT32)(b) > (UINT32)(~(a))) << 1)\r
+#define SET_C_SUB(a,b)         (dsp_flag_c= ((UINT32)(b) > (UINT32)(a)) << 1)\r
+#define SET_N(r)                       (dsp_flag_n= (((UINT32)(r) >> 29) & 4))\r
+#define SET_ZN(r)                      SET_N(r); SET_Z(r)\r
+#define SET_ZNC_ADD(a,b,r)     SET_N(r); SET_Z(r); SET_C_ADD(a,b)\r
+#define SET_ZNC_SUB(a,b,r)     SET_N(r); SET_Z(r); SET_C_SUB(a,b)\r
+\r
+void dsp_opcode_addqmod(void)  \r
+{\r
+       UINT32 r1 = dsp_convert_zero[imm_1];\r
+       UINT32 r2 = Rn;\r
+       UINT32 res = r2 + r1;\r
+       res = (res & (~dsp_modulo)) | (r2 & dsp_modulo);\r
+       Rn = res;\r
+       CLR_ZNC; SET_ZNC_ADD(r2,r1,res);\r
+}\r
+void dsp_opcode_subqmod(void)  \r
+{\r
+       UINT32 r1 = dsp_convert_zero[imm_1];\r
+       UINT32 r2 = Rn;\r
+       UINT32 res = r2 - r1;\r
+       res = (res & (~dsp_modulo)) | (r2 & dsp_modulo);\r
+       Rn = res;\r
+       \r
+       SET_ZNC_SUB(r2,r1,res);\r
+}\r
+void dsp_opcode_mirror(void)   \r
+{\r
+       UINT32 r1 = Rn;\r
+       UINT32 res = (mirror_table[r1 & 0xffff] << 16) | mirror_table[r1 >> 16];\r
+       Rn = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+void dsp_opcode_sat32s(void)           \r
+{\r
+       INT32 r2 = (UINT32)Rn;\r
+       INT32 temp = dsp_acc >> 32;\r
+       UINT32 res = (temp < -1) ? (INT32)0x80000000 : (temp > 0) ? (INT32)0x7fffffff : r2;\r
+       Rn = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+void dsp_opcode_sat16s(void)           \r
+{\r
+       INT32 r2 = Rn;\r
+       UINT32 res = (r2 < -32768) ? -32768 : (r2 > 32767) ? 32767 : r2;\r
+       Rn = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
diff --git a/src/eeprom.cpp b/src/eeprom.cpp
new file mode 100644 (file)
index 0000000..f6e66bb
--- /dev/null
@@ -0,0 +1,428 @@
+#include "eeprom.h"\r
+\r
+#define eeprom_LOG\r
+\r
+static uint16 eeprom_ram[64];\r
+\r
+void eeprom_set_di(uint32 state); \r
+void eeprom_set_cs(uint32 state);\r
+uint32 eeprom_get_do(void);\r
+\r
+#define EE_STATE_START                 1\r
+#define EE_STATE_OP_A                  2\r
+#define EE_STATE_OP_B                  3\r
+#define EE_STATE_0                             4\r
+#define EE_STATE_1                             5\r
+#define EE_STATE_2                             6\r
+#define EE_STATE_3                             7\r
+#define EE_STATE_0_0                   8\r
+#define EE_READ_ADDRESS                        9\r
+#define EE_STATE_0_0_0                 10\r
+#define EE_STATE_0_0_1                 11\r
+#define EE_STATE_0_0_2                 12\r
+#define EE_STATE_0_0_3                 13\r
+#define EE_STATE_0_0_1_0               14\r
+#define EE_READ_DATA                   15\r
+#define EE_STATE_BUSY                  16\r
+#define EE_STATE_1_0                   17\r
+#define EE_STATE_1_1                   18\r
+#define EE_STATE_2_0                   19\r
+#define EE_STATE_3_0                   20\r
+\r
+uint16 jerry_ee_state = EE_STATE_START;\r
+uint16 jerry_ee_op = 0;\r
+uint16 jerry_ee_rstate = 0;\r
+uint16 jerry_ee_address_data = 0;\r
+uint16 jerry_ee_address_cnt = 6;\r
+uint16 jerry_ee_data = 0;\r
+uint16 jerry_ee_data_cnt = 16;\r
+uint16 jerry_writes_enabled = 0;\r
+uint16 jerry_ee_direct_jump = 0;\r
+FILE * jerry_ee_fp;\r
+extern char * jaguar_boot_dir;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_init(void)\r
+{\r
+       static char eeprom_filename[256];\r
+       sprintf(eeprom_filename,"%s\\%s%.8x.eep",jaguar_boot_dir,jaguar_eeproms_path,jaguar_mainRom_crc32);\r
+       jerry_ee_fp=fopen(eeprom_filename,"rb");\r
+       if (jerry_ee_fp)\r
+       {\r
+               fread(eeprom_ram,1,128,jerry_ee_fp);\r
+               fclose(jerry_ee_fp);\r
+               fprintf(log_get(),"eeprom: loaded from %s\n",eeprom_filename);\r
+               jerry_ee_fp=fopen(eeprom_filename,"wrb");\r
+       }\r
+       else\r
+       {\r
+               fprintf(log_get(),"eeprom: creating %s\n",eeprom_filename);\r
+               jerry_ee_fp=fopen(eeprom_filename,"wb");\r
+               if (jerry_ee_fp==NULL)\r
+                       fprintf(log_get(),"eeprom: could not open/create %s\n",eeprom_filename);\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_reset(void)\r
+{\r
+       if (jerry_ee_fp==NULL)\r
+               memset(eeprom_ram,0xff,64*2);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_done(void)\r
+{\r
+       if (jerry_ee_fp)\r
+       {\r
+               fwrite(eeprom_ram,1,128,jerry_ee_fp);\r
+               fclose(jerry_ee_fp);\r
+       }\r
+       else\r
+               fprintf(log_get(),"eeprom: not saved\n");\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_byte_write(uint32 offset, uint8 data)\r
+{\r
+       switch (offset)\r
+       {\r
+       case 0xf14001: break;\r
+       case 0xf14801: eeprom_set_di(data&0x01); break;\r
+       case 0xf15001: eeprom_set_cs(1); break;\r
+//     default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_word_write(uint32 offset, uint16 data)\r
+{\r
+       eeprom_byte_write(offset+0,(data>>8)&0xff);\r
+       eeprom_byte_write(offset+1,(data&0xff));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 eeprom_byte_read(uint32 offset)\r
+{\r
+       switch (offset)\r
+       {\r
+       case 0xf14001: return(eeprom_get_do());  break;\r
+       case 0xf14801: break;\r
+       case 0xf15001: eeprom_set_cs(1); break;\r
+//     default: fprintf(log_get(),"eeprom: unmapped 0x%.8x\n",offset); break;\r
+       }\r
+       return(0x00);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 eeprom_word_read(uint32 offset)\r
+{\r
+       uint16 data=eeprom_byte_read(offset+0);\r
+       data<<=8;\r
+       data|=eeprom_byte_read(offset+1);\r
+       return(data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_set_di(uint32 data)\r
+{\r
+//     fprintf(log_get(),"eeprom: di=%i\n",data);\r
+//     fprintf(log_get(),"eeprom: state %i\n",jerry_ee_state);\r
+       switch (jerry_ee_state)\r
+       {\r
+       case EE_STATE_START: { \r
+                                                       jerry_ee_state=EE_STATE_OP_A; \r
+                                                       break;\r
+                                                }\r
+       case EE_STATE_OP_A:  { \r
+                                                       jerry_ee_op=(data<<1); \r
+                                                       jerry_ee_state=EE_STATE_OP_B; \r
+                                                       break;\r
+                                                }\r
+       case EE_STATE_OP_B:  {\r
+                                                       jerry_ee_op|=data; \r
+                                                       jerry_ee_direct_jump=0;\r
+//                                                     fprintf(log_get(),"eeprom: opcode %i\n",jerry_ee_op);\r
+                                                       switch (jerry_ee_op)\r
+                                                       {\r
+                                                       case 0: jerry_ee_state=EE_STATE_0; break;\r
+                                                       case 1: jerry_ee_state=EE_STATE_1; break;\r
+                                                       case 2: jerry_ee_state=EE_STATE_2; break;\r
+                                                       case 3: jerry_ee_state=EE_STATE_3; break;\r
+                                                       }\r
+                                                       eeprom_set_di(data);\r
+                                                       break;\r
+                                                }\r
+       case EE_STATE_0:        {\r
+                                                       jerry_ee_rstate=EE_STATE_0_0;\r
+                                                       jerry_ee_state=EE_READ_ADDRESS;\r
+                                                       jerry_ee_direct_jump=1;\r
+                                                       jerry_ee_address_cnt=6;\r
+                                                       jerry_ee_address_data=0;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_0_0:      {\r
+                                                       switch ((jerry_ee_address_data>>4)&0x03)\r
+                                                       {\r
+                                                       case 0: jerry_ee_state=EE_STATE_0_0_0; break;\r
+                                                       case 1: jerry_ee_state=EE_STATE_0_0_1; break;\r
+                                                       case 2: jerry_ee_state=EE_STATE_0_0_2; break;\r
+                                                       case 3: jerry_ee_state=EE_STATE_0_0_3; break;\r
+                                                       }\r
+                                                       eeprom_set_di(data);\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_0_0_0:{\r
+                                                       // writes disable\r
+                                                       // fprintf(log_get(),"eeprom: read only\n");\r
+                                                       jerry_writes_enabled=0;\r
+                                                       jerry_ee_state=EE_STATE_START;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_0_0_1:{\r
+                                                       // writes all\r
+                                                       jerry_ee_rstate=EE_STATE_0_0_1_0;\r
+                                                       jerry_ee_state=EE_READ_DATA;\r
+                                                       jerry_ee_data_cnt=16;\r
+                                                       jerry_ee_data=0;\r
+                                                       jerry_ee_direct_jump=1;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_0_0_1_0:{\r
+                                                       // fprintf(log_get(),"eeprom: filling eeprom with 0x%.4x\n",data);\r
+                                                       if (jerry_writes_enabled)\r
+                                                       {\r
+                                                               for (int i=0;i<64;i++)\r
+                                                                       eeprom_ram[i]=jerry_ee_data;\r
+                                                       }\r
+                                                       //else \r
+                                                       //      fprintf(log_get(),"eeprom: not writing because read only\n");\r
+                                                       jerry_ee_state=EE_STATE_BUSY;\r
+                                                       break;\r
+                                                 }\r
+       case EE_STATE_0_0_2:{\r
+                                                       // erase all\r
+                                                       //fprintf(log_get(),"eeprom: erasing eeprom\n");\r
+                                                       if (jerry_writes_enabled)\r
+                                                       {\r
+                                                               for (int i=0;i<64;i++)\r
+                                                                       eeprom_ram[i]=0xffff;\r
+                                                       }\r
+                                                       jerry_ee_state=EE_STATE_BUSY;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_0_0_3:{\r
+                                                       // writes enable\r
+                                                       //fprintf(log_get(),"eeprom: read/write\n");\r
+                                                       jerry_writes_enabled=1;\r
+                                                       jerry_ee_state=EE_STATE_START;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_1:        {\r
+                                                       jerry_ee_rstate=EE_STATE_1_0;\r
+                                                       jerry_ee_state=EE_READ_ADDRESS;\r
+                                                       jerry_ee_address_cnt=6;\r
+                                                       jerry_ee_address_data=0;\r
+                                                       jerry_ee_direct_jump=1;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_1_0:      {\r
+                                                       jerry_ee_rstate=EE_STATE_1_1;\r
+                                                       jerry_ee_state=EE_READ_DATA;\r
+                                                       jerry_ee_data_cnt=16;\r
+                                                       jerry_ee_data=0;\r
+                                                       jerry_ee_direct_jump=1;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_1_1:      {\r
+                                                       //fprintf(log_get(),"eeprom: writing 0x%.4x at 0x%.2x\n",jerry_ee_data,jerry_ee_address_data);\r
+                                                       if (jerry_writes_enabled)\r
+                                                               eeprom_ram[jerry_ee_address_data]=jerry_ee_data;\r
+                                                       jerry_ee_state=EE_STATE_BUSY;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_2:        {\r
+                                                       jerry_ee_rstate=EE_STATE_2_0;\r
+                                                       jerry_ee_state=EE_READ_ADDRESS;\r
+                                                       jerry_ee_address_cnt=6;\r
+                                                       jerry_ee_address_data=0;\r
+                                                       jerry_ee_data_cnt=16;\r
+                                                       jerry_ee_data=0;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_3:        {\r
+                                                       jerry_ee_rstate=EE_STATE_3_0;\r
+                                                       jerry_ee_state=EE_READ_ADDRESS;\r
+                                                       jerry_ee_address_cnt=6;\r
+                                                       jerry_ee_address_data=0;\r
+                                                       jerry_ee_direct_jump=1;\r
+                                                       break;\r
+                                               }\r
+       case EE_STATE_3_0:      {\r
+                                                       //fprintf(log_get(),"eeprom: erasing 0x%.2x\n",jerry_ee_address_data);\r
+                                                       if (jerry_writes_enabled)\r
+                                                               eeprom_ram[jerry_ee_address_data]=0xffff;\r
+                                                       jerry_ee_state=EE_STATE_BUSY;\r
+                                                       break;\r
+                                               }\r
+       case EE_READ_DATA: \r
+                                               {\r
+                                                       //fprintf(log_get(),"eeprom:\t\t\t%i bit %i\n",data,jerry_ee_data_cnt-1);\r
+                                                       jerry_ee_data<<=1;\r
+                                                       jerry_ee_data|=data;\r
+                                                       jerry_ee_data_cnt--;\r
+                                                       if (!jerry_ee_data_cnt)\r
+                                                       {\r
+                                                               jerry_ee_state=jerry_ee_rstate;\r
+                                                               if (jerry_ee_direct_jump)\r
+                                                                       eeprom_set_di(data);\r
+                                                       }\r
+                                                       break;\r
+                                               }\r
+       case EE_READ_ADDRESS: \r
+                                               {\r
+                                                       jerry_ee_address_data<<=1;\r
+                                                       jerry_ee_address_data|=data;\r
+                                                       jerry_ee_address_cnt--;\r
+//                                                     fprintf(log_get(),"eeprom:\t%i bits remaining\n",jerry_ee_address_cnt);\r
+                                                       if (!jerry_ee_address_cnt)\r
+                                                       {\r
+                                                               jerry_ee_state=jerry_ee_rstate;\r
+                                                               //fprintf(log_get(),"eeprom:\t\tread address 0x%.2x\n",jerry_ee_address_data);\r
+                                                               if (jerry_ee_direct_jump)\r
+                                                                       eeprom_set_di(data);\r
+                                                       }\r
+                                                       break;\r
+                                               }\r
+       default:                        { \r
+                                                       jerry_ee_state=EE_STATE_OP_A; \r
+                                                       break;\r
+                                                }\r
+                                               \r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void eeprom_set_cs(uint32 state)\r
+{\r
+//     fprintf(log_get(),"eeprom: cs=%i\n",state);\r
+       jerry_ee_state=EE_STATE_START;\r
+       jerry_ee_op=0;\r
+       jerry_ee_rstate=0;\r
+       jerry_ee_address_data=0;\r
+       jerry_ee_address_cnt=6;\r
+       jerry_ee_data=0;\r
+       jerry_ee_data_cnt=16;\r
+       jerry_writes_enabled=1;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 eeprom_get_do(void)\r
+{\r
+       uint16 data=1;\r
+       switch (jerry_ee_state)\r
+       {\r
+       case EE_STATE_START: {\r
+                                                       data=1;\r
+                                                       break;\r
+                                                }\r
+       case EE_STATE_BUSY: {\r
+                                                       jerry_ee_state=EE_STATE_START;\r
+                                                       data=0;\r
+                                                       break;\r
+                                                }\r
+       case EE_STATE_2_0:      {\r
+                                                       jerry_ee_data_cnt--;\r
+                                                       data=((eeprom_ram[jerry_ee_address_data]&(1<<jerry_ee_data_cnt))>>jerry_ee_data_cnt);\r
+                                                       if (!jerry_ee_data_cnt)\r
+                                                       {\r
+                                                               //fprintf(log_get(),"eeprom: read 0x%.4x at 0x%.2x cpu %i pc=0x%.8x\n",eeprom_ram[jerry_ee_address_data],jerry_ee_address_data,jaguar_cpu_in_exec,s68000readPC());\r
+                                                               jerry_ee_state=EE_STATE_START;\r
+                                                       }\r
+                                                       break;\r
+                                               }\r
+       }\r
+//     fprintf(log_get(),"eeprom: do=%i\n",data);\r
+       return(data);\r
+}\r
diff --git a/src/gpu.cpp b/src/gpu.cpp
new file mode 100644 (file)
index 0000000..b33390a
--- /dev/null
@@ -0,0 +1,3110 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/gpu.h"\r
+\r
+#define CINT0FLAG                      0x00200\r
+#define CINT1FLAG                      0x00400\r
+#define CINT2FLAG                      0x00800\r
+#define CINT3FLAG                      0x01000\r
+#define CINT4FLAG                      0x02000\r
+#define CINT04FLAGS                    (CINT0FLAG | CINT1FLAG | CINT2FLAG | CINT3FLAG | CINT4FLAG)\r
+\r
+extern int start_logging;\r
+\r
+\r
+static void gpu_opcode_add(void);\r
+static void gpu_opcode_addc(void);\r
+static void gpu_opcode_addq(void);\r
+static void gpu_opcode_addqt(void);\r
+static void gpu_opcode_sub(void);\r
+static void gpu_opcode_subc(void);\r
+static void gpu_opcode_subq(void);\r
+static void gpu_opcode_subqt(void);\r
+static void gpu_opcode_neg(void);\r
+static void gpu_opcode_and(void);\r
+static void gpu_opcode_or(void);\r
+static void gpu_opcode_xor(void);\r
+static void gpu_opcode_not(void);\r
+static void gpu_opcode_btst(void);\r
+static void gpu_opcode_bset(void);\r
+static void gpu_opcode_bclr(void);\r
+static void gpu_opcode_mult(void);\r
+static void gpu_opcode_imult(void);\r
+static void gpu_opcode_imultn(void);\r
+static void gpu_opcode_resmac(void);\r
+static void gpu_opcode_imacn(void);\r
+static void gpu_opcode_div(void);\r
+static void gpu_opcode_abs(void);\r
+static void gpu_opcode_sh(void);\r
+static void gpu_opcode_shlq(void);\r
+static void gpu_opcode_shrq(void);\r
+static void gpu_opcode_sha(void);\r
+static void gpu_opcode_sharq(void);\r
+static void gpu_opcode_ror(void);\r
+static void gpu_opcode_rorq(void);\r
+static void gpu_opcode_cmp(void);\r
+static void gpu_opcode_cmpq(void);\r
+static void gpu_opcode_sat8(void);\r
+static void gpu_opcode_sat16(void);\r
+static void gpu_opcode_move(void);\r
+static void gpu_opcode_moveq(void);\r
+static void gpu_opcode_moveta(void);\r
+static void gpu_opcode_movefa(void);\r
+static void gpu_opcode_movei(void);\r
+static void gpu_opcode_loadb(void);\r
+static void gpu_opcode_loadw(void);\r
+static void gpu_opcode_load(void);\r
+static void gpu_opcode_loadp(void);\r
+static void gpu_opcode_load_r14_indexed(void);\r
+static void gpu_opcode_load_r15_indexed(void);\r
+static void gpu_opcode_storeb(void);\r
+static void gpu_opcode_storew(void);\r
+static void gpu_opcode_store(void);\r
+static void gpu_opcode_storep(void);\r
+static void gpu_opcode_store_r14_indexed(void);\r
+static void gpu_opcode_store_r15_indexed(void);\r
+static void gpu_opcode_move_pc(void);\r
+static void gpu_opcode_jump(void);\r
+static void gpu_opcode_jr(void);\r
+static void gpu_opcode_mmult(void);\r
+static void gpu_opcode_mtoi(void);\r
+static void gpu_opcode_normi(void);\r
+static void gpu_opcode_nop(void);\r
+static void gpu_opcode_load_r14_ri(void);\r
+static void gpu_opcode_load_r15_ri(void);\r
+static void gpu_opcode_store_r14_ri(void);\r
+static void gpu_opcode_store_r15_ri(void);\r
+static void gpu_opcode_sat24(void);\r
+static void gpu_opcode_pack(void);\r
+\r
+uint8 gpu_opcode_cycles[64] = \r
+{\r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,\r
+       3,  3,  1,  3,  \r
+       1, 18,  3,  3,  \r
+       3,  3,  3,  3,  \r
+       3,  3,  3,  3,\r
+       3,  3,  2,  2,  \r
+       2,  2,  3,  4,  \r
+       5,  4,  5,  6,  \r
+       6,  1,  1,  1,\r
+       1,  2,  2,  2,  \r
+       1,  1,  9,  3,  \r
+       3,  1,  6,  6,  \r
+       2,  2,  3,  3\r
+};\r
+\r
+void (*gpu_opcode[64])()= \r
+{      \r
+       gpu_opcode_add,                                 gpu_opcode_addc,                                gpu_opcode_addq,                                gpu_opcode_addqt,\r
+       gpu_opcode_sub,                                 gpu_opcode_subc,                                gpu_opcode_subq,                                gpu_opcode_subqt,\r
+       gpu_opcode_neg,                                 gpu_opcode_and,                                 gpu_opcode_or,                                  gpu_opcode_xor,\r
+       gpu_opcode_not,                                 gpu_opcode_btst,                                gpu_opcode_bset,                                gpu_opcode_bclr,\r
+       gpu_opcode_mult,                                gpu_opcode_imult,                               gpu_opcode_imultn,                              gpu_opcode_resmac,\r
+       gpu_opcode_imacn,                               gpu_opcode_div,                                 gpu_opcode_abs,                                 gpu_opcode_sh,\r
+       gpu_opcode_shlq,                                gpu_opcode_shrq,                                gpu_opcode_sha,                                 gpu_opcode_sharq,\r
+       gpu_opcode_ror,                                 gpu_opcode_rorq,                                gpu_opcode_cmp,                                 gpu_opcode_cmpq,\r
+       gpu_opcode_sat8,                                gpu_opcode_sat16,                               gpu_opcode_move,                                gpu_opcode_moveq,\r
+       gpu_opcode_moveta,                              gpu_opcode_movefa,                              gpu_opcode_movei,                               gpu_opcode_loadb,\r
+       gpu_opcode_loadw,                               gpu_opcode_load,                                gpu_opcode_loadp,                               gpu_opcode_load_r14_indexed,\r
+       gpu_opcode_load_r15_indexed,    gpu_opcode_storeb,                              gpu_opcode_storew,                              gpu_opcode_store,\r
+       gpu_opcode_storep,                              gpu_opcode_store_r14_indexed,   gpu_opcode_store_r15_indexed,   gpu_opcode_move_pc,\r
+       gpu_opcode_jump,                                gpu_opcode_jr,                                  gpu_opcode_mmult,                               gpu_opcode_mtoi,\r
+       gpu_opcode_normi,                               gpu_opcode_nop,                                 gpu_opcode_load_r14_ri,                 gpu_opcode_load_r15_ri,\r
+       gpu_opcode_store_r14_ri,                gpu_opcode_store_r15_ri,                gpu_opcode_sat24,                               gpu_opcode_pack,\r
+};\r
+\r
+static uint8 * gpu_ram_8;\r
+//static uint16        *gpu_ram_16;\r
+//static uint32        *gpu_ram_32;\r
+\r
+\r
+static uint32 gpu_pc;\r
+static uint32 gpu_acc;\r
+static uint32 gpu_remain;\r
+static uint32 gpu_hidata;\r
+static uint32 gpu_flags;\r
+static uint32 gpu_matrix_control;\r
+static uint32 gpu_pointer_to_matrix;\r
+static uint32 gpu_data_organization;\r
+static uint32 gpu_control;\r
+static uint32 gpu_div_control;\r
+static uint8 gpu_flag_z;\r
+static uint8 gpu_flag_n;\r
+static uint8 gpu_flag_c;    \r
+static uint8 gpu_alternate_flag_z;\r
+static uint8 gpu_alternate_flag_n;\r
+static uint8 gpu_alternate_flag_c;    \r
+static uint32 * gpu_reg;\r
+static uint32 * gpu_alternate_reg;\r
+static uint32 * gpu_reg_bank_0;\r
+static uint32 * gpu_reg_bank_1;\r
+\r
+static uint32 gpu_opcode_first_parameter;\r
+static uint32 gpu_opcode_second_parameter;\r
+\r
+#define gpu_running (gpu_control&0x01)\r
+\r
+#define Rm gpu_reg[gpu_opcode_first_parameter]\r
+#define Rn gpu_reg[gpu_opcode_second_parameter]\r
+#define alternate_Rm gpu_alternate_reg[gpu_opcode_first_parameter]\r
+#define alternate_Rn gpu_alternate_reg[gpu_opcode_second_parameter]\r
+#define imm_1 gpu_opcode_first_parameter\r
+#define imm_2 gpu_opcode_second_parameter\r
+\r
+#define set_flag_z(r) gpu_flag_z=(r==0); \r
+#define set_flag_n(r) gpu_flag_n=((r&0x80000000)>>31);\r
+\r
+#define reset_flag_z() gpu_flag_z=0;\r
+#define reset_flag_n() gpu_flag_n=0;\r
+#define reset_flag_c() gpu_flag_c=0;    \r
+\r
+uint32 gpu_convert_zero[32] = { 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };\r
+\r
+uint8 * branch_condition_table = 0;\r
+#define branch_condition(x)    branch_condition_table[(x) + ((jaguar_flags & 7) << 5)]\r
+\r
+uint32 gpu_opcode_use[64];\r
+\r
+void gpu_update_register_banks(void);\r
+\r
+char *gpu_opcode_str[64]= \r
+{      \r
+       "add",                          "addc",                         "addq",                         "addqt",\r
+       "sub",                          "subc",                         "subq",                         "subqt",\r
+       "neg",                          "and",                          "or",                           "xor",\r
+       "not",                          "btst",                         "bset",                         "bclr",\r
+       "mult",                         "imult",                        "imultn",                       "resmac",\r
+       "imacn",                        "div",                          "abs",                          "sh",\r
+       "shlq",                         "shrq",                         "sha",                          "sharq",\r
+       "ror",                          "rorq",                         "cmp",                          "cmpq",\r
+       "sat8",                         "sat16",                        "move",                         "moveq",\r
+       "moveta",                       "movefa",                       "movei",                        "loadb",\r
+       "loadw",                        "load",                         "loadp",                        "load_r14_indexed",\r
+       "load_r15_indexed",     "storeb",                       "storew",                       "store",\r
+       "storep",                       "store_r14_indexed","store_r15_indexed","move_pc",\r
+       "jump",                         "jr",                           "mmult",                        "mtoi",\r
+       "normi",                        "nop",                          "load_r14_ri",          "load_r15_ri",\r
+       "store_r14_ri",         "store_r15_ri",         "sat24",                        "pack",\r
+};\r
+\r
+static uint32 gpu_in_exec = 0;\r
+static uint32 gpu_releaseTimeSlice_flag = 0;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_releaseTimeslice(void)\r
+{\r
+       gpu_releaseTimeSlice_flag = 1;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 gpu_get_pc(void)\r
+{\r
+       return gpu_pc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void build_branch_condition_table(void)\r
+{\r
+#define ZFLAG  0x00001\r
+#define CFLAG  0x00002\r
+#define NFLAG  0x00004\r
+       \r
+       if (!branch_condition_table)\r
+       {\r
+               branch_condition_table = (uint8*)malloc(32 * 8 * sizeof(branch_condition_table[0]));\r
+\r
+               if (branch_condition_table)\r
+               {\r
+                       for(int i=0; i<8; i++)\r
+                       {\r
+                               for(int j=0; j<32; j++)\r
+                               {\r
+                                       int result = 1;\r
+                                       if (j & 1)\r
+                                               if (i & ZFLAG)\r
+                                                       result = 0;\r
+                                       if (j & 2)\r
+                                               if (!(i & ZFLAG))\r
+                                                       result = 0;\r
+                                       if (j & 4)\r
+                                               if (i & (CFLAG << (j >> 4)))\r
+                                                       result = 0;\r
+                                       if (j & 8)\r
+                                               if (!(i & (CFLAG << (j >> 4))))\r
+                                                       result = 0;\r
+                                       branch_condition_table[i * 32 + j] = result;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+//\r
+// GPU byte access (read)\r
+//\r
+\r
+unsigned gpu_byte_read(unsigned int offset)\r
+{      \r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+               return gpu_ram_8[offset & 0xFFF];\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               uint32 data = gpu_long_read(offset & 0xFFFFFFFC);\r
+\r
+               if ((offset & 0x03) == 0)\r
+                       return data >> 24;\r
+               else if ((offset & 0x03) == 1)\r
+                       return (data >> 16) & 0xFF;\r
+               else if ((offset & 0x03) == 2)\r
+                       return (data >> 8) & 0xFF;\r
+               else if ((offset & 0x03) == 3)\r
+                       return data & 0xFF;\r
+       }\r
+\r
+       return jaguar_byte_read(offset);\r
+}\r
+\r
+//\r
+// GPU word access (read)\r
+//\r
+\r
+unsigned gpu_word_read(unsigned int offset)\r
+{\r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               offset &= 0xFFF;\r
+               uint16 data = (((uint16)gpu_ram_8[offset]) << 8) | (uint16)gpu_ram_8[offset+1];\r
+               return data;\r
+       }\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+// This looks and smells wrong...\r
+// But it *might* be OK...\r
+               if (offset & 0x01)                      // Catch cases 1 & 3... (unaligned read)\r
+                       return (gpu_byte_read(offset) << 8) | gpu_byte_read(offset+1);\r
+\r
+               uint32 data = gpu_long_read(offset & 0xFFFFFFFC);\r
+\r
+               if (offset & 0x02)                      // Cases 0 & 2...\r
+                       return data & 0xFFFF;\r
+               else\r
+                       return data >> 16;\r
+       }\r
+\r
+       return jaguar_word_read(offset);\r
+}\r
+\r
+//\r
+// GPU dword access (read)\r
+//\r
+\r
+unsigned gpu_long_read(unsigned int offset)\r
+{\r
+\r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               offset &= 0xFFF;\r
+               return ((uint32)gpu_ram_8[offset] << 24) | ((uint32)gpu_ram_8[offset+1] << 16)\r
+                       | ((uint32)gpu_ram_8[offset+2] << 8) | (uint32)gpu_ram_8[offset+3];\r
+       }\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               offset &= 0x1F;\r
+               switch (offset)\r
+               {\r
+               case 0x00:\r
+                       gpu_flag_c = (gpu_flag_c ? 1 : 0);\r
+                       gpu_flag_z = (gpu_flag_z ? 1 : 0);\r
+                       gpu_flag_n = (gpu_flag_n ? 1 : 0);\r
+\r
+                       gpu_flags = (gpu_flags & 0xFFFFFFF8) | (gpu_flag_n << 2) | (gpu_flag_c << 1) | gpu_flag_z;\r
+                                       \r
+                       return gpu_flags & 0xFFFFC1FF;\r
+               case 0x04:\r
+                       return gpu_matrix_control;\r
+               case 0x08:\r
+                       return gpu_pointer_to_matrix;\r
+               case 0x0C:\r
+                       return gpu_data_organization;\r
+               case 0x10:\r
+                       return gpu_pc;\r
+               case 0x14:\r
+                       return gpu_control;\r
+               case 0x18:\r
+                       return gpu_hidata;\r
+               case 0x1C:\r
+                       return gpu_remain;\r
+               default:                                                                // unaligned long read\r
+                       return 0;\r
+                       //exit(0);\r
+                       //         __asm int 3\r
+                       //                 }\r
+               }\r
+               // to prevent any lock-ups\r
+       }\r
+\r
+       return (jaguar_word_read(offset) << 16) | jaguar_word_read(offset+2);\r
+}\r
+\r
+//\r
+// GPU byte access (write)\r
+//\r
+\r
+void gpu_byte_write(unsigned offset, unsigned data)\r
+{\r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               gpu_ram_8[offset & 0xFFF] = data;\r
+               if (gpu_in_exec == 0)\r
+               {\r
+//                     s68000releaseTimeslice();\r
+                       m68k_end_timeslice();\r
+                       dsp_releaseTimeslice();\r
+               }\r
+               return;\r
+       }\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               uint32 reg = offset & 0x1C;\r
+               int bytenum = offset & 0x03;\r
+\r
+//This is definitely wrong!\r
+               if ((reg >= 0x1C) && (reg <= 0x1F))\r
+                       gpu_div_control = (gpu_div_control & (~(0xFF << (bytenum << 3)))) | (data << (bytenum << 3));                           \r
+               else\r
+               {\r
+                       uint32 old_data = gpu_long_read(offset & 0xFFFFFFC);\r
+                       bytenum = 3 - bytenum; // convention motorola !!!\r
+                       old_data = (old_data & (~(0xFF << (bytenum << 3)))) | (data << (bytenum << 3)); \r
+                       gpu_long_write(offset & 0xFFFFFFC, old_data);\r
+               }\r
+               return;\r
+       }\r
+//     fprintf(log_get(),"gpu: writing %.2x at 0x%.8x\n",data,offset);\r
+       jaguar_byte_write(offset, data);\r
+}\r
+\r
+//\r
+// GPU word access (write)\r
+//\r
+\r
+void gpu_word_write(unsigned offset, unsigned data)\r
+{\r
+\r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+\r
+               gpu_ram_8[offset & 0xFFF] = (data>>8) & 0xFF;\r
+               gpu_ram_8[(offset+1) & 0xFFF] = data & 0xFF;\r
+               if (gpu_in_exec == 0)\r
+               {\r
+//                     s68000releaseTimeslice();\r
+                       m68k_end_timeslice();\r
+                       dsp_releaseTimeslice();\r
+               }\r
+               return;\r
+       }\r
+       if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               if (offset & 0x01)              // This is supposed to weed out unaligned writes, but does nothing...\r
+               {\r
+                       //exit(0);\r
+                       //__asm int 3\r
+               }\r
+               if ((offset & 0x1C) == 0x1C)\r
+               {\r
+//This doesn't look right either--handles cases 1, 2, & 3 all the same!\r
+                       if (offset & 0x03)\r
+                               gpu_div_control = (gpu_div_control&0xFFFF0000) | (data&0xFFFF);\r
+                       else\r
+                               gpu_div_control = (gpu_div_control&0xFFFF) | ((data&0xFFFF)<<16);\r
+               }\r
+               else \r
+               {\r
+                       uint32 old_data = gpu_long_read(offset & 0xFFFFFFC);\r
+                       if (offset & 0x03)\r
+                               old_data = (old_data & 0xFFFF0000) | (data & 0xFFFF);\r
+                       else\r
+                               old_data = (old_data & 0xFFFF) | ((data & 0xFFFF) << 16);\r
+                       gpu_long_write(offset & 0xFFFFFFC, old_data);\r
+               }\r
+               return;\r
+       }\r
+//     fprintf(log_get(),"gpu: writing %.4x at 0x%.8x\n",data,offset);\r
+       jaguar_word_write(offset, data);\r
+}\r
+\r
+//\r
+// GPU dword access (write)\r
+//\r
+\r
+void gpu_long_write(unsigned offset, unsigned data)\r
+{\r
+\r
+       if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               gpu_ram_8[offset & 0xFFF] = (data >> 24) & 0xFF;\r
+               gpu_ram_8[(offset+1) & 0xFFF] = (data >> 16) & 0xFF;\r
+               gpu_ram_8[(offset+2) & 0xFFF] = (data >> 8) & 0xFF;\r
+               gpu_ram_8[(offset+3) & 0xFFF] = data & 0xFF;\r
+               return;\r
+       }\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               offset &= 0x1F;\r
+               switch (offset)\r
+               {\r
+               case 0x00:\r
+                       /*if (data&0x8)\r
+                               gpu_flags=(data&(~0x08))|(gpu_flags&0x08); // update dsp_flags, but keep imask unchanged\r
+                       else*/\r
+                       gpu_flags = data;\r
+                       gpu_flag_z = gpu_flags & 0x01;\r
+                       gpu_flag_c = (gpu_flags>>1) & 0x01;\r
+                       gpu_flag_n = (gpu_flags>>2) & 0x01;\r
+                       gpu_update_register_banks();\r
+                       gpu_control &= ~((gpu_flags & CINT04FLAGS) >> 3);\r
+                       gpu_check_irqs();\r
+                       break;\r
+               case 0x04:\r
+                       gpu_matrix_control = data;\r
+                       break;\r
+               case 0x08:\r
+                       gpu_pointer_to_matrix=data;\r
+                       break;\r
+               case 0x0C:\r
+                       gpu_data_organization=data;\r
+                       break;\r
+               case 0x10:\r
+                       gpu_pc = data;  /*fprintf(log_get(),"setting gpu pc to 0x%.8x\n",gpu_pc);*/\r
+                       break;\r
+               case 0x14:\r
+               {       \r
+                       uint32 gpu_was_running = gpu_running;\r
+                                               \r
+                       data &= (~0x7C0); // disable writes to irq pending\r
+                       /*if (gpu_running)\r
+                       {\r
+                               fprintf(log_get(),"gpu pc is 0x%.8x\n",gpu_pc);\r
+                               fclose(log_get());\r
+                               exit(0);\r
+                       }*/\r
+                       // check for GPU->CPU interrupt\r
+                       if (data & 0x02)\r
+                       {\r
+//                             fprintf(log_get(),"GPU->CPU interrupt\n");\r
+                               if (tom_irq_enabled(IRQ_GPU))\r
+                               {\r
+                                       if ((tom_irq_enabled(IRQ_GPU)) && (jaguar_interrupt_handler_is_valid(64)))\r
+                                       {\r
+                                               tom_set_pending_gpu_int();\r
+//                                             s68000interrupt(7,64);\r
+//                                             s68000flushInterrupts();\r
+                                               m68k_set_irq(7);                        // Set 68000 NMI\r
+                                               gpu_releaseTimeslice();\r
+                                       }\r
+/*\r
+                                       uint32 addr=jaguar_word_read(((IRQ_GPU+64)<<2)+0);\r
+                                       addr<<=16;\r
+                                       addr|=jaguar_word_read(((IRQ_GPU+64)<<2)+2);\r
+                                       if ((addr)&&(jaguar_interrupt_handler_is_valid(IRQ_GPU+64)))\r
+                                       {\r
+                                               s68000interrupt(7,IRQ_GPU+64);\r
+                                               s68000flushInterrupts();\r
+                                       }\r
+*/\r
+                               }\r
+                               data &= ~(0x02);\r
+                       }\r
+                       // check for CPU->GPU interrupt\r
+                       if (data & 0x04)\r
+                       {\r
+                               //fprintf(log_get(),"CPU->GPU interrupt\n");\r
+                               gpu_set_irq_line(0, 1);\r
+//                             s68000releaseTimeslice();\r
+                               m68k_end_timeslice();\r
+                               dsp_releaseTimeslice();\r
+                               data &= ~(0x04);\r
+                       }\r
+                       // single stepping\r
+                       if (data & 0x10)\r
+                       {\r
+                               //fprintf(log_get(),"asked to perform a single step (single step is %senabled)\n",(data&0x8)?"":"not ");\r
+                       }\r
+                       gpu_control = (gpu_control & 0x107C0) | (data & (~0x107C0));\r
+\r
+                       // if gpu wasn't running but is now running, execute a few cycles\r
+#ifndef GPU_SINGLE_STEPPING\r
+                       if ((!gpu_was_running) && (gpu_running))\r
+                               gpu_exec(200);\r
+#else\r
+                       if (gpu_control & 0x18)\r
+                               gpu_exec(1);\r
+#endif\r
+                       break;\r
+               }\r
+               case 0x18:\r
+                       gpu_hidata = data;\r
+                       break;\r
+               case 0x1C:\r
+                       gpu_div_control = data;\r
+                       break;\r
+//             default:   // unaligned long write\r
+                       //exit(0);\r
+                       //__asm int 3\r
+               }\r
+               return;\r
+       }\r
+//     fprintf(log_get(),"gpu: writing %.8x at 0x%.8x\n",data,offset);\r
+       jaguar_word_write(offset, (data >> 16) & 0xFFFF);\r
+       jaguar_word_write(offset+2, data & 0xFFFF);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_update_register_banks(void)\r
+{\r
+       uint32 temp;\r
+       int bank = (gpu_flags & 0x4000);\r
+\r
+//     fprintf(log_get(),"gpu_update_register_banks at gpu pc 0x%.8x bank=%i iflag=%i\n",gpu_pc,bank?1:0,(gpu_flags&0x8)?1:0);\r
+\r
+       if (gpu_flags & 0x8) \r
+               bank = 0;\r
+\r
+       if ((!bank && (gpu_reg_bank_0 != gpu_reg)) || (bank && (gpu_reg_bank_1 != gpu_reg)))\r
+       {\r
+//             fprintf(log_get(),"\tswitching to bank %i\n",bank?1:0);\r
+               for(int i=0; i<32; i++)\r
+               {\r
+                       temp = gpu_reg[i];\r
+                       gpu_reg[i] = gpu_alternate_reg[i];\r
+                       gpu_alternate_reg[i] = temp;\r
+               }\r
+\r
+               // switch flags\r
+               temp = gpu_flag_z;\r
+               gpu_flag_z = gpu_alternate_flag_z;\r
+               gpu_alternate_flag_z = temp;\r
+\r
+               temp = gpu_flag_n;\r
+               gpu_flag_n = gpu_alternate_flag_n;\r
+               gpu_alternate_flag_n = temp;\r
+\r
+               temp = gpu_flag_c;\r
+               gpu_flag_c = gpu_alternate_flag_c;\r
+               gpu_alternate_flag_c = temp;\r
+\r
+               if (!bank)\r
+               {\r
+                       gpu_reg_bank_0 = gpu_reg;\r
+                       gpu_reg_bank_1 = gpu_alternate_reg;\r
+               }\r
+               else\r
+               {\r
+                       gpu_reg_bank_0 = gpu_alternate_reg;\r
+                       gpu_reg_bank_1 = gpu_reg;\r
+               }\r
+       }\r
+//     else\r
+//     {\r
+//             fprintf(log_get(),"\tnot switching banks\n");\r
+//     }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_check_irqs(void)\r
+{\r
+       int bits, mask, which = 0;\r
+\r
+       // get the active interrupt bits \r
+       bits = (gpu_control >> 6) & 0x1F;\r
+       bits |= (gpu_control >> 10) & 0x20;\r
+\r
+       // get the interrupt mask \r
+       mask = (gpu_flags >> 4) & 0x1F;\r
+       mask |= (gpu_flags >> 11) & 0x20;\r
+       \r
+       // bail if nothing is available\r
+       bits &= mask;\r
+       if (!bits)\r
+               return;\r
+       \r
+       // determine which interrupt \r
+       if (bits & 0x01) which = 0;\r
+       if (bits & 0x02) which = 1;\r
+       if (bits & 0x04) which = 2;\r
+       if (bits & 0x08) which = 3;\r
+       if (bits & 0x10) which = 4;\r
+       if (bits & 0x20) which = 5;\r
+\r
+       if (gpu_flags & 0x8) \r
+               return;\r
+\r
+       if (start_logging)\r
+               fprintf(log_get(),"gpu: generating irg  %i\n",which);\r
+\r
+       // set the interrupt flag \r
+       gpu_flags |= 0x08;\r
+       gpu_update_register_banks();\r
+\r
+       // subqt  #4,r31                ; pre-decrement stack pointer \r
+       // move  pc,r30                 ; address of interrupted code \r
+       // store  r30,(r31)     ; store return address\r
+       gpu_reg[31] -= 4;\r
+       gpu_reg[30] = gpu_pc - 2;\r
+       gpu_long_write(gpu_reg[31], gpu_pc - 2);\r
+       \r
+       // movei  #service_address,r30  ; pointer to ISR entry \r
+       // jump  (r30)                                  ; jump to ISR \r
+       // nop\r
+       gpu_pc = gpu_work_ram_base;\r
+       gpu_pc += which * 0x10;\r
+       gpu_reg[30] = gpu_pc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_set_irq_line(int irqline, int state)\r
+{\r
+       if (start_logging)\r
+               fprintf(log_get(),"gpu: setting irg line %i\n",irqline);\r
+       int mask = 0x40 << irqline;\r
+       gpu_control &= ~mask;\r
+\r
+       if (state)\r
+       {\r
+               gpu_control |= mask;\r
+               gpu_check_irqs();\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_init(void)\r
+{\r
+       memory_malloc_secure((void **)&gpu_ram_8, 0x1000, "GPU work ram");\r
+//     gpu_ram_16=(uint16*)gpu_ram_8;\r
+//     gpu_ram_32=(uint32*)gpu_ram_8;\r
+\r
+       memory_malloc_secure((void **)&gpu_reg, 32*sizeof(int32), "GPU bank 0 regs");\r
+       memory_malloc_secure((void **)&gpu_alternate_reg, 32*sizeof(int32), "GPU bank 1 regs");\r
+       \r
+       build_branch_condition_table();\r
+\r
+       gpu_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_reset(void)\r
+{\r
+       gpu_pc                            = 0x00F03000;\r
+       gpu_acc                           = 0x00000000;\r
+       gpu_remain                        = 0x00000000;\r
+       gpu_hidata                        = 0x00000000;\r
+       gpu_flags                         = 0x00040000;\r
+       gpu_matrix_control    = 0x00000000;\r
+       gpu_pointer_to_matrix = 0x00000000;\r
+       gpu_data_organization = 0xFFFFFFFF;\r
+       gpu_control                       = 0x00012800;\r
+       gpu_div_control           = 0x00000000;\r
+       gpu_in_exec                       = 0;\r
+\r
+       for(int i=0; i<32; i++)\r
+       {\r
+               gpu_reg[i]           = 0x00000000;\r
+               gpu_alternate_reg[i] = 0x00000000;\r
+       }\r
+       \r
+       gpu_reg_bank_0 = gpu_reg;\r
+       gpu_reg_bank_1 = gpu_alternate_reg;\r
+//     gpu_reg_bank_1 = gpu_reg;\r
+//     gpu_reg_bank_0 = gpu_alternate_reg;\r
+\r
+       reset_flag_z();\r
+       reset_flag_n();\r
+       reset_flag_c();\r
+\r
+       gpu_alternate_flag_z = 0;\r
+       gpu_alternate_flag_n = 0;\r
+       gpu_alternate_flag_c = 0;\r
+\r
+       memset(gpu_ram_8, 0xFF, 0x1000);\r
+\r
+       gpu_reset_stats();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 gpu_read_pc(void)\r
+{\r
+       return gpu_pc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_reset_stats(void)\r
+{\r
+       for(uint32 i=0; i<64; i++)\r
+               gpu_opcode_use[i] = 0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_done(void)\r
+{ \r
+       int i, j;\r
+       fprintf(log_get(),"gpu: stopped at pc=0x%.8x (gpu %s running)\n",gpu_pc,gpu_running?"was":"wasn't");\r
+       int bits, mask;\r
+\r
+       // get the active interrupt bits \r
+       bits = (gpu_control >> 6) & 0x1F;\r
+       bits |= (gpu_control >> 10) & 0x20;\r
+\r
+       // get the interrupt mask \r
+       mask = (gpu_flags >> 4) & 0x1F;\r
+       mask |= (gpu_flags >> 11) & 0x20;\r
+       \r
+\r
+       fprintf(log_get(),"gpu: bits=0x%.8x mask=0x%.8x\n",bits,mask);\r
+//     fprintf(log_get(),"\nregisters bank 0\n");\r
+//     for (int j=0;j<8;j++)\r
+//     {\r
+//             fprintf(log_get(),"\tr%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x\n",\r
+//                                               (j<<2)+0,gpu_reg[(j<<2)+0],\r
+//                                               (j<<2)+1,gpu_reg[(j<<2)+1],\r
+//                                               (j<<2)+2,gpu_reg[(j<<2)+2],\r
+//                                               (j<<2)+3,gpu_reg[(j<<2)+3]);\r
+//\r
+//     }\r
+//     fprintf(log_get(),"registers bank 1\n");\r
+//     for (j=0;j<8;j++)\r
+//     {\r
+//             fprintf(log_get(),"\tr%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x r%2i=0x%.8x\n",\r
+//                                               (j<<2)+0,gpu_alternate_reg[(j<<2)+0],\r
+//                                               (j<<2)+1,gpu_alternate_reg[(j<<2)+1],\r
+//                                               (j<<2)+2,gpu_alternate_reg[(j<<2)+2],\r
+//                                               (j<<2)+3,gpu_alternate_reg[(j<<2)+3]);\r
+//\r
+//     }\r
+//     fprintf(log_get(),"---[GPU code at 0x00f03000]---------------------------\n");\r
+       static char buffer[512];\r
+       j = 0xF03000;\r
+       for(int i=0; i<4096; i++)\r
+       {\r
+               uint32 oldj = j;\r
+               j += dasmjag(JAGUAR_GPU, buffer, j);\r
+               fprintf(log_get(),"\t%08X: %s\n", oldj, buffer);\r
+       }\r
+\r
+       fprintf(log_get(), "---[GPU code at %08X]---------------------------\n", gpu_pc);\r
+       j = gpu_pc - 64;\r
+       for(i=0; i<4096; i++)\r
+       {\r
+               uint32 oldj = j;\r
+               j += dasmjag(JAGUAR_GPU, buffer, j);\r
+               fprintf(log_get(), "\t%08X: %s\n", oldj, buffer);\r
+       }\r
+\r
+       fprintf(log_get(), "gpu opcodes use:\n");\r
+       for(i=0; i<64; i++)\r
+       {\r
+               if (gpu_opcode_use[i])\r
+                       fprintf(log_get(), "\t%s %lu\n", gpu_opcode_str[i], gpu_opcode_use[i]);\r
+       }\r
+       memory_free(gpu_ram_8);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void gpu_exec(int32 cycles)\r
+{\r
+       if (!gpu_running)\r
+               return;\r
+\r
+#ifdef GPU_SINGLE_STEPPING\r
+       if (gpu_control & 0x18)\r
+       {\r
+               cycles = 1;\r
+               gpu_control &= ~0x10;\r
+       }\r
+#endif\r
+       gpu_check_irqs();\r
+       gpu_releaseTimeSlice_flag = 0;\r
+       gpu_in_exec++;\r
+\r
+       while ((cycles > 0) && gpu_running)\r
+       {\r
+               gpu_flag_c = (gpu_flag_c ? 1 : 0);\r
+               gpu_flag_z = (gpu_flag_z ? 1 : 0);\r
+               gpu_flag_n = (gpu_flag_n ? 1 : 0);\r
+       \r
+               uint16 opcode = gpu_word_read(gpu_pc);\r
+\r
+               uint32 index = opcode >> 10;            \r
+               gpu_opcode_first_parameter = (opcode & 0x3E0) >> 5;\r
+               gpu_opcode_second_parameter = (opcode & 0x1F);\r
+               gpu_pc += 2;\r
+               gpu_opcode[index]();\r
+               cycles -= gpu_opcode_cycles[index];\r
+               gpu_opcode_use[index]++;\r
+       }\r
+\r
+       gpu_in_exec--;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_jump(void)\r
+{\r
+       uint32 delayed_pc = Rm;\r
+       uint32 jaguar_flags;\r
+\r
+       // normalize flags\r
+       gpu_flag_c = (gpu_flag_c ? 1 : 0);\r
+       gpu_flag_z = (gpu_flag_z ? 1 : 0);\r
+       gpu_flag_n = (gpu_flag_n ? 1 : 0);\r
+\r
+       jaguar_flags = (gpu_flag_n << 2) | (gpu_flag_c << 1) | gpu_flag_z;\r
+\r
+       if (branch_condition(imm_2))\r
+       {\r
+               gpu_exec(1);\r
+               gpu_pc = delayed_pc;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_jr(void)\r
+{\r
+       int32 offset=(imm_1&0x10) ? (0xFFFFFFF0|imm_1) : imm_1;\r
+\r
+       int32 delayed_pc = gpu_pc + (offset * 2);\r
+       uint32 jaguar_flags;\r
+\r
+       // normalize flags\r
+       gpu_flag_c=gpu_flag_c?1:0;\r
+       gpu_flag_z=gpu_flag_z?1:0;\r
+       gpu_flag_n=gpu_flag_n?1:0;\r
+       \r
+       jaguar_flags=(gpu_flag_n<<2)|(gpu_flag_c<<1)|gpu_flag_z;\r
+\r
+       if (branch_condition(imm_2))\r
+       {\r
+               gpu_exec(1);\r
+               gpu_pc=delayed_pc;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_add(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               add   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_addc(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       cmp       $0, _gpu_flag_c                       \n\\r
+       clc                                                             \n\\r
+       jz 1f                                                   \n\\r
+       stc                                                             \n\\r
+       1:                                                              \n\\r
+       adc %1, %2                                              \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #else\r
+       \r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       cmp       $0, gpu_flag_c                        \n\\r
+       clc                                                             \n\\r
+       jz 1f                                                   \n\\r
+       stc                                                             \n\\r
+       1:                                                              \n\\r
+       adc %1, %2                                              \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               cmp       [gpu_flag_c],0\r
+               clc\r
+               jz        gpu_opcode_addc_no_carry\r
+               stc\r
+gpu_opcode_addc_no_carry:\r
+               adc   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_addq(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 _Rm=gpu_convert_zero[imm_1];\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               add   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_addqt(void)\r
+{\r
+       Rn += gpu_convert_zero[imm_1];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sub(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               sub   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_subc(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       cmp       $0, _gpu_flag_c                       \n\\r
+       clc                                                             \n\\r
+       jz 1f                                                   \n\\r
+       stc                                                             \n\\r
+       1:                                                              \n\\r
+       sbb %1, %2                                              \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "addl %1, %2                                    \n\\r
+       cmp       $0, gpu_flag_c                        \n\\r
+       clc                                                             \n\\r
+       jz 1f                                                   \n\\r
+       stc                                                             \n\\r
+       1:                                                              \n\\r
+       sbb %1, %2                                              \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               cmp       [gpu_flag_c],0\r
+               clc\r
+               jz        gpu_opcode_subc_no_carry\r
+               stc\r
+gpu_opcode_subc_no_carry:\r
+               mov   edx,_Rm\r
+               mov   eax,_Rn\r
+               sbb   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_subq(void)\r
+{\r
+       uint32 _Rm=gpu_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif  \r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               sub   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_subqt(void)\r
+{\r
+       Rn -= gpu_convert_zero[imm_1];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_cmp(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "cmpl %0, %1                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "cmpl %0, %1                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               cmp   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_cmpq(void)\r
+{\r
+       static int32 sqtable[32] = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1};\r
+       int32 _Rm=sqtable[imm_1&0x1f];\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "cmpl %0, %1                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "cmpl %0, %1                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       "\r
+       :\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               cmp   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_and(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "andl %1, %2                                    \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "andl %1, %2                                    \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               and   eax,edx\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_or(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "orl %1, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "orl %1, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               or    eax,edx\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_xor(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "xorl %1, %2                                    \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "xorl %1, %2                                    \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   edx,_Rm\r
+               xor   eax,edx\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_not(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "notl %1                                                \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "notl %1                                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               not   eax\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_move_pc(void)\r
+{\r
+       Rn = gpu_pc-2; \r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sat8(void)\r
+{\r
+       int32 _Rn=(int32)Rn;\r
+\r
+       uint32 res= Rn = (_Rn<0) ? 0 : (_Rn > 0xff ? 0xff : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sat16(void)\r
+{\r
+       int32 _Rn=(int32)Rn;\r
+       uint32 res= Rn = (_Rn<0) ? 0 : (_Rn > 0xFFFF ? 0xFFFF : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sat24(void)\r
+{\r
+       int32 _Rn=(int32)Rn;\r
+\r
+       uint32 res= Rn = (_Rn<0) ? 0 : (_Rn > 0xFFFFFF ? 0xFFFFFF : _Rn);\r
+       set_flag_z(res);\r
+       reset_flag_n();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_store_r14_indexed(void)\r
+{\r
+       gpu_long_write( gpu_reg[14] + (gpu_convert_zero[imm_1] << 2),Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_store_r15_indexed(void)\r
+{\r
+       gpu_long_write( gpu_reg[15] + (gpu_convert_zero[imm_1] << 2),Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_load_r14_ri(void)\r
+{\r
+       Rn=gpu_long_read(gpu_reg[14] + Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_load_r15_ri(void)\r
+{\r
+       Rn=gpu_long_read(gpu_reg[15] + Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_store_r14_ri(void)\r
+{\r
+       gpu_long_write(gpu_reg[14] + Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_store_r15_ri(void)\r
+{\r
+       gpu_long_write(gpu_reg[15] + Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_nop(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_pack(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+\r
+       if (Rm==0)\r
+       {\r
+               Rn =((_Rn & 0x03C00000) >> 10) |\r
+                       ((_Rn & 0x0001E000) >> 5)  |\r
+                       ((_Rn & 0x000000FF));\r
+       }\r
+       else\r
+       {\r
+               Rn =((_Rn & 0x0000F000) << 10) |\r
+                       ((_Rn & 0x00000F00) << 5)  |\r
+                       ((_Rn & 0x000000FF));\r
+       }\r
+       reset_flag_z();\r
+       reset_flag_n();\r
+       set_flag_z(Rn);\r
+       set_flag_n(Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_storeb(void)\r
+{\r
+       if ((Rm >= 0xF03000) && (Rm < 0xF04000))\r
+               gpu_long_write(Rm,Rn&0xff);\r
+       else\r
+               jaguar_byte_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_storew(void)\r
+{\r
+       if ((Rm >= 0xF03000) && (Rm < 0xF04000))\r
+               gpu_long_write(Rm,Rn&0xffff);\r
+       else\r
+               jaguar_word_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_store(void)\r
+{\r
+       gpu_long_write(Rm,Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_storep(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       gpu_long_write(_Rm,      gpu_hidata);\r
+       gpu_long_write(_Rm+4, Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_loadb(void)\r
+{\r
+       if ((Rm >= 0xF03000) && (Rm < 0xF04000))\r
+               Rn=gpu_long_read(Rm)&0xff;\r
+       else\r
+               Rn=jaguar_byte_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_loadw(void)\r
+{\r
+       if ((Rm >= 0xF03000) && (Rm < 0xF04000))\r
+               Rn=gpu_long_read(Rm)&0xffff;\r
+       else\r
+               Rn=jaguar_word_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_load(void)\r
+{\r
+       Rn = gpu_long_read(Rm);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_loadp(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+\r
+       gpu_hidata = gpu_long_read(_Rm);\r
+       Rn                 = gpu_long_read(_Rm+4);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_load_r14_indexed(void)\r
+{\r
+       Rn = gpu_long_read( gpu_reg[14] + (gpu_convert_zero[imm_1] << 2));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_load_r15_indexed(void)\r
+{\r
+       Rn = gpu_long_read( gpu_reg[15] + (gpu_convert_zero[imm_1] << 2));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_movei(void)\r
+{\r
+       Rn = ((uint32)gpu_word_read(gpu_pc)) + (((uint32)gpu_word_read(gpu_pc+2))<<16);\r
+       gpu_pc+=4;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_moveta(void)\r
+{\r
+       alternate_Rn = Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_movefa(void)\r
+{\r
+       Rn = alternate_Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_move(void)\r
+{\r
+       Rn = Rm;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_moveq(void)\r
+{\r
+       Rn = imm_1;    \r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_resmac(void)\r
+{\r
+       Rn = gpu_acc;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_imult(void)\r
+{\r
+       uint32 res=Rn=((int16)Rn)*((int16)Rm);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_mult(void)\r
+{\r
+       uint32 res=Rn =  ((uint16)Rm) * ((uint16)Rn);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_bclr(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "btrl %1, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "btrl %1, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               btr       eax,ecx\r
+               cmp   eax,0\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_btst(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "bt %0, %1                                              \n\\r
+       setnc _gpu_flag_z                               \n\\r
+       "\r
+       :\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "bt %0, %1                                              \n\\r
+       setnc gpu_flag_z                                \n\\r
+       "\r
+       :\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               bt        eax,ecx\r
+               setnc [gpu_flag_z]\r
+       };\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_bset(void)\r
+{\r
+       uint32 _Rm=imm_1;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "btsl %1, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "btsl %1, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(_Rm), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov   eax,_Rn\r
+               mov   ecx,_Rm\r
+               bts       eax,ecx\r
+               cmp   eax,0\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov   res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_imacn(void)\r
+{\r
+       uint32 res = ((int16)Rm) * ((int16)(Rn));\r
+       gpu_acc += res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_mtoi(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 res=Rn=(((INT32)_Rm >> 8) & 0xff800000) | (_Rm & 0x007fffff);\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_normi(void)\r
+{\r
+       uint32 _Rm = Rm;\r
+       uint32 res = 0;\r
+\r
+       if (_Rm)\r
+       {\r
+               while ((_Rm & 0xffc00000) == 0)\r
+               {\r
+                       _Rm <<= 1;\r
+                       res--;\r
+               }\r
+               while ((_Rm & 0xff800000) != 0)\r
+               {\r
+                       _Rm >>= 1;\r
+                       res++;\r
+               }\r
+       }\r
+       Rn = res;\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_mmult(void)\r
+{\r
+       int count       = gpu_matrix_control&0x0f;\r
+       uint32 addr = gpu_pointer_to_matrix; // in the gpu ram\r
+       int64 accum = 0;\r
+       uint32 res;\r
+\r
+       if (!(gpu_matrix_control & 0x10))\r
+       {\r
+               for (int i = 0; i < count; i++)\r
+               { \r
+                       int16 a;\r
+                       if (i&0x01)\r
+                               a=(int16)((gpu_alternate_reg[gpu_opcode_first_parameter + (i>>1)]>>16)&0xffff);\r
+                       else\r
+                               a=(int16)(gpu_alternate_reg[gpu_opcode_first_parameter + (i>>1)]&0xffff);\r
+\r
+                       int16 b=((int16)gpu_word_read(addr+2));\r
+                       accum += a*b;\r
+                       addr += 4;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for (int i = 0; i < count; i++)\r
+               {\r
+                       int16 a;\r
+                       if (i&0x01)\r
+                               a=(int16)((gpu_alternate_reg[gpu_opcode_first_parameter + (i>>1)]>>16)&0xffff);\r
+                       else\r
+                               a=(int16)(gpu_alternate_reg[gpu_opcode_first_parameter + (i>>1)]&0xffff);\r
+\r
+                       int16 b=((int16)gpu_word_read(addr+2));\r
+                       accum += a*b;\r
+                       addr += 4 * count;\r
+               }\r
+       }\r
+       Rn = res = (int32)accum;\r
+       // carry flag to do\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_abs(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+       \r
+       if (_Rn==0x80000000)\r
+       {\r
+               set_flag_n(1);\r
+       }\r
+       else\r
+       {\r
+               gpu_flag_c  = ((_Rn&0x80000000)>>31);\r
+               res= Rn =  (((int32)_Rn)<0) ? -_Rn : _Rn;\r
+               reset_flag_n();\r
+               set_flag_z(res);\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_div(void)\r
+{\r
+       uint32 _Rm=Rm;\r
+       uint32 _Rn=Rn;\r
+\r
+       if (_Rm)\r
+       {\r
+               if (gpu_div_control & 1)\r
+               {\r
+                       gpu_remain = (((uint64)_Rn) << 16) % _Rm;\r
+                       if (gpu_remain&0x80000000)\r
+                               gpu_remain-=_Rm;\r
+                       Rn = (((uint64)_Rn) << 16) / _Rm;\r
+               }\r
+               else\r
+               {\r
+                       gpu_remain = _Rn % _Rm;\r
+                       if (gpu_remain&0x80000000)\r
+                               gpu_remain-=_Rm;\r
+                       Rn/=_Rm;\r
+               }\r
+       }\r
+       else\r
+               Rn=0xffffffff;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_imultn(void)\r
+{\r
+       uint32 res = (int32)((int16)Rn * (int16)Rm);\r
+       gpu_acc = (int32)res;\r
+       set_flag_z(res);\r
+       set_flag_n(res);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_neg(void)\r
+{\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  _gpu_flag_c                               \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rn), "a"(0));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "subl %1, %2                                    \n\\r
+       setc  gpu_flag_c                                \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "d"(_Rn), "a"(0));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               xor       eax,eax\r
+               mov   edx,_Rn\r
+               sub   eax,edx\r
+               setc  [gpu_flag_c]\r
+               setz  [gpu_flag_z]\r
+               sets  [gpu_flag_n]\r
+               mov       res,eax\r
+       };\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_shlq(void)\r
+{\r
+       uint32 shift=(32-gpu_convert_zero[imm_1]);\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz _gpu_flag_c                               \n\\r
+       shl %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+       \r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz gpu_flag_c                                \n\\r
+       shl %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [gpu_flag_c]\r
+               shl eax,cl\r
+               cmp eax,0\r
+               setz [gpu_flag_z]\r
+               sets [gpu_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_shrq(void)\r
+{\r
+       uint32 shift=gpu_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+       \r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x00000001, %2                  \n\\r
+       setnz _gpu_flag_c                               \n\\r
+       shr %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "testl $0x00000001, %2                  \n\\r
+       setnz gpu_flag_c                                \n\\r
+       shr %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #endif\r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x00000001\r
+               setnz [gpu_flag_c]\r
+               shr eax,cl\r
+               cmp eax,0\r
+               setz [gpu_flag_z]\r
+               sets [gpu_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_ror(void)\r
+{\r
+       uint32 shift=Rm;\r
+       uint32 _Rn=Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+    #ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz _gpu_flag_c                               \n\\r
+       ror %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+       #else\r
+\r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz gpu_flag_c                                \n\\r
+       ror %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+       #endif\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [gpu_flag_c]\r
+               ror eax,cl\r
+               cmp eax,0\r
+               setz [gpu_flag_z]\r
+               sets [gpu_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif\r
+       Rn=res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_rorq(void)\r
+{\r
+       uint32 shift = gpu_convert_zero[imm_1 & 0x1F];\r
+       uint32 _Rn = Rn;\r
+       uint32 res;\r
+#ifdef __PORT__\r
+\r
+    /*\r
+       GCC on WIN32 (more importantly mingw) doesn't know the declared\r
+       variables in asm until we put a _ before it.\r
+       \r
+       So the declaration dsp_flag_c needs to be _dsp_flag_c on mingw.\r
+    */\r
+\r
+#ifdef __GCCWIN32__\r
+\r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz _gpu_flag_c                               \n\\r
+       ror %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  _gpu_flag_z                               \n\\r
+       sets  _gpu_flag_n                               \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+       \r
+#else\r
+       \r
+       asm(\r
+       "testl $0x80000000, %2                  \n\\r
+       setnz gpu_flag_c                                \n\\r
+       ror %%cl, %2                                    \n\\r
+       cmpl $0, %2                                             \n\\r
+       setz  gpu_flag_z                                \n\\r
+       sets  gpu_flag_n                                \n\\r
+       movl %%eax, %0                                  \n\\r
+       "\r
+       : "=m"(res)\r
+       : "c"(shift), "a"(_Rn));\r
+\r
+#endif // #ifdef __GCCWIN32__\r
+       \r
+#else\r
+       __asm \r
+       {\r
+               mov ecx,shift\r
+               mov eax,_Rn\r
+               test eax,0x80000000\r
+               setnz [gpu_flag_c]\r
+               ror eax,cl\r
+               cmp eax,0\r
+               setz [gpu_flag_z]\r
+               sets [gpu_flag_n]\r
+               mov res,eax\r
+       }\r
+#endif // #ifdef __PORT__\r
+       Rn = res;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sha(void)\r
+{\r
+       int32 sRm=(int32)Rm;\r
+       uint32 _Rn=Rn;\r
+\r
+       if (sRm<0)\r
+       {\r
+               uint32 shift=-sRm;\r
+               if (shift>=32) shift=32;\r
+               gpu_flag_c=(_Rn&0x80000000)>>31;\r
+               while (shift)\r
+               {\r
+                       _Rn<<=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               uint32 shift=sRm;\r
+               if (shift>=32) shift=32;\r
+               gpu_flag_c=_Rn&0x1;\r
+               while (shift)\r
+               {\r
+                       _Rn=((int32)_Rn)>>1;\r
+                       shift--;\r
+               }\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sharq(void)\r
+{\r
+       uint32 shift=gpu_convert_zero[imm_1];\r
+       uint32 _Rn=Rn;\r
+\r
+       gpu_flag_c  = (_Rn & 0x1);\r
+       while (shift)\r
+       {\r
+               _Rn=((int32)_Rn)>>1;\r
+               shift--;\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static void gpu_opcode_sh(void)\r
+{\r
+       int32 sRm=(int32)Rm;\r
+       uint32 _Rn=Rn;  \r
+\r
+       if (sRm<0)\r
+       {\r
+               uint32 shift=(-sRm);\r
+               if (shift>=32) shift=32;\r
+               gpu_flag_c=(_Rn&0x80000000)>>31;\r
+               while (shift)\r
+               {\r
+                       _Rn<<=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               uint32 shift=sRm;\r
+               if (shift>=32) shift=32;\r
+               gpu_flag_c=_Rn&0x1;\r
+               while (shift)\r
+               {\r
+                       _Rn>>=1;\r
+                       shift--;\r
+               }\r
+       }\r
+       Rn=_Rn;\r
+       set_flag_z(_Rn);\r
+       set_flag_n(_Rn);\r
+}\r
diff --git a/src/include/SDLptc.h b/src/include/SDLptc.h
new file mode 100644 (file)
index 0000000..542926f
--- /dev/null
@@ -0,0 +1,258 @@
+//\r
+// Some simple emulation classes to get PTC code running on SDL\r
+//\r
+// by cal16\r
+// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\r
+// Cleanups in some classes and code in general by James L. Hammons\r
+//\r
+\r
+#ifndef __SDLPTC_H__\r
+#define __SDLPTC_H__\r
+\r
+#include "SDL.h"\r
+#ifdef __PORT__\r
+#include <string.h>\r
+#include <stdlib.h>\r
+#endif // #ifdef __PORT__\r
+\r
+#include "types.h"\r
+\r
+#ifndef __PORT__\r
+#define randomize()    srand(time(NULL))\r
+#define random(max)    (rand() % (max))\r
+#endif // #ifndef __PORT__\r
+\r
+class Error\r
+{\r
+       public:\r
+               Error(const char * msg) { strcpy(message, msg); }\r
+               void report(void)               { printf("Error: %s\n", message); }\r
+\r
+       private:\r
+               char message[1024];\r
+};\r
+\r
+class Area\r
+{\r
+       public:\r
+               Area(int ll, int tt, int rr, int bb): l(ll), t(tt), r(rr), b(bb) {}\r
+               int left(void) const    { return l; }\r
+               int right(void) const   { return r; }\r
+               int top(void) const             { return t; }\r
+               int bottom(void) const  { return b; }\r
+               int width(void) const   { return r - l; }\r
+               int height(void) const  { return b - t; }\r
+\r
+       private:\r
+               int l, t, r, b;\r
+};\r
+\r
+       \r
+class Format\r
+{\r
+       public:\r
+               Format(int pBpp, int r=0, int g=0, int b=0): bpp(pBpp), maskR(r), maskG(g), maskB(b) {}\r
+               Uint8 BPP(void) const           { return bpp; }\r
+               Uint32 MaskR(void) const        { return maskR; }\r
+               Uint32 MaskG(void) const        { return maskG; }\r
+               Uint32 MaskB(void) const        { return maskB; }\r
+\r
+       private:\r
+               Uint8 bpp;\r
+               Uint32 maskR, maskG, maskB;\r
+};\r
+\r
+class Surface\r
+{\r
+       public:\r
+           Surface(int w, int h, const Format &format)\r
+           {\r
+                       surface = SDL_AllocSurface(SDL_SWSURFACE, w, h, format.BPP(),\r
+                                       format.MaskR(), format.MaskG(), format.MaskB(), 0);\r
+                       if (surface == NULL)\r
+                       {\r
+                               throw Error(SDL_GetError());\r
+                       }\r
+                       nupdates = 0;\r
+                       is_console = 0;\r
+               }\r
+               Surface(void)\r
+               {\r
+                       nupdates = 0;\r
+                       is_console = 1;\r
+               }\r
+               ~Surface()\r
+               {\r
+                       if (!is_console)\r
+                               SDL_FreeSurface(surface);\r
+               }\r
+\r
+               virtual int width(void)         { return surface->w; }\r
+               virtual int height(void)        { return surface->h; }\r
+               virtual int pitch(void)         { return surface->pitch; }\r
+               virtual void palette(int32 * pcolors)\r
+               {\r
+                       SDL_Color colors[256];\r
+\r
+                       for(int i=0; i<256; ++i)\r
+                               colors[i].r = (pcolors[i] >> 16) & 0xFF,\r
+                               colors[i].g = (pcolors[i] >> 8) & 0xFF,\r
+                               colors[i].b = (pcolors[i] >> 0) & 0xFF;\r
+                       SDL_SetColors(surface, colors, 0, 256);\r
+               }\r
+\r
+               virtual void * lock(void)\r
+               {\r
+                       if (SDL_MUSTLOCK(surface))\r
+                               while (SDL_LockSurface(surface) < 0)\r
+                                       SDL_Delay(10);\r
+\r
+                       return (Uint8 *)surface->pixels;\r
+               }\r
+\r
+               virtual void unlock(void)\r
+               {\r
+                       if (SDL_MUSTLOCK(surface))\r
+                               SDL_UnlockSurface(surface);\r
+               }\r
+       \r
+               virtual void copy(Surface &dst, const Area &srcarea, const Area &dstarea)\r
+               {\r
+                       SDL_Rect srcrect, dstrect;\r
+                       srcrect.x = srcarea.left();\r
+                       srcrect.y = srcarea.top();\r
+                       srcrect.w = srcarea.width();\r
+                       srcrect.h = srcarea.height();\r
+                       dstrect.x = dstarea.left();\r
+                       dstrect.y = dstarea.top();\r
+                       dstrect.w = dstarea.width();\r
+                       dstrect.h = dstarea.height();\r
+                       SDL_BlitSurface(surface, &srcrect, dst.surface, &dstrect);\r
+                       dst.updates[dst.nupdates++] = dstrect;\r
+               }\r
+               virtual void copy(Surface &dst)\r
+               {\r
+                       SDL_Rect srcrect, dstrect;\r
+                       srcrect.x = 0;\r
+                       srcrect.y = 0;\r
+                       srcrect.w = surface->w;\r
+                       srcrect.h = surface->h;\r
+                       dstrect.x = 0;\r
+                       dstrect.y = 0;\r
+                       dstrect.w = surface->w;\r
+                       dstrect.h = surface->h;\r
+                       SDL_LowerBlit(surface, &srcrect, dst.surface, &dstrect);\r
+                       dst.updates[dst.nupdates++] = dstrect;\r
+               }\r
+\r
+               virtual void update(void)\r
+               {\r
+                       /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com) */\r
+                       /* SDL_Flip is infact the same as SDL_Blitsurface but\r
+                               if SDL_DOUBLEBUF | SDL_HWSURFACE is available, it \r
+                               makes use of it. If not is uses SDL_Blitsurface */\r
+                   SDL_Flip(surface);      \r
+                       nupdates = 0;\r
+               }\r
+\r
+       public:\r
+               SDL_Surface * surface;\r
+\r
+       protected:\r
+               int nupdates;\r
+               SDL_Rect updates[1];            /* Definitely increase this.. */\r
+               int is_console;\r
+};\r
+\r
+class Console: public Surface\r
+{\r
+       public:\r
+               Console(): Surface(), fullscreen(0), nJoystick(0) {}\r
+               ~Console()                              { SDL_Quit(); }\r
+\r
+               /* Added/changed by SDLEMU (http://sdlemu.ngemu.com) */\r
+               /* We need to close several items in SDL because of memory leaks\r
+                       and core dumps and stuff :) */\r
+               void close(void)\r
+               {\r
+                       SDL_JoystickClose(joystick);\r
+                       SDL_FreeSurface(surface);\r
+                       SDL_QuitSubSystem(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK | SDL_INIT_AUDIO | SDL_INIT_TIMER);\r
+                       SDL_Quit();\r
+               }\r
+               void option(char * option)\r
+               {\r
+                       if (!stricmp(option, "fullscreen output"))\r
+                               fullscreen = 1;\r
+                       else if (!stricmp(option, "windowed output"))\r
+                               fullscreen = 0;\r
+                       /* Added/changed by SDLEMU (http://sdlemu.ngemu.com) */\r
+                       else if (!stricmp(option, "joystick enabled"))\r
+                               nJoystick = 1;\r
+                       else if (!stricmp(option, "joystick disabled"))\r
+                               nJoystick = 0;\r
+               }\r
+       \r
+               /* The following was changed/added by SDLEMU (http://sdlemu.ngemu.com) */\r
+       \r
+               void open(const char * title, int width, int height, const Format &format)\r
+               {\r
+                       Uint32 flags = SDL_SWSURFACE;\r
+\r
+                       if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_JOYSTICK | SDL_INIT_AUDIO | SDL_INIT_TIMER) < 0)\r
+                               throw Error(SDL_GetError());\r
+\r
+                   const SDL_VideoInfo * info = SDL_GetVideoInfo(); // Let us get proper info about the platform.\r
+\r
+                       if (!info)\r
+                       {\r
+                               fprintf(stderr, "SDL is unable to get the video query : %s\n", SDL_GetError());\r
+                               exit(1);\r
+                       }\r
+\r
+                       if (info->hw_available)\r
+                               flags = SDL_HWSURFACE | SDL_HWPALETTE | SDL_DOUBLEBUF;\r
+               \r
+                       if (info->blit_hw)\r
+                               flags |= SDL_HWACCEL;\r
+\r
+                       if (fullscreen)\r
+                               flags |= SDL_FULLSCREEN;\r
+\r
+                       surface = SDL_SetVideoMode(width, height, 16, flags);\r
+\r
+                       if (surface == NULL)\r
+                               throw Error(SDL_GetError());\r
+               \r
+               SDL_WM_SetCaption(title, title);\r
+           }\r
+\r
+               int key(void)\r
+               {\r
+                       SDL_Event event;\r
+                       int keyevent = 0;\r
+\r
+                       while (SDL_PollEvent(&event))\r
+                       {\r
+                               /* Real key events trigger this function */\r
+                               if (event.type == SDL_KEYDOWN)\r
+                                       keyevent = 1;\r
+\r
+                               /* So do quit events -- let the app know about it */\r
+                               if (event.type == SDL_QUIT)\r
+                                       keyevent = 1;\r
+                       }\r
+                       return keyevent;\r
+               }\r
+\r
+               int JoyEnabled(void)    { return (nJoystick == 1 ? 1 : 0); }\r
+\r
+       public:\r
+               SDL_Joystick * joystick;\r
+\r
+       private:\r
+               int fullscreen;\r
+               int nJoystick;\r
+};\r
+\r
+#endif // #ifndef __SDLPTC_H__\r
diff --git a/src/include/anajoy.h b/src/include/anajoy.h
new file mode 100644 (file)
index 0000000..3372ec6
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __ANAJOY_H__\r
+#define __ANAJOY_H__\r
+\r
+#include "types.h"\r
+\r
+void anajoy_init(void);\r
+void anajoy_reset(void);\r
+void anajoy_done(void);\r
+void anajoy_byte_write(uint32, uint8);\r
+void anajoy_word_write(uint32, uint16);\r
+uint8 anajoy_byte_read(uint32);\r
+uint16 anajoy_word_read(uint32);\r
+\r
+#endif\r
diff --git a/src/include/blit_c.h b/src/include/blit_c.h
new file mode 100644 (file)
index 0000000..ea2eda6
--- /dev/null
@@ -0,0 +1,8915 @@
+#ifndef blitter_code_0x30000000\r
+#define blitter_code_0x30000000\r
+void blitter_0x30000000(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010004\r
+#define blitter_code_0x34010004\r
+void blitter_0x34010004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c002a4\r
+#define blitter_code_0x30c002a4\r
+void blitter_0x30c002a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c042a4\r
+#define blitter_code_0x00c042a4\r
+void blitter_0x00c042a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c042a4\r
+#define blitter_code_0x08c042a4\r
+void blitter_0x08c042a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010024\r
+#define blitter_code_0x34010024\r
+void blitter_0x34010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010222\r
+#define blitter_code_0x24010222\r
+void blitter_0x24010222(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c04292\r
+#define blitter_code_0x00c04292\r
+void blitter_0x00c04292(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_4(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c0409b\r
+#define blitter_code_0x00c0409b\r
+void blitter_0x00c0409b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30000003\r
+#define blitter_code_0x30000003\r
+void blitter_0x30000003(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010003\r
+#define blitter_code_0x34010003\r
+void blitter_0x34010003(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c000ad\r
+#define blitter_code_0x30c000ad\r
+void blitter_0x30c000ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c0009b\r
+#define blitter_code_0x30c0009b\r
+void blitter_0x30c0009b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401001b\r
+#define blitter_code_0x3401001b\r
+void blitter_0x3401001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c000a4\r
+#define blitter_code_0x30c000a4\r
+void blitter_0x30c000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010023\r
+#define blitter_code_0x34010023\r
+void blitter_0x34010023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30000023\r
+#define blitter_code_0x30000023\r
+void blitter_0x30000023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010024\r
+#define blitter_code_0x24010024\r
+void blitter_0x24010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c000a4\r
+#define blitter_code_0x00c000a4\r
+void blitter_0x00c000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c040a4\r
+#define blitter_code_0x00c040a4\r
+void blitter_0x00c040a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010024\r
+#define blitter_code_0x04010024\r
+void blitter_0x04010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401001c\r
+#define blitter_code_0x2401001c\r
+void blitter_0x2401001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3000002b\r
+#define blitter_code_0x3000002b\r
+void blitter_0x3000002b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3000001b\r
+#define blitter_code_0x3000001b\r
+void blitter_0x3000001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c0009b\r
+#define blitter_code_0x00c0009b\r
+void blitter_0x00c0009b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1000001b\r
+#define blitter_code_0x1000001b\r
+void blitter_0x1000001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x10000023\r
+#define blitter_code_0x10000023\r
+void blitter_0x10000023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401001d\r
+#define blitter_code_0x3401001d\r
+void blitter_0x3401001d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c000e4\r
+#define blitter_code_0x00c000e4\r
+void blitter_0x00c000e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010064\r
+#define blitter_code_0x24010064\r
+void blitter_0x24010064(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c040e4\r
+#define blitter_code_0x00c040e4\r
+void blitter_0x00c040e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2000002b\r
+#define blitter_code_0x2000002b\r
+void blitter_0x2000002b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00a00058\r
+#define blitter_code_0x00a00058\r
+void blitter_0x00a00058(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x050100d8\r
+#define blitter_code_0x050100d8\r
+void blitter_0x050100d8(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c00280\r
+#define blitter_code_0x00c00280\r
+void blitter_0x00c00280(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_1(a2);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010064\r
+#define blitter_code_0x04010064\r
+void blitter_0x04010064(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010003\r
+#define blitter_code_0x24010003\r
+void blitter_0x24010003(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010023\r
+#define blitter_code_0x24010023\r
+void blitter_0x24010023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c0429b\r
+#define blitter_code_0x00c0429b\r
+void blitter_0x00c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c042db\r
+#define blitter_code_0x00c042db\r
+void blitter_0x00c042db(void)\r
+{\r
+       uint32 srcdata   = 0;\r
+       uint32 srczdata  = 0;\r
+       uint32 dstdata   = 0;\r
+       uint32 dstzdata  = 0;\r
+       uint32 writedata = 0;\r
+       uint32 inhibit   = 0;\r
+       uint32 compare_value=READ_RDATA_8(PATTERNDATA, a1,a1_phrase_mode);\r
+\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       srcdata   = 0;\r
+                       writedata = 0;\r
+\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       if (srcdata != compare_value )\r
+                       {\r
+                               dstdata = READ_PIXEL_8(a2);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a2, writedata);\r
+                       } \r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1401001b\r
+#define blitter_code_0x1401001b\r
+void blitter_0x1401001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010004\r
+#define blitter_code_0x24010004\r
+void blitter_0x24010004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x308000a4\r
+#define blitter_code_0x308000a4\r
+void blitter_0x308000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010024\r
+#define blitter_code_0x14010024\r
+void blitter_0x14010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010023\r
+#define blitter_code_0x14010023\r
+void blitter_0x14010023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30e000a4\r
+#define blitter_code_0x30e000a4\r
+void blitter_0x30e000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x10000013\r
+#define blitter_code_0x10000013\r
+void blitter_0x10000013(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c00292\r
+#define blitter_code_0x00c00292\r
+void blitter_0x00c00292(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x008000a4\r
+#define blitter_code_0x008000a4\r
+void blitter_0x008000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00800092\r
+#define blitter_code_0x00800092\r
+void blitter_0x00800092(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_RDATA_4(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2cc10023\r
+#define blitter_code_0x2cc10023\r
+void blitter_0x2cc10023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c10023\r
+#define blitter_code_0x34c10023\r
+void blitter_0x34c10023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x38c0429b\r
+#define blitter_code_0x38c0429b\r
+void blitter_0x38c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3cc1001b\r
+#define blitter_code_0x3cc1001b\r
+void blitter_0x3cc1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2cc1001b\r
+#define blitter_code_0x2cc1001b\r
+void blitter_0x2cc1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c0429b\r
+#define blitter_code_0x08c0429b\r
+void blitter_0x08c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1cc1001b\r
+#define blitter_code_0x1cc1001b\r
+void blitter_0x1cc1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0cc1001b\r
+#define blitter_code_0x0cc1001b\r
+void blitter_0x0cc1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3cc10023\r
+#define blitter_code_0x3cc10023\r
+void blitter_0x3cc10023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c0009b\r
+#define blitter_code_0x08c0009b\r
+void blitter_0x08c0009b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x28c0429b\r
+#define blitter_code_0x28c0429b\r
+void blitter_0x28c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x18c0429b\r
+#define blitter_code_0x18c0429b\r
+void blitter_0x18c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010005\r
+#define blitter_code_0x34010005\r
+void blitter_0x34010005(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401002d\r
+#define blitter_code_0x3401002d\r
+void blitter_0x3401002d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010025\r
+#define blitter_code_0x14010025\r
+void blitter_0x14010025(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010025\r
+#define blitter_code_0x34010025\r
+void blitter_0x34010025(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401006c\r
+#define blitter_code_0x3401006c\r
+void blitter_0x3401006c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a2, a2_phrase_mode);\r
+                       WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401022a\r
+#define blitter_code_0x2401022a\r
+void blitter_0x2401022a(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401006a\r
+#define blitter_code_0x2401006a\r
+void blitter_0x2401006a(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a2, a2_phrase_mode);\r
+                       WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c002e4\r
+#define blitter_code_0x00c002e4\r
+void blitter_0x00c002e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a2, a2_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010212\r
+#define blitter_code_0x04010212\r
+void blitter_0x04010212(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c010023\r
+#define blitter_code_0x2c010023\r
+void blitter_0x2c010023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3c010023\r
+#define blitter_code_0x3c010023\r
+void blitter_0x3c010023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401006b\r
+#define blitter_code_0x3401006b\r
+void blitter_0x3401006b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c000ad\r
+#define blitter_code_0x00c000ad\r
+void blitter_0x00c000ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00e002ad\r
+#define blitter_code_0x00e002ad\r
+void blitter_0x00e002ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c040a4\r
+#define blitter_code_0x08c040a4\r
+void blitter_0x08c040a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c000e4\r
+#define blitter_code_0x08c000e4\r
+void blitter_0x08c000e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c010024\r
+#define blitter_code_0x2c010024\r
+void blitter_0x2c010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3c010024\r
+#define blitter_code_0x3c010024\r
+void blitter_0x3c010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0c010024\r
+#define blitter_code_0x0c010024\r
+void blitter_0x0c010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1401001d\r
+#define blitter_code_0x1401001d\r
+void blitter_0x1401001d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c10003\r
+#define blitter_code_0x34c10003\r
+void blitter_0x34c10003(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x306002a4\r
+#define blitter_code_0x306002a4\r
+void blitter_0x306002a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c00292\r
+#define blitter_code_0x08c00292\r
+void blitter_0x08c00292(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14c10013\r
+#define blitter_code_0x14c10013\r
+void blitter_0x14c10013(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x38c0009b\r
+#define blitter_code_0x38c0009b\r
+void blitter_0x38c0009b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c1001b\r
+#define blitter_code_0x34c1001b\r
+void blitter_0x34c1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1401001c\r
+#define blitter_code_0x1401001c\r
+void blitter_0x1401001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c000db\r
+#define blitter_code_0x08c000db\r
+void blitter_0x08c000db(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 writedata = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                       writedata |= srcdata  & ~dstdata;\r
+                       writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0401001b\r
+#define blitter_code_0x0401001b\r
+void blitter_0x0401001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0401001d\r
+#define blitter_code_0x0401001d\r
+void blitter_0x0401001d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0401001c\r
+#define blitter_code_0x0401001c\r
+void blitter_0x0401001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x36013624\r
+#define blitter_code_0x36013624\r
+void blitter_0x36013624(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_ZDATA_16(a1);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata == dstzdata)       inhibit = 1;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       WRITE_ZDATA_16(a1, srczdata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c10284\r
+#define blitter_code_0x04c10284\r
+void blitter_0x04c10284(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010004\r
+#define blitter_code_0x14010004\r
+void blitter_0x14010004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x06c076e4\r
+#define blitter_code_0x06c076e4\r
+void blitter_0x06c076e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_ZDATA_16(a2);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata == dstzdata)       inhibit = 1;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                               WRITE_ZDATA_16(a2, srczdata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c040a4\r
+#define blitter_code_0x30c040a4\r
+void blitter_0x30c040a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c040db\r
+#define blitter_code_0x00c040db\r
+void blitter_0x00c040db(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c0429b\r
+#define blitter_code_0x30c0429b\r
+void blitter_0x30c0429b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c0409b\r
+#define blitter_code_0x08c0409b\r
+void blitter_0x08c0409b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c0029b\r
+#define blitter_code_0x00c0029b\r
+void blitter_0x00c0029b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x20c00003\r
+#define blitter_code_0x20c00003\r
+void blitter_0x20c00003(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c0001b\r
+#define blitter_code_0x00c0001b\r
+void blitter_0x00c0001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x20c0002b\r
+#define blitter_code_0x20c0002b\r
+void blitter_0x20c0002b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c0001c\r
+#define blitter_code_0x30c0001c\r
+void blitter_0x30c0001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c000db\r
+#define blitter_code_0x00c000db\r
+void blitter_0x00c000db(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c00023\r
+#define blitter_code_0x00c00023\r
+void blitter_0x00c00023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c10024\r
+#define blitter_code_0x34c10024\r
+void blitter_0x34c10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3cc10024\r
+#define blitter_code_0x3cc10024\r
+void blitter_0x3cc10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c10084\r
+#define blitter_code_0x04c10084\r
+void blitter_0x04c10084(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010004\r
+#define blitter_code_0x04010004\r
+void blitter_0x04010004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c000e4\r
+#define blitter_code_0x30c000e4\r
+void blitter_0x30c000e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c10004\r
+#define blitter_code_0x04c10004\r
+void blitter_0x04c10004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0cc10004\r
+#define blitter_code_0x0cc10004\r
+void blitter_0x0cc10004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1cc10024\r
+#define blitter_code_0x1cc10024\r
+void blitter_0x1cc10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0cc10084\r
+#define blitter_code_0x0cc10084\r
+void blitter_0x0cc10084(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24c10024\r
+#define blitter_code_0x24c10024\r
+void blitter_0x24c10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2cc10024\r
+#define blitter_code_0x2cc10024\r
+void blitter_0x2cc10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401002c\r
+#define blitter_code_0x3401002c\r
+void blitter_0x3401002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010014\r
+#define blitter_code_0x14010014\r
+void blitter_0x14010014(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010013\r
+#define blitter_code_0x14010013\r
+void blitter_0x14010013(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30000005\r
+#define blitter_code_0x30000005\r
+void blitter_0x30000005(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3000001d\r
+#define blitter_code_0x3000001d\r
+void blitter_0x3000001d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c0002c\r
+#define blitter_code_0x30c0002c\r
+void blitter_0x30c0002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3000002d\r
+#define blitter_code_0x3000002d\r
+void blitter_0x3000002d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x10000025\r
+#define blitter_code_0x10000025\r
+void blitter_0x10000025(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x28c0002c\r
+#define blitter_code_0x28c0002c\r
+void blitter_0x28c0002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3002022c\r
+#define blitter_code_0x3002022c\r
+void blitter_0x3002022c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               if (writedata > 0xff) writedata = 0xff;\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               if (writedata > 0xfff) writedata = 0xfff;\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c040e4\r
+#define blitter_code_0x08c040e4\r
+void blitter_0x08c040e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c042a4\r
+#define blitter_code_0x30c042a4\r
+void blitter_0x30c042a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401002b\r
+#define blitter_code_0x3401002b\r
+void blitter_0x3401002b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010005\r
+#define blitter_code_0x14010005\r
+void blitter_0x14010005(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c01001b\r
+#define blitter_code_0x2c01001b\r
+void blitter_0x2c01001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401001c\r
+#define blitter_code_0x3401001c\r
+void blitter_0x3401001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x05010083\r
+#define blitter_code_0x05010083\r
+void blitter_0x05010083(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x05010084\r
+#define blitter_code_0x05010084\r
+void blitter_0x05010084(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010064\r
+#define blitter_code_0x34010064\r
+void blitter_0x34010064(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14010064\r
+#define blitter_code_0x14010064\r
+void blitter_0x14010064(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401021b\r
+#define blitter_code_0x2401021b\r
+void blitter_0x2401021b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010218\r
+#define blitter_code_0x24010218\r
+void blitter_0x24010218(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401021a\r
+#define blitter_code_0x2401021a\r
+void blitter_0x2401021a(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401021c\r
+#define blitter_code_0x2401021c\r
+void blitter_0x2401021c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c00064\r
+#define blitter_code_0x00c00064\r
+void blitter_0x00c00064(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c00024\r
+#define blitter_code_0x00c00024\r
+void blitter_0x00c00024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x01c042e4\r
+#define blitter_code_0x01c042e4\r
+void blitter_0x01c042e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a2, a2_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               {\r
+                               int intensity = srcdata & 0xFF;\r
+                               int ia = gd_ia >> 16;\r
+                               if(ia & 0x80)\r
+                                       ia = 0xFFFFFF00 | ia;\r
+                               intensity += ia;\r
+                               if(intensity < 0)\r
+                                       intensity = 0;\r
+                               if(intensity > 0xFF)\r
+                                       intensity = 0xFF;\r
+                               writedata = (srcdata & 0xFF00) | intensity;\r
+                               }\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x20c0001c\r
+#define blitter_code_0x20c0001c\r
+void blitter_0x20c0001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010219\r
+#define blitter_code_0x24010219\r
+void blitter_0x24010219(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_2(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_2(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_2(a1);\r
+                       dstzdata = READ_RDATA_2(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_2(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_2(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x08c000a4\r
+#define blitter_code_0x08c000a4\r
+void blitter_0x08c000a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c01001c\r
+#define blitter_code_0x2c01001c\r
+void blitter_0x2c01001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3c01001c\r
+#define blitter_code_0x3c01001c\r
+void blitter_0x3c01001c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c010218\r
+#define blitter_code_0x2c010218\r
+void blitter_0x2c010218(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3050021b\r
+#define blitter_code_0x3050021b\r
+void blitter_0x3050021b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= ~srcdata & ~dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c10004\r
+#define blitter_code_0x34c10004\r
+void blitter_0x34c10004(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x05010218\r
+#define blitter_code_0x05010218\r
+void blitter_0x05010218(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30020224\r
+#define blitter_code_0x30020224\r
+void blitter_0x30020224(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               if (writedata > 0xff) writedata = 0xff;\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               if (writedata > 0xfff) writedata = 0xfff;\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24c1001b\r
+#define blitter_code_0x24c1001b\r
+void blitter_0x24c1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0501021b\r
+#define blitter_code_0x0501021b\r
+void blitter_0x0501021b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c1001b\r
+#define blitter_code_0x04c1001b\r
+void blitter_0x04c1001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24c10023\r
+#define blitter_code_0x24c10023\r
+void blitter_0x24c10023(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x01c040a4\r
+#define blitter_code_0x01c040a4\r
+void blitter_0x01c040a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c10024\r
+#define blitter_code_0x04c10024\r
+void blitter_0x04c10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0501021c\r
+#define blitter_code_0x0501021c\r
+void blitter_0x0501021c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30e00224\r
+#define blitter_code_0x30e00224\r
+void blitter_0x30e00224(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401002d\r
+#define blitter_code_0x2401002d\r
+void blitter_0x2401002d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401002c\r
+#define blitter_code_0x2401002c\r
+void blitter_0x2401002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010005\r
+#define blitter_code_0x24010005\r
+void blitter_0x24010005(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010220\r
+#define blitter_code_0x04010220\r
+void blitter_0x04010220(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c000ed\r
+#define blitter_code_0x00c000ed\r
+void blitter_0x00c000ed(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a1);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x040e026d\r
+#define blitter_code_0x040e026d\r
+void blitter_0x040e026d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_PIXEL_32(a2);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a2, a2_phrase_mode);\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                               WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0c01002c\r
+#define blitter_code_0x0c01002c\r
+void blitter_0x0c01002c(void)\r
+{\r
+//     fprintf(log_get(),"blitter_0x0c01002c: 0x%.8x 0x%.8x 0x%.8x 0x%.8x cpu %i pc=0x%.8x\n",\r
+//                                        gd_i[0],gd_c[0],gd_ia,gd_ca,jaguar_cpu_in_exec,gpu_read_pc()); \r
+\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 dstdata   = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } \r
+                       else \r
+                       { \r
+                               writedata=dstdata; \r
+                       }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x040e026c\r
+#define blitter_code_0x040e026c\r
+void blitter_0x040e026c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_PIXEL_32(a2);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_32(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c04280\r
+#define blitter_code_0x00c04280\r
+void blitter_0x00c04280(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_1(a2);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_1(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010200\r
+#define blitter_code_0x04010200\r
+void blitter_0x04010200(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00600280\r
+#define blitter_code_0x00600280\r
+void blitter_0x00600280(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_1(a2);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010005\r
+#define blitter_code_0x04010005\r
+void blitter_0x04010005(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0401002c\r
+#define blitter_code_0x0401002c\r
+void blitter_0x0401002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c000db\r
+#define blitter_code_0x30c000db\r
+void blitter_0x30c000db(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c002ad\r
+#define blitter_code_0x30c002ad\r
+void blitter_0x30c002ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3401009b\r
+#define blitter_code_0x3401009b\r
+void blitter_0x3401009b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04c1022d\r
+#define blitter_code_0x04c1022d\r
+void blitter_0x04c1022d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x008002ad\r
+#define blitter_code_0x008002ad\r
+void blitter_0x008002ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x14c1022d\r
+#define blitter_code_0x14c1022d\r
+void blitter_0x14c1022d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34c1022d\r
+#define blitter_code_0x34c1022d\r
+void blitter_0x34c1022d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c0029b\r
+#define blitter_code_0x30c0029b\r
+void blitter_0x30c0029b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24c1021b\r
+#define blitter_code_0x24c1021b\r
+void blitter_0x24c1021b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_8(a1);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c042ad\r
+#define blitter_code_0x30c042ad\r
+void blitter_0x30c042ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_PIXEL_32(a1);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_32(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3e01261c\r
+#define blitter_code_0x3e01261c\r
+void blitter_0x3e01261c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_ZDATA_16(a1);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       WRITE_ZDATA_16(a1, srczdata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00e00280\r
+#define blitter_code_0x00e00280\r
+void blitter_0x00e00280(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_1(a2);\r
+                       dstdata = READ_PIXEL_1(a1);\r
+                       dstzdata = READ_RDATA_1(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00e00292\r
+#define blitter_code_0x00e00292\r
+void blitter_0x00e00292(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= ~srcdata & dstdata;\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x308002a4\r
+#define blitter_code_0x308002a4\r
+void blitter_0x308002a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x00c002a4\r
+#define blitter_code_0x00c002a4\r
+void blitter_0x00c002a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x01c042a4\r
+#define blitter_code_0x01c042a4\r
+void blitter_0x01c042a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x06c066e4\r
+#define blitter_code_0x06c066e4\r
+void blitter_0x06c066e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_ZDATA_16(a2);\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                               WRITE_ZDATA_16(a2, srczdata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04010222\r
+#define blitter_code_0x04010222\r
+void blitter_0x04010222(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x24010224\r
+#define blitter_code_0x24010224\r
+void blitter_0x24010224(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2000001b\r
+#define blitter_code_0x2000001b\r
+void blitter_0x2000001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3000005b\r
+#define blitter_code_0x3000005b\r
+void blitter_0x3000005b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a2, a2_phrase_mode);\r
+                       WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x38000100\r
+#define blitter_code_0x38000100\r
+void blitter_0x38000100(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1c010024\r
+#define blitter_code_0x1c010024\r
+void blitter_0x1c010024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x000242e4\r
+#define blitter_code_0x000242e4\r
+void blitter_0x000242e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               if (writedata > 0xff) writedata = 0xff;\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               if (writedata > 0xfff) writedata = 0xfff;\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2c01002c\r
+#define blitter_code_0x2c01002c\r
+void blitter_0x2c01002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c042e4\r
+#define blitter_code_0x30c042e4\r
+void blitter_0x30c042e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_16(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3c01002c\r
+#define blitter_code_0x3c01002c\r
+void blitter_0x3c01002c(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0cc10212\r
+#define blitter_code_0x0cc10212\r
+void blitter_0x0cc10212(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_4(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_4(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_4(a1);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_4(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_4(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x38000301\r
+#define blitter_code_0x38000301\r
+void blitter_0x38000301(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_2(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_2(a1);\r
+                       dstzdata = READ_RDATA_2(DSTZ, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_2(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401002b\r
+#define blitter_code_0x2401002b\r
+void blitter_0x2401002b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c004ad\r
+#define blitter_code_0x30c004ad\r
+void blitter_0x30c004ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04012000\r
+#define blitter_code_0x04012000\r
+void blitter_0x04012000(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34012000\r
+#define blitter_code_0x34012000\r
+void blitter_0x34012000(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30c004ad\r
+#define blitter_code_0x30c004ad\r
+void blitter_0x30c004ad(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_32(a2);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       dstzdata = READ_RDATA_32(DSTZ, a1, a1_phrase_mode);\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x04012000\r
+#define blitter_code_0x04012000\r
+void blitter_0x04012000(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_1(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34012000\r
+#define blitter_code_0x34012000\r
+void blitter_0x34012000(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_1(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_1(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30808c92\r
+#define blitter_code_0x30808c92\r
+void blitter_0x30808c92(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_4(a2);\r
+                       dstdata = READ_RDATA_4(DSTDATA, a1, a1_phrase_mode);\r
+                       dstzdata = READ_RDATA_4(DSTZ, a1, a1_phrase_mode);\r
+                       if (srczdata <  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_4(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0040409b\r
+#define blitter_code_0x0040409b\r
+void blitter_0x0040409b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x1000001d\r
+#define blitter_code_0x1000001d\r
+void blitter_0x1000001d(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a1, a1_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_32(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0000409b\r
+#define blitter_code_0x0000409b\r
+void blitter_0x0000409b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a2);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a2,a2_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x0cc10024\r
+#define blitter_code_0x0cc10024\r
+void blitter_0x0cc10024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401001b\r
+#define blitter_code_0x2401001b\r
+void blitter_0x2401001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                               WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x01c042db\r
+#define blitter_code_0x01c042db\r
+void blitter_0x01c042db(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_8(a1);\r
+                       dstdata = READ_PIXEL_8(a2);\r
+                       dstzdata = READ_RDATA_8(DSTZ, a2, a2_phrase_mode);\r
+                       if (srcdata == READ_RDATA_8(PATTERNDATA, a1,a1_phrase_mode)) inhibit=1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x34010224\r
+#define blitter_code_0x34010224\r
+void blitter_0x34010224(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_RDATA_16(DSTZ, a1, a1_phrase_mode);\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30808800\r
+#define blitter_code_0x30808800\r
+void blitter_0x30808800(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_1(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_1(DSTDATA, a1, a1_phrase_mode);\r
+                       if (srczdata <  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_1(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x06c026e4\r
+#define blitter_code_0x06c026e4\r
+void blitter_0x06c026e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a2);\r
+                       dstzdata = READ_ZDATA_16(a2);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                               WRITE_ZDATA_16(a2, srczdata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x06012624\r
+#define blitter_code_0x06012624\r
+void blitter_0x06012624(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_ZDATA_16(a1);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_16(PATTERNDATA, a1, a1_phrase_mode);\r
+                               writedata = ((gd_c[colour_index])<<8)|(gd_i[colour_index]>>16);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a1, writedata);\r
+                               WRITE_ZDATA_16(a1, srczdata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                       gd_i[colour_index] += gd_ia;\r
+                       gd_c[colour_index] += gd_ca;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x000200e4\r
+#define blitter_code_0x000200e4\r
+void blitter_0x000200e4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a1);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata = (srcdata & 0xff) + (dstdata & 0xff);\r
+                               if (writedata > 0xff) writedata = 0xff;\r
+                               writedata |= (srcdata & 0xf00) + (dstdata & 0xf00);\r
+                               if (writedata > 0xfff) writedata = 0xfff;\r
+                               writedata |= (srcdata & 0xf000) + (dstdata & 0xf000);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       if (!inhibit)\r
+                       {\r
+                               WRITE_PIXEL_16(a2, writedata);\r
+                       }\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x37c026a4\r
+#define blitter_code_0x37c026a4\r
+void blitter_0x37c026a4(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_PIXEL_16(a2);\r
+                       srczdata = READ_RDATA_16(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_PIXEL_16(a1);\r
+                       dstzdata = READ_ZDATA_16(a1);\r
+                       srczdata=z_i[colour_index]>>16;\r
+                       if (srczdata >  dstzdata)       inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata |= srcdata  & ~dstdata;\r
+                               writedata |= srcdata  & dstdata;\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       WRITE_ZDATA_16(a1, srczdata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+                       z_i[colour_index]+=zadd;\r
+                        colour_index=(colour_index+1)&0x3;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x3c01001b\r
+#define blitter_code_0x3c01001b\r
+void blitter_0x3c01001b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_8(SRCDATA, a2, a2_phrase_mode);\r
+                       srczdata = READ_RDATA_8(SRCZINT, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_8(DSTDATA, a1, a1_phrase_mode);\r
+                       if (a1_x < 0 || a1_y < 0 || (a1_x >> 16) >= (REG(A1_CLIP) & 0x7fff) || (a1_y >> 16) >= ((REG(A1_CLIP) >> 16) & 0x7fff)) inhibit = 1;\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_8(PATTERNDATA, a1, a1_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_8(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x2401006b\r
+#define blitter_code_0x2401006b\r
+void blitter_0x2401006b(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_32(SRCDATA, a1, a1_phrase_mode);\r
+                       srczdata = READ_RDATA_32(SRCZINT, a1, a1_phrase_mode);\r
+                       dstdata = READ_RDATA_32(DSTDATA, a2, a2_phrase_mode);\r
+                       if (!inhibit)\r
+                       {\r
+                               writedata= READ_RDATA_32(PATTERNDATA, a2, a2_phrase_mode);\r
+                       } else { srczdata=dstzdata; writedata=dstdata; }\r
+                       WRITE_PIXEL_32(a2, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
+#ifndef blitter_code_0x30000024\r
+#define blitter_code_0x30000024\r
+void blitter_0x30000024(void)\r
+{\r
+       while (outer_loop--)\r
+       {\r
+               inner_loop=n_pixels;\r
+               while (inner_loop--)\r
+               {\r
+                       uint32 srcdata   = 0;\r
+                       uint32 srczdata  = 0;\r
+                       uint32 dstdata   = 0;\r
+                       uint32 dstzdata  = 0;\r
+                       uint32 writedata = 0;\r
+                       uint32 inhibit   = 0;\r
+                       srcdata = READ_RDATA_16(SRCDATA, a2, a2_phrase_mode);\r
+                       dstdata = READ_RDATA_16(DSTDATA, a1, a1_phrase_mode);\r
+                       WRITE_PIXEL_16(a1, writedata);\r
+                       a1_x += a1_xadd;\r
+                       a1_y += a1_yadd;\r
+                       a2_x = (a2_x + a2_xadd) & a2_mask_x;\r
+                       a2_y = (a2_y + a2_yadd) & a2_mask_y;\r
+               }\r
+               a1_x+=a1_step_x;\r
+               a1_y+=a1_step_y;\r
+               a2_x+=a2_step_x;\r
+               a2_y+=a2_step_y;\r
+       }\r
+       WREG(A1_PIXEL,  (a1_y & 0xffff0000) | ((a1_x >> 16) & 0xffff));\r
+       WREG(A1_FPIXEL, (a1_y << 16) | (a1_x & 0xffff));\r
+       WREG(A2_PIXEL,  (a2_y & 0xffff0000) | ((a2_x >> 16) & 0xffff));\r
+}\r
+#endif\r
diff --git a/src/include/blit_i.h b/src/include/blit_i.h
new file mode 100644 (file)
index 0000000..9e6b9f5
--- /dev/null
@@ -0,0 +1,226 @@
+       blitter_add(0x30000000,(uint8*)&blitter_0x30000000);\r
+       blitter_add(0x34010004,(uint8*)&blitter_0x34010004);\r
+       blitter_add(0x30c002a4,(uint8*)&blitter_0x30c002a4);\r
+       blitter_add(0x00c042a4,(uint8*)&blitter_0x00c042a4);\r
+       blitter_add(0x08c042a4,(uint8*)&blitter_0x08c042a4);\r
+       blitter_add(0x34010024,(uint8*)&blitter_0x34010024);\r
+       blitter_add(0x24010222,(uint8*)&blitter_0x24010222);\r
+       blitter_add(0x00c04292,(uint8*)&blitter_0x00c04292);\r
+       blitter_add(0x00c0409b,(uint8*)&blitter_0x00c0409b);\r
+       blitter_add(0x30000003,(uint8*)&blitter_0x30000003);\r
+       blitter_add(0x34010003,(uint8*)&blitter_0x34010003);\r
+       blitter_add(0x30c000ad,(uint8*)&blitter_0x30c000ad);\r
+       blitter_add(0x30c0009b,(uint8*)&blitter_0x30c0009b);\r
+       blitter_add(0x3401001b,(uint8*)&blitter_0x3401001b);\r
+       blitter_add(0x30c000a4,(uint8*)&blitter_0x30c000a4);\r
+       blitter_add(0x34010023,(uint8*)&blitter_0x34010023);\r
+       blitter_add(0x30000023,(uint8*)&blitter_0x30000023);\r
+       blitter_add(0x24010024,(uint8*)&blitter_0x24010024);\r
+       blitter_add(0x00c000a4,(uint8*)&blitter_0x00c000a4);\r
+       blitter_add(0x00c040a4,(uint8*)&blitter_0x00c040a4);\r
+       blitter_add(0x04010024,(uint8*)&blitter_0x04010024);\r
+       blitter_add(0x2401001c,(uint8*)&blitter_0x2401001c);\r
+       blitter_add(0x3000002b,(uint8*)&blitter_0x3000002b);\r
+       blitter_add(0x3000001b,(uint8*)&blitter_0x3000001b);\r
+       blitter_add(0x00c0009b,(uint8*)&blitter_0x00c0009b);\r
+       blitter_add(0x1000001b,(uint8*)&blitter_0x1000001b);\r
+       blitter_add(0x10000023,(uint8*)&blitter_0x10000023);\r
+       blitter_add(0x3401001d,(uint8*)&blitter_0x3401001d);\r
+       blitter_add(0x00c000e4,(uint8*)&blitter_0x00c000e4);\r
+       blitter_add(0x24010064,(uint8*)&blitter_0x24010064);\r
+       blitter_add(0x00c040e4,(uint8*)&blitter_0x00c040e4);\r
+       blitter_add(0x2000002b,(uint8*)&blitter_0x2000002b);\r
+       blitter_add(0x00a00058,(uint8*)&blitter_0x00a00058);\r
+       blitter_add(0x050100d8,(uint8*)&blitter_0x050100d8);\r
+       blitter_add(0x00c00280,(uint8*)&blitter_0x00c00280);\r
+       blitter_add(0x04010064,(uint8*)&blitter_0x04010064);\r
+       blitter_add(0x24010003,(uint8*)&blitter_0x24010003);\r
+       blitter_add(0x24010023,(uint8*)&blitter_0x24010023);\r
+       blitter_add(0x00c0429b,(uint8*)&blitter_0x00c0429b);\r
+       blitter_add(0x00c042db,(uint8*)&blitter_0x00c042db);\r
+       blitter_add(0x1401001b,(uint8*)&blitter_0x1401001b);\r
+       blitter_add(0x24010004,(uint8*)&blitter_0x24010004);\r
+       blitter_add(0x308000a4,(uint8*)&blitter_0x308000a4);\r
+       blitter_add(0x14010024,(uint8*)&blitter_0x14010024);\r
+       blitter_add(0x14010023,(uint8*)&blitter_0x14010023);\r
+       blitter_add(0x30e000a4,(uint8*)&blitter_0x30e000a4);\r
+       blitter_add(0x10000013,(uint8*)&blitter_0x10000013);\r
+       blitter_add(0x00c00292,(uint8*)&blitter_0x00c00292);\r
+       blitter_add(0x008000a4,(uint8*)&blitter_0x008000a4);\r
+       blitter_add(0x00800092,(uint8*)&blitter_0x00800092);\r
+       blitter_add(0x2cc10023,(uint8*)&blitter_0x2cc10023);\r
+       blitter_add(0x34c10023,(uint8*)&blitter_0x34c10023);\r
+       blitter_add(0x38c0429b,(uint8*)&blitter_0x38c0429b);\r
+       blitter_add(0x3cc1001b,(uint8*)&blitter_0x3cc1001b);\r
+       blitter_add(0x2cc1001b,(uint8*)&blitter_0x2cc1001b);\r
+       blitter_add(0x08c0429b,(uint8*)&blitter_0x08c0429b);\r
+       blitter_add(0x1cc1001b,(uint8*)&blitter_0x1cc1001b);\r
+       blitter_add(0x0cc1001b,(uint8*)&blitter_0x0cc1001b);\r
+       blitter_add(0x3cc10023,(uint8*)&blitter_0x3cc10023);\r
+       blitter_add(0x08c0009b,(uint8*)&blitter_0x08c0009b);\r
+       blitter_add(0x28c0429b,(uint8*)&blitter_0x28c0429b);\r
+       blitter_add(0x18c0429b,(uint8*)&blitter_0x18c0429b);\r
+       blitter_add(0x34010005,(uint8*)&blitter_0x34010005);\r
+       blitter_add(0x3401002d,(uint8*)&blitter_0x3401002d);\r
+       blitter_add(0x14010025,(uint8*)&blitter_0x14010025);\r
+       blitter_add(0x34010025,(uint8*)&blitter_0x34010025);\r
+       blitter_add(0x3401006c,(uint8*)&blitter_0x3401006c);\r
+       blitter_add(0x2401022a,(uint8*)&blitter_0x2401022a);\r
+       blitter_add(0x2401006a,(uint8*)&blitter_0x2401006a);\r
+       blitter_add(0x00c002e4,(uint8*)&blitter_0x00c002e4);\r
+       blitter_add(0x04010212,(uint8*)&blitter_0x04010212);\r
+       blitter_add(0x2c010023,(uint8*)&blitter_0x2c010023);\r
+       blitter_add(0x3c010023,(uint8*)&blitter_0x3c010023);\r
+       blitter_add(0x3401006b,(uint8*)&blitter_0x3401006b);\r
+       blitter_add(0x00c000ad,(uint8*)&blitter_0x00c000ad);\r
+       blitter_add(0x00e002ad,(uint8*)&blitter_0x00e002ad);\r
+       blitter_add(0x08c040a4,(uint8*)&blitter_0x08c040a4);\r
+       blitter_add(0x08c000e4,(uint8*)&blitter_0x08c000e4);\r
+       blitter_add(0x2c010024,(uint8*)&blitter_0x2c010024);\r
+       blitter_add(0x3c010024,(uint8*)&blitter_0x3c010024);\r
+       blitter_add(0x0c010024,(uint8*)&blitter_0x0c010024);\r
+       blitter_add(0x1401001d,(uint8*)&blitter_0x1401001d);\r
+       blitter_add(0x34c10003,(uint8*)&blitter_0x34c10003);\r
+       blitter_add(0x306002a4,(uint8*)&blitter_0x306002a4);\r
+       blitter_add(0x08c00292,(uint8*)&blitter_0x08c00292);\r
+       blitter_add(0x14c10013,(uint8*)&blitter_0x14c10013);\r
+       blitter_add(0x38c0009b,(uint8*)&blitter_0x38c0009b);\r
+       blitter_add(0x34c1001b,(uint8*)&blitter_0x34c1001b);\r
+       blitter_add(0x1401001c,(uint8*)&blitter_0x1401001c);\r
+       blitter_add(0x08c000db,(uint8*)&blitter_0x08c000db);\r
+       blitter_add(0x0401001b,(uint8*)&blitter_0x0401001b);\r
+       blitter_add(0x0401001d,(uint8*)&blitter_0x0401001d);\r
+       blitter_add(0x0401001c,(uint8*)&blitter_0x0401001c);\r
+       blitter_add(0x36013624,(uint8*)&blitter_0x36013624);\r
+       blitter_add(0x04c10284,(uint8*)&blitter_0x04c10284);\r
+       blitter_add(0x14010004,(uint8*)&blitter_0x14010004);\r
+       blitter_add(0x06c076e4,(uint8*)&blitter_0x06c076e4);\r
+       blitter_add(0x30c040a4,(uint8*)&blitter_0x30c040a4);\r
+       blitter_add(0x00c040db,(uint8*)&blitter_0x00c040db);\r
+       blitter_add(0x30c0429b,(uint8*)&blitter_0x30c0429b);\r
+       blitter_add(0x08c0409b,(uint8*)&blitter_0x08c0409b);\r
+       blitter_add(0x00c0029b,(uint8*)&blitter_0x00c0029b);\r
+       blitter_add(0x20c00003,(uint8*)&blitter_0x20c00003);\r
+       blitter_add(0x00c0001b,(uint8*)&blitter_0x00c0001b);\r
+       blitter_add(0x20c0002b,(uint8*)&blitter_0x20c0002b);\r
+       blitter_add(0x30c0001c,(uint8*)&blitter_0x30c0001c);\r
+       blitter_add(0x00c000db,(uint8*)&blitter_0x00c000db);\r
+       blitter_add(0x00c00023,(uint8*)&blitter_0x00c00023);\r
+       blitter_add(0x34c10024,(uint8*)&blitter_0x34c10024);\r
+       blitter_add(0x3cc10024,(uint8*)&blitter_0x3cc10024);\r
+       blitter_add(0x04c10084,(uint8*)&blitter_0x04c10084);\r
+       blitter_add(0x04010004,(uint8*)&blitter_0x04010004);\r
+       blitter_add(0x30c000e4,(uint8*)&blitter_0x30c000e4);\r
+       blitter_add(0x04c10004,(uint8*)&blitter_0x04c10004);\r
+       blitter_add(0x0cc10004,(uint8*)&blitter_0x0cc10004);\r
+       blitter_add(0x1cc10024,(uint8*)&blitter_0x1cc10024);\r
+       blitter_add(0x0cc10084,(uint8*)&blitter_0x0cc10084);\r
+       blitter_add(0x24c10024,(uint8*)&blitter_0x24c10024);\r
+       blitter_add(0x2cc10024,(uint8*)&blitter_0x2cc10024);\r
+       blitter_add(0x3401002c,(uint8*)&blitter_0x3401002c);\r
+       blitter_add(0x14010014,(uint8*)&blitter_0x14010014);\r
+       blitter_add(0x14010013,(uint8*)&blitter_0x14010013);\r
+       blitter_add(0x30000005,(uint8*)&blitter_0x30000005);\r
+       blitter_add(0x3000001d,(uint8*)&blitter_0x3000001d);\r
+       blitter_add(0x30c0002c,(uint8*)&blitter_0x30c0002c);\r
+       blitter_add(0x3000002d,(uint8*)&blitter_0x3000002d);\r
+       blitter_add(0x10000025,(uint8*)&blitter_0x10000025);\r
+       blitter_add(0x28c0002c,(uint8*)&blitter_0x28c0002c);\r
+       blitter_add(0x3002022c,(uint8*)&blitter_0x3002022c);\r
+       blitter_add(0x08c040e4,(uint8*)&blitter_0x08c040e4);\r
+       blitter_add(0x30c042a4,(uint8*)&blitter_0x30c042a4);\r
+       blitter_add(0x3401002b,(uint8*)&blitter_0x3401002b);\r
+       blitter_add(0x14010005,(uint8*)&blitter_0x14010005);\r
+       blitter_add(0x2c01001b,(uint8*)&blitter_0x2c01001b);\r
+       blitter_add(0x3401001c,(uint8*)&blitter_0x3401001c);\r
+       blitter_add(0x05010083,(uint8*)&blitter_0x05010083);\r
+       blitter_add(0x05010084,(uint8*)&blitter_0x05010084);\r
+       blitter_add(0x34010064,(uint8*)&blitter_0x34010064);\r
+       blitter_add(0x14010064,(uint8*)&blitter_0x14010064);\r
+       blitter_add(0x2401021b,(uint8*)&blitter_0x2401021b);\r
+       blitter_add(0x24010218,(uint8*)&blitter_0x24010218);\r
+       blitter_add(0x2401021a,(uint8*)&blitter_0x2401021a);\r
+       blitter_add(0x2401021c,(uint8*)&blitter_0x2401021c);\r
+       blitter_add(0x00c00064,(uint8*)&blitter_0x00c00064);\r
+       blitter_add(0x00c00024,(uint8*)&blitter_0x00c00024);\r
+       blitter_add(0x01c042e4,(uint8*)&blitter_0x01c042e4);\r
+       blitter_add(0x20c0001c,(uint8*)&blitter_0x20c0001c);\r
+       blitter_add(0x24010219,(uint8*)&blitter_0x24010219);\r
+       blitter_add(0x08c000a4,(uint8*)&blitter_0x08c000a4);\r
+       blitter_add(0x2c01001c,(uint8*)&blitter_0x2c01001c);\r
+       blitter_add(0x3c01001c,(uint8*)&blitter_0x3c01001c);\r
+       blitter_add(0x2c010218,(uint8*)&blitter_0x2c010218);\r
+       blitter_add(0x3050021b,(uint8*)&blitter_0x3050021b);\r
+       blitter_add(0x34c10004,(uint8*)&blitter_0x34c10004);\r
+       blitter_add(0x05010218,(uint8*)&blitter_0x05010218);\r
+       blitter_add(0x30020224,(uint8*)&blitter_0x30020224);\r
+       blitter_add(0x24c1001b,(uint8*)&blitter_0x24c1001b);\r
+       blitter_add(0x0501021b,(uint8*)&blitter_0x0501021b);\r
+       blitter_add(0x04c1001b,(uint8*)&blitter_0x04c1001b);\r
+       blitter_add(0x24c10023,(uint8*)&blitter_0x24c10023);\r
+       blitter_add(0x01c040a4,(uint8*)&blitter_0x01c040a4);\r
+       blitter_add(0x04c10024,(uint8*)&blitter_0x04c10024);\r
+       blitter_add(0x0501021c,(uint8*)&blitter_0x0501021c);\r
+       blitter_add(0x30e00224,(uint8*)&blitter_0x30e00224);\r
+       blitter_add(0x2401002d,(uint8*)&blitter_0x2401002d);\r
+       blitter_add(0x2401002c,(uint8*)&blitter_0x2401002c);\r
+       blitter_add(0x24010005,(uint8*)&blitter_0x24010005);\r
+       blitter_add(0x04010220,(uint8*)&blitter_0x04010220);\r
+       blitter_add(0x00c000ed,(uint8*)&blitter_0x00c000ed);\r
+       blitter_add(0x040e026d,(uint8*)&blitter_0x040e026d);\r
+       blitter_add(0x0c01002c,(uint8*)&blitter_0x0c01002c);\r
+       blitter_add(0x040e026c,(uint8*)&blitter_0x040e026c);\r
+       blitter_add(0x00c04280,(uint8*)&blitter_0x00c04280);\r
+       blitter_add(0x04010200,(uint8*)&blitter_0x04010200);\r
+       blitter_add(0x00600280,(uint8*)&blitter_0x00600280);\r
+       blitter_add(0x04010005,(uint8*)&blitter_0x04010005);\r
+       blitter_add(0x0401002c,(uint8*)&blitter_0x0401002c);\r
+       blitter_add(0x30c000db,(uint8*)&blitter_0x30c000db);\r
+       blitter_add(0x30c002ad,(uint8*)&blitter_0x30c002ad);\r
+       blitter_add(0x3401009b,(uint8*)&blitter_0x3401009b);\r
+       blitter_add(0x04c1022d,(uint8*)&blitter_0x04c1022d);\r
+       blitter_add(0x008002ad,(uint8*)&blitter_0x008002ad);\r
+       blitter_add(0x14c1022d,(uint8*)&blitter_0x14c1022d);\r
+       blitter_add(0x34c1022d,(uint8*)&blitter_0x34c1022d);\r
+       blitter_add(0x30c0029b,(uint8*)&blitter_0x30c0029b);\r
+       blitter_add(0x24c1021b,(uint8*)&blitter_0x24c1021b);\r
+       blitter_add(0x30c042ad,(uint8*)&blitter_0x30c042ad);\r
+       blitter_add(0x3e01261c,(uint8*)&blitter_0x3e01261c);\r
+       blitter_add(0x00e00280,(uint8*)&blitter_0x00e00280);\r
+       blitter_add(0x00e00292,(uint8*)&blitter_0x00e00292);\r
+       blitter_add(0x308002a4,(uint8*)&blitter_0x308002a4);\r
+       blitter_add(0x00c002a4,(uint8*)&blitter_0x00c002a4);\r
+       blitter_add(0x01c042a4,(uint8*)&blitter_0x01c042a4);\r
+       blitter_add(0x06c066e4,(uint8*)&blitter_0x06c066e4);\r
+       blitter_add(0x04010222,(uint8*)&blitter_0x04010222);\r
+       blitter_add(0x24010224,(uint8*)&blitter_0x24010224);\r
+       blitter_add(0x2000001b,(uint8*)&blitter_0x2000001b);\r
+       blitter_add(0x3000005b,(uint8*)&blitter_0x3000005b);\r
+       blitter_add(0x38000100,(uint8*)&blitter_0x38000100);\r
+       blitter_add(0x1c010024,(uint8*)&blitter_0x1c010024);\r
+       blitter_add(0x000242e4,(uint8*)&blitter_0x000242e4);\r
+       blitter_add(0x2c01002c,(uint8*)&blitter_0x2c01002c);\r
+       blitter_add(0x30c042e4,(uint8*)&blitter_0x30c042e4);\r
+       blitter_add(0x3c01002c,(uint8*)&blitter_0x3c01002c);\r
+       blitter_add(0x0cc10212,(uint8*)&blitter_0x0cc10212);\r
+       blitter_add(0x38000301,(uint8*)&blitter_0x38000301);\r
+       blitter_add(0x2401002b,(uint8*)&blitter_0x2401002b);\r
+       blitter_add(0x30c004ad,(uint8*)&blitter_0x30c004ad);\r
+       blitter_add(0x04012000,(uint8*)&blitter_0x04012000);\r
+       blitter_add(0x34012000,(uint8*)&blitter_0x34012000);\r
+       blitter_add(0x30808c92,(uint8*)&blitter_0x30808c92);\r
+       blitter_add(0x0040409b,(uint8*)&blitter_0x0040409b);\r
+       blitter_add(0x1000001d,(uint8*)&blitter_0x1000001d);\r
+       blitter_add(0x0000409b,(uint8*)&blitter_0x0000409b);\r
+       blitter_add(0x0cc10024,(uint8*)&blitter_0x0cc10024);\r
+       blitter_add(0x2401001b,(uint8*)&blitter_0x2401001b);\r
+       blitter_add(0x01c042db,(uint8*)&blitter_0x01c042db);\r
+       blitter_add(0x34010224,(uint8*)&blitter_0x34010224);\r
+       blitter_add(0x30808800,(uint8*)&blitter_0x30808800);\r
+       blitter_add(0x06c026e4,(uint8*)&blitter_0x06c026e4);\r
+       blitter_add(0x06012624,(uint8*)&blitter_0x06012624);\r
+       blitter_add(0x000200e4,(uint8*)&blitter_0x000200e4);\r
+       blitter_add(0x37c026a4,(uint8*)&blitter_0x37c026a4);\r
+       blitter_add(0x3c01001b,(uint8*)&blitter_0x3c01001b);\r
+       blitter_add(0x2401006b,(uint8*)&blitter_0x2401006b);\r
+       blitter_add(0x30000024,(uint8*)&blitter_0x30000024);\r
diff --git a/src/include/blitter.h b/src/include/blitter.h
new file mode 100644 (file)
index 0000000..d18b999
--- /dev/null
@@ -0,0 +1,19 @@
+#ifndef __BLITTER_H__\r
+#define __BLITTER_H__\r
+\r
+#include "types.h"\r
+\r
+void blitter_init(void);\r
+void blitter_reset(void);\r
+void blitter_done(void);\r
+void blitter_byte_write(uint32, uint8);\r
+void blitter_word_write(uint32, uint16);\r
+uint8 blitter_byte_read(uint32);\r
+uint16 blitter_word_read(uint32);\r
+uint32 blitter_long_read(uint32 offset);\r
+void blitter_long_write(uint32 offset, uint32 data);\r
+uint32 blitter_reg_read(uint32 offset);\r
+void blitter_reg_write(uint32 offset, uint32 data);\r
+extern uint8 blitter_working;\r
+\r
+#endif\r
diff --git a/src/include/blittertest.h b/src/include/blittertest.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/cdbios.h b/src/include/cdbios.h
new file mode 100644 (file)
index 0000000..5046d51
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __CDBIOS_H__\r
+#define __CDBIOS_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void cd_bios_init(void);\r
+void cd_bios_reset(void);\r
+void cd_bios_done(void);\r
+void cd_bios_process(uint32 cmd);\r
+void cd_bios_boot(char *filename);\r
+void cd_bios_exec(uint32 scanline);\r
+\r
+\r
+#endif\r
diff --git a/src/include/cdi.h b/src/include/cdi.h
new file mode 100644 (file)
index 0000000..a7d61f4
--- /dev/null
@@ -0,0 +1,55 @@
+#ifndef __CDI_H__\r
+#define __CDI_H__\r
+\r
+#include "jaguar.h"\r
+#include "types.h"\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#ifndef __PORT__\r
+#include <io.h>\r
+#endif\r
+#include <fcntl.h>\r
+\r
+struct s_cdi_track\r
+{\r
+       uint8   filename_length;\r
+       uint32  pregap_length;\r
+       uint32  length;\r
+       uint32  mode;\r
+       uint32  start_lba;\r
+       uint32  total_length;\r
+       uint32  sector_size;\r
+       uint32  sector_size_value;\r
+       uint32  position;\r
+};\r
+\r
+struct s_cdi_session\r
+{\r
+       uint16 nb_of_tracks;\r
+       s_cdi_track *tracks;\r
+};\r
+\r
+struct s_cdi_descriptor\r
+{\r
+       uint32 length;\r
+       uint32 version;\r
+       uint32 header_offset;\r
+       uint16 nb_of_sessions;\r
+       s_cdi_session *sessions;\r
+};\r
+\r
+extern int                             cdi_fp;\r
+extern uint32                  cdi_load_address;\r
+extern uint32                  cdi_code_length;\r
+extern s_cdi_descriptor        *cdi_descriptor;\r
+extern s_cdi_track             **cdi_tracks;\r
+extern uint32                  cdi_tracks_count;\r
+\r
+int cdi_open(char *path);\r
+void cdi_close(int fp);\r
+s_cdi_descriptor *cdi_get_descriptor(int fp, FILE *stdfp);\r
+void cdi_dump_descriptor(FILE *fp,s_cdi_descriptor *cdi_descriptor);\r
+uint8 *cdi_extract_boot_code(int fp, s_cdi_descriptor *cdi_descriptor);\r
+void cdi_load_sector(uint32 sector, uint8 *buffer);\r
+\r
+#endif\r
diff --git a/src/include/cdrom.h b/src/include/cdrom.h
new file mode 100644 (file)
index 0000000..5b06d39
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __CDROM_H__\r
+#define __CDROM_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void cdrom_init(void);\r
+void cdrom_reset(void);\r
+void cdrom_done(void);\r
+\r
+void cdrom_update(void);\r
+void cdrom_byte_write(uint32 offset, uint8 data);\r
+void cdrom_word_write(uint32 offset, uint16 data);\r
+uint8 cdrom_byte_read(uint32 offset);\r
+uint16 cdrom_word_read(uint32 offset);\r
+\r
+#endif\r
diff --git a/src/include/clock.h b/src/include/clock.h
new file mode 100644 (file)
index 0000000..d727584
--- /dev/null
@@ -0,0 +1,14 @@
+#ifndef __CLOCK_H__\r
+#define __CLOCK_H__\r
+\r
+#include "types.h"\r
+\r
+void clock_init(void);\r
+void clock_reset(void);\r
+void clock_done(void);\r
+void clock_byte_write(uint32, uint8);\r
+void clock_word_write(uint32, uint16);\r
+uint8 clock_byte_read(uint32);\r
+uint16 clock_word_read(uint32);\r
+\r
+#endif\r
diff --git a/src/include/crc32.h b/src/include/crc32.h
new file mode 100644 (file)
index 0000000..fd9faa6
--- /dev/null
@@ -0,0 +1,6 @@
+#ifndef __CRC32_H__\r
+#define __CRC32_H__\r
+\r
+int crc32_calcCheckSum(unsigned char *data, unsigned int length);\r
+\r
+#endif\r
diff --git a/src/include/cry2rgb.h b/src/include/cry2rgb.h
new file mode 100644 (file)
index 0000000..735d293
--- /dev/null
@@ -0,0 +1,74 @@
+////////////////////////////////////////////////////////////////////////////////\r
+// Red Color Values for CrY<->RGB Color Conversion\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+   uint8 redcv[16][16] = {\r
+   //  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\r
+   // ----------------------------------------------------------------------\r
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,    // 0\r
+      34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 19, 0,    // 1\r
+      68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 43, 21, 0,    // 2\r
+      102,102,102,102,102,102,102,102,102,102,102,95, 71, 47, 23, 0,    // 3\r
+      135,135,135,135,135,135,135,135,135,135,130,104,78, 52, 26, 0,    // 4\r
+      169,169,169,169,169,169,169,169,169,170,141,113,85, 56, 28, 0,    // 5\r
+      203,203,203,203,203,203,203,203,203,183,153,122,91, 61, 30, 0,    // 6\r
+      237,237,237,237,237,237,237,237,230,197,164,131,98, 65, 32, 0,    // 7\r
+      255,255,255,255,255,255,255,255,247,214,181,148,15, 82, 49, 7,    // 8\r
+      255,255,255,255,255,255,255,255,255,235,204,173,143,112,81, 51,   // 9\r
+      255,255,255,255,255,255,255,255,255,255,227,198,170,141,113,85,   // A\r
+      255,255,255,255,255,255,255,255,255,255,249,223,197,171,145,119,  // B\r
+      255,255,255,255,255,255,255,255,255,255,255,248,224,200,177,153,  // C\r
+      255,255,255,255,255,255,255,255,255,255,255,255,252,230,208,187,  // D\r
+      255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,221,  // E\r
+      255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255   // F\r
+   };\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+// Green Color Values for CrY<->RGB Color Conversion\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+   uint8 greencv[16][16] = {\r
+   //  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\r
+   // ----------------------------------------------------------------------\r
+      0,  17, 34, 51,68, 85, 102,119,136,153,170,187,204,221,238,255,   // 0\r
+      0,  19, 38, 57,77, 96, 115,134,154,173,192,211,231,250,255,255,   // 1\r
+      0,  21, 43, 64,86, 107,129,150,172,193,215,236,255,255,255,255,   // 2\r
+      0,  23, 47, 71,95, 119,142,166,190,214,238,255,255,255,255,255,   // 3\r
+      0,  26, 52, 78,104,130,156,182,208,234,255,255,255,255,255,255,   // 4\r
+      0,  28, 56, 85,113,141,170,198,226,255,255,255,255,255,255,255,   // 5\r
+      0,  30, 61, 91,122,153,183,214,244,255,255,255,255,255,255,255,   // 6\r
+      0,  32, 65, 98,131,164,197,230,255,255,255,255,255,255,255,255,   // 7\r
+      0,  32, 65, 98,131,164,197,230,255,255,255,255,255,255,255,255,   // 8\r
+      0,  30, 61, 91,122,153,183,214,244,255,255,255,255,255,255,255,   // 9\r
+      0,  28, 56, 85,113,141,170,198,226,255,255,255,255,255,255,255,   // A\r
+      0,  26, 52, 78,104,130,156,182,208,234,255,255,255,255,255,255,   // B\r
+      0,  23, 47, 71,95, 119,142,166,190,214,238,255,255,255,255,255,   // C\r
+      0,  21, 43, 64,86, 107,129,150,172,193,215,236,255,255,255,255,   // D\r
+      0,  19, 38, 57,77, 96, 115,134,154,173,192,211,231,250,255,255,   // E\r
+      0,  17, 34, 51,68, 85, 102,119,136,153,170,187,204,221,238,255    // F\r
+   };\r
+   \r
+////////////////////////////////////////////////////////////////////////////////\r
+// Blue Color Values for CrY<->RGB Color Conversion\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+   uint8 bluecv[16][16] = {\r
+   //  0   1   2   3   4   5   6   7   8   9   A   B   C   D   E   F\r
+   // ----------------------------------------------------------------------\r
+      255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,  // 0\r
+      255,255,255,255,255,255,255,255,255,255,255,255,255,255,240,221,  // 1\r
+      255,255,255,255,255,255,255,255,255,255,255,255,252,230,208,187,  // 2\r
+      255,255,255,255,255,255,255,255,255,255,255,248,224,200,177,153,  // 3\r
+      255,255,255,255,255,255,255,255,255,255,249,223,197,171,145,119,  // 4\r
+      255,255,255,255,255,255,255,255,255,255,227,198,170,141,113,85,   // 5\r
+      255,255,255,255,255,255,255,255,255,235,204,173,143,112,81, 51,   // 6\r
+      255,255,255,255,255,255,255,255,247,214,181,148,115,82, 49, 17,   // 7\r
+      237,237,237,237,237,237,237,237,230,197,164,131,98, 65, 32, 0,    // 8\r
+      203,203,203,203,203,203,203,203,203,183,153,122,91, 61, 30, 0,    // 9\r
+      169,169,169,169,169,169,169,169,169,170,141,113,85, 56, 28, 0,    // A\r
+      135,135,135,135,135,135,135,135,135,135,130,104,78, 52, 26, 0,    // B\r
+      102,102,102,102,102,102,102,102,102,102,102,95, 71, 47, 23, 0,    // C\r
+      68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 64, 43, 21, 0,    // D\r
+      34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 19, 0,    // E\r
+      0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0     // F\r
+   };\r
diff --git a/src/include/dsnd.h b/src/include/dsnd.h
new file mode 100644 (file)
index 0000000..62cf88c
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __DSOUND_H__\r
+#define __DSOUND_H__\r
+\r
+\r
+void ws_audio_init(void);\r
+void ws_audio_reset(void);\r
+void ws_audio_done(void);\r
+int  ws_audio_seal_init(void);\r
+void ws_audio_seal_done(void);\r
+void ws_audio_clear_channel(int Channel);\r
+int  ws_audio_play_channel(int Channel);\r
+int  ws_audio_stop_channel(int Channel);\r
+void ws_write_state(int fp);\r
+void ws_read_state(int fp);\r
+void system_sound_clear(void);\r
+void system_sound_shutdown(void);\r
+void system_sound_update(void);\r
+\r
+\r
+#endif\r
diff --git a/src/include/dsp.h b/src/include/dsp.h
new file mode 100644 (file)
index 0000000..3c6f87a
--- /dev/null
@@ -0,0 +1,36 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __DSP_H__\r
+#define __DSP_H__\r
+\r
+#include "jaguar.h"\r
+\r
+#define dsp_control_ram_base    0x00f1a100\r
+#define dsp_work_ram_base              0x00f1b000\r
+\r
+void dsp_init(void);\r
+void dsp_reset(void);\r
+void dsp_exec(int32);\r
+void dsp_done(void);\r
+void dsp_update_register_banks(void);\r
+void dsp_check_irqs(void);\r
+void dsp_set_irq_line(int irqline, int state);\r
+unsigned dsp_byte_read(unsigned int offset);\r
+unsigned dsp_word_read(unsigned int offset);\r
+unsigned dsp_long_read(unsigned int offset);\r
+void dsp_byte_write(unsigned  offset, unsigned  data);\r
+void dsp_word_write(unsigned  offset, unsigned  data);\r
+void dsp_long_write(unsigned  offset, unsigned  data);\r
+void dsp_check_if_i2s_interrupt_needed(void);\r
+void dsp_releaseTimeslice(void);\r
+\r
+#endif\r
diff --git a/src/include/eeprom.h b/src/include/eeprom.h
new file mode 100644 (file)
index 0000000..463526c
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __EEPROM_H__\r
+#define __EEPROm_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void eeprom_init(void);\r
+void eeprom_reset(void);\r
+void eeprom_done(void);\r
+\r
+void eeprom_update(void);\r
+void eeprom_byte_write(uint32 offset, uint8 data);\r
+void eeprom_word_write(uint32 offset, uint16 data);\r
+uint8 eeprom_byte_read(uint32 offset);\r
+uint16 eeprom_word_read(uint32 offset);\r
+\r
+#endif\r
diff --git a/src/include/fbmpop1.h b/src/include/fbmpop1.h
new file mode 100644 (file)
index 0000000..2dcf9cf
--- /dev/null
@@ -0,0 +1,145 @@
+\r
+               uint32 c;\r
+               paletteRam+=(idx<<2);\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_TB_HFLIP(C) if (C) { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else current_line_buffer-=2; \r
+                                               \r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_B_HFLIP(C) if (C) { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[1]); }\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x01)\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_TB(C) if (C) { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else current_line_buffer+=2; \r
+                                               \r
+                                               PUTPIXEL_1_TB(c&0x80)\r
+                                               PUTPIXEL_1_TB(c&0x40)\r
+                                               PUTPIXEL_1_TB(c&0x20)\r
+                                               PUTPIXEL_1_TB(c&0x10)\r
+                                               PUTPIXEL_1_TB(c&0x08)\r
+                                               PUTPIXEL_1_TB(c&0x04)\r
+                                               PUTPIXEL_1_TB(c&0x02)\r
+                                               PUTPIXEL_1_TB(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_B(C) if (C) { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[1]); }\r
+                                               PUTPIXEL_1_B(c&0x80)\r
+                                               PUTPIXEL_1_B(c&0x40)\r
+                                               PUTPIXEL_1_B(c&0x20)\r
+                                               PUTPIXEL_1_B(c&0x10)\r
+                                               PUTPIXEL_1_B(c&0x08)\r
+                                               PUTPIXEL_1_B(c&0x04)\r
+                                               PUTPIXEL_1_B(c&0x02)\r
+                                               PUTPIXEL_1_B(c&0x01)\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_T_HFLIP(C) if (C) { *current_line_buffer--=paletteRam[(1<<1)+0]; *current_line_buffer--=paletteRam[(1<<1)+1]; } else current_line_buffer-=2; \r
+                                               \r
+                                               PUTPIXEL_1_T_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_HFLIP(C) if (C) { *current_line_buffer--=paletteRam[(1<<1)+0]; *current_line_buffer--=paletteRam[(1<<1)+1]; } else { *current_line_buffer--=paletteRam[0]; *current_line_buffer--=paletteRam[1]; }\r
+                                               PUTPIXEL_1_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_HFLIP(c&0x01)\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_T(C) if (C) { *current_line_buffer++=paletteRam[(1<<1)+0]; *current_line_buffer++=paletteRam[(1<<1)+1]; } else current_line_buffer+=2; \r
+                                               \r
+                                               PUTPIXEL_1_T(c&0x80)\r
+                                               PUTPIXEL_1_T(c&0x40)\r
+                                               PUTPIXEL_1_T(c&0x20)\r
+                                               PUTPIXEL_1_T(c&0x10)\r
+                                               PUTPIXEL_1_T(c&0x08)\r
+                                               PUTPIXEL_1_T(c&0x04)\r
+                                               PUTPIXEL_1_T(c&0x02)\r
+                                               PUTPIXEL_1_T(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1(C) if (C) { *current_line_buffer++=paletteRam[(1<<1)+0]; *current_line_buffer++=paletteRam[(1<<1)+1]; } else { *current_line_buffer++=paletteRam[0]; *current_line_buffer++=paletteRam[1]; }\r
+                                               PUTPIXEL_1(c&0x80)\r
+                                               PUTPIXEL_1(c&0x40)\r
+                                               PUTPIXEL_1(c&0x20)\r
+                                               PUTPIXEL_1(c&0x10)\r
+                                               PUTPIXEL_1(c&0x08)\r
+                                               PUTPIXEL_1(c&0x04)\r
+                                               PUTPIXEL_1(c&0x02)\r
+                                               PUTPIXEL_1(c&0x01)\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop16.h b/src/include/fbmpop16.h
new file mode 100644 (file)
index 0000000..38edae0
--- /dev/null
@@ -0,0 +1,114 @@
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,(data>>8));\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,(data&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,(data>>8));\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,(data&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer--=(data>>8);\r
+                                                       *current_line_buffer--=(data&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr++);\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr++);\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               int count=0;\r
+\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer++=(data>>8);\r
+                                                       *current_line_buffer++=(data&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       }                               \r
+                                       count+=2;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop16p.h b/src/include/fbmpop16p.h
new file mode 100644 (file)
index 0000000..e784d89
--- /dev/null
@@ -0,0 +1,131 @@
+               int count=0;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,(data>>8));\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,(data&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                       }\r
+                                       count+=2;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,(data>>8));\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,(data&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr++));\r
+                                       }\r
+                                       count+=2;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer--=(data>>8);\r
+                                                       *current_line_buffer--=(data&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr++);\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr++);\r
+                                       }\r
+                                       count+=2;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               uint16 data=jaguar_byte_read(ptr++);\r
+                                               data<<=8;\r
+                                               data|=jaguar_byte_read(ptr++);\r
+                                               if (data)\r
+                                               {\r
+                                                       *current_line_buffer++=(data>>8);\r
+                                                       *current_line_buffer++=(data&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       }                               \r
+                                       count+=2;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop1p.h b/src/include/fbmpop1p.h
new file mode 100644 (file)
index 0000000..fdab43e
--- /dev/null
@@ -0,0 +1,170 @@
+\r
+               uint32 c;\r
+               paletteRam+=(idx<<2);\r
+               int count=0;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_TB_HFLIP(C) if (C) { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else current_line_buffer-=2; \r
+                                               \r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_TB_HFLIP(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_B_HFLIP(C) if (C) { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else { *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[0]); *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[1]); }\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_B_HFLIP(c&0x01)\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_TB(C) if (C) { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else current_line_buffer+=2; \r
+                                               \r
+                                               PUTPIXEL_1_TB(c&0x80)\r
+                                               PUTPIXEL_1_TB(c&0x40)\r
+                                               PUTPIXEL_1_TB(c&0x20)\r
+                                               PUTPIXEL_1_TB(c&0x10)\r
+                                               PUTPIXEL_1_TB(c&0x08)\r
+                                               PUTPIXEL_1_TB(c&0x04)\r
+                                               PUTPIXEL_1_TB(c&0x02)\r
+                                               PUTPIXEL_1_TB(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_B(C) if (C) { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(1<<1)+0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(1<<1)+1]); } else { *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[0]); *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[1]); }\r
+                                               PUTPIXEL_1_B(c&0x80)\r
+                                               PUTPIXEL_1_B(c&0x40)\r
+                                               PUTPIXEL_1_B(c&0x20)\r
+                                               PUTPIXEL_1_B(c&0x10)\r
+                                               PUTPIXEL_1_B(c&0x08)\r
+                                               PUTPIXEL_1_B(c&0x04)\r
+                                               PUTPIXEL_1_B(c&0x02)\r
+                                               PUTPIXEL_1_B(c&0x01)\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_T_HFLIP(C) if (C) { *current_line_buffer--=paletteRam[(1<<1)+0]; *current_line_buffer--=paletteRam[(1<<1)+1]; } else current_line_buffer-=2; \r
+                                               \r
+                                               PUTPIXEL_1_T_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_T_HFLIP(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1_HFLIP(C) if (C) { *current_line_buffer--=paletteRam[(1<<1)+0]; *current_line_buffer--=paletteRam[(1<<1)+1]; } else { *current_line_buffer--=paletteRam[0]; *current_line_buffer--=paletteRam[1]; }\r
+                                               PUTPIXEL_1_HFLIP(c&0x80)\r
+                                               PUTPIXEL_1_HFLIP(c&0x40)\r
+                                               PUTPIXEL_1_HFLIP(c&0x20)\r
+                                               PUTPIXEL_1_HFLIP(c&0x10)\r
+                                               PUTPIXEL_1_HFLIP(c&0x08)\r
+                                               PUTPIXEL_1_HFLIP(c&0x04)\r
+                                               PUTPIXEL_1_HFLIP(c&0x02)\r
+                                               PUTPIXEL_1_HFLIP(c&0x01)\r
+                                       }\r
+                                       iwidth--;\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       \r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {\r
+                                               #define PUTPIXEL_1_T(C) if (C) { *current_line_buffer++=paletteRam[(1<<1)+0]; *current_line_buffer++=paletteRam[(1<<1)+1]; } else current_line_buffer+=2; \r
+                                               \r
+                                               PUTPIXEL_1_T(c&0x80)\r
+                                               PUTPIXEL_1_T(c&0x40)\r
+                                               PUTPIXEL_1_T(c&0x20)\r
+                                               PUTPIXEL_1_T(c&0x10)\r
+                                               PUTPIXEL_1_T(c&0x08)\r
+                                               PUTPIXEL_1_T(c&0x04)\r
+                                               PUTPIXEL_1_T(c&0x02)\r
+                                               PUTPIXEL_1_T(c&0x01)\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               #define PUTPIXEL_1(C) if (C) { *current_line_buffer++=paletteRam[(1<<1)+0]; *current_line_buffer++=paletteRam[(1<<1)+1]; } else { *current_line_buffer++=paletteRam[0]; *current_line_buffer++=paletteRam[1]; }\r
+                                               PUTPIXEL_1(c&0x80)\r
+                                               PUTPIXEL_1(c&0x40)\r
+                                               PUTPIXEL_1(c&0x20)\r
+                                               PUTPIXEL_1(c&0x10)\r
+                                               PUTPIXEL_1(c&0x08)\r
+                                               PUTPIXEL_1(c&0x04)\r
+                                               PUTPIXEL_1(c&0x02)\r
+                                               PUTPIXEL_1(c&0x01)\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop2.h b/src/include/fbmpop2.h
new file mode 100644 (file)
index 0000000..9758b98
--- /dev/null
@@ -0,0 +1,268 @@
+               uint32 c;\r
+               paletteRam+=idx*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c0<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c0<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c1<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c1<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c2<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c2<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c3<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c3<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer--=paletteRam[(c0<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c0<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c1<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c1<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c2<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c2<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c3<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c3<<1)+1];\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c0<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c0<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c1<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c1<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c2<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c2<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c3<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c3<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer++=paletteRam[(c0<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c0<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c1<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c1<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c2<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c2<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c3<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c3<<1)+1];\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop24.h b/src/include/fbmpop24.h
new file mode 100644 (file)
index 0000000..3fccfb2
--- /dev/null
@@ -0,0 +1,74 @@
+               if (flags&FLAGS_HFLIP)\r
+               {\r
+                       if (flags&FLAGS_TRANSPARENT)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       uint32 data=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       if (data)\r
+                                       {\r
+                                               *current_line_buffer--=(data>>24)&0xff;\r
+                                               *current_line_buffer--=(data>>16)&0xff;\r
+                                               *current_line_buffer--=(data>> 8)&0xff;\r
+                                               *current_line_buffer--=data      &0xff;\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer-=4;\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_TRANSPARENT)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       uint32 data=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       if (data)\r
+                                       {\r
+                                               *current_line_buffer++=(data>>24)&0xff;\r
+                                               *current_line_buffer++=(data>>16)&0xff;\r
+                                               *current_line_buffer++=(data>> 8)&0xff;\r
+                                               *current_line_buffer++=data      &0xff;\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer+=4;\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop24p.h b/src/include/fbmpop24p.h
new file mode 100644 (file)
index 0000000..a1e904b
--- /dev/null
@@ -0,0 +1,99 @@
+               int count=0;\r
+               if (flags&FLAGS_HFLIP)\r
+               {\r
+                       if (flags&FLAGS_TRANSPARENT)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       uint32 data=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       if (data)\r
+                                       {\r
+                                               *current_line_buffer--=(data>>24)&0xff;\r
+                                               *current_line_buffer--=(data>>16)&0xff;\r
+                                               *current_line_buffer--=(data>> 8)&0xff;\r
+                                               *current_line_buffer--=data      &0xff;\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer-=4;\r
+                                       count+=4;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       iwidth--;\r
+                                       count+=4;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_TRANSPARENT)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       uint32 data=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       data<<=8;\r
+                                       data|=jaguar_byte_read(ptr++);\r
+                                       if (data)\r
+                                       {\r
+                                               *current_line_buffer++=(data>>24)&0xff;\r
+                                               *current_line_buffer++=(data>>16)&0xff;\r
+                                               *current_line_buffer++=(data>> 8)&0xff;\r
+                                               *current_line_buffer++=data      &0xff;\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer+=4;\r
+                                       count+=4;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       *current_line_buffer++=jaguar_byte_read(ptr++);\r
+                                       count+=4;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop2p.h b/src/include/fbmpop2p.h
new file mode 100644 (file)
index 0000000..783274b
--- /dev/null
@@ -0,0 +1,317 @@
+               int count=0;\r
+               uint32 c;\r
+               paletteRam+=idx*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c0<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c0<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c1<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c1<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c2<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c2<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(c3<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(c3<<1)+1]);\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c0<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c0<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c1<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c1<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c2<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c2<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(c3<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(c3<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer--=paletteRam[(c0<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c0<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c1<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c1<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c2<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c2<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(c3<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c3<<1)+1];\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               if (c0)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c0<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c0<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c1)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c1<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c1<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c2)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c2<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c2<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (c3)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(c3<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(c3<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 c0=(c>>6)&0x03;\r
+                                               uint32 c1=(c>>4)&0x03;\r
+                                               uint32 c2=(c>>2)&0x03;\r
+                                               uint32 c3=(c>>0)&0x03;\r
+\r
+                                               *current_line_buffer++=paletteRam[(c0<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c0<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c1<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c1<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c2<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c2<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(c3<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c3<<1)+1];\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop4.h b/src/include/fbmpop4.h
new file mode 100644 (file)
index 0000000..2d99376
--- /dev/null
@@ -0,0 +1,178 @@
+               uint32 c;\r
+               if (jaguar_mainRom_crc32==0x66f8914c)\r
+               {\r
+                       if (idx==12) \r
+                               idx=64;\r
+               }                       \r
+               paletteRam+=idx*4;\r
+\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(cl<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(cl<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(ch<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(ch<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer--=paletteRam[(cl<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(cl<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(ch<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(ch<<1)+1];\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(cl<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(cl<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(ch<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(ch<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer++=paletteRam[(cl<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(cl<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(ch<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(ch<<1)+1];\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop4p.h b/src/include/fbmpop4p.h
new file mode 100644 (file)
index 0000000..e7602f1
--- /dev/null
@@ -0,0 +1,221 @@
+               int count=0;\r
+               uint32 c;\r
+               paletteRam+=idx*4;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(cl<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(cl<<1)+1]);\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[(ch<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[(ch<<1)+1]);\r
+                                               iwidth--;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(cl<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(cl<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[(ch<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[(ch<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer--=paletteRam[(cl<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(cl<<1)+1];\r
+                                               *current_line_buffer--=paletteRam[(ch<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(ch<<1)+1];\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr-=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               if (cl)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(cl<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(cl<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               if (ch)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[(ch<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[(ch<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (iwidth)\r
+                                       {\r
+                                               c=jaguar_byte_read(ptr++);\r
+                                               uint32 cl=c>>4;\r
+                                               uint32 ch=c&0x0f;\r
+                                               *current_line_buffer++=paletteRam[(cl<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(cl<<1)+1];\r
+                                               *current_line_buffer++=paletteRam[(ch<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(ch<<1)+1];\r
+                                               count+=1;\r
+                                               if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                               {\r
+                                                       ptr+=8*(pitch-1);\r
+                                                       count=0;\r
+                                               }\r
+                                               iwidth--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop8.h b/src/include/fbmpop8.h
new file mode 100644 (file)
index 0000000..e5373cb
--- /dev/null
@@ -0,0 +1,104 @@
+               uint32 c;\r
+               paletteRam+=(idx&0x01)*256*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[c+0];\r
+                                                       *current_line_buffer--=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[c+0];\r
+                                               *current_line_buffer--=paletteRam[c+1];\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[c+0];\r
+                                                       *current_line_buffer++=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[c+0];\r
+                                               *current_line_buffer++=paletteRam[c+1];\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/fbmpop8p.h b/src/include/fbmpop8p.h
new file mode 100644 (file)
index 0000000..e3785d7
--- /dev/null
@@ -0,0 +1,129 @@
+               int count=0;\r
+               uint32 c;\r
+               paletteRam+=(idx&0x01)*256*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[c+0];\r
+                                                       *current_line_buffer--=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[c+0];\r
+                                               *current_line_buffer--=paletteRam[c+1];\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr-=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (iwidth)\r
+                               {\r
+                                       c=jaguar_byte_read(ptr++);\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[c+0];\r
+                                                       *current_line_buffer++=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[c+0];\r
+                                               *current_line_buffer++=paletteRam[c+1];\r
+                                       }\r
+                                       count+=1;\r
+                                       if (count==8) // 8 bytes = a phrase (64 bits)\r
+                                       {\r
+                                               ptr+=8*(pitch-1);\r
+                                               count=0;\r
+                                       }\r
+                                       iwidth--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/gpu.h b/src/include/gpu.h
new file mode 100644 (file)
index 0000000..b6b0f08
--- /dev/null
@@ -0,0 +1,38 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __GPU_H__\r
+#define __GPU_H__\r
+\r
+#include "jaguar.h"\r
+\r
+#define gpu_control_ram_base    0x00f02100\r
+#define gpu_work_ram_base              0x00f03000\r
+\r
+void gpu_init(void);\r
+void gpu_reset(void);\r
+void gpu_exec(int32);\r
+void gpu_done(void);\r
+void gpu_update_register_banks(void);\r
+void gpu_check_irqs(void);\r
+void gpu_set_irq_line(int irqline, int state);\r
+unsigned gpu_byte_read(unsigned int offset);\r
+unsigned gpu_word_read(unsigned int offset);\r
+unsigned gpu_long_read(unsigned int offset);\r
+void gpu_byte_write(unsigned  offset, unsigned  data);\r
+void gpu_word_write(unsigned  offset, unsigned  data);\r
+void gpu_long_write(unsigned  offset, unsigned  data);\r
+uint32 gpu_get_pc(void);\r
+void gpu_releaseTimeslice(void);\r
+void gpu_reset_stats(void);\r
+uint32 gpu_read_pc(void);\r
+\r
+#endif\r
diff --git a/src/include/gpuopcodes.h b/src/include/gpuopcodes.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/harddisk.h b/src/include/harddisk.h
new file mode 100644 (file)
index 0000000..37bcf41
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef __HARDDISK_H__\r
+#define __HARDDISK_H__\r
+\r
+#include "types.h"\r
+\r
+/***************************************************************************\r
+\r
+       MAME compressed hard disk header format. All numbers are stored in\r
+       Motorola (big-endian) byte ordering. The header is 76 bytes long.\r
+\r
+       [  0] char   tag[8];            // 'MComprHD'\r
+       [  8] UINT32 length;            // length of header (including tag and length fields)\r
+       [ 12] UINT32 version;           // drive format version\r
+       [ 16] UINT32 flags;                     // flags (see below)\r
+       [ 20] UINT32 compression;       // compression type\r
+       [ 24] UINT32 blocksize;         // sectors per block\r
+       [ 28] UINT32 totalblocks;       // total # of block represented\r
+       [ 32] UINT32 cylinders;         // number of cylinders on hard disk\r
+       [ 36] UINT32 heads;                     // number of heads on hard disk\r
+       [ 40] UINT32 sectors;           // number of sectors on hard disk\r
+       [ 44] UINT8  md5[16];           // MD5 checksum for this drive\r
+       [ 60] UINT8  parentmd5[16];     // MD5 checksum for parent drive\r
+       [ 76] (header length)\r
+\r
+       Flags:\r
+               0x00000001 - set if this drive has a parent\r
+               0x00000002 - set if this drive allows writes\r
+\r
+***************************************************************************/\r
+\r
+/*************************************\r
+ *\r
+ *     Constants\r
+ *\r
+ *************************************/\r
+\r
+#define HARD_DISK_HEADER_SIZE          76\r
+#define HARD_DISK_HEADER_VERSION       1\r
+\r
+#define HARD_DISK_SECTOR_SIZE          512\r
+\r
+#define HDFLAGS_HAS_PARENT                     0x00000001\r
+#define HDFLAGS_IS_WRITEABLE           0x00000002\r
+\r
+#define HDCOMPRESSION_NONE                     0\r
+#define HDCOMPRESSION_ZLIB                     1\r
+#define HDCOMPRESSION_MAX                      2\r
+\r
+enum\r
+{\r
+       HDERR_NONE,\r
+       HDERR_NO_INTERFACE,\r
+       HDERR_OUT_OF_MEMORY,\r
+       HDERR_INVALID_FILE,\r
+       HDERR_INVALID_PARAMETER,\r
+       HDERR_INVALID_DATA,\r
+       HDERR_FILE_NOT_FOUND,\r
+       HDERR_REQUIRES_PARENT,\r
+       HDERR_FILE_NOT_WRITEABLE,\r
+       HDERR_READ_ERROR,\r
+       HDERR_WRITE_ERROR,\r
+       HDERR_CODEC_ERROR,\r
+       HDERR_INVALID_PARENT,\r
+       HDERR_SECTOR_OUT_OF_RANGE,\r
+       HDERR_DECOMPRESSION_ERROR,\r
+       HDERR_COMPRESSION_ERROR,\r
+       HDERR_CANT_CREATE_FILE,\r
+       HDERR_CANT_VERIFY\r
+};\r
+\r
+\r
+\r
+/*************************************\r
+ *\r
+ *     Type definitions\r
+ *\r
+ *************************************/\r
+\r
+struct hard_disk_header\r
+{\r
+       UINT32  length;                         /* length of header data */\r
+       UINT32  version;                        /* drive format version */\r
+       UINT32  flags;                          /* flags field */\r
+       UINT32  compression;            /* compression type */\r
+       UINT32  blocksize;                      /* sectors per block */\r
+       UINT32  totalblocks;            /* total # of blocks represented */\r
+       UINT32  cylinders;                      /* number of cylinders on hard disk */\r
+       UINT32  heads;                          /* number of heads on hard disk */\r
+       UINT32  sectors;                        /* number of sectors on hard disk */\r
+       UINT8   md5[16];                        /* MD5 checksum for this drive */\r
+       UINT8   parentmd5[16];          /* MD5 checksum for parent drive */\r
+};\r
+\r
+\r
+struct hard_disk_interface\r
+{\r
+       void *(*open)(const char *filename, const char *mode);\r
+       void (*close)(void *file);\r
+       uint32 (*read)(void *file, UINT64 offset, UINT32 count, void *buffer);\r
+       uint32 (*write)(void *file, UINT64 offset, UINT32 count, const void *buffer);\r
+};\r
+\r
+void hard_disk_set_interface(struct hard_disk_interface *intf);\r
+\r
+int hard_disk_create(const char *filename, const struct hard_disk_header *header);\r
+void *hard_disk_open(const char *filename, int writeable, void *parent);\r
+void hard_disk_close(void *disk);\r
+void hard_disk_close_all(void);\r
+\r
+UINT32 hard_disk_read(void *disk, UINT32 lbasector, UINT32 numsectors, void *buffer);\r
+UINT32 hard_disk_write(void *disk, UINT32 lbasector, UINT32 numsectors, const void *buffer);\r
+\r
+int hard_disk_get_last_error(void);\r
+const struct hard_disk_header *hard_disk_get_header(void *disk);\r
+int hard_disk_set_header(const char *filename, const struct hard_disk_header *header);\r
+\r
+int hard_disk_compress(const char *rawfile, UINT32 offset, const char *newfile, const struct hard_disk_header *header, const char *difffile, void (*progress)(const char *, ...));\r
+int hard_disk_verify(const char *hdfile, void (*progress)(const char *, ...), UINT8 headermd5[16], UINT8 actualmd5[16]);\r
+\r
+#endif\r
diff --git a/src/include/ide.h b/src/include/ide.h
new file mode 100644 (file)
index 0000000..d6a72da
--- /dev/null
@@ -0,0 +1,16 @@
+#ifndef __IDE_H__\r
+#define __IDE_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void ide_init(void);\r
+void ide_reset(void);\r
+void ide_done(void);\r
+\r
+void ide_update(void);\r
+void ide_byte_write(uint32 offset, uint8 data);\r
+void ide_word_write(uint32 offset, uint16 data);\r
+uint8 ide_byte_read(uint32 offset);\r
+uint16 ide_word_read(uint32 offset);\r
+\r
+#endif\r
diff --git a/src/include/idectrl.h b/src/include/idectrl.h
new file mode 100644 (file)
index 0000000..29ae71a
--- /dev/null
@@ -0,0 +1,24 @@
+#ifndef __IDECTRL_H__\r
+#define __IDECTRL_H__\r
+\r
+#include "types.h"\r
+#include "harddisk.h"\r
+\r
+#define MAX_IDE_CONTROLLERS                    1\r
+\r
+struct ide_interface\r
+{\r
+       void    (*interrupt)(int state);\r
+};\r
+\r
+int ide_controller_init(int which, struct ide_interface *intf);\r
+void ide_controller_reset(int which);\r
+uint8 *ide_get_features(int which);\r
+/*\r
+READ32_HANDLER( ide_controller32_0_r );\r
+WRITE32_HANDLER( ide_controller32_0_w );\r
+\r
+READ16_HANDLER( ide_controller16_0_r );\r
+WRITE16_HANDLER( ide_controller16_0_w );\r
+*/\r
+#endif\r
diff --git a/src/include/jagdasm.h b/src/include/jagdasm.h
new file mode 100644 (file)
index 0000000..ee94495
--- /dev/null
@@ -0,0 +1,9 @@
+#ifndef __JAGDASM__\r
+#define __JAGDASM__\r
+\r
+#define JAGUAR_GPU 0\r
+#define JAGUAR_DSP 1\r
+\r
+unsigned dasmjag(int dsp_type, char *buffer, unsigned pc);\r
+\r
+#endif\r
diff --git a/src/include/jaguar.h b/src/include/jaguar.h
new file mode 100644 (file)
index 0000000..043e361
--- /dev/null
@@ -0,0 +1,49 @@
+#ifndef __JAGUAR_H__\r
+#define __JAGUAR_H__\r
+\r
+#include "types.h"\r
+#include "log.h"\r
+#include "version.h"\r
+#include "memory.h"\r
+//#include "../star026c/starcpu.h"\r
+#include "m68k.h"                                                              // Musashi! Not StarCrap! (Why are you afraid to show us the source, Neill? :-)\r
+#include "tom.h"\r
+#include "jerry.h"\r
+#include "gpu.h"\r
+#include "dsp.h"\r
+#include "objectp.h"\r
+#include "blitter.h"\r
+#include "clock.h"\r
+#include "anajoy.h"\r
+#include "joystick.h"\r
+#include "pcm.h"\r
+#include "jagdasm.h"\r
+#include "dsnd.h"\r
+#include "cdrom.h"\r
+#include "eeprom.h"\r
+#include "cdi.h"\r
+#include "cdbios.h"\r
+\r
+extern int32 jaguar_cpu_in_exec;\r
+extern uint32 jaguar_mainRom_crc32;\r
+extern char * jaguar_eeproms_path;\r
+\r
+#ifdef __PORT__\r
+void jaguar_init(const char * filename);\r
+#else\r
+void jaguar_init(void);\r
+#endif // #ifdef __PORT__\r
+void jaguar_reset(void);\r
+void jaguar_reset_handler(void);\r
+void jaguar_done(void);\r
+void jaguar_exec(int16 * backbuffer, uint8 render);\r
+unsigned jaguar_byte_read(unsigned int offset);\r
+unsigned jaguar_word_read(unsigned int offset);\r
+unsigned jaguar_long_read(unsigned int offset);\r
+void jaguar_byte_write(unsigned offset, unsigned data);\r
+void jaguar_word_write(unsigned offset, unsigned data);\r
+void jaguar_long_write(unsigned offset, unsigned data);\r
+uint32 jaguar_interrupt_handler_is_valid(uint32 i);\r
+void jaguar_dasm(uint32 offset, uint32 qt);\r
+\r
+#endif // #ifndef __JAGUAR_H__\r
diff --git a/src/include/jerry.h b/src/include/jerry.h
new file mode 100644 (file)
index 0000000..942e5ae
--- /dev/null
@@ -0,0 +1,27 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __JERRY_H__\r
+#define __JERRY_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void jerry_init(void);\r
+void jerry_reset(void);\r
+void jerry_done(void);\r
+unsigned jerry_byte_read(unsigned int offset);\r
+unsigned jerry_word_read(unsigned int offset);\r
+void jerry_byte_write(unsigned  offset, unsigned  data);\r
+void jerry_word_write(unsigned  offset, unsigned  data);\r
+void jerry_pit_exec(uint32 cycles);\r
+void jerry_i2s_exec(uint32 cycles);\r
+\r
+#endif\r
diff --git a/src/include/joystick.h b/src/include/joystick.h
new file mode 100644 (file)
index 0000000..7a4a3d2
--- /dev/null
@@ -0,0 +1,15 @@
+#ifndef __JOYSTICK_H__\r
+#define __JOYSTICK_H__\r
+\r
+#include "types.h"\r
+\r
+void joystick_init(void);\r
+void joystick_reset(void);\r
+void joystick_done(void);\r
+void joystick_byte_write(uint32, uint8);\r
+void joystick_word_write(uint32, uint16);\r
+uint8 joystick_byte_read(uint32);\r
+uint16 joystick_word_read(uint32);\r
+void joystick_exec(void);\r
+\r
+#endif\r
diff --git a/src/include/log.h b/src/include/log.h
new file mode 100644 (file)
index 0000000..e0fe1fb
--- /dev/null
@@ -0,0 +1,22 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __LOG_H__\r
+#define __LOG_H__\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+int log_init(char *);\r
+FILE *log_get(void);\r
+void log_done(void);\r
+\r
+#endif\r
diff --git a/src/include/m68kdasmAG.h b/src/include/m68kdasmAG.h
new file mode 100644 (file)
index 0000000..697f7bc
--- /dev/null
@@ -0,0 +1 @@
+int Dasm68000(char * pBase, char * buffer, int pc);\r
diff --git a/src/include/mamegpu.h b/src/include/mamegpu.h
new file mode 100644 (file)
index 0000000..4415695
--- /dev/null
@@ -0,0 +1,781 @@
+#define ZFLAG                          0x00001\r
+#define CFLAG                          0x00002\r
+#define NFLAG                          0x00004\r
+#define IFLAG                          0x00008\r
+static UINT8 *         condition_table=0;\r
+\r
+#define CONDITION(x)   condition_table[(x) + ((jaguar_FLAGS & 7) << 5)]\r
+static UINT16 *                mirror_table;\r
+\r
+\r
+\r
+\r
+/*###################################################################################################\r
+**     MEMORY ACCESSORS\r
+**#################################################################################################*/\r
+\r
+#define ROPCODE(pc)            (gpu_word_read(pc))\r
+uint16 jaguar_ppc;\r
+uint16 jaguar_op;\r
+int32 jaguar_icount;\r
+static const UINT32 convert_zero[32] =\r
+{ 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };\r
+\r
+static uint32 cnt_opcode=0;\r
+int jaguargpu_execute(int cycles)\r
+{\r
+       int i,j;\r
+       /* allocate the mirror table */\r
+       if (!mirror_table)\r
+       {\r
+               mirror_table = (UINT16*)malloc(65536 * sizeof(mirror_table[0]));\r
+\r
+               /* fill in the mirror table */\r
+               if (mirror_table)\r
+                       for (i = 0; i < 65536; i++)\r
+                               mirror_table[i] = ((i >> 15) & 0x0001) | ((i >> 13) & 0x0002) |\r
+                                                                 ((i >> 11) & 0x0004) | ((i >> 9)  & 0x0008) |\r
+                                                                 ((i >> 7)  & 0x0010) | ((i >> 5)  & 0x0020) |\r
+                                                                 ((i >> 3)  & 0x0040) | ((i >> 1)  & 0x0080) |\r
+                                                                 ((i << 1)  & 0x0100) | ((i << 3)  & 0x0200) |\r
+                                                                 ((i << 5)  & 0x0400) | ((i << 7)  & 0x0800) |\r
+                                                                 ((i << 9)  & 0x1000) | ((i << 11) & 0x2000) |\r
+                                                                 ((i << 13) & 0x4000) | ((i << 15) & 0x8000);\r
+       }\r
+       \r
+       if (!condition_table)\r
+       {\r
+               condition_table = (uint8*)malloc(32 * 8 * sizeof(condition_table[0]));\r
+\r
+               /* fill in the condition table */\r
+               if (condition_table)\r
+                       for (i = 0; i < 8; i++)\r
+                               for (j = 0; j < 32; j++)\r
+                               {\r
+                                       int result = 1;\r
+                                       if (j & 1)\r
+                                               if (i & ZFLAG) result = 0;\r
+                                       if (j & 2)\r
+                                               if (!(i & ZFLAG)) result = 0;\r
+                                       if (j & 4)\r
+                                               if (i & (CFLAG << (j >> 4))) result = 0;\r
+                                       if (j & 8)\r
+                                               if (!(i & (CFLAG << (j >> 4)))) result = 0;\r
+                                       condition_table[i * 32 + j] = result;\r
+                               }\r
+       }\r
+       /* if we're halted, we shouldn't be here */\r
+       if (!gpu_running)\r
+       {\r
+               return cycles;\r
+       }\r
+       jaguar_icount=cycles;\r
+\r
+       do\r
+       {\r
+               gpu_flag_c=(gpu_flag_c?1:0);\r
+               gpu_flag_z=(gpu_flag_z?1:0);\r
+               gpu_flag_n=(gpu_flag_n?1:0);\r
+\r
+//             fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);\r
+               jaguar_ppc = gpu_pc;\r
+\r
+               /* instruction fetch */\r
+               jaguar_op = ROPCODE(gpu_pc);\r
+               gpu_pc += 2;\r
+\r
+               /* parse the instruction */\r
+               (*gpu_op_table[jaguar_op >> 10])();\r
+               jaguar_icount--;\r
+\r
+       } while ((jaguar_icount > 0)&&(gpu_running));\r
+\r
+       return cycles - jaguar_icount;\r
+}\r
+/*###################################################################################################\r
+**     OPCODES\r
+**#################################################################################################*/\r
+\r
+void abs_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 res = gpu_reg[dreg];\r
+       CLR_ZNC;\r
+       if (res & 0x80000000)\r
+       {\r
+               gpu_reg[dreg] = res = -res;\r
+               SET_C\r
+       }\r
+       SET_Z(res);\r
+}\r
+\r
+void add_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 + r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_ADD(r2,r1,res);\r
+}\r
+\r
+void addc_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 + r1 + gpu_flag_c;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_ADD(r2,r1,res);\r
+}\r
+\r
+void addq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 + r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_ADD(r2,r1,res);\r
+}\r
+\r
+void addqmod_n_rn(void)        /* DSP only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 + r1;\r
+       res = (res & ~gpu_hidata) | (r2 & ~gpu_hidata);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_ADD(r2,r1,res);\r
+}\r
+\r
+void addqt_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 + r1;\r
+       gpu_reg[dreg] = res;\r
+}\r
+\r
+void and_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 & r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void bclr_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = (jaguar_op >> 5) & 31;\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 & ~(1 << r1);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void bset_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = (jaguar_op >> 5) & 31;\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 | (1 << r1);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void btst_n_rn(void)\r
+{\r
+       UINT32 r1 = (jaguar_op >> 5) & 31;\r
+       UINT32 r2 = gpu_reg[jaguar_op & 31];\r
+       CLR_Z; gpu_flag_z= (~r2 >> r1) & 1;\r
+}\r
+\r
+void cmp_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[jaguar_op & 31];\r
+       UINT32 res = r2 - r1;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void cmpq_n_rn(void)\r
+{\r
+       UINT32 r1 = (INT8)(jaguar_op >> 2) >> 3;\r
+       UINT32 r2 = gpu_reg[jaguar_op & 31];\r
+       UINT32 res = r2 - r1;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void div_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       if (r1)\r
+       {\r
+               if (gpu_div_control & 1)\r
+               {\r
+                       gpu_reg[dreg] = ((UINT64)r2 << 16) / r1;\r
+                       gpu_remain = ((UINT64)r2 << 16) % r1;\r
+               }\r
+               else\r
+               {\r
+                       gpu_reg[dreg] = r2 / r1;\r
+                       gpu_remain = r2 % r1;\r
+               }\r
+       }\r
+       else\r
+               gpu_reg[dreg] = 0xffffffff;\r
+}\r
+\r
+void illegal(void)\r
+{\r
+}\r
+\r
+void imacn_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[jaguar_op & 31];\r
+       gpu_acc += (INT64)((INT16)r1 * (INT16)r2);\r
+}\r
+\r
+void imult_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (INT16)r1 * (INT16)r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void imultn_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (INT16)r1 * (INT16)r2;\r
+       gpu_acc = (INT32)res;\r
+       CLR_ZN; SET_ZN(res);\r
+\r
+       jaguar_op = ROPCODE(gpu_pc);\r
+       while ((jaguar_op >> 10) == 20)\r
+       {\r
+               r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+               r2 = gpu_reg[jaguar_op & 31];\r
+               gpu_acc += (INT64)((INT16)r1 * (INT16)r2);\r
+               gpu_pc += 2;\r
+               jaguar_op = ROPCODE(gpu_pc);\r
+       }\r
+       if ((jaguar_op >> 10) == 19)\r
+       {\r
+               gpu_pc += 2;\r
+               gpu_reg[jaguar_op & 31] = (UINT32)gpu_acc;\r
+       }\r
+}\r
+\r
+void jr_cc_n(void)\r
+{\r
+       UINT32 jaguar_FLAGS;\r
+\r
+       gpu_flag_c?(gpu_flag_c=1):(gpu_flag_c=0);\r
+       gpu_flag_z?(gpu_flag_z=1):(gpu_flag_z=0);\r
+       gpu_flag_n?(gpu_flag_n=1):(gpu_flag_n=0);\r
+\r
+       jaguar_FLAGS=(gpu_flag_n<<2)|(gpu_flag_c<<1)|gpu_flag_z;\r
+\r
+       if (CONDITION(jaguar_op & 31))\r
+       {\r
+               INT32 r1 = (INT8)((jaguar_op >> 2) & 0xf8) >> 2;\r
+               UINT32 newpc = gpu_pc + r1;\r
+               jaguar_op = ROPCODE(gpu_pc);\r
+       //      fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);\r
+               gpu_pc = newpc;\r
+               (*gpu_op_table[jaguar_op >> 10])();\r
+\r
+               jaguar_icount -= 3;     /* 3 wait states guaranteed */\r
+       }\r
+}\r
+\r
+void jump_cc_rn(void)\r
+{\r
+       UINT32 jaguar_FLAGS;\r
+\r
+       gpu_flag_c?(gpu_flag_c=1):(gpu_flag_c=0);\r
+       gpu_flag_z?(gpu_flag_z=1):(gpu_flag_z=0);\r
+       gpu_flag_n?(gpu_flag_n=1):(gpu_flag_n=0);\r
+\r
+       jaguar_FLAGS=(gpu_flag_n<<2)|(gpu_flag_c<<1)|gpu_flag_z;\r
+       if (CONDITION(jaguar_op & 31))\r
+       {\r
+               UINT8 reg = (jaguar_op >> 5) & 31;\r
+\r
+               /* special kludge for risky code in the cojag DSP interrupt handlers */\r
+               UINT32 newpc = /*(jaguar_icount == bankswitch_icount) ?*/ gpu_reg[reg];// : gpu_reg[reg];\r
+               jaguar_op = ROPCODE(gpu_pc);\r
+       //      fprintf(log_get(),"%i 0x%.8x [%i %i %i]\n",cnt_opcode++,gpu_pc,gpu_flag_c,gpu_flag_z,gpu_flag_n);\r
+               gpu_pc = newpc;\r
+               (*gpu_op_table[jaguar_op >> 10])();\r
+\r
+               jaguar_icount -= 3;     /* 3 wait states guaranteed */\r
+       }\r
+}\r
+\r
+void load_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_long_read(r1);\r
+}\r
+\r
+void load_r14n_rn(void)\r
+{\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[14] + 4 * r1);\r
+}\r
+\r
+void load_r15n_rn(void)\r
+{\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[15] + 4 * r1);\r
+}\r
+\r
+void load_r14rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[14] + r1);\r
+}\r
+\r
+void load_r15rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_long_read(gpu_reg[15] + r1);\r
+}\r
+\r
+void loadb_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_byte_read(r1);\r
+}\r
+\r
+void loadw_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = gpu_word_read(r1);\r
+}\r
+\r
+void loadp_rn_rn(void) /* GPU only */\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_hidata = gpu_word_read(r1);\r
+       gpu_reg[jaguar_op & 31] = gpu_word_read(r1+4);\r
+}\r
+\r
+void mirror_rn(void)   /* DSP only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[dreg];\r
+       UINT32 res = (mirror_table[r1 & 0xffff] << 16) | mirror_table[r1 >> 16];\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void mmult_rn_rn(void)\r
+{\r
+       int count = gpu_matrix_control & 15, i;\r
+       int sreg = (jaguar_op >> 5) & 31;\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 addr = gpu_pointer_to_matrix;\r
+       INT64 accum = 0;\r
+       UINT32 res;\r
+\r
+       if (!(gpu_matrix_control & 0x10))\r
+       {\r
+               for (i = 0; i < count; i++)\r
+               {\r
+                       accum += (INT16)(gpu_reg_bank_1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)gpu_word_read(addr);\r
+                       addr += 2;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               for (i = 0; i < count; i++)\r
+               {\r
+                       accum += (INT16)(gpu_reg_bank_1[sreg + i/2] >> (16 * ((i & 1) ^ 1))) * (INT16)gpu_word_read(addr);\r
+                       addr += 2 * count;\r
+               }\r
+       }\r
+       gpu_reg[dreg] = res = (UINT32)accum;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void move_rn_rn(void)\r
+{\r
+       gpu_reg[jaguar_op & 31] = gpu_reg[(jaguar_op >> 5) & 31];\r
+}\r
+\r
+void move_pc_rn(void)\r
+{\r
+       gpu_reg[jaguar_op & 31] = jaguar_ppc;\r
+}\r
+\r
+void movefa_rn_rn(void)\r
+{\r
+       gpu_reg[jaguar_op & 31] = gpu_alternate_reg[(jaguar_op >> 5) & 31];\r
+}\r
+\r
+void movei_n_rn(void)\r
+{\r
+       UINT32 res = ROPCODE(gpu_pc) | (ROPCODE(gpu_pc + 2) << 16);\r
+       gpu_pc += 4;\r
+       gpu_reg[jaguar_op & 31] = res;\r
+}\r
+\r
+void moveq_n_rn(void)\r
+{\r
+       gpu_reg[jaguar_op & 31] = (jaguar_op >> 5) & 31;\r
+}\r
+\r
+void moveta_rn_rn(void)\r
+{\r
+       gpu_alternate_reg[jaguar_op & 31] = gpu_reg[(jaguar_op >> 5) & 31];\r
+}\r
+\r
+void mtoi_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_reg[jaguar_op & 31] = (((INT32)r1 >> 8) & 0xff800000) | (r1 & 0x007fffff);\r
+}\r
+\r
+void mult_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (UINT16)r1 * (UINT16)r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void neg_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = -r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_SUB(0,r2,res);\r
+}\r
+\r
+void nop(void)\r
+{\r
+}\r
+\r
+void normi_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 res = 0;\r
+       while ((r1 & 0xffc00000) == 0)\r
+       {\r
+               r1 <<= 1;\r
+               res--;\r
+       }\r
+       while ((r1 & 0xff800000) != 0)\r
+       {\r
+               r1 >>= 1;\r
+               res++;\r
+       }\r
+       gpu_reg[jaguar_op & 31] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void not_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 res = ~gpu_reg[dreg];\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void or_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r1 | r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void pack_rn(void)             /* GPU only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res;\r
+       if (r1 == 0)    /* PACK */\r
+               res = ((r2 >> 10) & 0xf000) | ((r2 >> 5) & 0x0f00) | (r2 & 0xff);\r
+       else                    /* UNPACK */\r
+               res = ((r2 & 0xf000) << 10) | ((r2 & 0x0f00) << 5) | (r2 & 0xff);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void resmac_rn(void)\r
+{\r
+       gpu_reg[jaguar_op & 31] = (UINT32)gpu_acc;\r
+}\r
+\r
+void ror_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31] & 31;\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 >> r1) | (r2 << (32 - r1));\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZN(res); gpu_flag_c = (r2 >> 30) & 2;\r
+}\r
+\r
+void rorq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 >> r1) | (r2 << (32 - r1));\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 >> 30) & 2;\r
+}\r
+\r
+void sat8_rn(void)             /* GPU only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 < 0) ? 0 : (r2 > 255) ? 255 : r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void sat16_rn(void)            /* GPU only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 < 0) ? 0 : (r2 > 65535) ? 65535 : r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void sat16s_rn(void)           /* DSP only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 < -32768) ? -32768 : (r2 > 32767) ? 32767 : r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void sat24_rn(void)                    /* GPU only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (r2 < 0) ? 0 : (r2 > 16777215) ? 16777215 : r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void sat32s_rn(void)           /* DSP only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r2 = (UINT32)gpu_reg[dreg];\r
+       INT32 temp = gpu_acc >> 32;\r
+       UINT32 res = (temp < -1) ? (INT32)0x80000000 : (temp > 0) ? (INT32)0x7fffffff : r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
+\r
+void sh_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r1 = (INT32)gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res;\r
+\r
+       CLR_ZNC;\r
+       if (r1 < 0)\r
+       {\r
+               res = (r1 <= -32) ? 0 : (r2 << -r1);\r
+               gpu_flag_c= (r2 >> 30) & 2;\r
+       }\r
+       else\r
+       {\r
+               res = (r1 >= 32) ? 0 : (r2 >> r1);\r
+               gpu_flag_c= (r2 << 1) & 2;\r
+       }\r
+       gpu_reg[dreg] = res;\r
+       SET_ZN(res);\r
+}\r
+\r
+void sha_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r1 = (INT32)gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res;\r
+\r
+       CLR_ZNC;\r
+       if (r1 < 0)\r
+       {\r
+               res = (r1 <= -32) ? 0 : (r2 << -r1);\r
+               gpu_flag_c= (r2 >> 30) & 2;\r
+       }\r
+       else\r
+       {\r
+               res = (r1 >= 32) ? ((INT32)r2 >> 31) : ((INT32)r2 >> r1);\r
+               gpu_flag_c= (r2 << 1) & 2;\r
+       }\r
+       gpu_reg[dreg] = res;\r
+       SET_ZN(res);\r
+}\r
+\r
+void sharq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = (INT32)r2 >> r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 << 1) & 2;\r
+}\r
+\r
+void shlq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 << (32 - r1);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 >> 30) & 2;\r
+}\r
+\r
+void shrq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       INT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 >> r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZN(res); gpu_flag_c= (r2 << 1) & 2;\r
+}\r
+\r
+void store_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(r1, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void store_rn_r14n(void)\r
+{\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(gpu_reg[14] + r1 * 4, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void store_rn_r15n(void)\r
+{\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(gpu_reg[15] + r1 * 4, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void store_rn_r14rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(gpu_reg[14] + r1, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void store_rn_r15rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(gpu_reg[15] + r1, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void storeb_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_byte_write(r1, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void storew_rn_rn(void)\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_word_write(r1, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void storep_rn_rn(void)        /* GPU only */\r
+{\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       gpu_long_write(r1, gpu_hidata);\r
+       gpu_long_write(r1+4, gpu_reg[jaguar_op & 31]);\r
+}\r
+\r
+void sub_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+//     fprintf(log_get(),"r%i=0x%.8x r%i=0x%.8x\n",(jaguar_op >> 5) & 31,r1,dreg,r2);\r
+       UINT32 res = r2 - r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void subc_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 - r1 - gpu_flag_c;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void subq_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 - r1;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void subqmod_n_rn(void)        /* DSP only */\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 - r1;\r
+//     res = (res & ~jaguar.ctrl[D_MOD]) | (r2 & ~jaguar.ctrl[D_MOD]);\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZNC; SET_ZNC_SUB(r2,r1,res);\r
+}\r
+\r
+void subqt_n_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = convert_zero[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r2 - r1;\r
+       gpu_reg[dreg] = res;\r
+}\r
+\r
+void xor_rn_rn(void)\r
+{\r
+       int dreg = jaguar_op & 31;\r
+       UINT32 r1 = gpu_reg[(jaguar_op >> 5) & 31];\r
+       UINT32 r2 = gpu_reg[dreg];\r
+       UINT32 res = r1 ^ r2;\r
+       gpu_reg[dreg] = res;\r
+       CLR_ZN; SET_ZN(res);\r
+}\r
diff --git a/src/include/memory.h b/src/include/memory.h
new file mode 100644 (file)
index 0000000..0073bcf
--- /dev/null
@@ -0,0 +1,29 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __MEMORY_H__\r
+#define __MEMORY_H__\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <malloc.h>\r
+#include "types.h"\r
+#include "log.h"\r
+\r
+void memory_init(void);\r
+void memory_done(void);\r
+void memory_malloc_secure(void **new_ptr, UINT32 size, char *info);\r
+void *memory_malloc(UINT32 size, char *info);\r
+void memory_free(void *ptr);\r
+void memory_memoryUsage(FILE *fp);\r
+\r
+\r
+#endif\r
diff --git a/src/include/objectp.h b/src/include/objectp.h
new file mode 100644 (file)
index 0000000..58856c8
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __OBJECTP_H__\r
+#define __OBJECTP_H__\r
+\r
+#include "types.h"\r
+\r
+void op_init(void);\r
+void op_reset(void);\r
+void op_done(void);\r
+void op_byte_write(uint32, uint8);\r
+void op_word_write(uint32, uint16);\r
+uint8 op_byte_read(uint32);\r
+uint16 op_word_read(uint32);\r
+uint32 op_get_list_pointer(void);\r
+void op_process_list(int16 *backbuffer, int scanline, int render);\r
+void op_set_status_register(uint32 data);\r
+uint32 op_get_status_register(void);\r
+void op_set_current_object(uint64 object);\r
+\r
+\r
+#endif\r
diff --git a/src/include/pcm.h b/src/include/pcm.h
new file mode 100644 (file)
index 0000000..e953ccd
--- /dev/null
@@ -0,0 +1,18 @@
+#ifndef __PCM_H__\r
+#define __PCM_H__\r
+\r
+#include "jaguar.h"\r
+\r
+void pcm_init(void);\r
+void pcm_reset(void);\r
+void pcm_done(void);\r
+\r
+void pcm_update(void);\r
+void pcm_byte_write(uint32 offset, uint8 data);\r
+void pcm_word_write(uint32 offset, uint16 data);\r
+uint8 pcm_byte_read(uint32 offset);\r
+uint16 pcm_word_read(uint32 offset);\r
+void pcm_updateOne(int channel, int16 * data, uint32 length);\r
+void pcm_set_sample_rate(int rate);\r
+\r
+#endif\r
diff --git a/src/include/tom.h b/src/include/tom.h
new file mode 100644 (file)
index 0000000..f22f70a
--- /dev/null
@@ -0,0 +1,67 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __TOM_H__\r
+#define __TOM_H__\r
+\r
+#include "jaguar.h"\r
+\r
+#define TOM_VBLANK_DURATION_IN_SCANLINES 25\r
+\r
+#define VIDEO_MODE_16BPP_CRY   0\r
+#define VIDEO_MODE_24BPP_RGB   1\r
+#define VIDEO_MODE_16BPP_DIRECT 2\r
+#define VIDEO_MODE_16BPP_RGB   3\r
+\r
+\r
+extern uint32 tom_width;\r
+extern uint32 tom_height;\r
+\r
+void tom_init(void);\r
+void tom_reset(void);\r
+void tom_done(void);\r
+unsigned tom_byte_read(unsigned int offset);\r
+unsigned tom_word_read(unsigned int offset);\r
+void tom_byte_write(unsigned  offset, unsigned  data);\r
+void tom_word_write(unsigned  offset, unsigned  data);\r
+void tom_exec_scanline(int16 *backbuffer, int32 scanline, int8 render);\r
+uint32 tom_getVideoModeWidth(void);\r
+uint32 tom_getVideoModeHeight(void);\r
+uint8 tom_getVideoMode(void);\r
+uint8 *tom_get_ram_pointer(void);\r
+uint16 tom_get_hdb(void);\r
+uint16 tom_get_vdb(void);\r
+uint16 tom_get_scanline(void);\r
+uint32 tom_getHBlankWidthInPixels(void);\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+// interrupts\r
+//////////////////////////////////////////////////////////////////////////////\r
+#define IRQ_VBLANK     0\r
+#define IRQ_GPU                1\r
+#define IRQ_HBLANK  2\r
+#define IRQ_OPFLAG  IRQ_HBLANK\r
+#define IRQ_TIMER      3\r
+#define IRQ_DSP                4\r
+\r
+int            tom_irq_enabled(int irq);\r
+uint16 tom_irq_control_reg(void);\r
+void   tom_set_irq_latch(int irq, int enabled);\r
+void   tom_pit_exec(uint32 cycles);\r
+void tom_set_pending_puck_int(void);\r
+void tom_set_pending_timer_int(void);\r
+void tom_set_pending_object_int(void);\r
+void tom_set_pending_gpu_int(void);\r
+void tom_set_pending_video_int(void);\r
+void tom_reset_timer(void);\r
+\r
+\r
+#endif\r
diff --git a/src/include/types.h b/src/include/types.h
new file mode 100644 (file)
index 0000000..f003899
--- /dev/null
@@ -0,0 +1,46 @@
+//\r
+// Useful types (platform specific)\r
+//\r
+// by cal16\r
+// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\r
+// Removal of unsafe macros and addition of typdefs by James L. Hammons\r
+//\r
+\r
+#ifndef __TYPES_H__\r
+#define __TYPES_H__\r
+\r
+#ifdef __PORT__\r
+#include <string.h>\r
+typedef unsigned char  BYTE;\r
+typedef unsigned short WORD;\r
+typedef unsigned long  DWORD;\r
+#ifdef __GCCUNIX__\r
+typedef long long              __int64;                // Could probably remove this crap with some judicious pruning\r
+#endif // #ifdef __GCCUNIX__\r
+typedef int                            HWND;\r
+#else\r
+#include <windows.h>\r
+#endif // #ifdef __PORT__\r
+\r
+// This is only good on certain intel 32-bit platforms...\r
+// You may need to tweak to suit your specific platform.\r
+\r
+typedef unsigned char          UINT8;\r
+typedef signed char                    INT8;\r
+typedef unsigned short         UINT16;\r
+typedef signed short           INT16;\r
+typedef unsigned long          UINT32;\r
+typedef signed long                    INT32;\r
+typedef unsigned long long     UINT64;\r
+typedef signed long long       INT64;\r
+\r
+typedef UINT8  uint8;\r
+typedef INT8   int8;\r
+typedef UINT16 uint16;\r
+typedef INT16  int16;\r
+typedef UINT32 uint32;\r
+typedef INT32  int32;\r
+typedef UINT64 uint64;\r
+typedef INT64  int64;\r
+\r
+#endif // #ifndef __TYPES_H__\r
diff --git a/src/include/version.h b/src/include/version.h
new file mode 100644 (file)
index 0000000..ac29cae
--- /dev/null
@@ -0,0 +1,23 @@
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+#ifndef __VERSION_H__\r
+#define __VERSION_H__\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+\r
+void version_init(void);\r
+void version_display(FILE *);\r
+void version_done(void);\r
+\r
+#endif\r
diff --git a/src/include/wavetable.h b/src/include/wavetable.h
new file mode 100644 (file)
index 0000000..71998b4
--- /dev/null
@@ -0,0 +1,258 @@
+const unsigned char wave_table[4096] = {\r
+    0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC8, 0x01, \r
+    0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xD0, 0x01, \r
+    0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD8, 0x01, \r
+    0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xE0, 0x01, \r
+    0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE8, 0x01, \r
+    0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xF0, 0x01, \r
+    0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF8, 0x01, \r
+    0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFE, 0x01, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x07, 0xFF, \r
+    0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0F, 0xFF, \r
+    0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x17, 0xFF, \r
+    0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1F, 0xFF, \r
+    0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x27, 0xFF, \r
+    0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2F, 0xFF, \r
+    0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x37, 0xFF, \r
+    0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3F, 0xFF, \r
+    0x00, 0x00, 0x3D, 0xFF, 0x00, 0x00, 0x3B, 0xFF, 0x00, 0x00, 0x39, 0xFF, 0x00, 0x00, 0x37, 0xFF, \r
+    0x00, 0x00, 0x35, 0xFF, 0x00, 0x00, 0x33, 0xFF, 0x00, 0x00, 0x31, 0xFF, 0x00, 0x00, 0x2F, 0xFF, \r
+    0x00, 0x00, 0x2D, 0xFF, 0x00, 0x00, 0x2B, 0xFF, 0x00, 0x00, 0x29, 0xFF, 0x00, 0x00, 0x27, 0xFF, \r
+    0x00, 0x00, 0x25, 0xFF, 0x00, 0x00, 0x23, 0xFF, 0x00, 0x00, 0x21, 0xFF, 0x00, 0x00, 0x1F, 0xFF, \r
+    0x00, 0x00, 0x1D, 0xFF, 0x00, 0x00, 0x1B, 0xFF, 0x00, 0x00, 0x19, 0xFF, 0x00, 0x00, 0x17, 0xFF, \r
+    0x00, 0x00, 0x15, 0xFF, 0x00, 0x00, 0x13, 0xFF, 0x00, 0x00, 0x11, 0xFF, 0x00, 0x00, 0x0F, 0xFF, \r
+    0x00, 0x00, 0x0D, 0xFF, 0x00, 0x00, 0x0B, 0xFF, 0x00, 0x00, 0x09, 0xFF, 0x00, 0x00, 0x07, 0xFF, \r
+    0x00, 0x00, 0x05, 0xFF, 0x00, 0x00, 0x03, 0xFF, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, \r
+    0xFF, 0xFF, 0xFE, 0x01, 0xFF, 0xFF, 0xFC, 0x01, 0xFF, 0xFF, 0xFA, 0x01, 0xFF, 0xFF, 0xF8, 0x01, \r
+    0xFF, 0xFF, 0xF6, 0x01, 0xFF, 0xFF, 0xF4, 0x01, 0xFF, 0xFF, 0xF2, 0x01, 0xFF, 0xFF, 0xF0, 0x01, \r
+    0xFF, 0xFF, 0xEE, 0x01, 0xFF, 0xFF, 0xEC, 0x01, 0xFF, 0xFF, 0xEA, 0x01, 0xFF, 0xFF, 0xE8, 0x01, \r
+    0xFF, 0xFF, 0xE6, 0x01, 0xFF, 0xFF, 0xE4, 0x01, 0xFF, 0xFF, 0xE2, 0x01, 0xFF, 0xFF, 0xE0, 0x01, \r
+    0xFF, 0xFF, 0xDE, 0x01, 0xFF, 0xFF, 0xDC, 0x01, 0xFF, 0xFF, 0xDA, 0x01, 0xFF, 0xFF, 0xD8, 0x01, \r
+    0xFF, 0xFF, 0xD6, 0x01, 0xFF, 0xFF, 0xD4, 0x01, 0xFF, 0xFF, 0xD2, 0x01, 0xFF, 0xFF, 0xD0, 0x01, \r
+    0xFF, 0xFF, 0xCE, 0x01, 0xFF, 0xFF, 0xCC, 0x01, 0xFF, 0xFF, 0xCA, 0x01, 0xFF, 0xFF, 0xC8, 0x01, \r
+    0xFF, 0xFF, 0xC6, 0x01, 0xFF, 0xFF, 0xC4, 0x01, 0xFF, 0xFF, 0xC2, 0x01, 0xFF, 0xFF, 0xC0, 0x01, \r
+    0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x18, 0xF8, \r
+    0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x30, 0xFB, \r
+    0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x47, 0x1C, \r
+    0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x5A, 0x81, \r
+    0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x6A, 0x6C, \r
+    0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x76, 0x40, \r
+    0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7D, 0x89, \r
+    0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0xFF, \r
+    0x00, 0x00, 0x7F, 0xD7, 0x00, 0x00, 0x7F, 0x61, 0x00, 0x00, 0x7E, 0x9C, 0x00, 0x00, 0x7D, 0x89, \r
+    0x00, 0x00, 0x7C, 0x29, 0x00, 0x00, 0x7A, 0x7C, 0x00, 0x00, 0x78, 0x83, 0x00, 0x00, 0x76, 0x40, \r
+    0x00, 0x00, 0x73, 0xB5, 0x00, 0x00, 0x70, 0xE1, 0x00, 0x00, 0x6D, 0xC9, 0x00, 0x00, 0x6A, 0x6C, \r
+    0x00, 0x00, 0x66, 0xCE, 0x00, 0x00, 0x62, 0xF1, 0x00, 0x00, 0x5E, 0xD6, 0x00, 0x00, 0x5A, 0x81, \r
+    0x00, 0x00, 0x55, 0xF4, 0x00, 0x00, 0x51, 0x33, 0x00, 0x00, 0x4C, 0x3F, 0x00, 0x00, 0x47, 0x1C, \r
+    0x00, 0x00, 0x41, 0xCD, 0x00, 0x00, 0x3C, 0x56, 0x00, 0x00, 0x36, 0xB9, 0x00, 0x00, 0x30, 0xFB, \r
+    0x00, 0x00, 0x2B, 0x1E, 0x00, 0x00, 0x25, 0x27, 0x00, 0x00, 0x1F, 0x19, 0x00, 0x00, 0x18, 0xF8, \r
+    0x00, 0x00, 0x12, 0xC7, 0x00, 0x00, 0x0C, 0x8B, 0x00, 0x00, 0x06, 0x47, 0x00, 0x00, 0x00, 0x00, \r
+    0xFF, 0xFF, 0xF9, 0xB9, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xE7, 0x08, \r
+    0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xCF, 0x05, \r
+    0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xB8, 0xE4, \r
+    0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xA5, 0x7F, \r
+    0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x95, 0x94, \r
+    0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x89, 0xC0, \r
+    0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x82, 0x77, \r
+    0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x01, \r
+    0xFF, 0xFF, 0x80, 0x29, 0xFF, 0xFF, 0x80, 0x9F, 0xFF, 0xFF, 0x81, 0x64, 0xFF, 0xFF, 0x82, 0x77, \r
+    0xFF, 0xFF, 0x83, 0xD7, 0xFF, 0xFF, 0x85, 0x84, 0xFF, 0xFF, 0x87, 0x7D, 0xFF, 0xFF, 0x89, 0xC0, \r
+    0xFF, 0xFF, 0x8C, 0x4B, 0xFF, 0xFF, 0x8F, 0x1F, 0xFF, 0xFF, 0x92, 0x37, 0xFF, 0xFF, 0x95, 0x94, \r
+    0xFF, 0xFF, 0x99, 0x32, 0xFF, 0xFF, 0x9D, 0x0F, 0xFF, 0xFF, 0xA1, 0x2A, 0xFF, 0xFF, 0xA5, 0x7F, \r
+    0xFF, 0xFF, 0xAA, 0x0C, 0xFF, 0xFF, 0xAE, 0xCD, 0xFF, 0xFF, 0xB3, 0xC1, 0xFF, 0xFF, 0xB8, 0xE4, \r
+    0xFF, 0xFF, 0xBE, 0x33, 0xFF, 0xFF, 0xC3, 0xAA, 0xFF, 0xFF, 0xC9, 0x47, 0xFF, 0xFF, 0xCF, 0x05, \r
+    0xFF, 0xFF, 0xD4, 0xE2, 0xFF, 0xFF, 0xDA, 0xD9, 0xFF, 0xFF, 0xE0, 0xE7, 0xFF, 0xFF, 0xE7, 0x08, \r
+    0xFF, 0xFF, 0xED, 0x39, 0xFF, 0xFF, 0xF3, 0x75, 0xFF, 0xFF, 0xF9, 0xB9, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0xFF, \r
+    0x00, 0x00, 0x01, 0x8E, 0x00, 0x00, 0x02, 0x3A, 0x00, 0x00, 0x03, 0x04, 0x00, 0x00, 0x03, 0xEB, \r
+    0x00, 0x00, 0x04, 0xEC, 0x00, 0x00, 0x06, 0x08, 0x00, 0x00, 0x07, 0x3D, 0x00, 0x00, 0x08, 0x88, \r
+    0x00, 0x00, 0x09, 0xE9, 0x00, 0x00, 0x0B, 0x5E, 0x00, 0x00, 0x0C, 0xE4, 0x00, 0x00, 0x0E, 0x7B, \r
+    0x00, 0x00, 0x10, 0x1F, 0x00, 0x00, 0x11, 0xCF, 0x00, 0x00, 0x13, 0x88, 0x00, 0x00, 0x15, 0x48, \r
+    0x00, 0x00, 0x17, 0x0E, 0x00, 0x00, 0x18, 0xD5, 0x00, 0x00, 0x1A, 0x9C, 0x00, 0x00, 0x1C, 0x61, \r
+    0x00, 0x00, 0x1E, 0x20, 0x00, 0x00, 0x1F, 0xD8, 0x00, 0x00, 0x21, 0x85, 0x00, 0x00, 0x23, 0x26, \r
+    0x00, 0x00, 0x24, 0xB7, 0x00, 0x00, 0x26, 0x36, 0x00, 0x00, 0x27, 0xA1, 0x00, 0x00, 0x28, 0xF5, \r
+    0x00, 0x00, 0x2A, 0x30, 0x00, 0x00, 0x2B, 0x4F, 0x00, 0x00, 0x2C, 0x50, 0x00, 0x00, 0x2D, 0x31, \r
+    0x00, 0x00, 0x2D, 0xF0, 0x00, 0x00, 0x2E, 0x8B, 0x00, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x2F, 0x4D, \r
+    0x00, 0x00, 0x2F, 0x70, 0x00, 0x00, 0x2F, 0x69, 0x00, 0x00, 0x2F, 0x35, 0x00, 0x00, 0x2E, 0xD3, \r
+    0x00, 0x00, 0x2E, 0x43, 0x00, 0x00, 0x2D, 0x83, 0x00, 0x00, 0x2C, 0x93, 0x00, 0x00, 0x2B, 0x71, \r
+    0x00, 0x00, 0x2A, 0x1E, 0x00, 0x00, 0x28, 0x99, 0x00, 0x00, 0x26, 0xE2, 0x00, 0x00, 0x24, 0xFA, \r
+    0x00, 0x00, 0x22, 0xE0, 0x00, 0x00, 0x20, 0x94, 0x00, 0x00, 0x1E, 0x19, 0x00, 0x00, 0x1B, 0x6E, \r
+    0x00, 0x00, 0x18, 0x94, 0x00, 0x00, 0x15, 0x8C, 0x00, 0x00, 0x12, 0x59, 0x00, 0x00, 0x0E, 0xFB, \r
+    0x00, 0x00, 0x0B, 0x74, 0x00, 0x00, 0x07, 0xC7, 0x00, 0x00, 0x03, 0xF4, 0x00, 0x00, 0x00, 0x00, \r
+    0xFF, 0xFF, 0xFB, 0xEB, 0xFF, 0xFF, 0xF7, 0xB9, 0xFF, 0xFF, 0xF3, 0x6B, 0xFF, 0xFF, 0xEF, 0x06, \r
+    0xFF, 0xFF, 0xEA, 0x8B, 0xFF, 0xFF, 0xE5, 0xFE, 0xFF, 0xFF, 0xE1, 0x63, 0xFF, 0xFF, 0xDC, 0xBC, \r
+    0xFF, 0xFF, 0xD8, 0x0D, 0xFF, 0xFF, 0xD3, 0x5A, 0xFF, 0xFF, 0xCE, 0xA6, 0xFF, 0xFF, 0xC9, 0xF5, \r
+    0xFF, 0xFF, 0xC5, 0x4B, 0xFF, 0xFF, 0xC0, 0xAB, 0xFF, 0xFF, 0xBC, 0x19, 0xFF, 0xFF, 0xB7, 0x99, \r
+    0xFF, 0xFF, 0xB3, 0x2F, 0xFF, 0xFF, 0xAE, 0xDF, 0xFF, 0xFF, 0xAA, 0xAC, 0xFF, 0xFF, 0xA6, 0x9B, \r
+    0xFF, 0xFF, 0xA2, 0xAF, 0xFF, 0xFF, 0x9E, 0xEC, 0xFF, 0xFF, 0x9B, 0x56, 0xFF, 0xFF, 0x97, 0xF0, \r
+    0xFF, 0xFF, 0x94, 0xBF, 0xFF, 0xFF, 0x91, 0xC4, 0xFF, 0xFF, 0x8F, 0x04, 0xFF, 0xFF, 0x8C, 0x82, \r
+    0xFF, 0xFF, 0x8A, 0x41, 0xFF, 0xFF, 0x88, 0x44, 0xFF, 0xFF, 0x86, 0x8D, 0xFF, 0xFF, 0x85, 0x20, \r
+    0xFF, 0xFF, 0x83, 0xFF, 0xFF, 0xFF, 0x83, 0x2B, 0xFF, 0xFF, 0x82, 0xA8, 0xFF, 0xFF, 0x82, 0x77, \r
+    0xFF, 0xFF, 0x82, 0x9A, 0xFF, 0xFF, 0x83, 0x11, 0xFF, 0xFF, 0x83, 0xDF, 0xFF, 0xFF, 0x85, 0x05, \r
+    0xFF, 0xFF, 0x86, 0x82, 0xFF, 0xFF, 0x88, 0x59, 0xFF, 0xFF, 0x8A, 0x88, 0xFF, 0xFF, 0x8D, 0x10, \r
+    0xFF, 0xFF, 0x8F, 0xF1, 0xFF, 0xFF, 0x93, 0x2A, 0xFF, 0xFF, 0x96, 0xBB, 0xFF, 0xFF, 0x9A, 0xA2, \r
+    0xFF, 0xFF, 0x9E, 0xDF, 0xFF, 0xFF, 0xA3, 0x6F, 0xFF, 0xFF, 0xA8, 0x51, 0xFF, 0xFF, 0xAD, 0x83, \r
+    0xFF, 0xFF, 0xB3, 0x03, 0xFF, 0xFF, 0xB8, 0xCE, 0xFF, 0xFF, 0xBE, 0xE1, 0xFF, 0xFF, 0xC5, 0x39, \r
+    0xFF, 0xFF, 0xCB, 0xD3, 0xFF, 0xFF, 0xD2, 0xAC, 0xFF, 0xFF, 0xD9, 0xC0, 0xFF, 0xFF, 0xE1, 0x0A, \r
+    0xFF, 0xFF, 0xE8, 0x87, 0xFF, 0xFF, 0xF0, 0x32, 0xFF, 0xFF, 0xF8, 0x07, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x09, 0x69, 0x00, 0x00, 0x12, 0xC2, 0x00, 0x00, 0x1B, 0xF7, 0x00, 0x00, 0x24, 0xF9, \r
+    0x00, 0x00, 0x2D, 0xB7, 0x00, 0x00, 0x36, 0x22, 0x00, 0x00, 0x3E, 0x29, 0x00, 0x00, 0x45, 0xBE, \r
+    0x00, 0x00, 0x4C, 0xD5, 0x00, 0x00, 0x53, 0x61, 0x00, 0x00, 0x59, 0x57, 0x00, 0x00, 0x5E, 0xAE, \r
+    0x00, 0x00, 0x63, 0x5D, 0x00, 0x00, 0x67, 0x5E, 0x00, 0x00, 0x6A, 0xAB, 0x00, 0x00, 0x6D, 0x40, \r
+    0x00, 0x00, 0x6F, 0x1B, 0x00, 0x00, 0x70, 0x3D, 0x00, 0x00, 0x70, 0xA5, 0x00, 0x00, 0x70, 0x56, \r
+    0x00, 0x00, 0x6F, 0x55, 0x00, 0x00, 0x6D, 0xA7, 0x00, 0x00, 0x6B, 0x53, 0x00, 0x00, 0x68, 0x61, \r
+    0x00, 0x00, 0x64, 0xDB, 0x00, 0x00, 0x60, 0xCC, 0x00, 0x00, 0x5C, 0x3F, 0x00, 0x00, 0x57, 0x42, \r
+    0x00, 0x00, 0x51, 0xE2, 0x00, 0x00, 0x4C, 0x2C, 0x00, 0x00, 0x46, 0x31, 0x00, 0x00, 0x3F, 0xFF, \r
+    0x00, 0x00, 0x39, 0xA5, 0x00, 0x00, 0x33, 0x34, 0x00, 0x00, 0x2C, 0xBA, 0x00, 0x00, 0x26, 0x47, \r
+    0x00, 0x00, 0x1F, 0xE9, 0x00, 0x00, 0x19, 0xAF, 0x00, 0x00, 0x13, 0xA8, 0x00, 0x00, 0x0D, 0xDF, \r
+    0x00, 0x00, 0x08, 0x61, 0x00, 0x00, 0x03, 0x3A, 0xFF, 0xFF, 0xFE, 0x74, 0xFF, 0xFF, 0xFA, 0x17, \r
+    0xFF, 0xFF, 0xF6, 0x2A, 0xFF, 0xFF, 0xF2, 0xB4, 0xFF, 0xFF, 0xEF, 0xBB, 0xFF, 0xFF, 0xED, 0x42, \r
+    0xFF, 0xFF, 0xEB, 0x4A, 0xFF, 0xFF, 0xE9, 0xD5, 0xFF, 0xFF, 0xE8, 0xE2, 0xFF, 0xFF, 0xE8, 0x6E, \r
+    0xFF, 0xFF, 0xE8, 0x76, 0xFF, 0xFF, 0xE8, 0xF5, 0xFF, 0xFF, 0xE9, 0xE5, 0xFF, 0xFF, 0xEB, 0x3D, \r
+    0xFF, 0xFF, 0xEC, 0xF6, 0xFF, 0xFF, 0xEF, 0x06, 0xFF, 0xFF, 0xF1, 0x62, 0xFF, 0xFF, 0xF3, 0xFF, \r
+    0xFF, 0xFF, 0xF6, 0xD1, 0xFF, 0xFF, 0xF9, 0xCA, 0xFF, 0xFF, 0xFC, 0xDF, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x03, 0x21, 0x00, 0x00, 0x06, 0x36, 0x00, 0x00, 0x09, 0x2F, 0x00, 0x00, 0x0C, 0x01, \r
+    0x00, 0x00, 0x0E, 0x9E, 0x00, 0x00, 0x10, 0xFA, 0x00, 0x00, 0x13, 0x0A, 0x00, 0x00, 0x14, 0xC3, \r
+    0x00, 0x00, 0x16, 0x1B, 0x00, 0x00, 0x17, 0x0B, 0x00, 0x00, 0x17, 0x8A, 0x00, 0x00, 0x17, 0x92, \r
+    0x00, 0x00, 0x17, 0x1E, 0x00, 0x00, 0x16, 0x2B, 0x00, 0x00, 0x14, 0xB6, 0x00, 0x00, 0x12, 0xBE, \r
+    0x00, 0x00, 0x10, 0x45, 0x00, 0x00, 0x0D, 0x4C, 0x00, 0x00, 0x09, 0xD6, 0x00, 0x00, 0x05, 0xE9, \r
+    0x00, 0x00, 0x01, 0x8C, 0xFF, 0xFF, 0xFC, 0xC6, 0xFF, 0xFF, 0xF7, 0x9F, 0xFF, 0xFF, 0xF2, 0x21, \r
+    0xFF, 0xFF, 0xEC, 0x58, 0xFF, 0xFF, 0xE6, 0x51, 0xFF, 0xFF, 0xE0, 0x17, 0xFF, 0xFF, 0xD9, 0xB9, \r
+    0xFF, 0xFF, 0xD3, 0x46, 0xFF, 0xFF, 0xCC, 0xCC, 0xFF, 0xFF, 0xC6, 0x5B, 0xFF, 0xFF, 0xC0, 0x01, \r
+    0xFF, 0xFF, 0xB9, 0xCF, 0xFF, 0xFF, 0xB3, 0xD4, 0xFF, 0xFF, 0xAE, 0x1E, 0xFF, 0xFF, 0xA8, 0xBE, \r
+    0xFF, 0xFF, 0xA3, 0xC1, 0xFF, 0xFF, 0x9F, 0x34, 0xFF, 0xFF, 0x9B, 0x25, 0xFF, 0xFF, 0x97, 0x9F, \r
+    0xFF, 0xFF, 0x94, 0xAD, 0xFF, 0xFF, 0x92, 0x59, 0xFF, 0xFF, 0x90, 0xAB, 0xFF, 0xFF, 0x8F, 0xAA, \r
+    0xFF, 0xFF, 0x8F, 0x5B, 0xFF, 0xFF, 0x8F, 0xC3, 0xFF, 0xFF, 0x90, 0xE5, 0xFF, 0xFF, 0x92, 0xC0, \r
+    0xFF, 0xFF, 0x95, 0x55, 0xFF, 0xFF, 0x98, 0xA2, 0xFF, 0xFF, 0x9C, 0xA3, 0xFF, 0xFF, 0xA1, 0x52, \r
+    0xFF, 0xFF, 0xA6, 0xA9, 0xFF, 0xFF, 0xAC, 0x9F, 0xFF, 0xFF, 0xB3, 0x2B, 0xFF, 0xFF, 0xBA, 0x42, \r
+    0xFF, 0xFF, 0xC1, 0xD7, 0xFF, 0xFF, 0xC9, 0xDE, 0xFF, 0xFF, 0xD2, 0x49, 0xFF, 0xFF, 0xDB, 0x07, \r
+    0xFF, 0xFF, 0xE4, 0x09, 0xFF, 0xFF, 0xED, 0x3E, 0xFF, 0xFF, 0xF6, 0x97, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x07, 0x04, 0x00, 0x00, 0x0F, 0x79, 0x00, 0x00, 0x19, 0x4E, 0x00, 0x00, 0x24, 0x67, \r
+    0x00, 0x00, 0x30, 0x92, 0x00, 0x00, 0x3D, 0x8B, 0x00, 0x00, 0x4A, 0xF0, 0x00, 0x00, 0x58, 0x42, \r
+    0x00, 0x00, 0x64, 0xE0, 0x00, 0x00, 0x70, 0x09, 0x00, 0x00, 0x78, 0xE3, 0x00, 0x00, 0x7E, 0x7E, \r
+    0x00, 0x00, 0x7F, 0xE5, 0x00, 0x00, 0x7C, 0x35, 0x00, 0x00, 0x72, 0xB3, 0x00, 0x00, 0x62, 0xF1, \r
+    0x00, 0x00, 0x4C, 0xEA, 0x00, 0x00, 0x31, 0x29, 0x00, 0x00, 0x10, 0xE2, 0xFF, 0xFF, 0xEE, 0x00, \r
+    0xFF, 0xFF, 0xCB, 0x1A, 0xFF, 0xFF, 0xAB, 0x5D, 0xFF, 0xFF, 0x92, 0x3E, 0xFF, 0xFF, 0x83, 0x1E, \r
+    0xFF, 0xFF, 0x80, 0xC8, 0xFF, 0xFF, 0x8C, 0xE4, 0xFF, 0xFF, 0xA7, 0x6D, 0xFF, 0xFF, 0xCE, 0x4C, \r
+    0xFF, 0xFF, 0xFD, 0x34, 0x00, 0x00, 0x2D, 0xE1, 0x00, 0x00, 0x58, 0xCA, 0x00, 0x00, 0x76, 0x40, \r
+    0x00, 0x00, 0x7F, 0xEF, 0x00, 0x00, 0x72, 0x6A, 0x00, 0x00, 0x4E, 0x79, 0x00, 0x00, 0x19, 0xBD, \r
+    0xFF, 0xFF, 0xDE, 0x4A, 0xFF, 0xFF, 0xA9, 0x08, 0xFF, 0xFF, 0x86, 0xFC, 0xFF, 0xFF, 0x81, 0xE4, \r
+    0xFF, 0xFF, 0x9D, 0x07, 0xFF, 0xFF, 0xD3, 0x39, 0x00, 0x00, 0x16, 0xFE, 0x00, 0x00, 0x55, 0x5F, \r
+    0x00, 0x00, 0x7B, 0x06, 0x00, 0x00, 0x7A, 0x8A, 0x00, 0x00, 0x51, 0xD7, 0x00, 0x00, 0x0C, 0x8B, \r
+    0xFF, 0xFF, 0xC1, 0xA4, 0xFF, 0xFF, 0x8C, 0x61, 0xFF, 0xFF, 0x82, 0x3B, 0xFF, 0xFF, 0xA9, 0x77, \r
+    0xFF, 0xFF, 0xF4, 0x95, 0x00, 0x00, 0x45, 0xA2, 0x00, 0x00, 0x79, 0x85, 0x00, 0x00, 0x77, 0x6B, \r
+    0x00, 0x00, 0x3D, 0xC2, 0xFF, 0xFF, 0xE5, 0xAF, 0xFF, 0xFF, 0x99, 0x75, 0xFF, 0xFF, 0x80, 0x8C, \r
+    0xFF, 0xFF, 0xAA, 0x4D, 0x00, 0x00, 0x02, 0xF1, 0x00, 0x00, 0x5B, 0x06, 0x00, 0x00, 0x7F, 0xFF, \r
+    0x00, 0x00, 0x59, 0xFC, 0xFF, 0xFF, 0xFD, 0x0F, 0xFF, 0xFF, 0xA0, 0xEF, 0xFF, 0xFF, 0x80, 0x8C, \r
+    0xFF, 0xFF, 0xB3, 0x67, 0x00, 0x00, 0x1A, 0x51, 0x00, 0x00, 0x70, 0x1C, 0x00, 0x00, 0x77, 0x6B, \r
+    0x00, 0x00, 0x28, 0x32, 0xFF, 0xFF, 0xBA, 0x5E, 0xFF, 0xFF, 0x80, 0x84, 0xFF, 0xFF, 0xA9, 0x77, \r
+    0x00, 0x00, 0x17, 0xC4, 0x00, 0x00, 0x73, 0x9F, 0x00, 0x00, 0x6F, 0xC6, 0x00, 0x00, 0x0C, 0x8B, \r
+    0xFF, 0xFF, 0x9D, 0x97, 0xFF, 0xFF, 0x85, 0x76, 0xFF, 0xFF, 0xDC, 0xAF, 0x00, 0x00, 0x55, 0x5F, \r
+    0x00, 0x00, 0x7D, 0xE9, 0x00, 0x00, 0x2C, 0xC7, 0xFF, 0xFF, 0xAE, 0xD7, 0xFF, 0xFF, 0x81, 0xE4, \r
+    0xFF, 0xFF, 0xD6, 0x51, 0x00, 0x00, 0x56, 0xF8, 0x00, 0x00, 0x7B, 0x7A, 0x00, 0x00, 0x19, 0xBD, \r
+    0xFF, 0xFF, 0x9A, 0xE3, 0xFF, 0xFF, 0x8D, 0x96, 0x00, 0x00, 0x03, 0xE0, 0x00, 0x00, 0x76, 0x40, \r
+    0x00, 0x00, 0x5C, 0x31, 0xFF, 0xFF, 0xD2, 0x1F, 0xFF, 0xFF, 0x80, 0x09, 0xFF, 0xFF, 0xCE, 0x4C, \r
+    0x00, 0x00, 0x5C, 0x65, 0x00, 0x00, 0x73, 0x1C, 0xFF, 0xFF, 0xF1, 0xF1, 0xFF, 0xFF, 0x83, 0x1E, \r
+    0xFF, 0xFF, 0xBE, 0x28, 0x00, 0x00, 0x54, 0xA3, 0x00, 0x00, 0x74, 0x8D, 0xFF, 0xFF, 0xEE, 0x00, \r
+    0xFF, 0xFF, 0x81, 0x20, 0xFF, 0xFF, 0xCE, 0xD7, 0x00, 0x00, 0x66, 0x4E, 0x00, 0x00, 0x62, 0xF1, \r
+    0xFF, 0xFF, 0xC7, 0x33, 0xFF, 0xFF, 0x83, 0xCB, 0x00, 0x00, 0x05, 0x0D, 0x00, 0x00, 0x7E, 0x7E, \r
+    0x00, 0x00, 0x2A, 0x0E, 0xFF, 0xFF, 0x8F, 0xF7, 0xFF, 0xFF, 0xB1, 0x37, 0x00, 0x00, 0x58, 0x42, \r
+    0x00, 0x00, 0x67, 0xC3, 0xFF, 0xFF, 0xC2, 0x75, 0xFF, 0xFF, 0x89, 0x95, 0x00, 0x00, 0x24, 0x67, \r
+    0x00, 0x00, 0x7D, 0x78, 0xFF, 0xFF, 0xF0, 0x87, 0xFF, 0xFF, 0x80, 0x33, 0x00, 0x00, 0x00, 0x00, \r
+    0xFF, 0xFF, 0xC6, 0x95, 0xFF, 0xFF, 0xCB, 0x25, 0xFF, 0xFF, 0xC9, 0xBC, 0xFF, 0xFF, 0xCD, 0x56, \r
+    0xFF, 0xFF, 0xCD, 0x2E, 0xFF, 0xFF, 0xCE, 0x03, 0xFF, 0xFF, 0xCE, 0xC0, 0xFF, 0xFF, 0xD1, 0xAC, \r
+    0xFF, 0xFF, 0xD6, 0x81, 0xFF, 0xFF, 0xD7, 0xD8, 0xFF, 0xFF, 0xD6, 0x23, 0xFF, 0xFF, 0xD9, 0xA3, \r
+    0xFF, 0xFF, 0xD9, 0x6F, 0xFF, 0xFF, 0xDE, 0x63, 0xFF, 0xFF, 0xE1, 0x8B, 0xFF, 0xFF, 0xE0, 0x2F, \r
+    0xFF, 0xFF, 0xDE, 0x31, 0xFF, 0xFF, 0xE6, 0xBA, 0xFF, 0xFF, 0xED, 0x65, 0xFF, 0xFF, 0xEA, 0x39, \r
+    0xFF, 0xFF, 0xEB, 0xAB, 0xFF, 0xFF, 0xED, 0x8B, 0xFF, 0xFF, 0xF0, 0xBA, 0xFF, 0xFF, 0xF4, 0xC5, \r
+    0xFF, 0xFF, 0xF5, 0x99, 0xFF, 0xFF, 0xF4, 0x3B, 0xFF, 0xFF, 0xF6, 0x89, 0xFF, 0xFF, 0xF8, 0xDF, \r
+    0xFF, 0xFF, 0xF8, 0xAE, 0xFF, 0xFF, 0xFE, 0x67, 0xFF, 0xFF, 0xFE, 0x69, 0x00, 0x00, 0x02, 0xF5, \r
+    0x00, 0x00, 0x01, 0x88, 0x00, 0x00, 0x06, 0xEF, 0x00, 0x00, 0x02, 0x17, 0x00, 0x00, 0x0B, 0x0F, \r
+    0x00, 0x00, 0x06, 0x9D, 0x00, 0x00, 0x09, 0x67, 0x00, 0x00, 0x0D, 0x64, 0x00, 0x00, 0x0C, 0x6F, \r
+    0x00, 0x00, 0x11, 0xFC, 0x00, 0x00, 0x14, 0x09, 0x00, 0x00, 0x17, 0x68, 0x00, 0x00, 0x16, 0x07, \r
+    0x00, 0x00, 0x19, 0x7E, 0x00, 0x00, 0x1B, 0x11, 0x00, 0x00, 0x1D, 0xD6, 0x00, 0x00, 0x1F, 0x99, \r
+    0x00, 0x00, 0x1E, 0x69, 0x00, 0x00, 0x25, 0x8E, 0x00, 0x00, 0x23, 0x5F, 0x00, 0x00, 0x24, 0x44, \r
+    0x00, 0x00, 0x26, 0x01, 0x00, 0x00, 0x2C, 0x11, 0x00, 0x00, 0x2B, 0x65, 0x00, 0x00, 0x32, 0xBC, \r
+    0x00, 0x00, 0x2F, 0x1F, 0x00, 0x00, 0x31, 0x21, 0x00, 0x00, 0x34, 0x14, 0x00, 0x00, 0x32, 0xF5, \r
+    0x00, 0x00, 0x36, 0x92, 0x00, 0x00, 0x35, 0xFE, 0x00, 0x00, 0x3C, 0xE4, 0x00, 0x00, 0x3D, 0x5F, \r
+    0x00, 0x00, 0x38, 0x91, 0x00, 0x00, 0x39, 0x21, 0x00, 0x00, 0x36, 0x58, 0x00, 0x00, 0x37, 0xD6, \r
+    0x00, 0x00, 0x35, 0xE4, 0x00, 0x00, 0x32, 0xA6, 0x00, 0x00, 0x30, 0x6E, 0x00, 0x00, 0x2F, 0x1E, \r
+    0x00, 0x00, 0x2A, 0x3D, 0x00, 0x00, 0x2A, 0x7D, 0x00, 0x00, 0x27, 0x24, 0x00, 0x00, 0x27, 0xA4, \r
+    0x00, 0x00, 0x23, 0xC2, 0x00, 0x00, 0x25, 0xC2, 0x00, 0x00, 0x20, 0xA0, 0x00, 0x00, 0x20, 0xD0, \r
+    0x00, 0x00, 0x1C, 0x6E, 0x00, 0x00, 0x17, 0xBF, 0x00, 0x00, 0x19, 0x64, 0x00, 0x00, 0x16, 0x6B, \r
+    0x00, 0x00, 0x12, 0x42, 0x00, 0x00, 0x13, 0x6F, 0x00, 0x00, 0x11, 0x9D, 0x00, 0x00, 0x0E, 0x80, \r
+    0x00, 0x00, 0x0F, 0xEA, 0x00, 0x00, 0x09, 0xE2, 0x00, 0x00, 0x07, 0xB8, 0x00, 0x00, 0x07, 0x98, \r
+    0x00, 0x00, 0x06, 0x73, 0x00, 0x00, 0x02, 0xD5, 0x00, 0x00, 0x01, 0x63, 0xFF, 0xFF, 0xFD, 0xF2, \r
+    0x00, 0x00, 0x01, 0xED, 0xFF, 0xFF, 0xFF, 0xE5, 0xFF, 0xFF, 0xF7, 0x69, 0xFF, 0xFF, 0xFC, 0x16, \r
+    0xFF, 0xFF, 0xF4, 0xCD, 0xFF, 0xFF, 0xF4, 0x06, 0xFF, 0xFF, 0xF3, 0xC2, 0xFF, 0xFF, 0xF0, 0x30, \r
+    0xFF, 0xFF, 0xF1, 0x72, 0xFF, 0xFF, 0xEF, 0x53, 0xFF, 0xFF, 0xE8, 0x12, 0xFF, 0xFF, 0xE7, 0x2D, \r
+    0xFF, 0xFF, 0xE5, 0xDC, 0xFF, 0xFF, 0xE6, 0x34, 0xFF, 0xFF, 0xE2, 0xAE, 0xFF, 0xFF, 0xE2, 0xF2, \r
+    0xFF, 0xFF, 0xE0, 0x23, 0xFF, 0xFF, 0xDB, 0xDF, 0xFF, 0xFF, 0xDC, 0x2B, 0xFF, 0xFF, 0xD8, 0x95, \r
+    0xFF, 0xFF, 0xD6, 0xE8, 0xFF, 0xFF, 0xD8, 0xDA, 0xFF, 0xFF, 0xD1, 0x2C, 0xFF, 0xFF, 0xCE, 0x93, \r
+    0xFF, 0xFF, 0xD1, 0x70, 0xFF, 0xFF, 0xCB, 0xA6, 0xFF, 0xFF, 0xCC, 0x70, 0xFF, 0xFF, 0xCB, 0x45, \r
+    0xFF, 0xFF, 0xC8, 0x65, 0xFF, 0xFF, 0xC5, 0xEC, 0xFF, 0xFF, 0xC4, 0xBF, 0xFF, 0xFF, 0xC5, 0x80, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x7F, 0xFF, \r
+    0x00, 0x00, 0x5F, 0xFF, 0x00, 0x00, 0x3F, 0xFF, 0x00, 0x00, 0x1F, 0xFF, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \r
+    0xFF, 0xFF, 0xEF, 0xA6, 0x00, 0x00, 0x0F, 0x80, 0xFF, 0xFF, 0xF0, 0x04, 0x00, 0x00, 0x0E, 0xA6, \r
+    0xFF, 0xFF, 0xED, 0x75, 0x00, 0x00, 0x1E, 0x84, 0x00, 0x00, 0x04, 0xC7, 0x00, 0x00, 0x28, 0xD4, \r
+    0x00, 0x00, 0x08, 0x39, 0x00, 0x00, 0x16, 0x30, 0x00, 0x00, 0x21, 0x11, 0x00, 0x00, 0x0B, 0x1E, \r
+    0xFF, 0xFF, 0xF6, 0x1E, 0xFF, 0xFF, 0xFD, 0x1F, 0xFF, 0xFF, 0xE7, 0x51, 0xFF, 0xFF, 0xCB, 0x57, \r
+    0x00, 0x00, 0x03, 0xD6, 0x00, 0x00, 0x0D, 0xE0, 0x00, 0x00, 0x06, 0x83, 0xFF, 0xFF, 0xF8, 0x23, \r
+    0xFF, 0xFF, 0xF5, 0x53, 0x00, 0x00, 0x1D, 0x19, 0x00, 0x00, 0x0A, 0x04, 0x00, 0x00, 0x29, 0x17, \r
+    0x00, 0x00, 0x15, 0x24, 0x00, 0x00, 0x25, 0xA4, 0xFF, 0xFF, 0xDC, 0xB4, 0xFF, 0xFF, 0xF9, 0x57, \r
+    0x00, 0x00, 0x19, 0x77, 0x00, 0x00, 0x2E, 0xF3, 0xFF, 0xFF, 0xD4, 0x13, 0x00, 0x00, 0x02, 0x39, \r
+    0x00, 0x00, 0x32, 0x10, 0x00, 0x00, 0x04, 0x22, 0xFF, 0xFF, 0xEF, 0xE8, 0xFF, 0xFF, 0xDB, 0x2B, \r
+    0xFF, 0xFF, 0xFE, 0x4C, 0x00, 0x00, 0x09, 0x8E, 0x00, 0x00, 0x05, 0x90, 0xFF, 0xFF, 0xFB, 0x68, \r
+    0x00, 0x00, 0x00, 0xA8, 0x00, 0x00, 0x10, 0x6F, 0x00, 0x00, 0x17, 0xA1, 0xFF, 0xFF, 0xD8, 0x31, \r
+    0x00, 0x00, 0x10, 0xFC, 0xFF, 0xFF, 0xF0, 0x66, 0x00, 0x00, 0x0E, 0x78, 0xFF, 0xFF, 0xF0, 0x5E, \r
+    0x00, 0x00, 0x1F, 0x83, 0x00, 0x00, 0x19, 0x74, 0xFF, 0xFF, 0xEB, 0x6F, 0xFF, 0xFF, 0xF0, 0xDE, \r
+    0x00, 0x00, 0x2B, 0x4D, 0x00, 0x00, 0x18, 0x67, 0xFF, 0xFF, 0xCE, 0x98, 0x00, 0x00, 0x0D, 0x20, \r
+    0x00, 0x00, 0x0A, 0x13, 0xFF, 0xFF, 0xE8, 0xD3, 0xFF, 0xFF, 0xDF, 0x60, 0x00, 0x00, 0x08, 0xDF, \r
+    0xFF, 0xFF, 0xE1, 0x68, 0x00, 0x00, 0x11, 0x14, 0xFF, 0xFF, 0xFE, 0x44, 0xFF, 0xFF, 0xD3, 0x92, \r
+    0x00, 0x00, 0x14, 0xA4, 0xFF, 0xFF, 0xE8, 0x95, 0xFF, 0xFF, 0xF2, 0xD8, 0x00, 0x00, 0x30, 0x8A, \r
+    0xFF, 0xFF, 0xF9, 0x85, 0xFF, 0xFF, 0xFB, 0x89, 0x00, 0x00, 0x19, 0x0E, 0x00, 0x00, 0x21, 0x02, \r
+    0xFF, 0xFF, 0xF2, 0x6B, 0xFF, 0xFF, 0xEE, 0x43, 0xFF, 0xFF, 0xE9, 0xFE, 0x00, 0x00, 0x0D, 0x8A, \r
+    0xFF, 0xFF, 0xFA, 0x2B, 0x00, 0x00, 0x09, 0xA5, 0x00, 0x00, 0x1F, 0x45, 0x00, 0x00, 0x1C, 0x1D, \r
+    0xFF, 0xFF, 0xEA, 0x2A, 0xFF, 0xFF, 0xE8, 0xDB, 0x00, 0x00, 0x11, 0xE2, 0x00, 0x00, 0x0C, 0x5A, \r
+    0x00, 0x00, 0x14, 0xC7, 0x00, 0x00, 0x08, 0x64, 0xFF, 0xFF, 0xD7, 0x61, 0xFF, 0xFF, 0xE8, 0x6E, \r
+    0xFF, 0xFF, 0xF0, 0x47, 0xFF, 0xFF, 0xF7, 0x6F, 0x00, 0x00, 0x02, 0x0E, 0xFF, 0xFF, 0xFE, 0xC9, \r
+    0xFF, 0xFF, 0xF0, 0x44, 0x00, 0x00, 0x06, 0x27, 0x00, 0x00, 0x03, 0x33, 0xFF, 0xFF, 0xFA, 0x47, \r
+    0xFF, 0xFF, 0xF5, 0xFE, 0xFF, 0xFF, 0xDC, 0x9F, 0x00, 0x00, 0x1B, 0x8D, 0x00, 0x00, 0x20, 0x7F, \r
+    0x00, 0x00, 0x0C, 0x79, 0xFF, 0xFF, 0xE7, 0x85, 0x00, 0x00, 0x0B, 0x90, 0xFF, 0xFF, 0xDF, 0xE8, \r
+    0x00, 0x00, 0x06, 0x90, 0x00, 0x00, 0x0A, 0xC8, 0x00, 0x00, 0x1A, 0xAF, 0x00, 0x00, 0x1E, 0xF3, \r
+    0x00, 0x00, 0x13, 0xFD, 0xFF, 0xFF, 0xE1, 0xCC, 0x00, 0x00, 0x19, 0xA2, 0xFF, 0xFF, 0xE5, 0xC4, \r
+    0xFF, 0xFF, 0xE4, 0xF3, 0x00, 0x00, 0x49, 0xEC, 0xFF, 0xFF, 0xF9, 0x26, 0xFF, 0xFF, 0xF3, 0x7F, \r
+    0x00, 0x00, 0x0A, 0xBC, 0xFF, 0xFF, 0xEC, 0xFD, 0x00, 0x00, 0x0E, 0xAA, 0xFF, 0xFF, 0xFC, 0x53, \r
+    0xFF, 0xFF, 0xFB, 0xFD, 0xFF, 0xFF, 0xF0, 0x58, 0x00, 0x00, 0x02, 0x91, 0xFF, 0xFF, 0xE3, 0x83, \r
+    0x00, 0x00, 0x18, 0x80, 0xFF, 0xFF, 0xF1, 0x35, 0xFF, 0xFF, 0xF3, 0x0C, 0xFF, 0xFF, 0xE6, 0xD6, \r
+    } ;\r
diff --git a/src/include/zbmpop1.h b/src/include/zbmpop1.h
new file mode 100644 (file)
index 0000000..ed8d3f4
--- /dev/null
@@ -0,0 +1,53 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=(idx<<2);\r
+               \r
+               if (flags&FLAGS_HFLIP)\r
+               {\r
+                       while (scaled_width)\r
+                       {\r
+                               uint32 c=jaguar_byte_read(ptr+(cnt>>19));\r
+                               c=(c>>(8-((cnt>>16)&0x07)))&0x01;\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       if (c)\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[(c<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c<<1)+1];\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer-=2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *current_line_buffer--=paletteRam[(c<<1)+0];\r
+                                       *current_line_buffer--=paletteRam[(c<<1)+1];\r
+                               }\r
+                               cnt+=hscale_fixed;\r
+                               scaled_width--;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       while (scaled_width)\r
+                       {\r
+                               uint32 c=jaguar_byte_read(ptr+(cnt>>19));\r
+                               c=(c>>(8-((cnt>>16)&0x07)))&0x01;\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       if (c)\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[(c<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c<<1)+1];\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer+=2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *current_line_buffer++=paletteRam[(c<<1)+0];\r
+                                       *current_line_buffer++=paletteRam[(c<<1)+1];\r
+                               }\r
+                               cnt+=hscale_fixed;\r
+                               scaled_width--;\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop16.h b/src/include/zbmpop16.h
new file mode 100644 (file)
index 0000000..e310186
--- /dev/null
@@ -0,0 +1,130 @@
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,(c>>8));\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,(c&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr+((cnt>>16)<<1)+0));\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr+((cnt>>16)<<1)+1));\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,(c>>8));\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,(c&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr+((cnt>>16)<<1)+0));\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr+((cnt>>16)<<1)+1));\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=(c>>8);\r
+                                                       *current_line_buffer--=(c&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=(c>>8);\r
+                                                       *current_line_buffer++=(c&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr+((cnt>>16)<<1)+0);\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr+((cnt>>16)<<1)+1);\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop16p.h b/src/include/zbmpop16p.h
new file mode 100644 (file)
index 0000000..3653293
--- /dev/null
@@ -0,0 +1,130 @@
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,(c>>8));\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,(c&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0));\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1));\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,(c>>8));\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,(c&0xff));\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0));\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1));\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=(c>>8);\r
+                                                       *current_line_buffer--=(c&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);\r
+                                               *current_line_buffer--=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint16 c=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);;\r
+                                               c<<=8;\r
+                                               c|=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=(c>>8);\r
+                                                       *current_line_buffer++=(c&0xff);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+0);\r
+                                               *current_line_buffer++=jaguar_byte_read(ptr+((((cnt>>16) & (~0x3))*pitch)+((cnt>>16)&0x3)<<1)+1);\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop1p.h b/src/include/zbmpop1p.h
new file mode 100644 (file)
index 0000000..94fc620
--- /dev/null
@@ -0,0 +1,53 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=(idx<<2);\r
+               \r
+               if (flags&FLAGS_HFLIP)\r
+               {\r
+                       while (scaled_width)\r
+                       {\r
+                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x3f))*pitch)+((cnt>>16)&0x3f));\r
+                               c=(c>>(8-((cnt>>16)&0x07)))&0x01;\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       if (c)\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[(c<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[(c<<1)+1];\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer-=2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *current_line_buffer--=paletteRam[(c<<1)+0];\r
+                                       *current_line_buffer--=paletteRam[(c<<1)+1];\r
+                               }\r
+                               cnt+=hscale_fixed;\r
+                               scaled_width--;\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       while (scaled_width)\r
+                       {\r
+                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x3f))*pitch)+((cnt>>16)&0x3f));\r
+                               c=(c>>(8-((cnt>>16)&0x07)))&0x01;\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {\r
+                                       if (c)\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[(c<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[(c<<1)+1];\r
+                                       }\r
+                                       else\r
+                                               current_line_buffer+=2;\r
+                               }\r
+                               else\r
+                               {\r
+                                       *current_line_buffer++=paletteRam[(c<<1)+0];\r
+                                       *current_line_buffer++=paletteRam[(c<<1)+1];\r
+                               }\r
+                               cnt+=hscale_fixed;\r
+                               scaled_width--;\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop2.h b/src/include/zbmpop2.h
new file mode 100644 (file)
index 0000000..08231e0
--- /dev/null
@@ -0,0 +1,150 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=idx*2;\r
+               \r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[((c&0x03)<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[((c&0x03)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer--=paletteRam[((c&0x03)<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[((c&0x03)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[((c&0x03)<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[((c&0x03)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>18));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer++=paletteRam[((c&0x03)<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[((c&0x03)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop24.h b/src/include/zbmpop24.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/zbmpop24p.h b/src/include/zbmpop24p.h
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/include/zbmpop2p.h b/src/include/zbmpop2p.h
new file mode 100644 (file)
index 0000000..ec38994
--- /dev/null
@@ -0,0 +1,150 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=idx*2;\r
+               \r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x03)<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x03)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[((c&0x03)<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[((c&0x03)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer--=paletteRam[((c&0x03)<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[((c&0x03)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[((c&0x03)<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[((c&0x03)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x1f))*pitch)+((cnt>>16)&0x1f));\r
+                                               c>>=(6-(2*((cnt>>16)&0x03)));\r
+                                               c&=0x03;\r
+                                               *current_line_buffer++=paletteRam[((c&0x03)<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[((c&0x03)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop4.h b/src/include/zbmpop4.h
new file mode 100644 (file)
index 0000000..e4c950f
--- /dev/null
@@ -0,0 +1,149 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=idx*4;\r
+               \r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[((c&0x0f)<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[((c&0x0f)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer--=paletteRam[((c&0x0f)<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[((c&0x0f)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[((c&0x0f)<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[((c&0x0f)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(cnt>>17));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer++=paletteRam[((c&0x0f)<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[((c&0x0f)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop4p.h b/src/include/zbmpop4p.h
new file mode 100644 (file)
index 0000000..4a6ab1e
--- /dev/null
@@ -0,0 +1,149 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=idx*4;\r
+               \r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[((c&0x0f)<<1)+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[((c&0x0f)<<1)+1]);\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[((c&0x0f)<<1)+0];\r
+                                                       *current_line_buffer--=paletteRam[((c&0x0f)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer--=paletteRam[((c&0x0f)<<1)+0];\r
+                                               *current_line_buffer--=paletteRam[((c&0x0f)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               if (flags&FLAGS_TRANSPARENT)\r
+                               {                                       \r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[((c&0x0f)<<1)+0];\r
+                                                       *current_line_buffer++=paletteRam[((c&0x0f)<<1)+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       while (scaled_width)\r
+                                       {\r
+                                               uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x0f))*pitch)+((cnt>>16)&0x0f));\r
+                                               if (!(cnt&(1<<16)))\r
+                                                       c>>=4;\r
+                                               *current_line_buffer++=paletteRam[((c&0x0f)<<1)+0];\r
+                                               *current_line_buffer++=paletteRam[((c&0x0f)<<1)+1];\r
+\r
+                                               cnt+=hscale_fixed;\r
+                                               scaled_width--;\r
+                                       }\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop8.h b/src/include/zbmpop8.h
new file mode 100644 (file)
index 0000000..29e3d52
--- /dev/null
@@ -0,0 +1,112 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=(idx&0x1)*256*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(cnt>>16));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(cnt>>16));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(cnt>>16));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[c+0];\r
+                                                       *current_line_buffer--=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[c+0];\r
+                                               *current_line_buffer--=paletteRam[c+1];\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(cnt>>16));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[c+0];\r
+                                                       *current_line_buffer++=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[c+0];\r
+                                               *current_line_buffer++=paletteRam[c+1];\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/include/zbmpop8p.h b/src/include/zbmpop8p.h
new file mode 100644 (file)
index 0000000..a553faf
--- /dev/null
@@ -0,0 +1,112 @@
+               uint8   *paletteRam=&tom_ram_8[0x400];\r
+               paletteRam+=(idx&0x1)*256*2;\r
+               if (flags&FLAGS_READMODIFY)\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x07))*pitch)+((cnt>>16)&0x07));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer--=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x07))*pitch)+((cnt>>16)&0x07));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                                       *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=BLEND_Y(*current_line_buffer,paletteRam[c+0]);\r
+                                               *current_line_buffer++=BLEND_CC(*current_line_buffer,paletteRam[c+1]);\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+               }\r
+               else\r
+               {\r
+                       if (flags&FLAGS_HFLIP)\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x07))*pitch)+((cnt>>16)&0x07));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer--=paletteRam[c+0];\r
+                                                       *current_line_buffer--=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer-=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer--=paletteRam[c+0];\r
+                                               *current_line_buffer--=paletteRam[c+1];\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+                       else\r
+                       {\r
+                               while (scaled_width)\r
+                               {\r
+                                       uint32 c=jaguar_byte_read(ptr+(((cnt>>16) & (~0x07))*pitch)+((cnt>>16)&0x07));\r
+                                       c<<=1;\r
+                                       if (flags&FLAGS_TRANSPARENT)\r
+                                       {                                       \r
+                                               if (c)\r
+                                               {\r
+                                                       *current_line_buffer++=paletteRam[c+0];\r
+                                                       *current_line_buffer++=paletteRam[c+1];\r
+                                               }\r
+                                               else\r
+                                                       current_line_buffer+=2;\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               *current_line_buffer++=paletteRam[c+0];\r
+                                               *current_line_buffer++=paletteRam[c+1];\r
+                                       }\r
+\r
+                                       cnt+=hscale_fixed;\r
+                                       scaled_width--;\r
+                               }\r
+                       }\r
+               }\r
diff --git a/src/jagdasm.cpp b/src/jagdasm.cpp
new file mode 100644 (file)
index 0000000..de85785
--- /dev/null
@@ -0,0 +1,160 @@
+#include "include/jaguar.h"\r
+\r
+#define ROPCODE(a) jaguar_word_read(a)\r
+\r
+uint8 convert_zero[32] =\r
+{ 32,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31 };\r
+\r
+char *condition[32] =\r
+{\r
+       "",\r
+       "nz,",\r
+       "z,",\r
+       "???,",\r
+       "nc,",\r
+       "nc nz,",\r
+       "nc z,",\r
+       "???,",\r
+       "c,",\r
+       "c nz,",\r
+       "c z,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "nn,",\r
+       "nn nz,",\r
+       "nn z,",\r
+       "???,",\r
+       "n,",\r
+       "n nz,",\r
+       "n z,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "???,",\r
+       "never,"\r
+};\r
+       \r
+\r
+\r
+char *signed_16bit(INT16 val)\r
+{\r
+       static char temp[10];\r
+       if (val < 0)\r
+               sprintf(temp, "-$%x", -val);\r
+       else\r
+               sprintf(temp, "$%x", val);\r
+       return temp;\r
+}\r
+\r
+unsigned dasmjag(int dsp_type, char *buffer, unsigned pc)\r
+{\r
+       int op = ROPCODE(pc);\r
+       int reg1 = (op >> 5) & 31;\r
+       int reg2 = op & 31;\r
+       int size = 2;\r
+       \r
+       pc += 2;\r
+       switch (op >> 10)\r
+       {\r
+               case 0:         sprintf(buffer, "add     r%d,r%d", reg1, reg2);                                 break;\r
+               case 1:         sprintf(buffer, "addc    r%d,r%d", reg1, reg2);                                 break;\r
+               case 2:         sprintf(buffer, "addq    $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 3:         sprintf(buffer, "addqt   $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 4:         sprintf(buffer, "sub     r%d,r%d", reg1, reg2);                                 break;\r
+               case 5:         sprintf(buffer, "subc    r%d,r%d", reg1, reg2);                                 break;\r
+               case 6:         sprintf(buffer, "subq    $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 7:         sprintf(buffer, "subqt   $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 8:         sprintf(buffer, "neg     r%d", reg2);                                                   break;\r
+               case 9:         sprintf(buffer, "and     r%d,r%d", reg1, reg2);                                 break;\r
+               case 10:        sprintf(buffer, "or      r%d,r%d", reg1, reg2);                                 break;\r
+               case 11:        sprintf(buffer, "xor     r%d,r%d", reg1, reg2);                                 break;\r
+               case 12:        sprintf(buffer, "not     r%d", reg2);                                                   break;\r
+               case 13:        sprintf(buffer, "btst    $%x,r%d", reg1, reg2);                                 break;\r
+               case 14:        sprintf(buffer, "bset    $%x,r%d", reg1, reg2);                                 break;\r
+               case 15:        sprintf(buffer, "bclr    $%x,r%d", reg1, reg2);                                 break;\r
+               case 16:        sprintf(buffer, "mult    r%d,r%d", reg1, reg2);                                 break;\r
+               case 17:        sprintf(buffer, "imult   r%d,r%d", reg1, reg2);                                 break;\r
+               case 18:        sprintf(buffer, "imultn  r%d,r%d", reg1, reg2);                                 break;\r
+               case 19:        sprintf(buffer, "resmac  r%d", reg2);                                                   break;\r
+               case 20:        sprintf(buffer, "imacn   r%d,r%d", reg1, reg2);                                 break;\r
+               case 21:        sprintf(buffer, "div     r%d,r%d", reg1, reg2);                                 break;\r
+               case 22:        sprintf(buffer, "abs     r%d", reg2);                                                   break;\r
+               case 23:        sprintf(buffer, "sh      r%d,r%d", reg1, reg2);                                 break;\r
+               case 24:        sprintf(buffer, "shlq    $%x,r%d", 32 - convert_zero[reg1], reg2);      break;\r
+               case 25:        sprintf(buffer, "shrq    $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 26:        sprintf(buffer, "sha     r%d,r%d", reg1, reg2);                                 break;\r
+               case 27:        sprintf(buffer, "sharq   $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 28:        sprintf(buffer, "ror     r%d,r%d", reg1, reg2);                                 break;\r
+               case 29:        sprintf(buffer, "rorq    $%x,r%d", convert_zero[reg1], reg2);   break;\r
+               case 30:        sprintf(buffer, "cmp     r%d,r%d", reg1, reg2);                                 break;\r
+               case 31:        sprintf(buffer, "cmpq    %s,r%d", signed_16bit((INT16)(reg1 << 11) >> 11), reg2);break;\r
+               case 32:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, "sat8    r%d", reg2);\r
+                                       else\r
+                                       sprintf(buffer, "subqmod $%x,r%d", convert_zero[reg1], reg2);\r
+                                       break;\r
+               case 33:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, "sat16   r%d", reg2);\r
+                                       else\r
+                                       sprintf(buffer, "sat16s  r%d", reg2);\r
+                                       break;\r
+               case 34:        sprintf(buffer, "move    r%d,r%d", reg1, reg2);                                 break;\r
+               case 35:        sprintf(buffer, "moveq   %d,r%d", reg1, reg2);                                  break;\r
+               case 36:        sprintf(buffer, "moveta  r%d,r%d", reg1, reg2);                                 break;\r
+               case 37:        sprintf(buffer, "movefa  r%d,r%d", reg1, reg2);                                 break;\r
+               case 38:        sprintf(buffer, "movei   $%x,r%d", ROPCODE(pc) | (ROPCODE(pc+2)<<16), reg2); size = 6; break;\r
+               case 39:        sprintf(buffer, "loadb   (r%d),r%d", reg1, reg2);                                       break;\r
+               case 40:        sprintf(buffer, "loadw   (r%d),r%d", reg1, reg2);                                       break;\r
+               case 41:        sprintf(buffer, "load    (r%d),r%d", reg1, reg2);                                       break;\r
+               case 42:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, "loadp   (r%d),r%d", reg1, reg2);\r
+                                       else\r
+                                       sprintf(buffer, "sat32s  r%d", reg2);\r
+                                       break;\r
+               case 43:        sprintf(buffer, "load    (r14+$%x),r%d", convert_zero[reg1]*4, reg2);break;\r
+               case 44:        sprintf(buffer, "load    (r15+$%x),r%d", convert_zero[reg1]*4, reg2);break;\r
+               case 45:        sprintf(buffer, "storeb  r%d,(r%d)", reg2, reg1);                               break;\r
+               case 46:        sprintf(buffer, "storew  r%d,(r%d)", reg2, reg1);                               break;\r
+               case 47:        sprintf(buffer, "store   r%d,(r%d)", reg2, reg1);                                       break;\r
+               case 48:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, "storep  r%d,(r%d)", reg2, reg1);\r
+                                       else\r
+                                       sprintf(buffer, "mirror  r%d", reg2);\r
+                                       break;\r
+               case 49:        sprintf(buffer, "store   r%d,(r14+$%x)", reg2, convert_zero[reg1]*4);break;\r
+               case 50:        sprintf(buffer, "store   r%d,(r15+$%x)", reg2, convert_zero[reg1]*4);break;\r
+               case 51:        sprintf(buffer, "move    pc,r%d", reg2);                                                        break;\r
+               case 52:        sprintf(buffer, "jump    %s(r%d)", condition[reg2], reg1);                      break;\r
+               case 53:        sprintf(buffer, "jr      %s%08X", condition[reg2], pc + ((INT8)(reg1 << 3) >> 2)); break;\r
+               case 54:        sprintf(buffer, "mmult   r%d,r%d", reg1, reg2);                                 break;\r
+               case 55:        sprintf(buffer, "mtoi    r%d,r%d", reg1, reg2);                                 break;\r
+               case 56:        sprintf(buffer, "normi   r%d,r%d", reg1, reg2);                                 break;\r
+               case 57:        sprintf(buffer, "nop");                                                                                 break;\r
+               case 58:        sprintf(buffer, "load    (r14+r%d),r%d", reg1, reg2);                           break;\r
+               case 59:        sprintf(buffer, "load    (r15+r%d),r%d", reg1, reg2);                           break;\r
+               case 60:        sprintf(buffer, "store   r%d,(r14+r%d)", reg2, reg1);                           break;\r
+               case 61:        sprintf(buffer, "store   r%d,(r15+r%d)", reg2, reg1);                           break;\r
+               case 62:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, "sat24   r%d", reg2);\r
+                                       else\r
+                                       sprintf(buffer, "illegal");\r
+                                       break;\r
+               case 63:        if (dsp_type == JAGUAR_GPU)\r
+                                       sprintf(buffer, reg1 ? \r
+                                                       "unpack  r%d" : \r
+                                                       "pack    r%d", reg2);\r
+                                       else\r
+                                       sprintf(buffer, "addqmod $%x,r%d", convert_zero[reg1], reg2);\r
+                                       break;\r
+       }\r
+       sprintf(buffer,"%s (0x%.4x)",buffer,op);\r
+       return size;\r
+}\r
diff --git a/src/jaguar.cpp b/src/jaguar.cpp
new file mode 100644 (file)
index 0000000..b30be95
--- /dev/null
@@ -0,0 +1,1097 @@
+//\r
+// JAGUAR.CPP\r
+//\r
+// by cal16\r
+// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\r
+// Cleanups and endian wrongness amelioration by James L. Hammons\r
+// Note: Endian wrongness probably stems from the MAME origins of this emu and\r
+//       the braindead way in which MAME handles memory. :-)\r
+// \r
+\r
+#include "jaguar.h"\r
+#include "m68kdasmAG.h"\r
+#include "crc32.h"\r
+\r
+//#define LOG_UNMAPPED_MEMORY_ACCESSES\r
+//#define SOUND_OUTPUT\r
+\r
+// Some handy macros to help converting native endian to big endian (jaguar native)\r
+\r
+#define SET32(r, a, v) r[a] = ((v) & 0xFF000000) >> 24, r[a+1] = ((v) & 0x00FF0000) >> 16, \\r
+                                               r[a+2] = ((v) & 0x0000FF00) >> 8, r[a+3] = (v) & 0x000000FF\r
+\r
+//\r
+// Function Prototypes\r
+//\r
+\r
+unsigned jaguar_unknown_readbyte(unsigned address);\r
+unsigned jaguar_unknown_readword(unsigned address);\r
+void jaguar_unknown_writebyte(unsigned address, unsigned data);\r
+void jaguar_unknown_writeword(unsigned address, unsigned data);\r
+\r
+\r
+#ifdef SOUND_OUTPUT\r
+int dsp_enabled = 1;\r
+#else\r
+int dsp_enabled = 0;\r
+#endif\r
+uint32 jaguar_active_memory_dumps = 0;\r
+uint32 jaguar_use_bios = 0;\r
+#define JAGUAR_WIP_RELEASE\r
+#define JAGUAR_REAL_SPEED\r
+\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+// Bios path\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//static char  *jaguar_bootRom_path="c:/jaguarEmu/newload.img";\r
+static char * jaguar_bootRom_path = "./bios/jagboot.rom";\r
+//static char  *jaguar_bootRom_path="./bios/JagOS.bin";\r
+char * jaguar_eeproms_path = "./eeproms/";\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 jaguar_mainRom_crc32;\r
+\r
+static uint32 m68k_cycles_per_scanline;\r
+static uint32 gpu_cycles_per_scanline;\r
+static uint32 dsp_cycles_per_scanline;\r
+static uint32 jaguar_screen_scanlines;\r
+\r
+static uint8 * jaguar_mainRam = NULL;\r
+static uint8 * jaguar_bootRom = NULL;\r
+static uint8 * jaguar_mainRom = NULL;\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+//\r
+// Musashi 68000 read/write/IRQ functions\r
+//\r
+\r
+int irq_ack_handler(int level)\r
+{\r
+       int vector = M68K_INT_ACK_AUTOVECTOR;\r
+\r
+       if (level = 7)\r
+       {\r
+               m68k_set_irq(0);                                                // Clear the IRQ...\r
+               vector = 64;                                                    // Set user interrupt #0\r
+       }\r
+\r
+       return vector;\r
+}\r
+\r
+//Do this in makefile???\r
+//#define LOG_UNMAPPED_MEMORY_ACCESSES 1\r
+\r
+unsigned int m68k_read_memory_8(unsigned int address)\r
+{\r
+//fprintf(log_get(), "[RM8] Addr: %08X\n", address);\r
+       unsigned int retVal = 0;\r
+\r
+       if ((address >= 0x000000) && (address <= 0x3FFFFF))\r
+               retVal = jaguar_mainRam[address];\r
+       else if ((address >= 0x800000) && (address <= 0xDFFFFF))\r
+               retVal = jaguar_mainRom[address - 0x800000];\r
+       else if ((address >= 0xE00000) && (address <= 0xE3FFFF))\r
+               retVal = jaguar_bootRom[address - 0xE00000];\r
+       else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))\r
+               retVal = cdrom_byte_read(address);\r
+       else if ((address >= 0xF00000) && (address <= 0xF0FFFF))\r
+               retVal = tom_byte_read(address);\r
+       else if ((address >= 0xF10000) && (address <= 0xF1FFFF))\r
+               retVal = jerry_byte_read(address);\r
+       else\r
+               retVal = jaguar_unknown_readbyte(address);\r
+\r
+    return retVal;\r
+}\r
+\r
+unsigned int m68k_read_memory_16(unsigned int address)\r
+{\r
+//fprintf(log_get(), "[RM16] Addr: %08X\n", address);\r
+    unsigned int retVal = 0;\r
+\r
+       if ((address >= 0x000000) && (address <= 0x3FFFFE))\r
+               retVal = (jaguar_mainRam[address] << 8) | jaguar_mainRam[address+1];\r
+       else if ((address >= 0x800000) && (address <= 0xDFFFFE))\r
+               retVal = (jaguar_mainRom[address - 0x800000] << 8) | jaguar_mainRom[address - 0x800000 + 1];\r
+       else if ((address >= 0xE00000) && (address <= 0xE3FFFE))\r
+               retVal = (jaguar_bootRom[address - 0xE00000] << 8) | jaguar_bootRom[address - 0xE00000 + 1];\r
+       else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))\r
+               retVal = cdrom_word_read(address);\r
+       else if ((address >= 0xF00000) && (address <= 0xF0FFFE))\r
+               retVal = tom_word_read(address);\r
+       else if ((address >= 0xF10000) && (address <= 0xF1FFFE))\r
+               retVal = jerry_word_read(address);\r
+       else\r
+//{\r
+//fprintf(log_get(), "[RM16] Unknown address: %08X\n", address);\r
+               retVal = jaguar_unknown_readword(address);\r
+//}\r
+\r
+    return retVal;\r
+}\r
+\r
+unsigned int m68k_read_memory_32(unsigned int address)\r
+{\r
+//fprintf(log_get(), "--> [RM32]\n");\r
+    return (m68k_read_memory_16(address) << 16) | m68k_read_memory_16(address + 2);\r
+}\r
+\r
+void m68k_write_memory_8(unsigned int address, unsigned int value)\r
+{\r
+//fprintf(log_get(), "[WM8  PC=%08X] Addr: %08X, val: %02X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);\r
+       if ((address >= 0x000000) && (address <= 0x3FFFFF))\r
+               jaguar_mainRam[address] = value;\r
+       else if ((address >= 0xDFFF00) && (address <= 0xDFFFFF))\r
+               cdrom_byte_write(address, value);\r
+       else if ((address >= 0xF00000) && (address <= 0xF0FFFF))\r
+               tom_byte_write(address, value);\r
+       else if ((address >= 0xF10000) && (address <= 0xF1FFFF))\r
+               jerry_byte_write(address, value);\r
+       else\r
+               jaguar_unknown_writebyte(address, value);\r
+}\r
+\r
+void m68k_write_memory_16(unsigned int address, unsigned int value)\r
+{\r
+//fprintf(log_get(), "[WM16 PC=%08X] Addr: %08X, val: %04X\n", m68k_get_reg(NULL, M68K_REG_PC), address, value);\r
+       if ((address >= 0x000000) && (address <= 0x3FFFFE))\r
+       {\r
+               jaguar_mainRam[address] = value >> 8;\r
+               jaguar_mainRam[address + 1] = value & 0xFF;\r
+       }\r
+       else if ((address >= 0xDFFF00) && (address <= 0xDFFFFE))\r
+               cdrom_word_write(address, value);\r
+       else if ((address >= 0xF00000) && (address <= 0xF0FFFE))\r
+               tom_word_write(address, value);\r
+       else if ((address >= 0xF10000) && (address <= 0xF1FFFE))\r
+               jerry_word_write(address, value);\r
+       else\r
+               jaguar_unknown_writeword(address, value);\r
+}\r
+\r
+void m68k_write_memory_32(unsigned int address, unsigned int value)\r
+{\r
+//fprintf(log_get(), "--> [WM32]\n");\r
+       m68k_write_memory_16(address, value >> 16);\r
+       m68k_write_memory_16(address + 2, value & 0xFFFF);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+/*struct STARSCREAM_PROGRAMREGION *jaguar_programfetch;\r
+struct STARSCREAM_DATAREGION    *jaguar_readbyte;\r
+struct STARSCREAM_DATAREGION    *jaguar_readword;\r
+struct STARSCREAM_DATAREGION    *jaguar_writebyte;\r
+struct STARSCREAM_DATAREGION    *jaguar_writeword;\r
+UINT16 jaguar_regionsCount[6];*/\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 jaguar_get_handler(uint32 i)\r
+{\r
+//     return (jaguar_word_read(i<<2) << 16) | jaguar_word_read((i<<2) + 2);\r
+       return (jaguar_word_read(i*4) << 16) | jaguar_word_read((i*4) + 2);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+static char romLoadDialog_filePath[1024];\r
+#ifndef __PORT__\r
+static char romLoadDialog_initialDirectory[1024];\r
+\r
+int jaguar_open_rom(HWND hWnd,char *title,char *filterString)\r
+{\r
+       OPENFILENAME ofn;\r
+\r
+\r
+       romLoadDialog_initialDirectory[0] = 0;\r
+\r
+\r
+       romLoadDialog_filePath[0] = 0;\r
+\r
+       ZeroMemory(&ofn, sizeof(OPENFILENAME));\r
+       ofn.lStructSize = sizeof(OPENFILENAME);\r
+       ofn.hwndOwner = hWnd;\r
+       ofn.lpstrFile = romLoadDialog_filePath;\r
+       ofn.nMaxFile = sizeof(romLoadDialog_filePath);\r
+       ofn.lpstrFilter =  filterString;\r
+       ofn.nFilterIndex = 0;\r
+       ofn.lpstrFileTitle = NULL;\r
+       ofn.nMaxFileTitle = 0;\r
+       ofn.lpstrInitialDir = (const char *)romLoadDialog_initialDirectory;\r
+       ofn.lpstrTitle = title; \r
+       ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;\r
+\r
+       if(GetOpenFileName(&ofn) == FALSE) \r
+       {\r
+               DWORD res = CommDlgExtendedError();\r
+               SendMessage(hWnd, WM_MOVE, 0,0);\r
+               return 0;\r
+       }\r
+\r
+\r
+       SendMessage(hWnd, WM_MOVE, 0,0);\r
+       return 1;\r
+}\r
+#endif\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 jaguar_interrupt_handler_is_valid(uint32 i)\r
+{\r
+       uint32 handler = jaguar_get_handler(i);\r
+       if (handler && (handler != 0xFFFFFFFF))\r
+               return 1;\r
+       else\r
+               return 0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void s68000show_context(void)\r
+{\r
+//     fprintf(log_get(),"\t68k PC=0x%.6x\n",s68000readPC());\r
+       fprintf(log_get(),"\t68k PC=0x%.6x\n", m68k_get_reg(NULL, M68K_REG_PC));\r
+//     for (int i=0;i<8;i++)\r
+//             fprintf(log_get(),"\tD%i = 0x%.8x\n",i,s68000context.dreg[i]);\r
+       for(int i=M68K_REG_D0; i<=M68K_REG_D7; i++)\r
+               fprintf(log_get(), "\tD%i = 0x%.8x\n", i-M68K_REG_D0, m68k_get_reg(NULL, (m68k_register_t)i));\r
+       fprintf(log_get(), "\n");\r
+//     for (i=0;i<8;i++)\r
+//             fprintf(log_get(),"\tA%i = 0x%.8x\n",i,s68000context.areg[i]);\r
+       for(int i=M68K_REG_A0; i<=M68K_REG_A7; i++)\r
+               fprintf(log_get(), "\tA%i = 0x%.8x\n", i-M68K_REG_A0, m68k_get_reg(NULL, (m68k_register_t)i));\r
+\r
+       fprintf(log_get(), "68k dasm\n");\r
+//     jaguar_dasm(s68000readPC()-0x1000,0x20000);\r
+//     jaguar_dasm(m68k_get_reg(NULL, M68K_REG_PC) - 0x1000, 0x20000);\r
+       jaguar_dasm(m68k_get_reg(NULL, M68K_REG_PC) - 0x80, 0x200);\r
+       fprintf(log_get(), "..................\n");\r
+\r
+\r
+       if (tom_irq_enabled(IRQ_VBLANK))\r
+       {\r
+               fprintf(log_get(), "vblank int: enabled\n");\r
+               jaguar_dasm(jaguar_get_handler(64), 0x200);\r
+       }\r
+       else\r
+               fprintf(log_get(), "vblank int: disabled\n");\r
+       fprintf(log_get(), "..................\n");\r
+\r
+       for(int i=0; i<256; i++)\r
+               fprintf(log_get(), "handler %03i at $%08X\n", i, jaguar_get_handler(i));\r
+}\r
+\r
+// Starscream crap ripped out...\r
+\r
+//\r
+// Unknown read/write byte/word routines\r
+//\r
+\r
+void jaguar_unknown_writebyte(unsigned address, unsigned data)\r
+{\r
+#ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
+       fprintf(log_get(), "jaguar: unknown byte %02X write at %08X (PC=%06X)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC));\r
+#endif\r
+}\r
+\r
+void jaguar_unknown_writeword(unsigned address, unsigned data)\r
+{\r
+#ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
+       fprintf(log_get(), "jaguar: unknown word %04X write at %08X (PC=%06X)\n", data, address, m68k_get_reg(NULL, M68K_REG_PC));\r
+#endif\r
+}\r
+\r
+unsigned jaguar_unknown_readbyte(unsigned address)\r
+{\r
+#ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
+       fprintf(log_get(), "jaguar: unknown byte read at %08X (PC=%06X)\n", address, m68k_get_reg(NULL, M68K_REG_PC));\r
+#endif\r
+    return 0xFF;\r
+}\r
+\r
+unsigned jaguar_unknown_readword(unsigned address)\r
+{\r
+#ifdef LOG_UNMAPPED_MEMORY_ACCESSES\r
+       fprintf(log_get(), "jaguar: unknown word read at %08X (PC=%06X)\n", address, m68k_get_reg(NULL, M68K_REG_PC));\r
+#endif\r
+    return 0xFFFF;\r
+}\r
+\r
+//\r
+// Jaguar ROM loading\r
+//\r
+\r
+uint8 * jaguar_rom_load(char * path, uint32 * romSize)\r
+{\r
+       uint8 * rom = NULL;\r
+       fpos_t pos;\r
+       int     x;\r
+       __int64 filepos;\r
+\r
+       fprintf(log_get(), "jaguar: loading %s...", path);\r
+       FILE * fp = fopen(path, "rb");\r
+       if (fp == NULL)\r
+       {\r
+               fprintf(log_get(), "failed\n");\r
+               log_done();\r
+               exit(0);\r
+               return NULL;\r
+       }\r
+       fseek(fp, 0, SEEK_END);\r
+\r
+       /* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
+       /* Added for GCC UNIX compatibility          */\r
+       #ifdef __GCCUNIX__\r
+       fgetpos(fp, (fpos_t *)&filepos);\r
+       #else\r
+       fgetpos(fp, &filepos);\r
+       #endif\r
+       \r
+       *romSize = (int)filepos;\r
+       fseek(fp, 0, SEEK_SET);\r
+       rom = (uint8 *)malloc(*romSize);\r
+       fread(rom, 1, *romSize, fp);\r
+       fclose(fp);\r
+       fprintf(log_get(), "ok (%i bytes)\n", *romSize);\r
+//     jaguar_mainRom_crc32=crc32_calcCheckSum(jaguar_mainRom,*romSize);\r
+//     fprintf(log_get(),"crc: 0x%.8x\n",jaguar_mainRom_crc32);\r
+       return rom;\r
+}\r
+\r
+//\r
+// Load a ROM at a specific address\r
+//\r
+\r
+void jaguar_rom_load_to(uint8 * rom, char * path, uint32 * romSize)\r
+{\r
+       __int64 filepos;\r
+\r
+       fprintf(log_get(), "jaguar: loading %s...", path);\r
+       FILE * fp = fopen(path, "rb");\r
+       if (fp == NULL)\r
+       {\r
+               fprintf(log_get(), "failed\n");\r
+               log_done();\r
+               exit(0);\r
+               return;\r
+       }\r
+       fseek(fp, 0, SEEK_END);\r
+\r
+       /* Added by SDLEMU (http://sdlemu.ngemu.com) */\r
+       /* Added for GCC UNIX compatibility          */\r
+       #ifdef __GCCUNIX__\r
+       fgetpos(fp, (fpos_t *)&filepos);\r
+       #else\r
+       fgetpos(fp, &filepos);\r
+       #endif\r
+\r
+       *romSize = (int)filepos;\r
+       fseek(fp, 0, SEEK_SET);\r
+       fread(rom, 1, *romSize, fp);\r
+       fclose(fp);\r
+       fprintf(log_get(), "ok (%i bytes)\n", *romSize);\r
+}\r
+\r
+//\r
+// Byte swap a region of memory\r
+//\r
+\r
+void jaguar_byte_swap(uint8 * rom, uint32 size)\r
+{\r
+       while (size > 0)\r
+       {\r
+               uint8 tmp = rom[0];\r
+               rom[0] = rom[1];\r
+               rom[1] = tmp;\r
+               rom += 2;\r
+               size -= 2;\r
+       }\r
+}\r
+\r
+//\r
+// Disassemble instructions at the given offset\r
+//\r
+\r
+void jaguar_dasm(uint32 offset, uint32 qt)\r
+{\r
+       static char buffer[2048], mem[64];\r
+       int pc = offset, oldpc;\r
+\r
+       for(int i=0; i<qt; i++)\r
+       {\r
+               oldpc = pc;\r
+               for(int j=0; j<64; j++)\r
+//                     mem[j^0x01] = jaguar_byte_read(pc + j);\r
+                       mem[j^0x01] = jaguar_byte_read(pc + j);\r
+\r
+               pc += Dasm68000((char *)mem, buffer, 0);\r
+#ifdef CPU_DEBUG\r
+               fprintf(log_get(), "%08X: %s\n", oldpc, buffer);\r
+#endif\r
+       }\r
+}\r
+\r
+//\r
+// Jaguar cartridge ROM loading\r
+//\r
+\r
+void jaguar_load_cart(char * path, uint8 * mem, uint32 offs, uint32 boot, uint32 header)\r
+{\r
+       uint32 romsize;\r
+\r
+       jaguar_rom_load_to(mem+offs-header, path, &romsize);\r
+// Is there a need for this? The answer is !!! NO !!!\r
+//     jaguar_byte_swap(mem+offs, romsize);\r
+       jaguar_mainRom_crc32 = crc32_calcCheckSum(jaguar_mainRom, romsize);\r
+       fprintf(log_get(), "crc: %08X\n", jaguar_mainRom_crc32);\r
+\r
+// Brain dead endian dependent crap\r
+//     *((uint32 *)&jaguar_mainRam[4]) = boot;\r
+// This is how it *should* have been done...\r
+       SET32(jaguar_mainRam, 4, boot);\r
+// Same as above...\r
+//     jaguar_dasm((boot>>16) | (boot<<16), 32*4);\r
+       jaguar_dasm(boot, 32*4);\r
+}\r
+\r
+//\r
+// Jaguar initialization\r
+//\r
+\r
+#ifdef __PORT__\r
+void jaguar_init(const char * filename)\r
+#else\r
+void jaguar_init(void)\r
+#endif\r
+{\r
+       uint32 romsize;\r
+\r
+       jaguar_screen_scanlines = 525;                  // PAL screen size\r
+       m68k_cycles_per_scanline = 13300000 / (jaguar_screen_scanlines * 60);\r
+       gpu_cycles_per_scanline = (26591000 / 4) / (jaguar_screen_scanlines * 60);\r
+       dsp_cycles_per_scanline = (26591000 / 4) / (jaguar_screen_scanlines * 60);\r
+\r
+       memory_malloc_secure((void**)&jaguar_mainRam, 0x400000, "Jaguar 68k cpu ram");\r
+       memory_malloc_secure((void**)&jaguar_bootRom, 0x040000, "Jaguar 68k cpu boot rom");\r
+       memory_malloc_secure((void**)&jaguar_mainRom, 0x600000, "Jaguar 68k cpu rom");\r
+       memset(jaguar_mainRam, 0x00, 0x400000);\r
+\r
+       jaguar_rom_load_to(jaguar_bootRom, jaguar_bootRom_path, &romsize);\r
+// No need to do this anymore, since Starcrap is gone!\r
+//     jaguar_byte_swap(jaguar_bootRom, romsize);\r
+       memcpy(jaguar_mainRam, jaguar_bootRom, 8);\r
+// More braindead endian dependent crap\r
+//WAS: *((uint32 *)&jaguar_mainRam[0]) = 0x00000020;\r
+       SET32(jaguar_mainRam, 0, 0x00200000);\r
+\r
+#ifdef JAGUAR_WIP_RELEASE\r
+#ifdef __PORT__\r
+       strcpy(romLoadDialog_filePath, filename);\r
+#else\r
+       jaguar_open_rom(GetForegroundWindow(), "Load", "Jaguar roms (*.JAG)\0*.JAG\0\0");\r
+#endif\r
+//WAS:         jaguar_load_cart(romLoadDialog_filePath, jaguar_mainRom, 0x0000, 0x20000080, 0);\r
+       jaguar_load_cart(romLoadDialog_filePath, jaguar_mainRom, 0x0000, 0x00802000, 0);\r
+       if ((jaguar_mainRom_crc32 == 0x3966698f) || (jaguar_mainRom_crc32 == 0x5e705756)\r
+               || (jaguar_mainRom_crc32 == 0x2630cbc4) || (jaguar_mainRom_crc32 == 0xd46437e8)\r
+               || (jaguar_mainRom_crc32 == 0x2630cbc4))\r
+               dsp_enabled = 1;\r
+\r
+       if ((jaguar_mainRom_crc32 == 0x6e90989f) || (jaguar_mainRom_crc32 == 0xfc8f0dcd)\r
+               || (jaguar_mainRom_crc32 == 0x2a512a83) || (jaguar_mainRom_crc32 == 0x41307601)\r
+               || (jaguar_mainRom_crc32 == 0x3c7bfda8) || (jaguar_mainRom_crc32 == 0x5e705756))\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+\r
+       if (jaguar_mainRom_crc32 == 0x7ae20823)\r
+       {\r
+               dsp_enabled = 1;\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0xe21d0e2f)\r
+       {\r
+               dsp_enabled = 1;\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0x66f8914c)\r
+       {\r
+               gpu_cycles_per_scanline = (26591000 / 1) /(jaguar_screen_scanlines * 60);\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0x5a5b9c68)\r
+       {\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0xdcb0197a)\r
+       {\r
+               dsp_enabled = 0; // dsp not needed\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               //dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+       if ((jaguar_mainRom_crc32 == 0x3966698f) || (jaguar_mainRom_crc32 == 0xe21d0e2f))\r
+               dsp_enabled = 1;\r
+       if (jaguar_mainRom_crc32 == 0x5e705756)\r
+       {\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_enabled = 1;\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0x2630cbc4)\r
+       {\r
+               // ultra vortek\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_enabled = 1;\r
+       }\r
+       if ((jaguar_mainRom_crc32 == 0xd46437e8) || (jaguar_mainRom_crc32 == 0xba74c3ed))\r
+       {\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+               dsp_enabled = 1;\r
+       }\r
+       if (jaguar_mainRom_crc32 == 0x6e90989f)\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+\r
+       if (jaguar_mainRom_crc32 == 0x41307601)\r
+       {\r
+               gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+       }\r
+\r
+       if (jaguar_mainRom_crc32 == 0x8483392b)\r
+       {\r
+               dsp_enabled = 1;\r
+       }\r
+\r
+#else  // #ifdef JAGUAR_WIP_RELEASE\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/flashback.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Pinball Fantasies.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/alien vs predator (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/cannon fodder (1995) (computer west).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/double dragon v (1995) (williams).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Dragon - The Bruce Lee Story.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Syndicate.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Theme Park.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Brutal Sports Football.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/International Sensible Soccer.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//  jaguar_load_cart("C:/ftp/jaguar/roms/roms/Defender 2000.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Fever Pitch Soccer.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Rayman.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Tempest 2000.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/zool 2 (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Bubsy - Fractured Furry Tails.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Raiden.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Dino Olympics.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/I-War.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Attack of the Mutant Penguins.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Cybermorph.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Troy Aikman NFL Football (1995) (Williams).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Power Drive Rally (1995) (TWI).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Zoop! (1996).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Missile Command 3D.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Hover Strike.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/worms.bin",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Atari Kart.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/native.bin",jaguar_mainRam,0x5000, 0x50000000,0x00);\r
+\r
+       if (jaguar_mainRom_crc32==0xe21d0e2f)\r
+       {\r
+               dsp_enabled=1;\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+       if (jaguar_mainRom_crc32==0x66f8914c)\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+       if (jaguar_mainRom_crc32==0x5a5b9c68)\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Super Cross 3D.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0xdcb0197a)\r
+       {\r
+               dsp_enabled=0; // dsp not needed\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               //dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+//  jaguar_load_cart("C:/ftp/jaguar/roms/roms/wolfenstein 3d (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if ((jaguar_mainRom_crc32==0x3966698f)||(jaguar_mainRom_crc32==0xe21d0e2f))\r
+               dsp_enabled=1;\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/NBA JAM.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Doom - Evil Unleashed.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x5e705756)\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_enabled=1;\r
+       }\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Ultra Vortek.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x2630cbc4)\r
+       {\r
+               // ultra vortek\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_enabled=1; \r
+       }\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/fflbeta.rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Fight for Your Life.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if ((jaguar_mainRom_crc32==0xd46437e8)||(jaguar_mainRom_crc32==0xba74c3ed))\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+//             dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_enabled=1;\r
+       }\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Pitfall - The Mayan Adventure.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x6e90989f)\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+\r
+// missing some sprites\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Crescent Galaxy.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x41307601)\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+\r
+// missing vertical bar shades \r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Phase Zero (2000) (PD).rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x8483392b)\r
+       {\r
+               dsp_enabled=1;\r
+       }\r
+// cpu/dsp/gpu synchronization problems\r
+\r
+\r
+// locks up during the game\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Club Drive.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+// no parallax floor, locks up at the start of the game        \r
+// jaguar_load_cart("C:/ftp/jaguar/roms/roms/Kasumi Ninja.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+// displaying the sound control dialog. no way to exit from it \r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Checkered Flag.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+// no 3d       \r
+//  jaguar_load_cart("C:/ftp/jaguar/roms/roms/Iron Soldier.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+// locks up at the start of the game\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Super Burnout.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x20ae75f4)\r
+       {\r
+               dsp_enabled=1;\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+// locks up at the start of the game   \r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Val D'Isere Skiing & Snowboarding (1994).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x4664ebd1)\r
+       {\r
+               dsp_enabled=1;\r
+       }\r
+\r
+// fonctionne avec le gpu et le dsp activés et gpu Ã  frequence nominale, et dsp Ã  1/4 de la frequence nominale\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/white men can't jump (1995).jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x7ae20823)\r
+       {\r
+               dsp_enabled=1;\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+// not working at all\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/Flip Out.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x6f57dcd2)\r
+       {\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               dsp_enabled=0;\r
+\r
+       }\r
+\r
+       jaguar_load_cart("C:/ftp/jaguar/roms/roms/Ruiner.JAG",jaguar_mainRom,0x0000, 0x20000080,0);\r
+       if (jaguar_mainRom_crc32==0x6a7c7430)\r
+       {\r
+               dsp_enabled=1;\r
+       }\r
+\r
+       if (jaguar_mainRom_crc32==0x2f032271)\r
+       {\r
+               dsp_enabled=1;\r
+               dsp_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+               gpu_cycles_per_scanline=(26591000/1) /((jaguar_screen_scanlines)*60);\r
+       }\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/tetris.bin",jaguar_mainRam,0x4fe4, 0x50000000,0x00);\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/painter.bin",jaguar_mainRam,0xffe4, 0x00000001,0x00);\r
+//     jaguar_load_cart("./roms/jagcd.rom",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+//     jaguar_load_cart("cart.jag",jaguar_mainRom,0x0000, 0x20000080,0);\r
+\r
+       \r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\Brain Dead 13.cdi");\r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\baldies.cdi");\r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\mystdemo.cdi");\r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\battlemorph.cdi");\r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\primalrage.cdi");\r
+//     cd_bios_boot("C:\\ftp\\jaguar\\cd\\Dragons Lair.cdi");\r
+\r
+//     jaguar_load_cart("C:/ftp/jaguar/roms/roms/raw.jag",jaguar_mainRam,0x4000, 0x40000000,0x00);\r
+#endif // #ifdef JAGUAR_WIP_RELEASE\r
+\r
+#ifdef JAGUAR_REAL_SPEED\r
+       gpu_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+       dsp_cycles_per_scanline = (26591000 / 1) / (jaguar_screen_scanlines * 60);\r
+#endif\r
+#ifdef SOUND_OUTPUT\r
+       ws_audio_init();\r
+#endif\r
+       if (jaguar_use_bios)\r
+       {\r
+               memcpy(jaguar_mainRam, jaguar_bootRom, 8);\r
+               *((uint32 *)&jaguar_mainRam[0]) = 0x00000020;\r
+       }\r
+\r
+//     s68000init();\r
+       m68k_set_cpu_type(M68K_CPU_TYPE_68000);\r
+       gpu_init();\r
+       dsp_init();\r
+       tom_init();\r
+       jerry_init();\r
+       cdrom_init();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned jaguar_byte_read(unsigned int offset)\r
+{\r
+       uint8 data = 0x00;\r
+\r
+       offset &= 0xFFFFFF;\r
+       if (offset < 0x400000)\r
+//             data = (jaguar_mainRam[(offset^0x01) & 0x3FFFFF]);\r
+               data = (jaguar_mainRam[offset & 0x3FFFFF]);\r
+       else if ((offset >= 0x800000) && (offset < 0xC00000))\r
+//             data = (jaguar_mainRom[(offset^0x01)-0x800000]);\r
+               data = (jaguar_mainRom[offset - 0x800000]);\r
+       else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
+               data = cdrom_byte_read(offset);\r
+       else if ((offset >= 0xE00000) && (offset < 0xE40000))\r
+//             data = (jaguar_bootRom[(offset^0x01) & 0x3FFFF]);\r
+               data = (jaguar_bootRom[offset & 0x3FFFF]);\r
+       else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
+               data = (tom_byte_read(offset));\r
+       else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
+               data = (jerry_byte_read(offset));\r
+       else\r
+               data = jaguar_unknown_readbyte(offset);\r
+\r
+       return data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned jaguar_word_read(unsigned int offset)\r
+{\r
+       offset &= 0xFFFFFF;\r
+       if (offset < 0x400000)\r
+       {\r
+//             return (jaguar_mainRam[(offset+1) & 0x3FFFFF] << 8) | jaguar_mainRam[(offset+0) & 0x3FFFFF];\r
+               return (jaguar_mainRam[(offset+0) & 0x3FFFFF] << 8) | jaguar_mainRam[(offset+1) & 0x3FFFFF];\r
+       }\r
+       else if ((offset >= 0x800000) && (offset < 0xC00000))\r
+       {\r
+               offset -= 0x800000;\r
+//             return (jaguar_mainRom[offset+1] << 8) | jaguar_mainRom[offset+0];\r
+               return (jaguar_mainRom[offset+0] << 8) | jaguar_mainRom[offset+1];\r
+       }\r
+       else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
+               return cdrom_word_read(offset);\r
+       else if ((offset >= 0xE00000) && (offset < 0xE40000))\r
+               return *((uint16 *)&jaguar_bootRom[offset & 0x3FFFF]);\r
+       else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
+               return tom_word_read(offset);\r
+       else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
+               return jerry_word_read(offset);\r
+\r
+       return jaguar_unknown_readword(offset);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_byte_write(unsigned  offset, unsigned  data)\r
+{\r
+       offset &= 0xFFFFFF;\r
+       if (offset < 0x400000)\r
+       {\r
+//             jaguar_mainRam[(offset^0x01) & 0x3FFFFF] = data;\r
+               jaguar_mainRam[offset & 0x3FFFFF] = data;\r
+               return;\r
+       }\r
+       else if ((offset >= 0xDFFF00) && (offset < 0xDFFF00))\r
+       {\r
+               cdrom_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
+       {\r
+               tom_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
+       {\r
+               jerry_byte_write(offset, data);\r
+               return;\r
+       }\r
+    \r
+       jaguar_unknown_writebyte(offset, data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_word_write(unsigned offset, unsigned data)\r
+{\r
+       offset &= 0xFFFFFF;\r
+       \r
+       if (offset < 0x400000)\r
+       {\r
+//             jaguar_mainRam[(offset+0) & 0x3FFFFF] = data & 0xFF;\r
+//             jaguar_mainRam[(offset+1) & 0x3FFFFF] = (data>>8) & 0xFF;\r
+               jaguar_mainRam[(offset+0) & 0x3FFFFF] = (data>>8) & 0xFF;\r
+               jaguar_mainRam[(offset+1) & 0x3FFFFF] = data & 0xFF;\r
+               return;\r
+       }\r
+       else if ((offset >= 0xDFFF00) && (offset < 0xDFFFFF))\r
+       {\r
+               cdrom_word_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF00000) && (offset < 0xF10000))\r
+       {\r
+               tom_word_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF10000) && (offset < 0xF20000))\r
+       {\r
+               jerry_word_write(offset, data);\r
+               return;\r
+       }\r
+    \r
+       jaguar_unknown_writeword(offset, data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned jaguar_long_read(unsigned int offset)\r
+{\r
+/*     uint32 data = jaguar_word_read(offset);\r
+       data = (data<<16) | jaguar_word_read(offset+2);\r
+       return data;*/\r
+       return (jaguar_word_read(offset) << 16) | jaguar_word_read(offset+2);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_long_write(unsigned offset, unsigned data)\r
+{\r
+       jaguar_word_write(offset, data >> 16);\r
+       jaguar_word_write(offset+2, data & 0xFFFF);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_done(void)\r
+{\r
+       fprintf(log_get(), "jaguar: top of stack: %08X\n", jaguar_long_read(0x001FFFF8));\r
+//     fprintf(log_get(),"jaguar: cd bios version 0x%.4x\n",jaguar_word_read(0x3004));\r
+//     fprintf(log_get(),"jaguar: vbl interrupt is %s\n",((tom_irq_enabled(IRQ_VBLANK))&&(jaguar_interrupt_handler_is_valid(64)))?"enabled":"disabled");\r
+       s68000show_context();\r
+#ifdef SOUND_OUTPUT\r
+       ws_audio_done();\r
+#endif\r
+       cd_bios_done();\r
+       cdrom_done();\r
+       tom_done();\r
+       jerry_done();\r
+//     jaguar_regionsDone();\r
+       memory_free(jaguar_mainRom);\r
+       memory_free(jaguar_bootRom);\r
+       memory_free(jaguar_mainRam);\r
+//     fprintf(log_get(),"jaguar_done()\n");\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_reset(void)\r
+{\r
+//     fprintf(log_get(),"jaguar_reset():\n");\r
+#ifdef SOUND_OUTPUT\r
+       ws_audio_reset();\r
+#endif\r
+       cd_bios_reset();\r
+       tom_reset();\r
+       jerry_reset();\r
+       gpu_reset();\r
+       dsp_reset();\r
+       cdrom_reset();\r
+//     s68000reset();\r
+    m68k_pulse_reset();                         // Reset the 68000\r
+       fprintf(log_get(), "\t68K PC=%06X SP=%08X\n", m68k_get_reg(NULL, M68K_REG_PC), m68k_get_reg(NULL, M68K_REG_A7));\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_reset_handler(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jaguar_exec(int16 * backbuffer, uint8 render)\r
+{ \r
+       int i;\r
+       uint32 vblank_duration = tom_get_vdb();\r
+\r
+       // vblank\r
+       if ((tom_irq_enabled(IRQ_VBLANK)) && (jaguar_interrupt_handler_is_valid(64)))\r
+       {\r
+               if (jaguar_word_read(0xF0004E) != 0xFFFF)\r
+               {\r
+                       tom_set_pending_video_int();\r
+//                     s68000interrupt(7, IRQ_VBLANK+64);\r
+//                     s68000flushInterrupts();\r
+                       m68k_set_irq(7);                                        // IRQ_VBLANK+64??? Not autovectored??? No.\r
+// Could set a global variable here, to signal that this is a VBLANK interrupt...\r
+// Then again, since IRQ_VBLANK is set to zero, this would not be necessary in this case.\r
+               }\r
+       }\r
+       for(i=0; i<vblank_duration; i++)\r
+       {\r
+/*             uint32 invalid_instruction_address = s68000exec(m68k_cycles_per_scanline);\r
+               if (invalid_instruction_address != 0x80000000)\r
+                       cd_bios_process(invalid_instruction_address);*/\r
+               m68k_execute(m68k_cycles_per_scanline);\r
+               // No CD handling... Hmm...\r
+\r
+               cd_bios_exec(i);\r
+               tom_pit_exec(m68k_cycles_per_scanline);\r
+               tom_exec_scanline(backbuffer, i, 0);\r
+               jerry_pit_exec(m68k_cycles_per_scanline);\r
+               jerry_i2s_exec(m68k_cycles_per_scanline);\r
+               gpu_exec(gpu_cycles_per_scanline);\r
+               if (dsp_enabled)\r
+                       dsp_exec(dsp_cycles_per_scanline);\r
+       }\r
+       \r
+       for (; i<jaguar_screen_scanlines; i++)\r
+       {\r
+/*             uint32 invalid_instruction_address = s68000exec(m68k_cycles_per_scanline);\r
+               if (invalid_instruction_address != 0x80000000)\r
+                       cd_bios_process(invalid_instruction_address);*/\r
+               m68k_execute(m68k_cycles_per_scanline);\r
+               // No CD handling... Hmm...\r
+               cd_bios_exec(i);\r
+               tom_pit_exec(m68k_cycles_per_scanline);\r
+               jerry_pit_exec(m68k_cycles_per_scanline);\r
+               jerry_i2s_exec(m68k_cycles_per_scanline);\r
+               tom_exec_scanline(backbuffer, i, render);\r
+               gpu_exec(gpu_cycles_per_scanline);\r
+               if (dsp_enabled)\r
+                       dsp_exec(dsp_cycles_per_scanline);\r
+               backbuffer += tom_width;\r
+       }\r
+#ifdef SOUND_OUTPUT\r
+       system_sound_update();\r
+#endif\r
+}\r
diff --git a/src/jerry.cpp b/src/jerry.cpp
new file mode 100644 (file)
index 0000000..4145cd8
--- /dev/null
@@ -0,0 +1,690 @@
+/***************************************************************************\r
+\r
+       Atari Jaguar hardware\r
+\r
+****************************************************************************\r
+\r
+       ------------------------------------------------------------\r
+       JERRY REGISTERS\r
+       ------------------------------------------------------------\r
+       F10000-F13FFF   R/W   xxxxxxxx xxxxxxxx   Jerry\r
+       F10000            W   xxxxxxxx xxxxxxxx   JPIT1 - timer 1 pre-scaler\r
+       F10004            W   xxxxxxxx xxxxxxxx   JPIT2 - timer 1 divider\r
+       F10008            W   xxxxxxxx xxxxxxxx   JPIT3 - timer 2 pre-scaler\r
+       F1000C            W   xxxxxxxx xxxxxxxx   JPIT4 - timer 2 divider\r
+       F10010            W   ------xx xxxxxxxx   CLK1 - processor clock divider\r
+       F10012            W   ------xx xxxxxxxx   CLK2 - video clock divider\r
+       F10014            W   -------- --xxxxxx   CLK3 - chroma clock divider\r
+       F10020          R/W   ---xxxxx ---xxxxx   JINTCTRL - interrupt control register\r
+                         W   ---x---- --------      (J_SYNCLR - clear synchronous serial intf ints)\r
+                         W   ----x--- --------      (J_ASYNCLR - clear asynchronous serial intf ints)\r
+                         W   -----x-- --------      (J_TIM2CLR - clear timer 2 [tempo] interrupts)\r
+                         W   ------x- --------      (J_TIM1CLR - clear timer 1 [sample] interrupts)\r
+                         W   -------x --------      (J_EXTCLR - clear external interrupts)\r
+                       R/W   -------- ---x----      (J_SYNENA - enable synchronous serial intf ints)\r
+                       R/W   -------- ----x---      (J_ASYNENA - enable asynchronous serial intf ints)\r
+                       R/W   -------- -----x--      (J_TIM2ENA - enable timer 2 [tempo] interrupts)\r
+                       R/W   -------- ------x-      (J_TIM1ENA - enable timer 1 [sample] interrupts)\r
+                       R/W   -------- -------x      (J_EXTENA - enable external interrupts)\r
+       F10030          R/W   -------- xxxxxxxx   ASIDATA - asynchronous serial data\r
+       F10032            W   -x------ -xxxxxxx   ASICTRL - asynchronous serial control\r
+                         W   -x------ --------      (TXBRK - transmit break)\r
+                         W   -------- -x------      (CLRERR - clear error)\r
+                         W   -------- --x-----      (RINTEN - enable receiver interrupts)\r
+                         W   -------- ---x----      (TINTEN - enable transmitter interrupts)\r
+                         W   -------- ----x---      (RXIPOL - receiver input polarity)\r
+                         W   -------- -----x--      (TXOPOL - transmitter output polarity)\r
+                         W   -------- ------x-      (PAREN - parity enable)\r
+                         W   -------- -------x      (ODD - odd parity select)\r
+       F10032          R     xxx-xxxx x-xxxxxx   ASISTAT - asynchronous serial status\r
+                       R     x------- --------      (ERROR - OR of PE,FE,OE)\r
+                       R     -x------ --------      (TXBRK - transmit break)\r
+                       R     --x----- --------      (SERIN - serial input)\r
+                       R     ----x--- --------      (OE - overrun error)\r
+                       R     -----x-- --------      (FE - framing error)\r
+                       R     ------x- --------      (PE - parity error)\r
+                       R     -------x --------      (TBE - transmit buffer empty)\r
+                       R     -------- x-------      (RBF - receive buffer full)\r
+                       R     -------- ---x----      (TINTEN - enable transmitter interrupts)\r
+                       R     -------- ----x---      (RXIPOL - receiver input polarity)\r
+                       R     -------- -----x--      (TXOPOL - transmitter output polarity)\r
+                       R     -------- ------x-      (PAREN - parity enable)\r
+                       R     -------- -------x      (ODD - odd parity)\r
+       F10034          R/W   xxxxxxxx xxxxxxxx   ASICLK - asynchronous serial interface clock\r
+       ------------------------------------------------------------\r
+       F14000-F17FFF   R/W   xxxxxxxx xxxxxxxx   Joysticks and GPIO0-5\r
+       F14000          R     xxxxxxxx xxxxxxxx   JOYSTICK - read joystick state\r
+       F14000            W   x------- xxxxxxxx   JOYSTICK - latch joystick output\r
+                         W   x------- --------      (enable joystick outputs)\r
+                         W   -------- xxxxxxxx      (joystick output data)\r
+       F14002          R     xxxxxxxx xxxxxxxx   JOYBUTS - button register\r
+       F14800-F14FFF   R/W   xxxxxxxx xxxxxxxx   GPI00 - reserved\r
+       F15000-F15FFF   R/W   xxxxxxxx xxxxxxxx   GPI01 - reserved\r
+       F16000-F16FFF   R/W   xxxxxxxx xxxxxxxx   GPI02 - reserved\r
+       F17000-F177FF   R/W   xxxxxxxx xxxxxxxx   GPI03 - reserved\r
+       F17800-F17BFF   R/W   xxxxxxxx xxxxxxxx   GPI04 - reserved\r
+       F17C00-F17FFF   R/W   xxxxxxxx xxxxxxxx   GPI05 - reserved\r
+       ------------------------------------------------------------\r
+       F18000-F1FFFF   R/W   xxxxxxxx xxxxxxxx   Jerry DSP\r
+       F1A100          R/W   xxxxxxxx xxxxxxxx   D_FLAGS - DSP flags register\r
+                       R/W   x------- --------      (DMAEN - DMA enable)\r
+                       R/W   -x------ --------      (REGPAGE - register page)\r
+                         W   --x----- --------      (D_EXT0CLR - clear external interrupt 0)\r
+                         W   ---x---- --------      (D_TIM2CLR - clear timer 2 interrupt)\r
+                         W   ----x--- --------      (D_TIM1CLR - clear timer 1 interrupt)\r
+                         W   -----x-- --------      (D_I2SCLR - clear I2S interrupt)\r
+                         W   ------x- --------      (D_CPUCLR - clear CPU interrupt)\r
+                       R/W   -------x --------      (D_EXT0ENA - enable external interrupt 0)\r
+                       R/W   -------- x-------      (D_TIM2ENA - enable timer 2 interrupt)\r
+                       R/W   -------- -x------      (D_TIM1ENA - enable timer 1 interrupt)\r
+                       R/W   -------- --x-----      (D_I2SENA - enable I2S interrupt)\r
+                       R/W   -------- ---x----      (D_CPUENA - enable CPU interrupt)\r
+                       R/W   -------- ----x---      (IMASK - interrupt mask)\r
+                       R/W   -------- -----x--      (NEGA_FLAG - ALU negative)\r
+                       R/W   -------- ------x-      (CARRY_FLAG - ALU carry)\r
+                       R/W   -------- -------x      (ZERO_FLAG - ALU zero)\r
+       F1A102          R/W   -------- ------xx   D_FLAGS - upper DSP flags\r
+                       R/W   -------- ------x-      (D_EXT1ENA - enable external interrupt 1)\r
+                       R/W   -------- -------x      (D_EXT1CLR - clear external interrupt 1)\r
+       F1A104            W   -------- ----xxxx   D_MTXC - matrix control register\r
+                         W   -------- ----x---      (MATCOL - column/row major)\r
+                         W   -------- -----xxx      (MATRIX3-15 - matrix width)\r
+       F1A108            W   ----xxxx xxxxxx--   D_MTXA - matrix address register\r
+       F1A10C            W   -------- -----x-x   D_END - data organization register\r
+                         W   -------- -----x--      (BIG_INST - big endian instruction fetch)\r
+                         W   -------- -------x      (BIG_IO - big endian I/O)\r
+       F1A110          R/W   xxxxxxxx xxxxxxxx   D_PC - DSP program counter\r
+       F1A114          R/W   xxxxxxxx xx-xxxxx   D_CTRL - DSP control/status register\r
+                       R     xxxx---- --------      (VERSION - DSP version code)\r
+                       R/W   ----x--- --------      (BUS_HOG - hog the bus!)\r
+                       R/W   -----x-- --------      (D_EXT0LAT - external interrupt 0 latch)\r
+                       R/W   ------x- --------      (D_TIM2LAT - timer 2 interrupt latch)\r
+                       R/W   -------x --------      (D_TIM1LAT - timer 1 interrupt latch)\r
+                       R/W   -------- x-------      (D_I2SLAT - I2S interrupt latch)\r
+                       R/W   -------- -x------      (D_CPULAT - CPU interrupt latch)\r
+                       R/W   -------- ---x----      (SINGLE_GO - single step one instruction)\r
+                       R/W   -------- ----x---      (SINGLE_STEP - single step mode)\r
+                       R/W   -------- -----x--      (FORCEINT0 - cause interrupt 0 on GPU)\r
+                       R/W   -------- ------x-      (CPUINT - send GPU interrupt to CPU)\r
+                       R/W   -------- -------x      (DSPGO - enable DSP execution)\r
+       F1A116          R/W   -------- -------x   D_CTRL - upper DSP control/status register\r
+                       R/W   -------- -------x      (D_EXT1LAT - external interrupt 1 latch)\r
+       F1A118-F1A11B     W   xxxxxxxx xxxxxxxx   D_MOD - modulo instruction mask\r
+       F1A11C-F1A11F   R     xxxxxxxx xxxxxxxx   D_REMAIN - divide unit remainder\r
+       F1A11C            W   -------- -------x   D_DIVCTRL - divide unit control\r
+                         W   -------- -------x      (DIV_OFFSET - 1=16.16 divide, 0=32-bit divide)\r
+       F1A120-F1A123   R     xxxxxxxx xxxxxxxx   D_MACHI - multiply & accumulate high bits\r
+       F1A148            W   xxxxxxxx xxxxxxxx   R_DAC - right transmit data\r
+       F1A14C            W   xxxxxxxx xxxxxxxx   L_DAC - left transmit data\r
+       F1A150            W   -------- xxxxxxxx   SCLK - serial clock frequency\r
+       F1A150          R     -------- ------xx   SSTAT\r
+                       R     -------- ------x-      (left - no description)\r
+                       R     -------- -------x      (WS - word strobe status)\r
+       F1A154            W   -------- --xxxx-x   SMODE - serial mode\r
+                         W   -------- --x-----      (EVERYWORD - interrupt on MSB of every word)\r
+                         W   -------- ---x----      (FALLING - interrupt on falling edge)\r
+                         W   -------- ----x---      (RISING - interrupt of rising edge)\r
+                         W   -------- -----x--      (WSEN - enable word strobes)\r
+                         W   -------- -------x      (INTERNAL - enables serial clock)\r
+       ------------------------------------------------------------\r
+       F1B000-F1CFFF   R/W   xxxxxxxx xxxxxxxx   Local DSP RAM\r
+       ------------------------------------------------------------\r
+       F1D000          R     xxxxxxxx xxxxxxxx   ROM_TRI - triangle wave\r
+       F1D200          R     xxxxxxxx xxxxxxxx   ROM_SINE - full sine wave\r
+       F1D400          R     xxxxxxxx xxxxxxxx   ROM_AMSINE - amplitude modulated sine wave\r
+       F1D600          R     xxxxxxxx xxxxxxxx   ROM_12W - sine wave and second order harmonic\r
+       F1D800          R     xxxxxxxx xxxxxxxx   ROM_CHIRP16 - chirp\r
+       F1DA00          R     xxxxxxxx xxxxxxxx   ROM_NTRI - traingle wave with noise\r
+       F1DC00          R     xxxxxxxx xxxxxxxx   ROM_DELTA - spike\r
+       F1DE00          R     xxxxxxxx xxxxxxxx   ROM_NOISE - white noise\r
+       ------------------------------------------------------------\r
+       F20000-FFFFFF   R     xxxxxxxx xxxxxxxx   Bootstrap ROM\r
+\r
+****************************************************************************/\r
+\r
+#include "jerry.h"\r
+#include "wavetable.h"\r
+#include <math.h>\r
+\r
+//#define JERRY_DEBUG\r
+\r
+static uint8 * jerry_ram_8;\r
+//static uint16 *jerry_ram_16;\r
+static uint8 * jerry_wave_rom;\r
+\r
+\r
+//#define JERRY_CONFIG jerry_ram_16[0x4002>>1]\r
+#define JERRY_CONFIG   0x4002\r
+\r
+uint8 analog_x, analog_y;\r
+\r
+static uint32 jerry_timer_1_prescaler;\r
+static uint32 jerry_timer_2_prescaler;\r
+static uint32 jerry_timer_1_divider;\r
+static uint32 jerry_timer_2_divider;\r
+static int32 jerry_timer_1_counter;\r
+static int32 jerry_timer_2_counter;\r
+\r
+static uint32 jerry_i2s_interrupt_divide = 8;\r
+static int32  jerry_i2s_interrupt_timer = -1;\r
+static int32  jerry_i2s_interrupt_cycles_per_scanline = 0;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_i2s_exec(uint32 cycles)\r
+{      \r
+       jerry_i2s_interrupt_divide &= 0xFF;\r
+\r
+       if (jerry_i2s_interrupt_timer == -1)\r
+       {\r
+               uint32 jerry_i2s_int_freq = (26591000 / 64) / (jerry_i2s_interrupt_divide + 1);\r
+               jerry_i2s_interrupt_cycles_per_scanline = 13300000 / jerry_i2s_int_freq;\r
+               jerry_i2s_interrupt_timer = jerry_i2s_interrupt_cycles_per_scanline;\r
+               //fprintf(log_get(),"jerry: i2s interrupt rate set to %i hz (every %i cpu clock cycles) jerry_i2s_interrupt_divide=%i\n",jerry_i2s_int_freq,jerry_i2s_interrupt_cycles_per_scanline,jerry_i2s_interrupt_divide);\r
+               pcm_set_sample_rate(jerry_i2s_int_freq);\r
+       }\r
+       jerry_i2s_interrupt_timer -= cycles;\r
+       // note : commented since the sound doesn't work properly else\r
+       if (1)//jerry_i2s_interrupt_timer<=0)\r
+       {\r
+               // i2s interrupt\r
+               dsp_check_if_i2s_interrupt_needed();\r
+               //fprintf(log_get(),"jerry_i2s_interrupt_timer=%i, generating an i2s interrupt\n",jerry_i2s_interrupt_timer);\r
+               jerry_i2s_interrupt_timer += jerry_i2s_interrupt_cycles_per_scanline;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_reset_i2s_timer(void)\r
+{\r
+       //fprintf(log_get(),"i2s: reseting\n");\r
+       jerry_i2s_interrupt_divide=8;\r
+       jerry_i2s_interrupt_timer=-1;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_reset_timer_1(void)\r
+{\r
+       if ((!jerry_timer_1_prescaler)||(!jerry_timer_1_divider))\r
+               jerry_timer_1_counter=0;\r
+       else\r
+               jerry_timer_1_counter=(1+jerry_timer_1_prescaler)*(1+jerry_timer_1_divider);\r
+\r
+//     if (jerry_timer_1_counter)\r
+//             fprintf(log_get(),"jerry: reseting timer 1 to 0x%.8x (%i)\n",jerry_timer_1_counter,jerry_timer_1_counter);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_reset_timer_2(void)\r
+{\r
+       if ((!jerry_timer_2_prescaler)||(!jerry_timer_2_divider))\r
+       {\r
+               jerry_timer_2_counter=0;\r
+               return;\r
+       }\r
+       else\r
+               jerry_timer_2_counter=((1+jerry_timer_2_prescaler)*(1+jerry_timer_2_divider));\r
+\r
+//     if (jerry_timer_2_counter)\r
+//             fprintf(log_get(),"jerry: reseting timer 2 to 0x%.8x (%i)\n",jerry_timer_2_counter,jerry_timer_2_counter);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_pit_exec(uint32 cycles)\r
+{\r
+       if (jerry_timer_1_counter)\r
+               jerry_timer_1_counter-=cycles;\r
+\r
+       if (jerry_timer_1_counter<=0)\r
+       {\r
+               dsp_set_irq_line(2,1);\r
+               jerry_reset_timer_1();\r
+       }\r
+\r
+       if (jerry_timer_2_counter)\r
+               jerry_timer_2_counter-=cycles;\r
+\r
+       if (jerry_timer_2_counter<=0)\r
+       {\r
+               dsp_set_irq_line(3,1);\r
+               jerry_reset_timer_2();\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_wave_rom_init(void)\r
+{\r
+       memory_malloc_secure((void **)&jerry_wave_rom, 0x1000, "jerry wave rom");\r
+       uint32 * jaguar_wave_rom_32 = (uint32 *)jerry_wave_rom;\r
+\r
+/*     for (i = 0; i < 0x80; i++)\r
+       {\r
+               // F1D000 = triangle wave \r
+               jaguar_wave_rom_32[0x000 + i] = ((i <= 0x40) ? i : 0x80 - i) * 32767 / 0x40;\r
+\r
+               // F1D200 = full sine wave \r
+               jaguar_wave_rom_32[0x080 + i] = (int)(32767. * sin(2.0 * 3.1415927 * (double)i / (double)0x80));\r
+\r
+               // F1D400 = amplitude modulated sine wave? \r
+               jaguar_wave_rom_32[0x100 + i] = (int)(32767. * sin(2.0 * 3.1415927 * (double)i / (double)0x80));\r
+\r
+               // F1D600 = sine wave and second order harmonic \r
+               jaguar_wave_rom_32[0x180 + i] = (int)(32767. * sin(2.0 * 3.1415927 * (double)i / (double)0x80));\r
+\r
+               // F1D800 = chirp (sine wave of increasing frequency) \r
+               jaguar_wave_rom_32[0x200 + i] = (int)(32767. * sin(2.0 * 3.1415927 * (double)i / (double)0x80));\r
+\r
+               // F1DA00 = traingle wave with noise \r
+               jaguar_wave_rom_32[0x280 + i] = jaguar_wave_rom_32[0x000 + i] * (rand() % 32768) / 32768;\r
+\r
+               // F1DC00 = spike \r
+               jaguar_wave_rom_32[0x300 + i] = (i == 0x40) ? 32767 : 0;\r
+\r
+               // F1DE00 = white noise \r
+               jaguar_wave_rom_32[0x380 + i] = rand() % 32768;\r
+       }\r
+       */\r
+       // use real wave table dump\r
+// Looks like this WT dump is in the wrong endian...\r
+       memcpy(jerry_wave_rom, wave_table, 0x1000);\r
+\r
+       // reverse byte ordering\r
+// Actually, this does nothing...\r
+       for(int i=0; i<0x400; i++)\r
+       {\r
+               uint32 data = jaguar_wave_rom_32[i];\r
+               data = ((data&0xff000000)>>24)|((data&0x0000ff00)<<8)|\r
+                        ((data&0x00ff0000)>>8) |((data&0x000000ff)<<24);\r
+       }\r
+       \r
+       // copy it to dsp ram\r
+       memcpy(&jerry_ram_8[0xD000], jerry_wave_rom, 0x1000);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_init(void)\r
+{\r
+       //fprintf(log_get(),"jerry_init()\n");\r
+       clock_init();\r
+       anajoy_init();\r
+       joystick_init();\r
+       eeprom_init();\r
+       memory_malloc_secure((void **)&jerry_ram_8, 0x10000, "jerry ram");\r
+//     jerry_ram_16 = (uint16 *)jerry_ram_8;\r
+       jerry_wave_rom_init();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_reset(void)\r
+{\r
+       //fprintf(log_get(),"jerry_reset()\n");\r
+       clock_reset();\r
+       anajoy_reset();\r
+       joystick_reset();\r
+       eeprom_reset();\r
+       jerry_reset_i2s_timer();\r
+\r
+       memset(jerry_ram_8, 0x00, 0x10000);\r
+       jerry_ram_8[JERRY_CONFIG+1] |= 0x10; // NTSC (bit 4)\r
+       jerry_timer_1_prescaler = 0xFFFF;\r
+       jerry_timer_2_prescaler = 0xFFFF;\r
+       jerry_timer_1_divider = 0xFFFF;\r
+       jerry_timer_2_divider = 0xFFFF;\r
+       jerry_timer_1_counter = 0;\r
+       jerry_timer_2_counter = 0;\r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_done(void)\r
+{\r
+       //fprintf(log_get(),"jerry_done()\n");\r
+       memory_free(jerry_ram_8);\r
+       clock_done();\r
+       anajoy_done();\r
+       joystick_done();\r
+       eeprom_done();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned jerry_byte_read(unsigned int offset)\r
+{\r
+#ifdef JERRY_DEBUG\r
+       fprintf(log_get(),"jerry: reading byte at 0x%.6x\n",offset);\r
+#endif\r
+       if ((offset >= dsp_control_ram_base) && (offset < dsp_control_ram_base+0x20))\r
+               return dsp_byte_read(offset);\r
+\r
+       if ((offset >= dsp_work_ram_base) && (offset < dsp_work_ram_base+0x2000))\r
+               return dsp_byte_read(offset);\r
+\r
+       if ((offset >= 0xF10000) && (offset <= 0xF10007))\r
+       {\r
+               switch(offset & 0x07)\r
+               {\r
+               case 0: return(jerry_timer_1_prescaler>>8);\r
+               case 1: return(jerry_timer_1_prescaler&0xff);\r
+               case 2: return(jerry_timer_1_divider>>8);\r
+               case 3: return(jerry_timer_1_divider&0xff);\r
+               case 4: return(jerry_timer_2_prescaler>>8);\r
+               case 5: return(jerry_timer_2_prescaler&0xff);\r
+               case 6: return(jerry_timer_2_divider>>8);\r
+               case 7: return(jerry_timer_2_divider&0xff);\r
+               }\r
+       }\r
+\r
+       if ((offset>=0xf10010)&&(offset<0xf10016))\r
+               return(clock_byte_read(offset));\r
+       \r
+       if ((offset>=0xf17c00)&&(offset<0xf17c02))\r
+               return(anajoy_byte_read(offset));\r
+       \r
+       if ((offset>=0xf14000)&&(offset<=0xf14003))\r
+       {\r
+               return(joystick_byte_read(offset)|eeprom_byte_read(offset));\r
+       }\r
+       \r
+       if ((offset >= 0xF14000) && (offset <= 0xF1A0FF))\r
+               return(eeprom_byte_read(offset));\r
+       \r
+       return jerry_ram_8[offset & 0xFFFF];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+unsigned jerry_word_read(unsigned int offset)\r
+{\r
+#ifdef JERRY_DEBUG\r
+       fprintf(log_get(),"jerry: reading word at 0x%.6x\n",offset);\r
+#endif\r
+       if ((offset>=dsp_control_ram_base)&&(offset<dsp_control_ram_base+0x20))\r
+               return(dsp_word_read(offset));\r
+\r
+       if ((offset>=dsp_work_ram_base)&&(offset<dsp_work_ram_base+0x2000))\r
+               return(dsp_word_read(offset));\r
+\r
+       if ((offset>=0xf10000)&&(offset<=0xf10007))\r
+       {\r
+               switch(offset&0x07)\r
+               {\r
+               case 0: return(jerry_timer_1_prescaler);\r
+               case 2: return(jerry_timer_1_divider);\r
+               case 4: return(jerry_timer_2_prescaler);\r
+               case 6: return(jerry_timer_2_divider);\r
+               }\r
+       }\r
+\r
+       if ((offset>=0xf10010)&&(offset<0xf10016))\r
+               return(clock_word_read(offset));\r
+\r
+       if (offset==0xF10020)\r
+               return(0x00);\r
+\r
+       if ((offset>=0xf17c00)&&(offset<0xf17c02))\r
+               return(anajoy_word_read(offset));\r
+\r
+       if (offset==0xf14000)\r
+       {\r
+               uint16 dta=(joystick_word_read(offset)&0xfffe)|eeprom_word_read(offset);\r
+               //fprintf(log_get(),"reading 0x%.4x from 0xf14000\n");\r
+               return(dta);\r
+       }\r
+       if ((offset>=0xf14002)&&(offset<0xf14003))\r
+               return(joystick_word_read(offset));\r
+\r
+       if ((offset>=0xf14000)&&(offset<=0xF1A0FF))\r
+               return(eeprom_word_read(offset));\r
+\r
+\r
+\r
+       offset&=0xffff;\r
+       if (offset==0x4002)\r
+               return(0xffff);\r
+       \r
+\r
+       uint16 data=jerry_ram_8[offset+0];\r
+       data<<=8;\r
+       data|=jerry_ram_8[offset+1];\r
+       return(data);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_byte_write(unsigned  offset, unsigned  data)\r
+{\r
+#ifdef JERRY_DEBUG\r
+       fprintf(log_get(),"jerry: writing byte %.2x at 0x%.6x\n",data,offset);\r
+#endif\r
+       if ((offset>=dsp_control_ram_base)&&(offset<dsp_control_ram_base+0x20))\r
+       {\r
+               dsp_byte_write(offset,data);\r
+               return;\r
+       }\r
+       if ((offset>=dsp_work_ram_base)&&(offset<dsp_work_ram_base+0x2000))\r
+       {\r
+               dsp_byte_write(offset,data);\r
+               return;\r
+       }\r
+\r
+       if ((offset>=0xf1a152)&&(offset<0xf1a154))\r
+       {\r
+//             fprintf(log_get(),"i2s: writing 0x%.2x to SCLK\n",data);\r
+               if ((offset&0x03)==2)\r
+                       jerry_i2s_interrupt_divide=(jerry_i2s_interrupt_divide&0x00ff)|(((uint32)data)<<8);\r
+               else\r
+                       jerry_i2s_interrupt_divide=(jerry_i2s_interrupt_divide&0xff00)|((uint32)data);\r
+\r
+               jerry_i2s_interrupt_timer=-1;\r
+               jerry_i2s_exec(0);\r
+       }\r
+       if ((offset>=0xf10000)&&(offset<=0xf10007))\r
+       {\r
+               switch(offset&0x07)\r
+               {\r
+               case 0: { jerry_timer_1_prescaler=(jerry_timer_1_prescaler&0x00ff)|(data<<8);   jerry_reset_timer_1(); return; }\r
+               case 1: { jerry_timer_1_prescaler=(jerry_timer_1_prescaler&0xff00)|(data);              jerry_reset_timer_1(); return; }\r
+               case 2: { jerry_timer_1_divider=(jerry_timer_1_divider&0x00ff)|(data<<8);               jerry_reset_timer_1(); return; }\r
+               case 3: { jerry_timer_1_divider=(jerry_timer_1_divider&0xff00)|(data);                  jerry_reset_timer_1(); return; }\r
+               case 4: { jerry_timer_2_prescaler=(jerry_timer_2_prescaler&0x00ff)|(data<<8);   jerry_reset_timer_2(); return; }\r
+               case 5: { jerry_timer_2_prescaler=(jerry_timer_2_prescaler&0xff00)|(data);              jerry_reset_timer_2(); return; }\r
+               case 6: { jerry_timer_2_divider=(jerry_timer_2_divider&0x00ff)|(data<<8);               jerry_reset_timer_2(); return; }\r
+               case 7: { jerry_timer_2_divider=(jerry_timer_2_divider&0xff00)|(data);                  jerry_reset_timer_2(); return; }\r
+               }\r
+       }\r
+\r
+\r
+       if ((offset>=0xf10010)&&(offset<0xf10016))\r
+       {\r
+               clock_byte_write(offset,data);\r
+               return;\r
+       }\r
+       if ((offset>=0xf17c00)&&(offset<0xf17c02))\r
+       {\r
+               anajoy_byte_write(offset,data);\r
+               return;\r
+       }\r
+       if ((offset>=0xf14000)&&(offset<0xf14003))\r
+       {\r
+               joystick_byte_write(offset,data);\r
+               eeprom_byte_write(offset,data);\r
+               return;\r
+       }\r
+       if ((offset>=0xf14000)&&(offset<=0xF1A0FF))\r
+       {\r
+               eeprom_byte_write(offset,data);\r
+               return;\r
+       }\r
+       offset&=0xffff; \r
+       jerry_ram_8[offset]=data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void jerry_word_write(unsigned offset, unsigned data)\r
+{\r
+#ifdef JERRY_DEBUG\r
+       fprintf(log_get(), "JERRY: Writing word %04X at %06X\n", data, offset);\r
+#endif\r
+\r
+       if ((offset >= dsp_control_ram_base) && (offset < dsp_control_ram_base+0x20))\r
+       {\r
+               dsp_word_write(offset, data);\r
+               return;\r
+       }\r
+       if ((offset >=dsp_work_ram_base) && (offset < dsp_work_ram_base+0x2000))\r
+       {\r
+               dsp_word_write(offset, data);\r
+               return;\r
+       }\r
+       if (offset == 0xF1A152)\r
+       {\r
+//             fprintf(log_get(),"i2s: writing 0x%.4x to SCLK\n",data);\r
+               jerry_i2s_interrupt_divide = data & 0xFF;\r
+               jerry_i2s_interrupt_timer = -1;\r
+               jerry_i2s_exec(0);\r
+       }\r
+\r
+       if ((offset >= 0xF10000) && (offset <= 0xF10007))\r
+       {\r
+               switch(offset & 0x07)\r
+               {\r
+               case 0: { jerry_timer_1_prescaler=data; jerry_reset_timer_1(); return; }\r
+               case 2: { jerry_timer_1_divider=data;   jerry_reset_timer_1(); return; }\r
+               case 4: { jerry_timer_2_prescaler=data; jerry_reset_timer_2(); return; }\r
+               case 6: { jerry_timer_2_divider=data;   jerry_reset_timer_2(); return; }\r
+               }\r
+       }\r
+       \r
+       if ((offset >= 0xF1A148) && (offset < 0xF1A150)) \r
+       { \r
+               pcm_word_write(offset-0xF1A148, data); \r
+               return; \r
+       }\r
+\r
+       if ((offset >= 0xF10010) && (offset < 0xF10016))\r
+       {\r
+               clock_word_write(offset, data);\r
+               return;\r
+       }\r
+       if ((offset >= 0xf17C00) && (offset < 0xF17C02))\r
+       {\r
+               anajoy_word_write(offset, data);\r
+               return;\r
+       }\r
+       if ((offset >= 0xF14000) && (offset < 0xF14003))\r
+       {\r
+               joystick_word_write(offset, data);\r
+               eeprom_word_write(offset, data);\r
+               return;\r
+       }\r
+       if ((offset >= 0xF14000) && (offset <= 0xF1A0FF))\r
+       {\r
+               eeprom_word_write(offset,data);\r
+               return;\r
+       }\r
+\r
+       jerry_ram_8[(offset+0) & 0xFFFF] = (data >> 8) & 0xFF;\r
+       jerry_ram_8[(offset+1) & 0xFFFF] = data & 0xFF;\r
+       \r
+}\r
diff --git a/src/joystick.cpp b/src/joystick.cpp
new file mode 100644 (file)
index 0000000..88da109
--- /dev/null
@@ -0,0 +1,264 @@
+#ifndef __PORT__\r
+#include "include/stdafx.h"\r
+#include <mmsystem.h>\r
+#endif\r
+#include <time.h>\r
+#include <SDL.h>\r
+#include "include/SDLptc.h"\r
+#include "include/jaguar.h"\r
+\r
+void main_screen_switch(void);\r
+\r
+\r
+#define BUTTON_U               0\r
+#define BUTTON_D               1\r
+#define BUTTON_L               2\r
+#define BUTTON_R               3\r
+#define BUTTON_1               4\r
+#define BUTTON_4               5\r
+#define BUTTON_7               6\r
+#define BUTTON_s               7\r
+#define BUTTON_0               8\r
+#define BUTTON_8               9\r
+#define BUTTON_5               10\r
+#define BUTTON_2               11\r
+#define BUTTON_d               12\r
+#define BUTTON_9               13\r
+#define BUTTON_6               14\r
+#define BUTTON_3               15\r
+\r
+\r
+#define BUTTON_A               16\r
+#define BUTTON_B               17\r
+#define BUTTON_C               18\r
+#define BUTTON_OPTION  19\r
+#define BUTTON_PAUSE   20\r
+\r
+static uint8 joystick_ram[4];\r
+static uint8 joypad_0_buttons[21];\r
+static uint8 joypad_1_buttons[21];\r
+extern uint8 finished;\r
+extern int start_logging;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_init(void)\r
+{\r
+       joystick_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_exec(void)\r
+{\r
+\r
+       uint8    *keystate = SDL_GetKeyState(NULL);\r
+       Sint16    x = 0, y = 0;\r
+       extern   Console console;\r
+       \r
+       memset(joypad_0_buttons,0,21);\r
+       memset(joypad_1_buttons,0,21);\r
+\r
+       if ((keystate[SDLK_LALT])&(keystate[SDLK_RETURN]))      main_screen_switch();\r
+\r
+       /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com) */\r
+\r
+       if (keystate[SDLK_UP])          joypad_0_buttons[BUTTON_U]=0x01;\r
+       if (keystate[SDLK_DOWN])        joypad_0_buttons[BUTTON_D]=0x01;\r
+       if (keystate[SDLK_LEFT])        joypad_0_buttons[BUTTON_L]=0x01;\r
+       if (keystate[SDLK_RIGHT])       joypad_0_buttons[BUTTON_R]=0x01;\r
+       if (keystate[SDLK_z])           joypad_0_buttons[BUTTON_A]=0x01;\r
+       if (keystate[SDLK_x])           joypad_0_buttons[BUTTON_B]=0x01;\r
+       if (keystate[SDLK_c])           joypad_0_buttons[BUTTON_C]=0x01;\r
+       if (keystate[SDLK_TAB])         joypad_0_buttons[BUTTON_OPTION]=0x01;\r
+       if (keystate[SDLK_RETURN])      joypad_0_buttons[BUTTON_PAUSE]=0x01;\r
+       if (keystate[SDLK_q])           start_logging=1;\r
+       if (keystate[SDLK_w])           gpu_reset_stats();\r
+//f (keystate[SDLK_u])         jaguar_long_write(0xf1c384,jaguar_long_read(0xf1c384)+1);\r
+\r
+       if (keystate[SDLK_KP0])         joypad_0_buttons[BUTTON_0]=0x01;\r
+       if (keystate[SDLK_KP1])         joypad_0_buttons[BUTTON_1]=0x01;\r
+       if (keystate[SDLK_KP2])         joypad_0_buttons[BUTTON_2]=0x01;\r
+       if (keystate[SDLK_KP3])         joypad_0_buttons[BUTTON_3]=0x01;\r
+       if (keystate[SDLK_KP4])         joypad_0_buttons[BUTTON_4]=0x01;\r
+       if (keystate[SDLK_KP5])         joypad_0_buttons[BUTTON_5]=0x01;\r
+       if (keystate[SDLK_KP6])         joypad_0_buttons[BUTTON_6]=0x01;\r
+       if (keystate[SDLK_KP7])         joypad_0_buttons[BUTTON_7]=0x01;\r
+       if (keystate[SDLK_KP8])         joypad_0_buttons[BUTTON_8]=0x01;\r
+       if (keystate[SDLK_KP9])         joypad_0_buttons[BUTTON_9]=0x01;\r
+       \r
+    if (keystate[SDLK_ESCAPE]) finished=1;\r
+    \r
+    /* Added/Changed by SDLEMU (http://sdlemu.ngemu.com */\r
+    /* Joystick support                                 */\r
+    \r
+    if ( console.JoyEnabled() == 1 ) {\r
+    \r
+       x = SDL_JoystickGetAxis(console.joystick, 0);\r
+       y = SDL_JoystickGetAxis(console.joystick, 1);\r
+       \r
+       if ( x > 16384  ) joypad_0_buttons[BUTTON_R]=0x01;\r
+       if ( x < -16384 ) joypad_0_buttons[BUTTON_L]=0x01;\r
+       if ( y > 16384  ) joypad_0_buttons[BUTTON_D]=0x01;\r
+       if ( y < -16384 ) joypad_0_buttons[BUTTON_U]=0x01;\r
+       \r
+       if (SDL_JoystickGetButton(console.joystick, 0) == SDL_PRESSED) joypad_0_buttons[BUTTON_A]=0x01;\r
+       if (SDL_JoystickGetButton(console.joystick, 1) == SDL_PRESSED) joypad_0_buttons[BUTTON_B]=0x01;\r
+       if (SDL_JoystickGetButton(console.joystick, 2) == SDL_PRESSED) joypad_0_buttons[BUTTON_C]=0x01;\r
+\r
+       }\r
+       \r
+       /* ADDED by SDLEMU (http://sdlemu.ngemu.com */\r
+       /* Needed to make sure that the events queue is empty */\r
+    SDL_PumpEvents();            \r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_reset(void)\r
+{\r
+       memset(joystick_ram,0x00,4);\r
+       memset(joypad_0_buttons,0,21);\r
+       memset(joypad_1_buttons,0,21);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_byte_write(uint32 offset, uint8 data)\r
+{\r
+       joystick_ram[offset&0x03]=data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void joystick_word_write(uint32 offset, uint16 data)\r
+{\r
+       offset&=0x03;\r
+       joystick_ram[offset+0]=(data>>8)&0xff;\r
+       joystick_ram[offset+1]=data&0xff;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 joystick_byte_read(uint32 offset)\r
+{\r
+       offset&=0x03;\r
+\r
+       if (offset==0)\r
+       {\r
+               uint8 data=0x00;\r
+               int pad0Index=joystick_ram[1]&0x0f;\r
+               int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
+               \r
+               if (!(pad0Index&0x01)) \r
+                       pad0Index=0;\r
+               else\r
+               if (!(pad0Index&0x02)) \r
+                       pad0Index=1;\r
+               else\r
+               if (!(pad0Index&0x04)) \r
+                       pad0Index=2;\r
+               else\r
+                       pad0Index=3;\r
+               \r
+               if (!(pad1Index&0x01)) \r
+                       pad1Index=0;\r
+               else\r
+               if (!(pad1Index&0x02)) \r
+                       pad1Index=1;\r
+               else\r
+               if (!(pad1Index&0x04)) \r
+                       pad1Index=2;\r
+               else\r
+                       pad1Index=3;\r
+\r
+               if (joypad_0_buttons[(pad0Index<<2)+0]) data|=0x01;\r
+               if (joypad_0_buttons[(pad0Index<<2)+1]) data|=0x02;\r
+               if (joypad_0_buttons[(pad0Index<<2)+2]) data|=0x04;\r
+               if (joypad_0_buttons[(pad0Index<<2)+3]) data|=0x08;\r
+               if (joypad_1_buttons[(pad1Index<<2)+0]) data|=0x10;\r
+               if (joypad_1_buttons[(pad1Index<<2)+1]) data|=0x20;\r
+               if (joypad_1_buttons[(pad1Index<<2)+2]) data|=0x40;\r
+               if (joypad_1_buttons[(pad1Index<<2)+3]) data|=0x80;\r
+               return(~data);\r
+       }\r
+       else\r
+       if (offset==3)\r
+       {\r
+               uint8 data=((1<<5)|(1<<4)|0x0f) ;\r
+               int pad0Index=joystick_ram[1]&0x0f;\r
+               int pad1Index=(joystick_ram[1]>>4)&0x0f;\r
+               \r
+               if (!(pad0Index&0x01)) \r
+               {\r
+                       if (joypad_0_buttons[BUTTON_PAUSE]) data^=0x01;\r
+                       if (joypad_0_buttons[BUTTON_A]) data^=0x02;\r
+               }\r
+               else\r
+               if (!(pad0Index&0x02)) \r
+               {\r
+                       if (joypad_0_buttons[BUTTON_B])          data^=0x02;\r
+               }\r
+               else\r
+               if (!(pad0Index&0x04)) \r
+               {\r
+                       if (joypad_0_buttons[BUTTON_C]) data^=0x02;\r
+               }\r
+               else\r
+               {\r
+                       if (joypad_0_buttons[BUTTON_OPTION]) data^=0x02;\r
+               }               \r
+               return(data);\r
+       }\r
+       return(joystick_ram[offset]);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 joystick_word_read(uint32 offset)\r
+{\r
+       uint16 data=joystick_byte_read((offset+0)&0x03);\r
+       data<<=8;\r
+       data|=joystick_byte_read((offset+1)&0x03);\r
+       return(data);\r
+}\r
diff --git a/src/log.cpp b/src/log.cpp
new file mode 100644 (file)
index 0000000..56a5b52
--- /dev/null
@@ -0,0 +1,60 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/log.h"\r
+\r
+FILE   *log_stream=NULL;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+int log_init(char *path)\r
+{\r
+       log_stream=fopen(path,"wrt");\r
+       if (log_stream==NULL)\r
+               return(0);\r
+       return(1);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+FILE *log_get(void)\r
+{\r
+       return(log_stream);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void log_done(void)\r
+{\r
+       fclose(log_stream);\r
+}\r
diff --git a/src/m68k.h b/src/m68k.h
new file mode 100644 (file)
index 0000000..fffe2ed
--- /dev/null
@@ -0,0 +1,346 @@
+#ifndef M68K__HEADER\r
+#define M68K__HEADER\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================ GENERAL DEFINES =========================== */\r
+\r
+/* ======================================================================== */\r
+\r
+/* There are 7 levels of interrupt to the 68K.\r
+ * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI).\r
+ */\r
+#define M68K_IRQ_NONE 0\r
+#define M68K_IRQ_1    1\r
+#define M68K_IRQ_2    2\r
+#define M68K_IRQ_3    3\r
+#define M68K_IRQ_4    4\r
+#define M68K_IRQ_5    5\r
+#define M68K_IRQ_6    6\r
+#define M68K_IRQ_7    7\r
+\r
+\r
+/* Special interrupt acknowledge values.\r
+ * Use these as special returns from the interrupt acknowledge callback\r
+ * (specified later in this header).\r
+ */\r
+\r
+/* Causes an interrupt autovector (0x18 + interrupt level) to be taken.\r
+ * This happens in a real 68K if VPA or AVEC is asserted during an interrupt\r
+ * acknowledge cycle instead of DTACK.\r
+ */\r
+#define M68K_INT_ACK_AUTOVECTOR    0xffffffff\r
+\r
+/* Causes the spurious interrupt vector (0x18) to be taken\r
+ * This happens in a real 68K if BERR is asserted during the interrupt\r
+ * acknowledge cycle (i.e. no devices responded to the acknowledge).\r
+ */\r
+#define M68K_INT_ACK_SPURIOUS      0xfffffffe\r
+\r
+\r
+/* CPU types for use in m68k_set_cpu_type() */\r
+enum\r
+{\r
+       M68K_CPU_TYPE_INVALID,\r
+       M68K_CPU_TYPE_68000,\r
+       M68K_CPU_TYPE_68010,\r
+       M68K_CPU_TYPE_68EC020,\r
+       M68K_CPU_TYPE_68020,\r
+       M68K_CPU_TYPE_68030,    /* Supported by disassembler ONLY */\r
+       M68K_CPU_TYPE_68040             /* Supported by disassembler ONLY */\r
+};\r
+\r
+/* Registers used by m68k_get_reg() and m68k_set_reg() */\r
+typedef enum\r
+{\r
+       /* Real registers */\r
+       M68K_REG_D0,            /* Data registers */\r
+       M68K_REG_D1,\r
+       M68K_REG_D2,\r
+       M68K_REG_D3,\r
+       M68K_REG_D4,\r
+       M68K_REG_D5,\r
+       M68K_REG_D6,\r
+       M68K_REG_D7,\r
+       M68K_REG_A0,            /* Address registers */\r
+       M68K_REG_A1,\r
+       M68K_REG_A2,\r
+       M68K_REG_A3,\r
+       M68K_REG_A4,\r
+       M68K_REG_A5,\r
+       M68K_REG_A6,\r
+       M68K_REG_A7,\r
+       M68K_REG_PC,            /* Program Counter */\r
+       M68K_REG_SR,            /* Status Register */\r
+       M68K_REG_SP,            /* The current Stack Pointer (located in A7) */\r
+       M68K_REG_USP,           /* User Stack Pointer */\r
+       M68K_REG_ISP,           /* Interrupt Stack Pointer */\r
+       M68K_REG_MSP,           /* Master Stack Pointer */\r
+       M68K_REG_SFC,           /* Source Function Code */\r
+       M68K_REG_DFC,           /* Destination Function Code */\r
+       M68K_REG_VBR,           /* Vector Base Register */\r
+       M68K_REG_CACR,          /* Cache Control Register */\r
+       M68K_REG_CAAR,          /* Cache Address Register */\r
+\r
+       /* Assumed registers */\r
+       /* These are cheat registers which emulate the 1-longword prefetch\r
+        * present in the 68000 and 68010.\r
+        */ \r
+       M68K_REG_PREF_ADDR,     /* Last prefetch address */\r
+       M68K_REG_PREF_DATA,     /* Last prefetch data */\r
+\r
+       /* Convenience registers */\r
+       M68K_REG_PPC,           /* Previous value in the program counter */\r
+       M68K_REG_IR,            /* Instruction register */\r
+       M68K_REG_CPU_TYPE       /* Type of CPU being run */\r
+} m68k_register_t;\r
+\r
+/* ======================================================================== */\r
+/* ====================== FUNCTIONS CALLED BY THE CPU ===================== */\r
+/* ======================================================================== */\r
+\r
+/* You will have to implement these functions */\r
+\r
+/* read/write functions called by the CPU to access memory.\r
+ * while values used are 32 bits, only the appropriate number\r
+ * of bits are relevant (i.e. in write_memory_8, only the lower 8 bits\r
+ * of value should be written to memory).\r
+ *\r
+ * NOTE: I have separated the immediate and PC-relative memory fetches\r
+ *       from the other memory fetches because some systems require\r
+ *       differentiation between PROGRAM and DATA fetches (usually\r
+ *       for security setups such as encryption).\r
+ *       This separation can either be achieved by setting\r
+ *       M68K_SEPARATE_READS in m68kconf.h and defining\r
+ *       the read functions, or by setting M68K_EMULATE_FC and\r
+ *       making a function code callback function.\r
+ *       Using the callback offers better emulation coverage\r
+ *       because you can also monitor whether the CPU is in SYSTEM or\r
+ *       USER mode, but it is also slower.\r
+ */\r
+\r
+/* Read from anywhere */\r
+unsigned int  m68k_read_memory_8(unsigned int address);\r
+unsigned int  m68k_read_memory_16(unsigned int address);\r
+unsigned int  m68k_read_memory_32(unsigned int address);\r
+\r
+/* Read data immediately following the PC */\r
+unsigned int  m68k_read_immediate_16(unsigned int address);\r
+unsigned int  m68k_read_immediate_32(unsigned int address);\r
+\r
+/* Read data relative to the PC */\r
+unsigned int  m68k_read_pcrelative_8(unsigned int address);\r
+unsigned int  m68k_read_pcrelative_16(unsigned int address);\r
+unsigned int  m68k_read_pcrelative_32(unsigned int address);\r
+\r
+/* Memory access for the disassembler */\r
+unsigned int m68k_read_disassembler_8  (unsigned int address);\r
+unsigned int m68k_read_disassembler_16 (unsigned int address);\r
+unsigned int m68k_read_disassembler_32 (unsigned int address);\r
+\r
+/* Write to anywhere */\r
+void m68k_write_memory_8(unsigned int address, unsigned int value);\r
+void m68k_write_memory_16(unsigned int address, unsigned int value);\r
+void m68k_write_memory_32(unsigned int address, unsigned int value);\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== CALLBACKS =============================== */\r
+/* ======================================================================== */\r
+\r
+/* These functions allow you to set callbacks to the host when specific events\r
+ * occur.  Note that you must enable the corresponding value in m68kconf.h\r
+ * in order for these to do anything useful.\r
+ * Note: I have defined default callbacks which are used if you have enabled\r
+ * the corresponding #define in m68kconf.h but either haven't assigned a\r
+ * callback or have assigned a callback of NULL.\r
+ */\r
+\r
+/* Set the callback for an interrupt acknowledge.\r
+ * You must enable M68K_EMULATE_INT_ACK in m68kconf.h.\r
+ * The CPU will call the callback with the interrupt level being acknowledged.\r
+ * The host program must return either a vector from 0x02-0xff, or one of the\r
+ * special interrupt acknowledge values specified earlier in this header.\r
+ * If this is not implemented, the CPU will always assume an autovectored\r
+ * interrupt, and will automatically clear the interrupt request when it\r
+ * services the interrupt.\r
+ * Default behavior: return M68K_INT_ACK_AUTOVECTOR.\r
+ */\r
+void m68k_set_int_ack_callback(int  (*callback)(int int_level));\r
+\r
+\r
+/* Set the callback for a breakpoint acknowledge (68010+).\r
+ * You must enable M68K_EMULATE_BKPT_ACK in m68kconf.h.\r
+ * The CPU will call the callback with whatever was in the data field of the\r
+ * BKPT instruction for 68020+, or 0 for 68010.\r
+ * Default behavior: do nothing.\r
+ */\r
+void m68k_set_bkpt_ack_callback(void (*callback)(unsigned int data));\r
+\r
+\r
+/* Set the callback for the RESET instruction.\r
+ * You must enable M68K_EMULATE_RESET in m68kconf.h.\r
+ * The CPU calls this callback every time it encounters a RESET instruction.\r
+ * Default behavior: do nothing.\r
+ */\r
+void m68k_set_reset_instr_callback(void  (*callback)(void));\r
+\r
+\r
+/* Set the callback for informing of a large PC change.\r
+ * You must enable M68K_MONITOR_PC in m68kconf.h.\r
+ * The CPU calls this callback with the new PC value every time the PC changes\r
+ * by a large value (currently set for changes by longwords).\r
+ * Default behavior: do nothing.\r
+ */\r
+void m68k_set_pc_changed_callback(void  (*callback)(unsigned int new_pc));\r
+\r
+\r
+/* Set the callback for CPU function code changes.\r
+ * You must enable M68K_EMULATE_FC in m68kconf.h.\r
+ * The CPU calls this callback with the function code before every memory\r
+ * access to set the CPU's function code according to what kind of memory\r
+ * access it is (supervisor/user, program/data and such).\r
+ * Default behavior: do nothing.\r
+ */\r
+void m68k_set_fc_callback(void  (*callback)(unsigned int new_fc));\r
+\r
+\r
+/* Set a callback for the instruction cycle of the CPU.\r
+ * You must enable M68K_INSTRUCTION_HOOK in m68kconf.h.\r
+ * The CPU calls this callback just before fetching the opcode in the\r
+ * instruction cycle.\r
+ * Default behavior: do nothing.\r
+ */\r
+void m68k_set_instr_hook_callback(void  (*callback)(void));\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ====================== FUNCTIONS TO ACCESS THE CPU ===================== */\r
+/* ======================================================================== */\r
+\r
+/* Use this function to set the CPU type you want to emulate.\r
+ * Currently supported types are: M68K_CPU_TYPE_68000, M68K_CPU_TYPE_68010,\r
+ * M68K_CPU_TYPE_EC020, and M68K_CPU_TYPE_68020.\r
+ */\r
+void m68k_set_cpu_type(unsigned int cpu_type);\r
+\r
+/* Pulse the RESET pin on the CPU.\r
+ * You *MUST* reset the CPU at least once to initialize the emulation\r
+ * Note: If you didn't call m68k_set_cpu_type() before resetting\r
+ *       the CPU for the first time, the CPU will be set to\r
+ *       M68K_CPU_TYPE_68000.\r
+ */\r
+void m68k_pulse_reset(void);\r
+\r
+/* execute num_cycles worth of instructions.  returns number of cycles used */\r
+int m68k_execute(int num_cycles);\r
+\r
+/* These functions let you read/write/modify the number of cycles left to run\r
+ * while m68k_execute() is running.\r
+ * These are useful if the 68k accesses a memory-mapped port on another device\r
+ * that requires immediate processing by another CPU.\r
+ */\r
+int m68k_cycles_run(void);              /* Number of cycles run so far */\r
+int m68k_cycles_remaining(void);        /* Number of cycles left */\r
+void m68k_modify_timeslice(int cycles); /* Modify cycles left */\r
+void m68k_end_timeslice(void);          /* End timeslice now */\r
+\r
+/* Set the IPL0-IPL2 pins on the CPU (IRQ).\r
+ * A transition from < 7 to 7 will cause a non-maskable interrupt (NMI).\r
+ * Setting IRQ to 0 will clear an interrupt request.\r
+ */\r
+void m68k_set_irq(unsigned int int_level);\r
+\r
+\r
+/* Halt the CPU as if you pulsed the HALT pin. */\r
+void m68k_pulse_halt(void);\r
+\r
+\r
+/* Context switching to allow multiple CPUs */\r
+\r
+/* Get the size of the cpu context in bytes */\r
+unsigned int m68k_context_size(void);\r
+\r
+/* Get a cpu context */\r
+unsigned int m68k_get_context(void* dst);\r
+\r
+/* set the current cpu context */\r
+void m68k_set_context(void* dst);\r
+\r
+/* Save the current cpu context to disk.\r
+ * You must provide a function pointer of the form:\r
+ * void save_value(char* identifier, unsigned int value)\r
+ */\r
+void m68k_save_context(        void (*save_value)(char* identifier, unsigned int value));\r
+\r
+/* Load a cpu context from disk.\r
+ * You must provide a function pointer of the form:\r
+ * unsigned int load_value(char* identifier)\r
+ */\r
+void m68k_load_context(unsigned int (*load_value)(char* identifier));\r
+\r
+\r
+\r
+/* Peek at the internals of a CPU context.  This can either be a context\r
+ * retrieved using m68k_get_context() or the currently running context.\r
+ * If context is NULL, the currently running CPU context will be used.\r
+ */\r
+unsigned int m68k_get_reg(void* context, m68k_register_t reg);\r
+\r
+/* Poke values into the internals of the currently running CPU context */\r
+void m68k_set_reg(m68k_register_t reg, unsigned int value);\r
+\r
+/* Check if an instruction is valid for the specified CPU type */\r
+unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type);\r
+\r
+/* Disassemble 1 instruction using the epecified CPU type at pc.  Stores\r
+ * disassembly in str_buff and returns the size of the instruction in bytes.\r
+ */\r
+unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type);\r
+\r
+/* ======================================================================== */\r
+/* ============================= CONFIGURATION ============================ */\r
+/* ======================================================================== */\r
+\r
+/* Import the configuration for this build */\r
+#include "m68kconf.h"\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* M68K__HEADER */\r
diff --git a/src/m68k_in.c b/src/m68k_in.c
new file mode 100644 (file)
index 0000000..9793d56
--- /dev/null
@@ -0,0 +1,9989 @@
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+/* Input file for m68kmake\r
+ * -----------------------\r
+ *\r
+ * All sections begin with 80 X's in a row followed by an end-of-line\r
+ * sequence.\r
+ * After this, m68kmake will expect to find one of the following section\r
+ * identifiers:\r
+ *    M68KMAKE_PROTOTYPE_HEADER      - header for opcode handler prototypes\r
+ *    M68KMAKE_PROTOTYPE_FOOTER      - footer for opcode handler prototypes\r
+ *    M68KMAKE_TABLE_HEADER          - header for opcode handler jumptable\r
+ *    M68KMAKE_TABLE_FOOTER          - footer for opcode handler jumptable\r
+ *    M68KMAKE_TABLE_BODY            - the table itself\r
+ *    M68KMAKE_OPCODE_HANDLER_HEADER - header for opcode handler implementation\r
+ *    M68KMAKE_OPCODE_HANDLER_FOOTER - footer for opcode handler implementation\r
+ *    M68KMAKE_OPCODE_HANDLER_BODY   - body section for opcode handler implementation\r
+ *\r
+ * NOTE: M68KMAKE_OPCODE_HANDLER_BODY must be last in the file and\r
+ *       M68KMAKE_TABLE_BODY must be second last in the file.\r
+ *\r
+ * The M68KMAKE_OPHANDLER_BODY section contains the opcode handler\r
+ * primitives themselves.  Each opcode handler begins with:\r
+ *    M68KMAKE_OP(A, B, C, D)\r
+ *\r
+ * where A is the opcode handler name, B is the size of the operation,\r
+ * C denotes any special processing mode, and D denotes a specific\r
+ * addressing mode.\r
+ * For C and D where nothing is specified, use "."\r
+ *\r
+ * Example:\r
+ *     M68KMAKE_OP(abcd, 8, rr, .)   abcd, size 8, register to register, default EA\r
+ *     M68KMAKE_OP(abcd, 8, mm, ax7) abcd, size 8, memory to memory, register X is A7\r
+ *     M68KMAKE_OP(tst, 16, ., pcix) tst, size 16, PCIX addressing\r
+ *\r
+ * All opcode handler primitives end with a closing curly brace "}" at column 1\r
+ *\r
+ * NOTE: Do not place a M68KMAKE_OP() directive inside the opcode handler,\r
+ *       and do not put a closing curly brace at column 1 unless it is\r
+ *       marking the end of the handler!\r
+ *\r
+ * Inside the handler, m68kmake will recognize M68KMAKE_GET_OPER_xx_xx,\r
+ * M68KMAKE_GET_EA_xx_xx, and M68KMAKE_CC directives, and create multiple\r
+ * opcode handlers to handle variations in the opcode handler.\r
+ * Note: M68KMAKE_CC will only be interpreted in condition code opcodes.\r
+ * As well, M68KMAKE_GET_EA_xx_xx and M68KMAKE_GET_OPER_xx_xx will only\r
+ * be interpreted on instructions where the corresponding table entry\r
+ * specifies multiple effective addressing modes.\r
+ * Example:\r
+ * clr       32  .     .     0100001010......  A+-DXWL...  U U U   12   6   4\r
+ *\r
+ * This table entry says that the clr.l opcde has 7 variations (A+-DXWL).\r
+ * It is run in user or supervisor mode for all CPUs, and uses 12 cycles for\r
+ * 68000, 6 cycles for 68010, and 4 cycles for 68020.\r
+ */\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_PROTOTYPE_HEADER\r
+\r
+#ifndef M68KOPS__HEADER\r
+#define M68KOPS__HEADER\r
+\r
+/* ======================================================================== */\r
+/* ============================ OPCODE HANDLERS =========================== */\r
+/* ======================================================================== */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_PROTOTYPE_FOOTER\r
+\r
+\r
+/* Build the opcode handler table */\r
+void m68ki_build_opcode_table(void);\r
+\r
+extern void (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */\r
+extern unsigned char m68ki_cycles[][0x10000];\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+#endif /* M68KOPS__HEADER */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_TABLE_HEADER\r
+\r
+/* ======================================================================== */\r
+/* ========================= OPCODE TABLE BUILDER ========================= */\r
+/* ======================================================================== */\r
+\r
+#include "m68kops.h"\r
+\r
+#define NUM_CPU_TYPES 3\r
+\r
+void  (*m68ki_instruction_jump_table[0x10000])(void); /* opcode handler jump table */\r
+unsigned char m68ki_cycles[NUM_CPU_TYPES][0x10000]; /* Cycles used by CPU type */\r
+\r
+/* This is used to generate the opcode handler jump table */\r
+typedef struct\r
+{\r
+       void (*opcode_handler)(void);        /* handler function */\r
+       unsigned int  mask;                  /* mask on opcode */\r
+       unsigned int  match;                 /* what to match after masking */\r
+       unsigned char cycles[NUM_CPU_TYPES]; /* cycles each cpu type takes */\r
+} opcode_handler_struct;\r
+\r
+\r
+/* Opcode handler table */\r
+static opcode_handler_struct m68k_opcode_handler_table[] =\r
+{\r
+/*   function                      mask    match    000  010  020 */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_TABLE_FOOTER\r
+\r
+       {0, 0, 0, {0, 0, 0}}\r
+};\r
+\r
+\r
+/* Build the opcode handler jump table */\r
+void m68ki_build_opcode_table(void)\r
+{\r
+       opcode_handler_struct *ostruct;\r
+       int instr;\r
+       int i;\r
+       int j;\r
+       int k;\r
+\r
+       for(i = 0; i < 0x10000; i++)\r
+       {\r
+               /* default to illegal */\r
+               m68ki_instruction_jump_table[i] = m68k_op_illegal;\r
+               for(k=0;k<NUM_CPU_TYPES;k++)\r
+                       m68ki_cycles[k][i] = 0;\r
+       }\r
+\r
+       ostruct = m68k_opcode_handler_table;\r
+       while(ostruct->mask != 0xff00)\r
+       {\r
+               for(i = 0;i < 0x10000;i++)\r
+               {\r
+                       if((i & ostruct->mask) == ostruct->match)\r
+                       {\r
+                               m68ki_instruction_jump_table[i] = ostruct->opcode_handler;\r
+                               for(k=0;k<NUM_CPU_TYPES;k++)\r
+                                       m68ki_cycles[k][i] = ostruct->cycles[k];\r
+                       }\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xff00)\r
+       {\r
+               for(i = 0;i <= 0xff;i++)\r
+               {\r
+                       m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;\r
+                       for(k=0;k<NUM_CPU_TYPES;k++)\r
+                               m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xf1f8)\r
+       {\r
+               for(i = 0;i < 8;i++)\r
+               {\r
+                       for(j = 0;j < 8;j++)\r
+                       {\r
+                               instr = ostruct->match | (i << 9) | j;\r
+                               m68ki_instruction_jump_table[instr] = ostruct->opcode_handler;\r
+                               for(k=0;k<NUM_CPU_TYPES;k++)\r
+                                       m68ki_cycles[k][instr] = ostruct->cycles[k];\r
+                               if((instr & 0xf000) == 0xe000 && (!(instr & 0x20)))\r
+                                       m68ki_cycles[0][instr] = m68ki_cycles[1][instr] = ostruct->cycles[k] + ((((j-1)&7)+1)<<1);\r
+                       }\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xfff0)\r
+       {\r
+               for(i = 0;i <= 0x0f;i++)\r
+               {\r
+                       m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;\r
+                       for(k=0;k<NUM_CPU_TYPES;k++)\r
+                               m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xf1ff)\r
+       {\r
+               for(i = 0;i <= 0x07;i++)\r
+               {\r
+                       m68ki_instruction_jump_table[ostruct->match | (i << 9)] = ostruct->opcode_handler;\r
+                       for(k=0;k<NUM_CPU_TYPES;k++)\r
+                               m68ki_cycles[k][ostruct->match | (i << 9)] = ostruct->cycles[k];\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xfff8)\r
+       {\r
+               for(i = 0;i <= 0x07;i++)\r
+               {\r
+                       m68ki_instruction_jump_table[ostruct->match | i] = ostruct->opcode_handler;\r
+                       for(k=0;k<NUM_CPU_TYPES;k++)\r
+                               m68ki_cycles[k][ostruct->match | i] = ostruct->cycles[k];\r
+               }\r
+               ostruct++;\r
+       }\r
+       while(ostruct->mask == 0xffff)\r
+       {\r
+               m68ki_instruction_jump_table[ostruct->match] = ostruct->opcode_handler;\r
+               for(k=0;k<NUM_CPU_TYPES;k++)\r
+                       m68ki_cycles[k][ostruct->match] = ostruct->cycles[k];\r
+               ostruct++;\r
+       }\r
+}\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_OPCODE_HANDLER_HEADER\r
+\r
+#include "m68kcpu.h"\r
+\r
+/* ======================================================================== */\r
+/* ========================= INSTRUCTION HANDLERS ========================= */\r
+/* ======================================================================== */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_OPCODE_HANDLER_FOOTER\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_TABLE_BODY\r
+\r
+The following table is arranged as follows:\r
+\r
+name:        Opcode mnemonic\r
+\r
+size:        Operation size\r
+\r
+spec proc:   Special processing mode:\r
+                 .:    normal\r
+                 s:    static operand\r
+                 r:    register operand\r
+                 rr:   register to register\r
+                 mm:   memory to memory\r
+                 er:   effective address to register\r
+                 re:   register to effective address\r
+                 dd:   data register to data register\r
+                 da:   data register to address register\r
+                 aa:   address register to address register\r
+                 cr:   control register to register\r
+                 rc:   register to control register\r
+                 toc:  to condition code register\r
+                 tos:  to status register\r
+                 tou:  to user stack pointer\r
+                 frc:  from condition code register\r
+                 frs:  from status register\r
+                 fru:  from user stack pointer\r
+                 * for move.x, the special processing mode is a specific\r
+                   destination effective addressing mode.\r
+\r
+spec ea:     Specific effective addressing mode:\r
+                 .:    normal\r
+                 i:    immediate\r
+                 d:    data register\r
+                 a:    address register\r
+                 ai:   address register indirect\r
+                 pi:   address register indirect with postincrement\r
+                 pd:   address register indirect with predecrement\r
+                 di:   address register indirect with displacement\r
+                 ix:   address register indirect with index\r
+                 aw:   absolute word address\r
+                 al:   absolute long address\r
+                 pcdi: program counter relative with displacement\r
+                 pcix: program counter relative with index\r
+                 a7:   register specified in instruction is A7\r
+                 ax7:  register field X of instruction is A7\r
+                 ay7:  register field Y of instruction is A7\r
+                 axy7: register fields X and Y of instruction are A7\r
+\r
+bit pattern: Pattern to recognize this opcode.  "." means don't care.\r
+\r
+allowed ea:  List of allowed addressing modes:\r
+                 .: not present\r
+                 A: address register indirect\r
+                 +: ARI (address register indirect) with postincrement\r
+                 -: ARI with predecrement\r
+                 D: ARI with displacement\r
+                 X: ARI with index\r
+                 W: absolute word address\r
+                 L: absolute long address\r
+                 d: program counter indirect with displacement\r
+                 x: program counter indirect with index\r
+                 I: immediate\r
+mode:        CPU operating mode for each cpu type.  U = user or supervisor,\r
+             S = supervisor only, "." = opcode not present.\r
+\r
+cpu cycles:  Base number of cycles required to execute this opcode on the\r
+             specified CPU type.\r
+             Use "." if CPU does not have this opcode.\r
+\r
+\r
+\r
+              spec  spec                    allowed ea  mode   cpu cycles\r
+name    size  proc   ea   bit pattern       A+-DXWLdxI  0 1 2  000 010 020  comments\r
+======  ====  ====  ====  ================  ==========  = = =  === === ===  =============\r
+M68KMAKE_TABLE_START\r
+1010       0  .     .     1010............  ..........  U U U    4   4   4\r
+1111       0  .     .     1111............  ..........  U U U    4   4   4\r
+abcd       8  rr    .     1100...100000...  ..........  U U U    6   6   4\r
+abcd       8  mm    ax7   1100111100001...  ..........  U U U   18  18  16\r
+abcd       8  mm    ay7   1100...100001111  ..........  U U U   18  18  16\r
+abcd       8  mm    axy7  1100111100001111  ..........  U U U   18  18  16\r
+abcd       8  mm    .     1100...100001...  ..........  U U U   18  18  16\r
+add        8  er    d     1101...000000...  ..........  U U U    4   4   2\r
+add        8  er    .     1101...000......  A+-DXWLdxI  U U U    4   4   2\r
+add       16  er    d     1101...001000...  ..........  U U U    4   4   2\r
+add       16  er    a     1101...001001...  ..........  U U U    4   4   2\r
+add       16  er    .     1101...001......  A+-DXWLdxI  U U U    4   4   2\r
+add       32  er    d     1101...010000...  ..........  U U U    6   6   2\r
+add       32  er    a     1101...010001...  ..........  U U U    6   6   2\r
+add       32  er    .     1101...010......  A+-DXWLdxI  U U U    6   6   2\r
+add        8  re    .     1101...100......  A+-DXWL...  U U U    8   8   4\r
+add       16  re    .     1101...101......  A+-DXWL...  U U U    8   8   4\r
+add       32  re    .     1101...110......  A+-DXWL...  U U U   12  12   4\r
+adda      16  .     d     1101...011000...  ..........  U U U    8   8   2\r
+adda      16  .     a     1101...011001...  ..........  U U U    8   8   2\r
+adda      16  .     .     1101...011......  A+-DXWLdxI  U U U    8   8   2\r
+adda      32  .     d     1101...111000...  ..........  U U U    6   6   2\r
+adda      32  .     a     1101...111001...  ..........  U U U    6   6   2\r
+adda      32  .     .     1101...111......  A+-DXWLdxI  U U U    6   6   2\r
+addi       8  .     d     0000011000000...  ..........  U U U    8   8   2\r
+addi       8  .     .     0000011000......  A+-DXWL...  U U U   12  12   4\r
+addi      16  .     d     0000011001000...  ..........  U U U    8   8   2\r
+addi      16  .     .     0000011001......  A+-DXWL...  U U U   12  12   4\r
+addi      32  .     d     0000011010000...  ..........  U U U   16  14   2\r
+addi      32  .     .     0000011010......  A+-DXWL...  U U U   20  20   4\r
+addq       8  .     d     0101...000000...  ..........  U U U    4   4   2\r
+addq       8  .     .     0101...000......  A+-DXWL...  U U U    8   8   4\r
+addq      16  .     d     0101...001000...  ..........  U U U    4   4   2\r
+addq      16  .     a     0101...001001...  ..........  U U U    4   4   2\r
+addq      16  .     .     0101...001......  A+-DXWL...  U U U    8   8   4\r
+addq      32  .     d     0101...010000...  ..........  U U U    8   8   2\r
+addq      32  .     a     0101...010001...  ..........  U U U    8   8   2\r
+addq      32  .     .     0101...010......  A+-DXWL...  U U U   12  12   4\r
+addx       8  rr    .     1101...100000...  ..........  U U U    4   4   2\r
+addx      16  rr    .     1101...101000...  ..........  U U U    4   4   2\r
+addx      32  rr    .     1101...110000...  ..........  U U U    8   6   2\r
+addx       8  mm    ax7   1101111100001...  ..........  U U U   18  18  12\r
+addx       8  mm    ay7   1101...100001111  ..........  U U U   18  18  12\r
+addx       8  mm    axy7  1101111100001111  ..........  U U U   18  18  12\r
+addx       8  mm    .     1101...100001...  ..........  U U U   18  18  12\r
+addx      16  mm    .     1101...101001...  ..........  U U U   18  18  12\r
+addx      32  mm    .     1101...110001...  ..........  U U U   30  30  12\r
+and        8  er    d     1100...000000...  ..........  U U U    4   4   2\r
+and        8  er    .     1100...000......  A+-DXWLdxI  U U U    4   4   2\r
+and       16  er    d     1100...001000...  ..........  U U U    4   4   2\r
+and       16  er    .     1100...001......  A+-DXWLdxI  U U U    4   4   2\r
+and       32  er    d     1100...010000...  ..........  U U U    6   6   2\r
+and       32  er    .     1100...010......  A+-DXWLdxI  U U U    6   6   2\r
+and        8  re    .     1100...100......  A+-DXWL...  U U U    8   8   4\r
+and       16  re    .     1100...101......  A+-DXWL...  U U U    8   8   4\r
+and       32  re    .     1100...110......  A+-DXWL...  U U U   12  12   4\r
+andi      16  toc   .     0000001000111100  ..........  U U U   20  16  12\r
+andi      16  tos   .     0000001001111100  ..........  S S S   20  16  12\r
+andi       8  .     d     0000001000000...  ..........  U U U    8   8   2\r
+andi       8  .     .     0000001000......  A+-DXWL...  U U U   12  12   4\r
+andi      16  .     d     0000001001000...  ..........  U U U    8   8   2\r
+andi      16  .     .     0000001001......  A+-DXWL...  U U U   12  12   4\r
+andi      32  .     d     0000001010000...  ..........  U U U   14  14   2\r
+andi      32  .     .     0000001010......  A+-DXWL...  U U U   20  20   4\r
+asr        8  s     .     1110...000000...  ..........  U U U    6   6   6\r
+asr       16  s     .     1110...001000...  ..........  U U U    6   6   6\r
+asr       32  s     .     1110...010000...  ..........  U U U    8   8   6\r
+asr        8  r     .     1110...000100...  ..........  U U U    6   6   6\r
+asr       16  r     .     1110...001100...  ..........  U U U    6   6   6\r
+asr       32  r     .     1110...010100...  ..........  U U U    8   8   6\r
+asr       16  .     .     1110000011......  A+-DXWL...  U U U    8   8   5\r
+asl        8  s     .     1110...100000...  ..........  U U U    6   6   8\r
+asl       16  s     .     1110...101000...  ..........  U U U    6   6   8\r
+asl       32  s     .     1110...110000...  ..........  U U U    8   8   8\r
+asl        8  r     .     1110...100100...  ..........  U U U    6   6   8\r
+asl       16  r     .     1110...101100...  ..........  U U U    6   6   8\r
+asl       32  r     .     1110...110100...  ..........  U U U    8   8   8\r
+asl       16  .     .     1110000111......  A+-DXWL...  U U U    8   8   6\r
+bcc        8  .     .     0110............  ..........  U U U    8   8   6\r
+bcc       16  .     .     0110....00000000  ..........  U U U   10  10   6\r
+bcc       32  .     .     0110....11111111  ..........  . . U    .   .   6\r
+bchg       8  r     .     0000...101......  A+-DXWL...  U U U    8   8   4\r
+bchg      32  r     d     0000...101000...  ..........  U U U    8   8   4\r
+bchg       8  s     .     0000100001......  A+-DXWL...  U U U   12  12   4\r
+bchg      32  s     d     0000100001000...  ..........  U U U   12  12   4\r
+bclr       8  r     .     0000...110......  A+-DXWL...  U U U    8  10   4\r
+bclr      32  r     d     0000...110000...  ..........  U U U   10  10   4\r
+bclr       8  s     .     0000100010......  A+-DXWL...  U U U   12  12   4\r
+bclr      32  s     d     0000100010000...  ..........  U U U   14  14   4\r
+bfchg     32  .     d     1110101011000...  ..........  . . U    .   .  12  timing not quite correct\r
+bfchg     32  .     .     1110101011......  A..DXWL...  . . U    .   .  20\r
+bfclr     32  .     d     1110110011000...  ..........  . . U    .   .  12\r
+bfclr     32  .     .     1110110011......  A..DXWL...  . . U    .   .  20\r
+bfexts    32  .     d     1110101111000...  ..........  . . U    .   .   8\r
+bfexts    32  .     .     1110101111......  A..DXWLdx.  . . U    .   .  15\r
+bfextu    32  .     d     1110100111000...  ..........  . . U    .   .   8\r
+bfextu    32  .     .     1110100111......  A..DXWLdx.  . . U    .   .  15\r
+bfffo     32  .     d     1110110111000...  ..........  . . U    .   .  18\r
+bfffo     32  .     .     1110110111......  A..DXWLdx.  . . U    .   .  28\r
+bfins     32  .     d     1110111111000...  ..........  . . U    .   .  10\r
+bfins     32  .     .     1110111111......  A..DXWL...  . . U    .   .  17\r
+bfset     32  .     d     1110111011000...  ..........  . . U    .   .  12\r
+bfset     32  .     .     1110111011......  A..DXWL...  . . U    .   .  20\r
+bftst     32  .     d     1110100011000...  ..........  . . U    .   .   6\r
+bftst     32  .     .     1110100011......  A..DXWLdx.  . . U    .   .  13\r
+bkpt       0  .     .     0100100001001...  ..........  . U U    .  10  10\r
+bra        8  .     .     01100000........  ..........  U U U   10  10  10\r
+bra       16  .     .     0110000000000000  ..........  U U U   10  10  10\r
+bra       32  .     .     0110000011111111  ..........  U U U    .   .  10\r
+bset      32  r     d     0000...111000...  ..........  U U U    8   8   4\r
+bset       8  r     .     0000...111......  A+-DXWL...  U U U    8   8   4\r
+bset       8  s     .     0000100011......  A+-DXWL...  U U U   12  12   4\r
+bset      32  s     d     0000100011000...  ..........  U U U   12  12   4\r
+bsr        8  .     .     01100001........  ..........  U U U   18  18   7\r
+bsr       16  .     .     0110000100000000  ..........  U U U   18  18   7\r
+bsr       32  .     .     0110000111111111  ..........  . . U    .   .   7\r
+btst       8  r     .     0000...100......  A+-DXWLdxI  U U U    4   4   4\r
+btst      32  r     d     0000...100000...  ..........  U U U    6   6   4\r
+btst       8  s     .     0000100000......  A+-DXWLdx.  U U U    8   8   4\r
+btst      32  s     d     0000100000000...  ..........  U U U   10  10   4\r
+callm     32  .     .     0000011011......  A..DXWLdx.  . . U    .   .  60  not properly emulated\r
+cas        8  .     .     0000101011......  A+-DXWL...  . . U    .   .  12\r
+cas       16  .     .     0000110011......  A+-DXWL...  . . U    .   .  12\r
+cas       32  .     .     0000111011......  A+-DXWL...  . . U    .   .  12\r
+cas2      16  .     .     0000110011111100  ..........  . . U    .   .  12\r
+cas2      32  .     .     0000111011111100  ..........  . . U    .   .  12\r
+chk       16  .     d     0100...110000...  ..........  U U U   10   8   8\r
+chk       16  .     .     0100...110......  A+-DXWLdxI  U U U   10   8   8\r
+chk       32  .     d     0100...100000...  ..........  . . U    .   .   8\r
+chk       32  .     .     0100...100......  A+-DXWLdxI  . . U    .   .   8\r
+chk2cmp2   8  .     .     0000000011......  A..DXWLdx.  . . U    .   .  18\r
+chk2cmp2  16  .     .     0000001011......  A..DXWLdx.  . . U    .   .  18\r
+chk2cmp2  32  .     .     0000010011......  A..DXWLdx.  . . U    .   .  18\r
+clr        8  .     d     0100001000000...  ..........  U U U    4   4   2\r
+clr        8  .     .     0100001000......  A+-DXWL...  U U U    8   4   4\r
+clr       16  .     d     0100001001000...  ..........  U U U    4   4   2\r
+clr       16  .     .     0100001001......  A+-DXWL...  U U U    8   4   4\r
+clr       32  .     d     0100001010000...  ..........  U U U    6   6   2\r
+clr       32  .     .     0100001010......  A+-DXWL...  U U U   12   6   4\r
+cmp        8  .     d     1011...000000...  ..........  U U U    4   4   2\r
+cmp        8  .     .     1011...000......  A+-DXWLdxI  U U U    4   4   2\r
+cmp       16  .     d     1011...001000...  ..........  U U U    4   4   2\r
+cmp       16  .     a     1011...001001...  ..........  U U U    4   4   2\r
+cmp       16  .     .     1011...001......  A+-DXWLdxI  U U U    4   4   2\r
+cmp       32  .     d     1011...010000...  ..........  U U U    6   6   2\r
+cmp       32  .     a     1011...010001...  ..........  U U U    6   6   2\r
+cmp       32  .     .     1011...010......  A+-DXWLdxI  U U U    6   6   2\r
+cmpa      16  .     d     1011...011000...  ..........  U U U    6   6   4\r
+cmpa      16  .     a     1011...011001...  ..........  U U U    6   6   4\r
+cmpa      16  .     .     1011...011......  A+-DXWLdxI  U U U    6   6   4\r
+cmpa      32  .     d     1011...111000...  ..........  U U U    6   6   4\r
+cmpa      32  .     a     1011...111001...  ..........  U U U    6   6   4\r
+cmpa      32  .     .     1011...111......  A+-DXWLdxI  U U U    6   6   4\r
+cmpi       8  .     d     0000110000000...  ..........  U U U    8   8   2\r
+cmpi       8  .     .     0000110000......  A+-DXWL...  U U U    8   8   2\r
+cmpi       8  .     pcdi  0000110000111010  ..........  . . U    .   .   7\r
+cmpi       8  .     pcix  0000110000111011  ..........  . . U    .   .   9\r
+cmpi      16  .     d     0000110001000...  ..........  U U U    8   8   2\r
+cmpi      16  .     .     0000110001......  A+-DXWL...  U U U    8   8   2\r
+cmpi      16  .     pcdi  0000110001111010  ..........  . . U    .   .   7\r
+cmpi      16  .     pcix  0000110001111011  ..........  . . U    .   .   9\r
+cmpi      32  .     d     0000110010000...  ..........  U U U   14  12   2\r
+cmpi      32  .     .     0000110010......  A+-DXWL...  U U U   12  12   2\r
+cmpi      32  .     pcdi  0000110010111010  ..........  . . U    .   .   7\r
+cmpi      32  .     pcix  0000110010111011  ..........  . . U    .   .   9\r
+cmpm       8  .     ax7   1011111100001...  ..........  U U U   12  12   9\r
+cmpm       8  .     ay7   1011...100001111  ..........  U U U   12  12   9\r
+cmpm       8  .     axy7  1011111100001111  ..........  U U U   12  12   9\r
+cmpm       8  .     .     1011...100001...  ..........  U U U   12  12   9\r
+cmpm      16  .     .     1011...101001...  ..........  U U U   12  12   9\r
+cmpm      32  .     .     1011...110001...  ..........  U U U   20  20   9\r
+cpbcc     32  .     .     1111...01.......  ..........  . . U    .   .   4  unemulated\r
+cpdbcc    32  .     .     1111...001001...  ..........  . . U    .   .   4  unemulated\r
+cpgen     32  .     .     1111...000......  ..........  . . U    .   .   4  unemulated\r
+cpscc     32  .     .     1111...001......  ..........  . . U    .   .   4  unemulated\r
+cptrapcc  32  .     .     1111...001111...  ..........  . . U    .   .   4  unemulated\r
+dbt       16  .     .     0101000011001...  ..........  U U U   12  12   6\r
+dbf       16  .     .     0101000111001...  ..........  U U U   14  14   6\r
+dbcc      16  .     .     0101....11001...  ..........  U U U   12  12   6\r
+divs      16  .     d     1000...111000...  ..........  U U U  158 122  56\r
+divs      16  .     .     1000...111......  A+-DXWLdxI  U U U  158 122  56\r
+divu      16  .     d     1000...011000...  ..........  U U U  140 108  44\r
+divu      16  .     .     1000...011......  A+-DXWLdxI  U U U  140 108  44\r
+divl      32  .     d     0100110001000...  ..........  . . U    .   .  84\r
+divl      32  .     .     0100110001......  A+-DXWLdxI  . . U    .   .  84\r
+eor        8  .     d     1011...100000...  ..........  U U U    4   4   2\r
+eor        8  .     .     1011...100......  A+-DXWL...  U U U    8   8   4\r
+eor       16  .     d     1011...101000...  ..........  U U U    4   4   2\r
+eor       16  .     .     1011...101......  A+-DXWL...  U U U    8   8   4\r
+eor       32  .     d     1011...110000...  ..........  U U U    8   6   2\r
+eor       32  .     .     1011...110......  A+-DXWL...  U U U   12  12   4\r
+eori      16  toc   .     0000101000111100  ..........  U U U   20  16  12\r
+eori      16  tos   .     0000101001111100  ..........  S S S   20  16  12\r
+eori       8  .     d     0000101000000...  ..........  U U U    8   8   2\r
+eori       8  .     .     0000101000......  A+-DXWL...  U U U   12  12   4\r
+eori      16  .     d     0000101001000...  ..........  U U U    8   8   2\r
+eori      16  .     .     0000101001......  A+-DXWL...  U U U   12  12   4\r
+eori      32  .     d     0000101010000...  ..........  U U U   16  14   2\r
+eori      32  .     .     0000101010......  A+-DXWL...  U U U   20  20   4\r
+exg       32  dd    .     1100...101000...  ..........  U U U    6   6   2\r
+exg       32  aa    .     1100...101001...  ..........  U U U    6   6   2\r
+exg       32  da    .     1100...110001...  ..........  U U U    6   6   2\r
+ext       16  .     .     0100100010000...  ..........  U U U    4   4   4\r
+ext       32  .     .     0100100011000...  ..........  U U U    4   4   4\r
+extb      32  .     .     0100100111000...  ..........  . . U    .   .   4\r
+illegal    0  .     .     0100101011111100  ..........  U U U    4   4   4\r
+jmp       32  .     .     0100111011......  A..DXWLdx.  U U U    4   4   0\r
+jsr       32  .     .     0100111010......  A..DXWLdx.  U U U   12  12   0\r
+lea       32  .     .     0100...111......  A..DXWLdx.  U U U    0   0   2\r
+link      16  .     a7    0100111001010111  ..........  U U U   16  16   5\r
+link      16  .     .     0100111001010...  ..........  U U U   16  16   5\r
+link      32  .     a7    0100100000001111  ..........  . . U    .   .   6\r
+link      32  .     .     0100100000001...  ..........  . . U    .   .   6\r
+lsr        8  s     .     1110...000001...  ..........  U U U    6   6   4\r
+lsr       16  s     .     1110...001001...  ..........  U U U    6   6   4\r
+lsr       32  s     .     1110...010001...  ..........  U U U    8   8   4\r
+lsr        8  r     .     1110...000101...  ..........  U U U    6   6   6\r
+lsr       16  r     .     1110...001101...  ..........  U U U    6   6   6\r
+lsr       32  r     .     1110...010101...  ..........  U U U    8   8   6\r
+lsr       16  .     .     1110001011......  A+-DXWL...  U U U    8   8   5\r
+lsl        8  s     .     1110...100001...  ..........  U U U    6   6   4\r
+lsl       16  s     .     1110...101001...  ..........  U U U    6   6   4\r
+lsl       32  s     .     1110...110001...  ..........  U U U    8   8   4\r
+lsl        8  r     .     1110...100101...  ..........  U U U    6   6   6\r
+lsl       16  r     .     1110...101101...  ..........  U U U    6   6   6\r
+lsl       32  r     .     1110...110101...  ..........  U U U    8   8   6\r
+lsl       16  .     .     1110001111......  A+-DXWL...  U U U    8   8   5\r
+move       8  d     d     0001...000000...  ..........  U U U    4   4   2\r
+move       8  d     .     0001...000......  A+-DXWLdxI  U U U    4   4   2\r
+move       8  ai    d     0001...010000...  ..........  U U U    8   8   4\r
+move       8  ai    .     0001...010......  A+-DXWLdxI  U U U    8   8   4\r
+move       8  pi    d     0001...011000...  ..........  U U U    8   8   4\r
+move       8  pi    .     0001...011......  A+-DXWLdxI  U U U    8   8   4\r
+move       8  pi7   d     0001111011000...  ..........  U U U    8   8   4\r
+move       8  pi7   .     0001111011......  A+-DXWLdxI  U U U    8   8   4\r
+move       8  pd    d     0001...100000...  ..........  U U U    8   8   5\r
+move       8  pd    .     0001...100......  A+-DXWLdxI  U U U    8   8   5\r
+move       8  pd7   d     0001111100000...  ..........  U U U    8   8   5\r
+move       8  pd7   .     0001111100......  A+-DXWLdxI  U U U    8   8   5\r
+move       8  di    d     0001...101000...  ..........  U U U   12  12   5\r
+move       8  di    .     0001...101......  A+-DXWLdxI  U U U   12  12   5\r
+move       8  ix    d     0001...110000...  ..........  U U U   14  14   7\r
+move       8  ix    .     0001...110......  A+-DXWLdxI  U U U   14  14   7\r
+move       8  aw    d     0001000111000...  ..........  U U U   12  12   4\r
+move       8  aw    .     0001000111......  A+-DXWLdxI  U U U   12  12   4\r
+move       8  al    d     0001001111000...  ..........  U U U   16  16   6\r
+move       8  al    .     0001001111......  A+-DXWLdxI  U U U   16  16   6\r
+move      16  d     d     0011...000000...  ..........  U U U    4   4   2\r
+move      16  d     a     0011...000001...  ..........  U U U    4   4   2\r
+move      16  d     .     0011...000......  A+-DXWLdxI  U U U    4   4   2\r
+move      16  ai    d     0011...010000...  ..........  U U U    8   8   4\r
+move      16  ai    a     0011...010001...  ..........  U U U    8   8   4\r
+move      16  ai    .     0011...010......  A+-DXWLdxI  U U U    8   8   4\r
+move      16  pi    d     0011...011000...  ..........  U U U    8   8   4\r
+move      16  pi    a     0011...011001...  ..........  U U U    8   8   4\r
+move      16  pi    .     0011...011......  A+-DXWLdxI  U U U    8   8   4\r
+move      16  pd    d     0011...100000...  ..........  U U U    8   8   5\r
+move      16  pd    a     0011...100001...  ..........  U U U    8   8   5\r
+move      16  pd    .     0011...100......  A+-DXWLdxI  U U U    8   8   5\r
+move      16  di    d     0011...101000...  ..........  U U U   12  12   5\r
+move      16  di    a     0011...101001...  ..........  U U U   12  12   5\r
+move      16  di    .     0011...101......  A+-DXWLdxI  U U U   12  12   5\r
+move      16  ix    d     0011...110000...  ..........  U U U   14  14   7\r
+move      16  ix    a     0011...110001...  ..........  U U U   14  14   7\r
+move      16  ix    .     0011...110......  A+-DXWLdxI  U U U   14  14   7\r
+move      16  aw    d     0011000111000...  ..........  U U U   12  12   4\r
+move      16  aw    a     0011000111001...  ..........  U U U   12  12   4\r
+move      16  aw    .     0011000111......  A+-DXWLdxI  U U U   12  12   4\r
+move      16  al    d     0011001111000...  ..........  U U U   16  16   6\r
+move      16  al    a     0011001111001...  ..........  U U U   16  16   6\r
+move      16  al    .     0011001111......  A+-DXWLdxI  U U U   16  16   6\r
+move      32  d     d     0010...000000...  ..........  U U U    4   4   2\r
+move      32  d     a     0010...000001...  ..........  U U U    4   4   2\r
+move      32  d     .     0010...000......  A+-DXWLdxI  U U U    4   4   2\r
+move      32  ai    d     0010...010000...  ..........  U U U   12  12   4\r
+move      32  ai    a     0010...010001...  ..........  U U U   12  12   4\r
+move      32  ai    .     0010...010......  A+-DXWLdxI  U U U   12  12   4\r
+move      32  pi    d     0010...011000...  ..........  U U U   12  12   4\r
+move      32  pi    a     0010...011001...  ..........  U U U   12  12   4\r
+move      32  pi    .     0010...011......  A+-DXWLdxI  U U U   12  12   4\r
+move      32  pd    d     0010...100000...  ..........  U U U   12  14   5\r
+move      32  pd    a     0010...100001...  ..........  U U U   12  14   5\r
+move      32  pd    .     0010...100......  A+-DXWLdxI  U U U   12  14   5\r
+move      32  di    d     0010...101000...  ..........  U U U   16  16   5\r
+move      32  di    a     0010...101001...  ..........  U U U   16  16   5\r
+move      32  di    .     0010...101......  A+-DXWLdxI  U U U   16  16   5\r
+move      32  ix    d     0010...110000...  ..........  U U U   18  18   7\r
+move      32  ix    a     0010...110001...  ..........  U U U   18  18   7\r
+move      32  ix    .     0010...110......  A+-DXWLdxI  U U U   18  18   7\r
+move      32  aw    d     0010000111000...  ..........  U U U   16  16   4\r
+move      32  aw    a     0010000111001...  ..........  U U U   16  16   4\r
+move      32  aw    .     0010000111......  A+-DXWLdxI  U U U   16  16   4\r
+move      32  al    d     0010001111000...  ..........  U U U   20  20   6\r
+move      32  al    a     0010001111001...  ..........  U U U   20  20   6\r
+move      32  al    .     0010001111......  A+-DXWLdxI  U U U   20  20   6\r
+movea     16  .     d     0011...001000...  ..........  U U U    4   4   2\r
+movea     16  .     a     0011...001001...  ..........  U U U    4   4   2\r
+movea     16  .     .     0011...001......  A+-DXWLdxI  U U U    4   4   2\r
+movea     32  .     d     0010...001000...  ..........  U U U    4   4   2\r
+movea     32  .     a     0010...001001...  ..........  U U U    4   4   2\r
+movea     32  .     .     0010...001......  A+-DXWLdxI  U U U    4   4   2\r
+move      16  frc   d     0100001011000...  ..........  . U U    .   4   4\r
+move      16  frc   .     0100001011......  A+-DXWL...  . U U    .   8   4\r
+move      16  toc   d     0100010011000...  ..........  U U U   12  12   4\r
+move      16  toc   .     0100010011......  A+-DXWLdxI  U U U   12  12   4\r
+move      16  frs   d     0100000011000...  ..........  U S S    6   4   8 U only for 000\r
+move      16  frs   .     0100000011......  A+-DXWL...  U S S    8   8   8 U only for 000\r
+move      16  tos   d     0100011011000...  ..........  S S S   12  12   8\r
+move      16  tos   .     0100011011......  A+-DXWLdxI  S S S   12  12   8\r
+move      32  fru   .     0100111001101...  ..........  S S S    4   6   2\r
+move      32  tou   .     0100111001100...  ..........  S S S    4   6   2\r
+movec     32  cr    .     0100111001111010  ..........  . S S    .  12   6\r
+movec     32  rc    .     0100111001111011  ..........  . S S    .  10  12\r
+movem     16  re    pd    0100100010100...  ..........  U U U    8   8   4\r
+movem     16  re    .     0100100010......  A..DXWL...  U U U    8   8   4\r
+movem     32  re    pd    0100100011100...  ..........  U U U    8   8   4\r
+movem     32  re    .     0100100011......  A..DXWL...  U U U    8   8   4\r
+movem     16  er    pi    0100110010011...  ..........  U U U   12  12   8\r
+movem     16  er    .     0100110010......  A..DXWLdx.  U U U   12  12   8\r
+movem     32  er    pi    0100110011011...  ..........  U U U   12  12   8\r
+movem     32  er    .     0100110011......  A..DXWLdx.  U U U   12  12   8\r
+movep     16  er    .     0000...100001...  ..........  U U U   16  16  12\r
+movep     32  er    .     0000...101001...  ..........  U U U   24  24  18\r
+movep     16  re    .     0000...110001...  ..........  U U U   16  16  11\r
+movep     32  re    .     0000...111001...  ..........  U U U   24  24  17\r
+moveq     32  .     .     0111...0........  ..........  U U U    4   4   2\r
+moves      8  .     .     0000111000......  A+-DXWL...  . S S    .  14   5\r
+moves     16  .     .     0000111001......  A+-DXWL...  . S S    .  14   5\r
+moves     32  .     .     0000111010......  A+-DXWL...  . S S    .  16   5\r
+muls      16  .     d     1100...111000...  ..........  U U U   54  32  27\r
+muls      16  .     .     1100...111......  A+-DXWLdxI  U U U   54  32  27\r
+mulu      16  .     d     1100...011000...  ..........  U U U   54  30  27\r
+mulu      16  .     .     1100...011......  A+-DXWLdxI  U U U   54  30  27\r
+mull      32  .     d     0100110000000...  ..........  . . U    .   .  43\r
+mull      32  .     .     0100110000......  A+-DXWLdxI  . . U    .   .  43\r
+nbcd       8  .     d     0100100000000...  ..........  U U U    6   6   6\r
+nbcd       8  .     .     0100100000......  A+-DXWL...  U U U    8   8   6\r
+neg        8  .     d     0100010000000...  ..........  U U U    4   4   2\r
+neg        8  .     .     0100010000......  A+-DXWL...  U U U    8   8   4\r
+neg       16  .     d     0100010001000...  ..........  U U U    4   4   2\r
+neg       16  .     .     0100010001......  A+-DXWL...  U U U    8   8   4\r
+neg       32  .     d     0100010010000...  ..........  U U U    6   6   2\r
+neg       32  .     .     0100010010......  A+-DXWL...  U U U   12  12   4\r
+negx       8  .     d     0100000000000...  ..........  U U U    4   4   2\r
+negx       8  .     .     0100000000......  A+-DXWL...  U U U    8   8   4\r
+negx      16  .     d     0100000001000...  ..........  U U U    4   4   2\r
+negx      16  .     .     0100000001......  A+-DXWL...  U U U    8   8   4\r
+negx      32  .     d     0100000010000...  ..........  U U U    6   6   2\r
+negx      32  .     .     0100000010......  A+-DXWL...  U U U   12  12   4\r
+nop        0  .     .     0100111001110001  ..........  U U U    4   4   2\r
+not        8  .     d     0100011000000...  ..........  U U U    4   4   2\r
+not        8  .     .     0100011000......  A+-DXWL...  U U U    8   8   4\r
+not       16  .     d     0100011001000...  ..........  U U U    4   4   2\r
+not       16  .     .     0100011001......  A+-DXWL...  U U U    8   8   4\r
+not       32  .     d     0100011010000...  ..........  U U U    6   6   2\r
+not       32  .     .     0100011010......  A+-DXWL...  U U U   12  12   4\r
+or         8  er    d     1000...000000...  ..........  U U U    4   4   2\r
+or         8  er    .     1000...000......  A+-DXWLdxI  U U U    4   4   2\r
+or        16  er    d     1000...001000...  ..........  U U U    4   4   2\r
+or        16  er    .     1000...001......  A+-DXWLdxI  U U U    4   4   2\r
+or        32  er    d     1000...010000...  ..........  U U U    6   6   2\r
+or        32  er    .     1000...010......  A+-DXWLdxI  U U U    6   6   2\r
+or         8  re    .     1000...100......  A+-DXWL...  U U U    8   8   4\r
+or        16  re    .     1000...101......  A+-DXWL...  U U U    8   8   4\r
+or        32  re    .     1000...110......  A+-DXWL...  U U U   12  12   4\r
+ori       16  toc   .     0000000000111100  ..........  U U U   20  16  12\r
+ori       16  tos   .     0000000001111100  ..........  S S S   20  16  12\r
+ori        8  .     d     0000000000000...  ..........  U U U    8   8   2\r
+ori        8  .     .     0000000000......  A+-DXWL...  U U U   12  12   4\r
+ori       16  .     d     0000000001000...  ..........  U U U    8   8   2\r
+ori       16  .     .     0000000001......  A+-DXWL...  U U U   12  12   4\r
+ori       32  .     d     0000000010000...  ..........  U U U   16  14   2\r
+ori       32  .     .     0000000010......  A+-DXWL...  U U U   20  20   4\r
+pack      16  rr    .     1000...101000...  ..........  . . U    .   .   6\r
+pack      16  mm    ax7   1000111101001...  ..........  . . U    .   .  13\r
+pack      16  mm    ay7   1000...101001111  ..........  . . U    .   .  13\r
+pack      16  mm    axy7  1000111101001111  ..........  . . U    .   .  13\r
+pack      16  mm    .     1000...101001...  ..........  . . U    .   .  13\r
+pea       32  .     .     0100100001......  A..DXWLdx.  U U U    6   6   5\r
+reset      0  .     .     0100111001110000  ..........  S S S    0   0   0\r
+ror        8  s     .     1110...000011...  ..........  U U U    6   6   8\r
+ror       16  s     .     1110...001011...  ..........  U U U    6   6   8\r
+ror       32  s     .     1110...010011...  ..........  U U U    8   8   8\r
+ror        8  r     .     1110...000111...  ..........  U U U    6   6   8\r
+ror       16  r     .     1110...001111...  ..........  U U U    6   6   8\r
+ror       32  r     .     1110...010111...  ..........  U U U    8   8   8\r
+ror       16  .     .     1110011011......  A+-DXWL...  U U U    8   8   7\r
+rol        8  s     .     1110...100011...  ..........  U U U    6   6   8\r
+rol       16  s     .     1110...101011...  ..........  U U U    6   6   8\r
+rol       32  s     .     1110...110011...  ..........  U U U    8   8   8\r
+rol        8  r     .     1110...100111...  ..........  U U U    6   6   8\r
+rol       16  r     .     1110...101111...  ..........  U U U    6   6   8\r
+rol       32  r     .     1110...110111...  ..........  U U U    8   8   8\r
+rol       16  .     .     1110011111......  A+-DXWL...  U U U    8   8   7\r
+roxr       8  s     .     1110...000010...  ..........  U U U    6   6  12\r
+roxr      16  s     .     1110...001010...  ..........  U U U    6   6  12\r
+roxr      32  s     .     1110...010010...  ..........  U U U    8   8  12\r
+roxr       8  r     .     1110...000110...  ..........  U U U    6   6  12\r
+roxr      16  r     .     1110...001110...  ..........  U U U    6   6  12\r
+roxr      32  r     .     1110...010110...  ..........  U U U    8   8  12\r
+roxr      16  .     .     1110010011......  A+-DXWL...  U U U    8   8   5\r
+roxl       8  s     .     1110...100010...  ..........  U U U    6   6  12\r
+roxl      16  s     .     1110...101010...  ..........  U U U    6   6  12\r
+roxl      32  s     .     1110...110010...  ..........  U U U    8   8  12\r
+roxl       8  r     .     1110...100110...  ..........  U U U    6   6  12\r
+roxl      16  r     .     1110...101110...  ..........  U U U    6   6  12\r
+roxl      32  r     .     1110...110110...  ..........  U U U    8   8  12\r
+roxl      16  .     .     1110010111......  A+-DXWL...  U U U    8   8   5\r
+rtd       32  .     .     0100111001110100  ..........  . U U    .  16  10\r
+rte       32  .     .     0100111001110011  ..........  S S S   20  24  20  bus fault not emulated\r
+rtm       32  .     .     000001101100....  ..........  . . U    .   .  19  not properly emulated\r
+rtr       32  .     .     0100111001110111  ..........  U U U   20  20  14\r
+rts       32  .     .     0100111001110101  ..........  U U U   16  16  10\r
+sbcd       8  rr    .     1000...100000...  ..........  U U U    6   6   4\r
+sbcd       8  mm    ax7   1000111100001...  ..........  U U U   18  18  16\r
+sbcd       8  mm    ay7   1000...100001111  ..........  U U U   18  18  16\r
+sbcd       8  mm    axy7  1000111100001111  ..........  U U U   18  18  16\r
+sbcd       8  mm    .     1000...100001...  ..........  U U U   18  18  16\r
+st         8  .     d     0101000011000...  ..........  U U U    6   4   4\r
+st         8  .     .     0101000011......  A+-DXWL...  U U U    8   8   6\r
+sf         8  .     d     0101000111000...  ..........  U U U    4   4   4\r
+sf         8  .     .     0101000111......  A+-DXWL...  U U U    8   8   6\r
+scc        8  .     d     0101....11000...  ..........  U U U    4   4   4\r
+scc        8  .     .     0101....11......  A+-DXWL...  U U U    8   8   6\r
+stop       0  .     .     0100111001110010  ..........  S S S    4   4   8\r
+sub        8  er    d     1001...000000...  ..........  U U U    4   4   2\r
+sub        8  er    .     1001...000......  A+-DXWLdxI  U U U    4   4   2\r
+sub       16  er    d     1001...001000...  ..........  U U U    4   4   2\r
+sub       16  er    a     1001...001001...  ..........  U U U    4   4   2\r
+sub       16  er    .     1001...001......  A+-DXWLdxI  U U U    4   4   2\r
+sub       32  er    d     1001...010000...  ..........  U U U    6   6   2\r
+sub       32  er    a     1001...010001...  ..........  U U U    6   6   2\r
+sub       32  er    .     1001...010......  A+-DXWLdxI  U U U    6   6   2\r
+sub        8  re    .     1001...100......  A+-DXWL...  U U U    8   8   4\r
+sub       16  re    .     1001...101......  A+-DXWL...  U U U    8   8   4\r
+sub       32  re    .     1001...110......  A+-DXWL...  U U U   12  12   4\r
+suba      16  .     d     1001...011000...  ..........  U U U    8   8   2\r
+suba      16  .     a     1001...011001...  ..........  U U U    8   8   2\r
+suba      16  .     .     1001...011......  A+-DXWLdxI  U U U    8   8   2\r
+suba      32  .     d     1001...111000...  ..........  U U U    6   6   2\r
+suba      32  .     a     1001...111001...  ..........  U U U    6   6   2\r
+suba      32  .     .     1001...111......  A+-DXWLdxI  U U U    6   6   2\r
+subi       8  .     d     0000010000000...  ..........  U U U    8   8   2\r
+subi       8  .     .     0000010000......  A+-DXWL...  U U U   12  12   4\r
+subi      16  .     d     0000010001000...  ..........  U U U    8   8   2\r
+subi      16  .     .     0000010001......  A+-DXWL...  U U U   12  12   4\r
+subi      32  .     d     0000010010000...  ..........  U U U   16  14   2\r
+subi      32  .     .     0000010010......  A+-DXWL...  U U U   20  20   4\r
+subq       8  .     d     0101...100000...  ..........  U U U    4   4   2\r
+subq       8  .     .     0101...100......  A+-DXWL...  U U U    8   8   4\r
+subq      16  .     d     0101...101000...  ..........  U U U    4   4   2\r
+subq      16  .     a     0101...101001...  ..........  U U U    8   4   2\r
+subq      16  .     .     0101...101......  A+-DXWL...  U U U    8   8   4\r
+subq      32  .     d     0101...110000...  ..........  U U U    8   8   2\r
+subq      32  .     a     0101...110001...  ..........  U U U    8   8   2\r
+subq      32  .     .     0101...110......  A+-DXWL...  U U U   12  12   4\r
+subx       8  rr    .     1001...100000...  ..........  U U U    4   4   2\r
+subx      16  rr    .     1001...101000...  ..........  U U U    4   4   2\r
+subx      32  rr    .     1001...110000...  ..........  U U U    8   6   2\r
+subx       8  mm    ax7   1001111100001...  ..........  U U U   18  18  12\r
+subx       8  mm    ay7   1001...100001111  ..........  U U U   18  18  12\r
+subx       8  mm    axy7  1001111100001111  ..........  U U U   18  18  12\r
+subx       8  mm    .     1001...100001...  ..........  U U U   18  18  12\r
+subx      16  mm    .     1001...101001...  ..........  U U U   18  18  12\r
+subx      32  mm    .     1001...110001...  ..........  U U U   30  30  12\r
+swap      32  .     .     0100100001000...  ..........  U U U    4   4   4\r
+tas        8  .     d     0100101011000...  ..........  U U U    4   4   4\r
+tas        8  .     .     0100101011......  A+-DXWL...  U U U   14  14  12\r
+trap       0  .     .     010011100100....  ..........  U U U    4   4   4\r
+trapt      0  .     .     0101000011111100  ..........  . . U    .   .   4\r
+trapt     16  .     .     0101000011111010  ..........  . . U    .   .   6\r
+trapt     32  .     .     0101000011111011  ..........  . . U    .   .   8\r
+trapf      0  .     .     0101000111111100  ..........  . . U    .   .   4\r
+trapf     16  .     .     0101000111111010  ..........  . . U    .   .   6\r
+trapf     32  .     .     0101000111111011  ..........  . . U    .   .   8\r
+trapcc     0  .     .     0101....11111100  ..........  . . U    .   .   4\r
+trapcc    16  .     .     0101....11111010  ..........  . . U    .   .   6\r
+trapcc    32  .     .     0101....11111011  ..........  . . U    .   .   8\r
+trapv      0  .     .     0100111001110110  ..........  U U U    4   4   4\r
+tst        8  .     d     0100101000000...  ..........  U U U    4   4   2\r
+tst        8  .     .     0100101000......  A+-DXWL...  U U U    4   4   2\r
+tst        8  .     pcdi  0100101000111010  ..........  . . U    .   .   7\r
+tst        8  .     pcix  0100101000111011  ..........  . . U    .   .   9\r
+tst        8  .     i     0100101000111100  ..........  . . U    .   .   6\r
+tst       16  .     d     0100101001000...  ..........  U U U    4   4   2\r
+tst       16  .     a     0100101001001...  ..........  . . U    .   .   2\r
+tst       16  .     .     0100101001......  A+-DXWL...  U U U    4   4   2\r
+tst       16  .     pcdi  0100101001111010  ..........  . . U    .   .   7\r
+tst       16  .     pcix  0100101001111011  ..........  . . U    .   .   9\r
+tst       16  .     i     0100101001111100  ..........  . . U    .   .   6\r
+tst       32  .     d     0100101010000...  ..........  U U U    4   4   2\r
+tst       32  .     a     0100101010001...  ..........  . . U    .   .   2\r
+tst       32  .     .     0100101010......  A+-DXWL...  U U U    4   4   2\r
+tst       32  .     pcdi  0100101010111010  ..........  . . U    .   .   7\r
+tst       32  .     pcix  0100101010111011  ..........  . . U    .   .   9\r
+tst       32  .     i     0100101010111100  ..........  . . U    .   .   6\r
+unlk      32  .     a7    0100111001011111  ..........  U U U   12  12   6\r
+unlk      32  .     .     0100111001011...  ..........  U U U   12  12   6\r
+unpk      16  rr    .     1000...110000...  ..........  . . U    .   .   8\r
+unpk      16  mm    ax7   1000111110001...  ..........  . . U    .   .  13\r
+unpk      16  mm    ay7   1000...110001111  ..........  . . U    .   .  13\r
+unpk      16  mm    axy7  1000111110001111  ..........  . . U    .   .  13\r
+unpk      16  mm    .     1000...110001...  ..........  . . U    .   .  13\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_OPCODE_HANDLER_BODY\r
+\r
+M68KMAKE_OP(1010, 0, ., .)\r
+{\r
+       m68ki_exception_1010();\r
+}\r
+\r
+\r
+M68KMAKE_OP(1111, 0, ., .)\r
+{\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(abcd, 8, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res += 6;\r
+       res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res -= 0xa0;\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(abcd, 8, mm, ax7)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res += 6;\r
+       res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res -= 0xa0;\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(abcd, 8, mm, ay7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res += 6;\r
+       res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res -= 0xa0;\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(abcd, 8, mm, axy7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res += 6;\r
+       res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res -= 0xa0;\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(abcd, 8, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(src) + LOW_NIBBLE(dst) + XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res += 6;\r
+       res += HIGH_NIBBLE(src) + HIGH_NIBBLE(dst);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res -= 0xa0;\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 8, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_8(DY);\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 8, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_8;\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 16, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 16, er, a)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(AY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 16, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_16;\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 32, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 32, er, a)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = AY;\r
+       uint dst = *r_dst;\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 32, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_32;\r
+       uint dst = *r_dst;\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 8, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = MASK_OUT_ABOVE_8(DX);\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 16, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = MASK_OUT_ABOVE_16(DX);\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(add, 32, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint src = DX;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 16, ., d)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(DY));\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 16, ., a)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(AY));\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 16, ., .)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 32, ., d)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + DY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 32, ., a)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + AY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(adda, 32, ., .)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + M68KMAKE_GET_OPER_AY_32);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_8();\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_16();\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_32();\r
+       uint dst = *r_dst;\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addi, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 8, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 16, ., a)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 16, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = *r_dst;\r
+       uint res = src + dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 32, ., a)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst + (((REG_IR >> 9) - 1) & 7) + 1);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addq, 32, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = src + dst;\r
+\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 8, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_8(DY);\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 16, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 32, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 8, mm, ax7)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 8, mm, ay7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 8, mm, axy7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 8, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_V = VFLAG_ADD_8(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 16, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_16();\r
+       uint ea  = EA_AX_PD_16();\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_V = VFLAG_ADD_16(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_16(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(addx, 32, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_32();\r
+       uint ea  = EA_AX_PD_32();\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = src + dst + XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_ADD_32(src, dst, res);\r
+       FLAG_X = FLAG_C = CFLAG_ADD_32(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_32(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 8, er, d)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_8(DX &= (DY | 0xffffff00));\r
+\r
+       FLAG_N = NFLAG_8(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 8, er, .)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_8(DX &= (M68KMAKE_GET_OPER_AY_8 | 0xffffff00));\r
+\r
+       FLAG_N = NFLAG_8(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 16, er, d)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_16(DX &= (DY | 0xffff0000));\r
+\r
+       FLAG_N = NFLAG_16(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 16, er, .)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_16(DX &= (M68KMAKE_GET_OPER_AY_16 | 0xffff0000));\r
+\r
+       FLAG_N = NFLAG_16(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 32, er, d)\r
+{\r
+       FLAG_Z = DX &= DY;\r
+\r
+       FLAG_N = NFLAG_32(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 32, er, .)\r
+{\r
+       FLAG_Z = DX &= M68KMAKE_GET_OPER_AY_32;\r
+\r
+       FLAG_N = NFLAG_32(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 8, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = DX & m68ki_read_8(ea);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 16, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = DX & m68ki_read_16(ea);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(and, 32, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = DX & m68ki_read_32(ea);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+       m68ki_write_32(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 8, ., d)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_8(DY &= (OPER_I_8() | 0xffffff00));\r
+\r
+       FLAG_N = NFLAG_8(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = src & m68ki_read_8(ea);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 16, ., d)\r
+{\r
+       FLAG_Z = MASK_OUT_ABOVE_16(DY &= (OPER_I_16() | 0xffff0000));\r
+\r
+       FLAG_N = NFLAG_16(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = src & m68ki_read_16(ea);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+       m68ki_write_16(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 32, ., d)\r
+{\r
+       FLAG_Z = DY &= (OPER_I_32());\r
+\r
+       FLAG_N = NFLAG_32(FLAG_Z);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = src & m68ki_read_32(ea);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+       m68ki_write_32(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 16, toc, .)\r
+{\r
+       m68ki_set_ccr(m68ki_get_ccr() & OPER_I_16());\r
+}\r
+\r
+\r
+M68KMAKE_OP(andi, 16, tos, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint src = OPER_I_16();\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_set_sr(m68ki_get_sr() & src);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(GET_MSB_8(src))\r
+               res |= m68ki_shift_8_table[shift];\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(GET_MSB_16(src))\r
+               res |= m68ki_shift_16_table[shift];\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = src >> shift;\r
+\r
+       if(GET_MSB_32(src))\r
+               res |= m68ki_shift_32_table[shift];\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 8)\r
+               {\r
+                       if(GET_MSB_8(src))\r
+                               res |= m68ki_shift_8_table[shift];\r
+\r
+                       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+                       FLAG_X = FLAG_C = src << (9-shift);\r
+                       FLAG_N = NFLAG_8(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               if(GET_MSB_8(src))\r
+               {\r
+                       *r_dst |= 0xff;\r
+                       FLAG_C = CFLAG_SET;\r
+                       FLAG_X = XFLAG_SET;\r
+                       FLAG_N = NFLAG_SET;\r
+                       FLAG_Z = ZFLAG_CLEAR;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffffff00;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 16)\r
+               {\r
+                       if(GET_MSB_16(src))\r
+                               res |= m68ki_shift_16_table[shift];\r
+\r
+                       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+                       FLAG_C = FLAG_X = (src >> (shift - 1))<<8;\r
+                       FLAG_N = NFLAG_16(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               if(GET_MSB_16(src))\r
+               {\r
+                       *r_dst |= 0xffff;\r
+                       FLAG_C = CFLAG_SET;\r
+                       FLAG_X = XFLAG_SET;\r
+                       FLAG_N = NFLAG_SET;\r
+                       FLAG_Z = ZFLAG_CLEAR;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffff0000;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = *r_dst;\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 32)\r
+               {\r
+                       if(GET_MSB_32(src))\r
+                               res |= m68ki_shift_32_table[shift];\r
+\r
+                       *r_dst = res;\r
+\r
+                       FLAG_C = FLAG_X = (src >> (shift - 1))<<8;\r
+                       FLAG_N = NFLAG_32(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               if(GET_MSB_32(src))\r
+               {\r
+                       *r_dst = 0xffffffff;\r
+                       FLAG_C = CFLAG_SET;\r
+                       FLAG_X = XFLAG_SET;\r
+                       FLAG_N = NFLAG_SET;\r
+                       FLAG_Z = ZFLAG_CLEAR;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst = 0;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asr, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = src >> 1;\r
+\r
+       if(GET_MSB_16(src))\r
+               res |= 0x8000;\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = FLAG_X = src << 8;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_8(src << shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_X = FLAG_C = src << shift;\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       src &= m68ki_shift_8_table[shift + 1];\r
+       FLAG_V = (!(src == 0 || (src == m68ki_shift_8_table[shift + 1] && shift < 8)))<<7;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_16(src << shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> (8-shift);\r
+       src &= m68ki_shift_16_table[shift + 1];\r
+       FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32(src << shift);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> (24-shift);\r
+       src &= m68ki_shift_32_table[shift + 1];\r
+       FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_8(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 8)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+                       FLAG_X = FLAG_C = src << shift;\r
+                       FLAG_N = NFLAG_8(res);\r
+                       FLAG_Z = res;\r
+                       src &= m68ki_shift_8_table[shift + 1];\r
+                       FLAG_V = (!(src == 0 || src == m68ki_shift_8_table[shift + 1]))<<7;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffffff00;\r
+               FLAG_X = FLAG_C = ((shift == 8 ? src & 1 : 0))<<8;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = (!(src == 0))<<7;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_16(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 16)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+                       FLAG_X = FLAG_C = (src << shift) >> 8;\r
+                       FLAG_N = NFLAG_16(res);\r
+                       FLAG_Z = res;\r
+                       src &= m68ki_shift_16_table[shift + 1];\r
+                       FLAG_V = (!(src == 0 || src == m68ki_shift_16_table[shift + 1]))<<7;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffff0000;\r
+               FLAG_X = FLAG_C = ((shift == 16 ? src & 1 : 0))<<8;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = (!(src == 0))<<7;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 32)\r
+               {\r
+                       *r_dst = res;\r
+                       FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;\r
+                       FLAG_N = NFLAG_32(res);\r
+                       FLAG_Z = res;\r
+                       src &= m68ki_shift_32_table[shift + 1];\r
+                       FLAG_V = (!(src == 0 || src == m68ki_shift_32_table[shift + 1]))<<7;\r
+                       return;\r
+               }\r
+\r
+               *r_dst = 0;\r
+               FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = (!(src == 0))<<7;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(asl, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = MASK_OUT_ABOVE_16(src << 1);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> 7;\r
+       src &= 0xc000;\r
+       FLAG_V = (!(src == 0 || src == 0xc000))<<7;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bcc, 8, ., .)\r
+{\r
+       if(M68KMAKE_CC)\r
+       {\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));\r
+               return;\r
+       }\r
+       USE_CYCLES(CYC_BCC_NOTAKE_B);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bcc, 16, ., .)\r
+{\r
+       if(M68KMAKE_CC)\r
+       {\r
+               uint offset = OPER_I_16();\r
+               REG_PC -= 2;\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_branch_16(offset);\r
+               return;\r
+       }\r
+       REG_PC += 2;\r
+       USE_CYCLES(CYC_BCC_NOTAKE_W);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bcc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               if(M68KMAKE_CC)\r
+               {\r
+                       uint offset = OPER_I_32();\r
+                       REG_PC -= 4;\r
+                       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+                       m68ki_branch_32(offset);\r
+                       return;\r
+               }\r
+               REG_PC += 4;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bchg, 32, r, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (DX & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst ^= mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bchg, 8, r, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+       uint mask = 1 << (DX & 7);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src ^ mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bchg, 32, s, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (OPER_I_8() & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst ^= mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bchg, 8, s, .)\r
+{\r
+       uint mask = 1 << (OPER_I_8() & 7);\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src ^ mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bclr, 32, r, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (DX & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst &= ~mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bclr, 8, r, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+       uint mask = 1 << (DX & 7);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src & ~mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bclr, 32, s, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (OPER_I_8() & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst &= ~mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bclr, 8, s, .)\r
+{\r
+       uint mask = 1 << (OPER_I_8() & 7);\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src & ~mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfchg, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint* data = &DY;\r
+               uint64 mask;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask = ROR_32(mask, offset);\r
+\r
+               FLAG_N = NFLAG_32(*data<<offset);\r
+               FLAG_Z = *data & mask;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               *data ^= mask;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfchg, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint mask_base;\r
+               uint data_long;\r
+               uint mask_long;\r
+               uint data_byte = 0;\r
+               uint mask_byte = 0;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask_long = mask_base >> offset;\r
+\r
+               data_long = m68ki_read_32(ea);\r
+               FLAG_N = NFLAG_32(data_long << offset);\r
+               FLAG_Z = data_long & mask_long;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               m68ki_write_32(ea, data_long ^ mask_long);\r
+\r
+               if((width + offset) > 32)\r
+               {\r
+                       mask_byte = MASK_OUT_ABOVE_8(mask_base);\r
+                       data_byte = m68ki_read_8(ea+4);\r
+                       FLAG_Z |= (data_byte & mask_byte);\r
+                       m68ki_write_8(ea+4, data_byte ^ mask_byte);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfclr, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint* data = &DY;\r
+               uint64 mask;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask = ROR_32(mask, offset);\r
+\r
+               FLAG_N = NFLAG_32(*data<<offset);\r
+               FLAG_Z = *data & mask;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               *data &= ~mask;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfclr, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint mask_base;\r
+               uint data_long;\r
+               uint mask_long;\r
+               uint data_byte = 0;\r
+               uint mask_byte = 0;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask_long = mask_base >> offset;\r
+\r
+               data_long = m68ki_read_32(ea);\r
+               FLAG_N = NFLAG_32(data_long << offset);\r
+               FLAG_Z = data_long & mask_long;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               m68ki_write_32(ea, data_long & ~mask_long);\r
+\r
+               if((width + offset) > 32)\r
+               {\r
+                       mask_byte = MASK_OUT_ABOVE_8(mask_base);\r
+                       data_byte = m68ki_read_8(ea+4);\r
+                       FLAG_Z |= (data_byte & mask_byte);\r
+                       m68ki_write_8(ea+4, data_byte & ~mask_byte);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfexts, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint64 data = DY;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = ROL_32(data, offset);\r
+               FLAG_N = NFLAG_32(data);\r
+               data = MAKE_INT_32(data) >> (32 - width);\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               REG_D[(word2>>12)&7] = data;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfexts, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint data;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = m68ki_read_32(ea);\r
+\r
+               data = MASK_OUT_ABOVE_32(data<<offset);\r
+\r
+               if((offset+width) > 32)\r
+                       data |= (m68ki_read_8(ea+4) << offset) >> 8;\r
+\r
+               FLAG_N = NFLAG_32(data);\r
+               data  = MAKE_INT_32(data) >> (32 - width);\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               REG_D[(word2 >> 12) & 7] = data;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfextu, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint64 data = DY;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = ROL_32(data, offset);\r
+               FLAG_N = NFLAG_32(data);\r
+               data >>= 32 - width;\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               REG_D[(word2>>12)&7] = data;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfextu, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint data;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+               offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = m68ki_read_32(ea);\r
+               data = MASK_OUT_ABOVE_32(data<<offset);\r
+\r
+               if((offset+width) > 32)\r
+                       data |= (m68ki_read_8(ea+4) << offset) >> 8;\r
+\r
+               FLAG_N = NFLAG_32(data);\r
+               data  >>= (32 - width);\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               REG_D[(word2 >> 12) & 7] = data;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfffo, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint64 data = DY;\r
+               uint bit;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = ROL_32(data, offset);\r
+               FLAG_N = NFLAG_32(data);\r
+               data >>= 32 - width;\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)\r
+                       offset++;\r
+\r
+               REG_D[(word2>>12)&7] = offset;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfffo, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               sint local_offset;\r
+               uint width = word2;\r
+               uint data;\r
+               uint bit;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               local_offset = offset % 8;\r
+               if(local_offset < 0)\r
+               {\r
+                       local_offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               data = m68ki_read_32(ea);\r
+               data = MASK_OUT_ABOVE_32(data<<local_offset);\r
+\r
+               if((local_offset+width) > 32)\r
+                       data |= (m68ki_read_8(ea+4) << local_offset) >> 8;\r
+\r
+               FLAG_N = NFLAG_32(data);\r
+               data  >>= (32 - width);\r
+\r
+               FLAG_Z = data;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               for(bit = 1<<(width-1);bit && !(data & bit);bit>>= 1)\r
+                       offset++;\r
+\r
+               REG_D[(word2>>12)&7] = offset;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfins, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint* data = &DY;\r
+               uint64 mask;\r
+               uint64 insert = REG_D[(word2>>12)&7];\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask = ROR_32(mask, offset);\r
+\r
+               insert = MASK_OUT_ABOVE_32(insert << (32 - width));\r
+               FLAG_N = NFLAG_32(insert);\r
+               FLAG_Z = insert;\r
+               insert = ROR_32(insert, offset);\r
+\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               *data &= ~mask;\r
+               *data |= insert;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfins, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint insert_base = REG_D[(word2>>12)&7];\r
+               uint insert_long;\r
+               uint insert_byte;\r
+               uint mask_base;\r
+               uint data_long;\r
+               uint mask_long;\r
+               uint data_byte = 0;\r
+               uint mask_byte = 0;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+               mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask_long = mask_base >> offset;\r
+\r
+               insert_base = MASK_OUT_ABOVE_32(insert_base << (32 - width));\r
+               FLAG_N = NFLAG_32(insert_base);\r
+               FLAG_Z = insert_base;\r
+               insert_long = insert_base >> offset;\r
+\r
+               data_long = m68ki_read_32(ea);\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               m68ki_write_32(ea, (data_long & ~mask_long) | insert_long);\r
+\r
+               if((width + offset) > 32)\r
+               {\r
+                       mask_byte = MASK_OUT_ABOVE_8(mask_base);\r
+                       insert_byte = MASK_OUT_ABOVE_8(insert_base);\r
+                       data_byte = m68ki_read_8(ea+4);\r
+                       FLAG_Z |= (data_byte & mask_byte);\r
+                       m68ki_write_8(ea+4, (data_byte & ~mask_byte) | insert_byte);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfset, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint* data = &DY;\r
+               uint64 mask;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask = ROR_32(mask, offset);\r
+\r
+               FLAG_N = NFLAG_32(*data<<offset);\r
+               FLAG_Z = *data & mask;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               *data |= mask;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bfset, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint mask_base;\r
+               uint data_long;\r
+               uint mask_long;\r
+               uint data_byte = 0;\r
+               uint mask_byte = 0;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask_long = mask_base >> offset;\r
+\r
+               data_long = m68ki_read_32(ea);\r
+               FLAG_N = NFLAG_32(data_long << offset);\r
+               FLAG_Z = data_long & mask_long;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               m68ki_write_32(ea, data_long | mask_long);\r
+\r
+               if((width + offset) > 32)\r
+               {\r
+                       mask_byte = MASK_OUT_ABOVE_8(mask_base);\r
+                       data_byte = m68ki_read_8(ea+4);\r
+                       FLAG_Z |= (data_byte & mask_byte);\r
+                       m68ki_write_8(ea+4, data_byte | mask_byte);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bftst, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint* data = &DY;\r
+               uint64 mask;\r
+\r
+\r
+               if(BIT_B(word2))\r
+                       offset = REG_D[offset&7];\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+\r
+               offset &= 31;\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask = ROR_32(mask, offset);\r
+\r
+               FLAG_N = NFLAG_32(*data<<offset);\r
+               FLAG_Z = *data & mask;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bftst, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               sint offset = (word2>>6)&31;\r
+               uint width = word2;\r
+               uint mask_base;\r
+               uint data_long;\r
+               uint mask_long;\r
+               uint data_byte = 0;\r
+               uint mask_byte = 0;\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+               if(BIT_B(word2))\r
+                       offset = MAKE_INT_32(REG_D[offset&7]);\r
+               if(BIT_5(word2))\r
+                       width = REG_D[width&7];\r
+\r
+               /* Offset is signed so we have to use ugly math =( */\r
+               ea += offset / 8;\r
+               offset %= 8;\r
+               if(offset < 0)\r
+               {\r
+                       offset += 8;\r
+                       ea--;\r
+               }\r
+               width = ((width-1) & 31) + 1;\r
+\r
+\r
+               mask_base = MASK_OUT_ABOVE_32(0xffffffff << (32 - width));\r
+               mask_long = mask_base >> offset;\r
+\r
+               data_long = m68ki_read_32(ea);\r
+               FLAG_N = ((data_long & (0x80000000 >> offset))<<offset)>>24;\r
+               FLAG_Z = data_long & mask_long;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               if((width + offset) > 32)\r
+               {\r
+                       mask_byte = MASK_OUT_ABOVE_8(mask_base);\r
+                       data_byte = m68ki_read_8(ea+4);\r
+                       FLAG_Z |= (data_byte & mask_byte);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bkpt, 0, ., .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               m68ki_bkpt_ack(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE) ? REG_IR & 7 : 0);      /* auto-disable (see m68kcpu.h) */\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bra, 8, ., .)\r
+{\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));\r
+       if(REG_PC == REG_PPC)\r
+               USE_ALL_CYCLES();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bra, 16, ., .)\r
+{\r
+       uint offset = OPER_I_16();\r
+       REG_PC -= 2;\r
+       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+       m68ki_branch_16(offset);\r
+       if(REG_PC == REG_PPC)\r
+               USE_ALL_CYCLES();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bra, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint offset = OPER_I_32();\r
+               REG_PC -= 4;\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_branch_32(offset);\r
+               if(REG_PC == REG_PPC)\r
+                       USE_ALL_CYCLES();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(bset, 32, r, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (DX & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst |= mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bset, 8, r, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+       uint mask = 1 << (DX & 7);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src | mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bset, 32, s, d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint mask = 1 << (OPER_I_8() & 0x1f);\r
+\r
+       FLAG_Z = *r_dst & mask;\r
+       *r_dst |= mask;\r
+}\r
+\r
+\r
+M68KMAKE_OP(bset, 8, s, .)\r
+{\r
+       uint mask = 1 << (OPER_I_8() & 7);\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+\r
+       FLAG_Z = src & mask;\r
+       m68ki_write_8(ea, src | mask);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bsr, 8, ., .)\r
+{\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       m68ki_push_32(REG_PC);\r
+       m68ki_branch_8(MASK_OUT_ABOVE_8(REG_IR));\r
+}\r
+\r
+\r
+M68KMAKE_OP(bsr, 16, ., .)\r
+{\r
+       uint offset = OPER_I_16();\r
+       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+       m68ki_push_32(REG_PC);\r
+       REG_PC -= 2;\r
+       m68ki_branch_16(offset);\r
+}\r
+\r
+\r
+M68KMAKE_OP(bsr, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint offset = OPER_I_32();\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_push_32(REG_PC);\r
+               REG_PC -= 4;\r
+               m68ki_branch_32(offset);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(btst, 32, r, d)\r
+{\r
+       FLAG_Z = DY & (1 << (DX & 0x1f));\r
+}\r
+\r
+\r
+M68KMAKE_OP(btst, 8, r, .)\r
+{\r
+       FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << (DX & 7));\r
+}\r
+\r
+\r
+M68KMAKE_OP(btst, 32, s, d)\r
+{\r
+       FLAG_Z = DY & (1 << (OPER_I_8() & 0x1f));\r
+}\r
+\r
+\r
+M68KMAKE_OP(btst, 8, s, .)\r
+{\r
+       uint bit = OPER_I_8() & 7;\r
+\r
+       FLAG_Z = M68KMAKE_GET_OPER_AY_8 & (1 << bit);\r
+}\r
+\r
+\r
+M68KMAKE_OP(callm, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+       {\r
+               uint ea = M68KMAKE_GET_EA_AY_32;\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               REG_PC += 2;\r
+(void)ea;      /* just to avoid an 'unused variable' warning */\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cas, 8, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+               uint dest = m68ki_read_8(ea);\r
+               uint* compare = &REG_D[word2 & 7];\r
+               uint res = dest - MASK_OUT_ABOVE_8(*compare);\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+               FLAG_V = VFLAG_SUB_8(*compare, dest, res);\r
+               FLAG_C = CFLAG_8(res);\r
+\r
+               if(COND_NE())\r
+                       *compare = MASK_OUT_BELOW_8(*compare) | dest;\r
+               else\r
+               {\r
+                       USE_CYCLES(3);\r
+                       m68ki_write_8(ea, MASK_OUT_ABOVE_8(REG_D[(word2 >> 6) & 7]));\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cas, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint ea = M68KMAKE_GET_EA_AY_16;\r
+               uint dest = m68ki_read_16(ea);\r
+               uint* compare = &REG_D[word2 & 7];\r
+               uint res = dest - MASK_OUT_ABOVE_16(*compare);\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+               FLAG_V = VFLAG_SUB_16(*compare, dest, res);\r
+               FLAG_C = CFLAG_16(res);\r
+\r
+               if(COND_NE())\r
+                       *compare = MASK_OUT_BELOW_16(*compare) | dest;\r
+               else\r
+               {\r
+                       USE_CYCLES(3);\r
+                       m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_D[(word2 >> 6) & 7]));\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cas, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint ea = M68KMAKE_GET_EA_AY_32;\r
+               uint dest = m68ki_read_32(ea);\r
+               uint* compare = &REG_D[word2 & 7];\r
+               uint res = dest - *compare;\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+               FLAG_V = VFLAG_SUB_32(*compare, dest, res);\r
+               FLAG_C = CFLAG_SUB_32(*compare, dest, res);\r
+\r
+               if(COND_NE())\r
+                       *compare = dest;\r
+               else\r
+               {\r
+                       USE_CYCLES(3);\r
+                       m68ki_write_32(ea, REG_D[(word2 >> 6) & 7]);\r
+               }\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cas2, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_32();\r
+               uint* compare1 = &REG_D[(word2 >> 16) & 7];\r
+               uint ea1 = REG_DA[(word2 >> 28) & 15];\r
+               uint dest1 = m68ki_read_16(ea1);\r
+               uint res1 = dest1 - MASK_OUT_ABOVE_16(*compare1);\r
+               uint* compare2 = &REG_D[word2 & 7];\r
+               uint ea2 = REG_DA[(word2 >> 12) & 15];\r
+               uint dest2 = m68ki_read_16(ea2);\r
+               uint res2;\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               FLAG_N = NFLAG_16(res1);\r
+               FLAG_Z = MASK_OUT_ABOVE_16(res1);\r
+               FLAG_V = VFLAG_SUB_16(*compare1, dest1, res1);\r
+               FLAG_C = CFLAG_16(res1);\r
+\r
+               if(COND_EQ())\r
+               {\r
+                       res2 = dest2 - MASK_OUT_ABOVE_16(*compare2);\r
+\r
+                       FLAG_N = NFLAG_16(res2);\r
+                       FLAG_Z = MASK_OUT_ABOVE_16(res2);\r
+                       FLAG_V = VFLAG_SUB_16(*compare2, dest2, res2);\r
+                       FLAG_C = CFLAG_16(res2);\r
+\r
+                       if(COND_EQ())\r
+                       {\r
+                               USE_CYCLES(3);\r
+                               m68ki_write_16(ea1, REG_D[(word2 >> 22) & 7]);\r
+                               m68ki_write_16(ea2, REG_D[(word2 >> 6) & 7]);\r
+                               return;\r
+                       }\r
+               }\r
+               *compare1 = BIT_1F(word2) ? MAKE_INT_16(dest1) : MASK_OUT_BELOW_16(*compare1) | dest1;\r
+               *compare2 = BIT_F(word2) ? MAKE_INT_16(dest2) : MASK_OUT_BELOW_16(*compare2) | dest2;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cas2, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_32();\r
+               uint* compare1 = &REG_D[(word2 >> 16) & 7];\r
+               uint ea1 = REG_DA[(word2 >> 28) & 15];\r
+               uint dest1 = m68ki_read_32(ea1);\r
+               uint res1 = dest1 - *compare1;\r
+               uint* compare2 = &REG_D[word2 & 7];\r
+               uint ea2 = REG_DA[(word2 >> 12) & 15];\r
+               uint dest2 = m68ki_read_32(ea2);\r
+               uint res2;\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               FLAG_N = NFLAG_32(res1);\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res1);\r
+               FLAG_V = VFLAG_SUB_32(*compare1, dest1, res1);\r
+               FLAG_C = CFLAG_SUB_32(*compare1, dest1, res1);\r
+\r
+               if(COND_EQ())\r
+               {\r
+                       res2 = dest2 - *compare2;\r
+\r
+                       FLAG_N = NFLAG_32(res2);\r
+                       FLAG_Z = MASK_OUT_ABOVE_32(res2);\r
+                       FLAG_V = VFLAG_SUB_32(*compare2, dest2, res2);\r
+                       FLAG_C = CFLAG_SUB_32(*compare2, dest2, res2);\r
+\r
+                       if(COND_EQ())\r
+                       {\r
+                               USE_CYCLES(3);\r
+                               m68ki_write_32(ea1, REG_D[(word2 >> 22) & 7]);\r
+                               m68ki_write_32(ea2, REG_D[(word2 >> 6) & 7]);\r
+                               return;\r
+                       }\r
+               }\r
+               *compare1 = dest1;\r
+               *compare2 = dest2;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk, 16, ., d)\r
+{\r
+       sint src = MAKE_INT_16(DX);\r
+       sint bound = MAKE_INT_16(DY);\r
+\r
+       if(src >= 0 && src <= bound)\r
+       {\r
+               return;\r
+       }\r
+       FLAG_N = (src < 0)<<7;\r
+       m68ki_exception_trap(EXCEPTION_CHK);\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk, 16, ., .)\r
+{\r
+       sint src = MAKE_INT_16(DX);\r
+       sint bound = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
+\r
+       if(src >= 0 && src <= bound)\r
+       {\r
+               return;\r
+       }\r
+       FLAG_N = (src < 0)<<7;\r
+       m68ki_exception_trap(EXCEPTION_CHK);\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk, 32, ., d)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               sint src = MAKE_INT_32(DX);\r
+               sint bound = MAKE_INT_32(DY);\r
+\r
+               if(src >= 0 && src <= bound)\r
+               {\r
+                       return;\r
+               }\r
+               FLAG_N = (src < 0)<<7;\r
+               m68ki_exception_trap(EXCEPTION_CHK);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               sint src = MAKE_INT_32(DX);\r
+               sint bound = MAKE_INT_32(M68KMAKE_GET_OPER_AY_32);\r
+\r
+               if(src >= 0 && src <= bound)\r
+               {\r
+                       return;\r
+               }\r
+               FLAG_N = (src < 0)<<7;\r
+               m68ki_exception_trap(EXCEPTION_CHK);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk2cmp2, 8, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint compare = REG_DA[(word2 >> 12) & 15];\r
+               uint ea = M68KMAKE_GET_EA_AY_8;\r
+               uint lower_bound = m68ki_read_8(ea);\r
+               uint upper_bound = m68ki_read_8(ea + 1);\r
+\r
+               if(!BIT_F(word2))\r
+                       compare = MAKE_INT_8(compare);\r
+\r
+               FLAG_C = compare - lower_bound;\r
+               FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C);\r
+               if(COND_CS())\r
+               {\r
+                       if(BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+                       return;\r
+               }\r
+\r
+               FLAG_C = upper_bound - compare;\r
+               FLAG_Z = MASK_OUT_ABOVE_8(FLAG_C);\r
+               if(COND_CS() && BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk2cmp2, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint compare = REG_DA[(word2 >> 12) & 15];\r
+               uint ea = M68KMAKE_GET_EA_AY_16;\r
+               uint lower_bound = m68ki_read_16(ea);\r
+               uint upper_bound = m68ki_read_16(ea + 1);\r
+\r
+               if(!BIT_F(word2))\r
+                       compare = MAKE_INT_16(compare);\r
+\r
+               FLAG_C = compare - lower_bound;\r
+               FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C);\r
+               FLAG_C = CFLAG_16(FLAG_C);\r
+               if(COND_CS())\r
+               {\r
+                       if(BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+                       return;\r
+               }\r
+\r
+               FLAG_C = upper_bound - compare;\r
+               FLAG_Z = MASK_OUT_ABOVE_16(FLAG_C);\r
+               FLAG_C = CFLAG_16(FLAG_C);\r
+               if(COND_CS() && BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(chk2cmp2, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint compare = REG_DA[(word2 >> 12) & 15];\r
+               uint ea = M68KMAKE_GET_EA_AY_32;\r
+               uint lower_bound = m68ki_read_32(ea);\r
+               uint upper_bound = m68ki_read_32(ea + 1);\r
+\r
+               FLAG_C = compare - lower_bound;\r
+               FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C);\r
+               FLAG_C = CFLAG_SUB_32(lower_bound, compare, FLAG_C);\r
+               if(COND_CS())\r
+               {\r
+                       if(BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+                       return;\r
+               }\r
+\r
+               FLAG_C = upper_bound - compare;\r
+               FLAG_Z = MASK_OUT_ABOVE_32(FLAG_C);\r
+               FLAG_C = CFLAG_SUB_32(compare, upper_bound, FLAG_C);\r
+               if(COND_CS() && BIT_B(word2))\r
+                               m68ki_exception_trap(EXCEPTION_CHK);\r
+\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 8, ., d)\r
+{\r
+       DY &= 0xffffff00;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 8, ., .)\r
+{\r
+       m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 16, ., d)\r
+{\r
+       DY &= 0xffff0000;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 16, ., .)\r
+{\r
+       m68ki_write_16(M68KMAKE_GET_EA_AY_16, 0);\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 32, ., d)\r
+{\r
+       DY = 0;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(clr, 32, ., .)\r
+{\r
+       m68ki_write_32(M68KMAKE_GET_EA_AY_32, 0);\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_Z = ZFLAG_SET;\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 8, ., d)\r
+{\r
+       uint src = MASK_OUT_ABOVE_8(DY);\r
+       uint dst = MASK_OUT_ABOVE_8(DX);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 8, ., .)\r
+{\r
+       uint src = M68KMAKE_GET_OPER_AY_8;\r
+       uint dst = MASK_OUT_ABOVE_8(DX);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 16, ., d)\r
+{\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+       uint dst = MASK_OUT_ABOVE_16(DX);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 16, ., a)\r
+{\r
+       uint src = MASK_OUT_ABOVE_16(AY);\r
+       uint dst = MASK_OUT_ABOVE_16(DX);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 16, ., .)\r
+{\r
+       uint src = M68KMAKE_GET_OPER_AY_16;\r
+       uint dst = MASK_OUT_ABOVE_16(DX);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 32, ., d)\r
+{\r
+       uint src = DY;\r
+       uint dst = DX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 32, ., a)\r
+{\r
+       uint src = AY;\r
+       uint dst = DX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmp, 32, ., .)\r
+{\r
+       uint src = M68KMAKE_GET_OPER_AY_32;\r
+       uint dst = DX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 16, ., d)\r
+{\r
+       uint src = MAKE_INT_16(DY);\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 16, ., a)\r
+{\r
+       uint src = MAKE_INT_16(AY);\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 16, ., .)\r
+{\r
+       uint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 32, ., d)\r
+{\r
+       uint src = DY;\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 32, ., a)\r
+{\r
+       uint src = AY;\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpa, 32, ., .)\r
+{\r
+       uint src = M68KMAKE_GET_OPER_AY_32;\r
+       uint dst = AX;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 8, ., d)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint dst = MASK_OUT_ABOVE_8(DY);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint dst = M68KMAKE_GET_OPER_AY_8;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 8, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_8();\r
+               uint dst = OPER_PCDI_8();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+               FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+               FLAG_C = CFLAG_8(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 8, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_8();\r
+               uint dst = OPER_PCIX_8();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+               FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+               FLAG_C = CFLAG_8(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 16, ., d)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint dst = MASK_OUT_ABOVE_16(DY);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint dst = M68KMAKE_GET_OPER_AY_16;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 16, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_16();\r
+               uint dst = OPER_PCDI_16();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+               FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+               FLAG_C = CFLAG_16(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 16, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_16();\r
+               uint dst = OPER_PCIX_16();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+               FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+               FLAG_C = CFLAG_16(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 32, ., d)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint dst = DY;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint dst = M68KMAKE_GET_OPER_AY_32;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 32, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_32();\r
+               uint dst = OPER_PCDI_32();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+               FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+               FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpi, 32, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_I_32();\r
+               uint dst = OPER_PCIX_32();\r
+               uint res = dst - src;\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+               FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+               FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 8, ., ax7)\r
+{\r
+       uint src = OPER_AY_PI_8();\r
+       uint dst = OPER_A7_PI_8();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 8, ., ay7)\r
+{\r
+       uint src = OPER_A7_PI_8();\r
+       uint dst = OPER_AX_PI_8();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 8, ., axy7)\r
+{\r
+       uint src = OPER_A7_PI_8();\r
+       uint dst = OPER_A7_PI_8();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 8, ., .)\r
+{\r
+       uint src = OPER_AY_PI_8();\r
+       uint dst = OPER_AX_PI_8();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_C = CFLAG_8(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 16, ., .)\r
+{\r
+       uint src = OPER_AY_PI_16();\r
+       uint dst = OPER_AX_PI_16();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_C = CFLAG_16(res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cmpm, 32, ., .)\r
+{\r
+       uint src = OPER_AY_PI_32();\r
+       uint dst = OPER_AX_PI_32();\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(cpbcc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cpdbcc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cpgen, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cpscc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(cptrapcc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_1111();\r
+}\r
+\r
+\r
+M68KMAKE_OP(dbt, 16, ., .)\r
+{\r
+       REG_PC += 2;\r
+}\r
+\r
+\r
+M68KMAKE_OP(dbf, 16, ., .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = MASK_OUT_ABOVE_16(*r_dst - 1);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+       if(res != 0xffff)\r
+       {\r
+               uint offset = OPER_I_16();\r
+               REG_PC -= 2;\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_branch_16(offset);\r
+               return;\r
+       }\r
+       REG_PC += 2;\r
+}\r
+\r
+\r
+M68KMAKE_OP(dbcc, 16, ., .)\r
+{\r
+       if(M68KMAKE_NOT_CC)\r
+       {\r
+               uint* r_dst = &DY;\r
+               uint res = MASK_OUT_ABOVE_16(*r_dst - 1);\r
+\r
+               *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+               if(res != 0xffff)\r
+               {\r
+                       uint offset = OPER_I_16();\r
+                       REG_PC -= 2;\r
+                       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+                       m68ki_branch_16(offset);\r
+                       USE_CYCLES(CYC_DBCC_F_NOEXP);\r
+                       return;\r
+               }\r
+               REG_PC += 2;\r
+               USE_CYCLES(CYC_DBCC_F_EXP);\r
+               return;\r
+       }\r
+       REG_PC += 2;\r
+}\r
+\r
+\r
+M68KMAKE_OP(divs, 16, ., d)\r
+{\r
+       uint* r_dst = &DX;\r
+       sint src = MAKE_INT_16(DY);\r
+       sint quotient;\r
+       sint remainder;\r
+\r
+       if(src != 0)\r
+       {\r
+               if((uint32)*r_dst == 0x80000000 && src == -1)\r
+               {\r
+                       FLAG_Z = 0;\r
+                       FLAG_N = NFLAG_CLEAR;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = 0;\r
+                       return;\r
+               }\r
+\r
+               quotient = MAKE_INT_32(*r_dst) / src;\r
+               remainder = MAKE_INT_32(*r_dst) % src;\r
+\r
+               if(quotient == MAKE_INT_16(quotient))\r
+               {\r
+                       FLAG_Z = quotient;\r
+                       FLAG_N = NFLAG_16(quotient);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));\r
+                       return;\r
+               }\r
+               FLAG_V = VFLAG_SET;\r
+               return;\r
+       }\r
+       m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+}\r
+\r
+\r
+M68KMAKE_OP(divs, 16, ., .)\r
+{\r
+       uint* r_dst = &DX;\r
+       sint src = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
+       sint quotient;\r
+       sint remainder;\r
+\r
+       if(src != 0)\r
+       {\r
+               if((uint32)*r_dst == 0x80000000 && src == -1)\r
+               {\r
+                       FLAG_Z = 0;\r
+                       FLAG_N = NFLAG_CLEAR;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = 0;\r
+                       return;\r
+               }\r
+\r
+               quotient = MAKE_INT_32(*r_dst) / src;\r
+               remainder = MAKE_INT_32(*r_dst) % src;\r
+\r
+               if(quotient == MAKE_INT_16(quotient))\r
+               {\r
+                       FLAG_Z = quotient;\r
+                       FLAG_N = NFLAG_16(quotient);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));\r
+                       return;\r
+               }\r
+               FLAG_V = VFLAG_SET;\r
+               return;\r
+       }\r
+       m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+}\r
+\r
+\r
+M68KMAKE_OP(divu, 16, ., d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+\r
+       if(src != 0)\r
+       {\r
+               uint quotient = *r_dst / src;\r
+               uint remainder = *r_dst % src;\r
+\r
+               if(quotient < 0x10000)\r
+               {\r
+                       FLAG_Z = quotient;\r
+                       FLAG_N = NFLAG_16(quotient);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));\r
+                       return;\r
+               }\r
+               FLAG_V = VFLAG_SET;\r
+               return;\r
+       }\r
+       m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+}\r
+\r
+\r
+M68KMAKE_OP(divu, 16, ., .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_16;\r
+\r
+       if(src != 0)\r
+       {\r
+               uint quotient = *r_dst / src;\r
+               uint remainder = *r_dst % src;\r
+\r
+               if(quotient < 0x10000)\r
+               {\r
+                       FLAG_Z = quotient;\r
+                       FLAG_N = NFLAG_16(quotient);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       *r_dst = MASK_OUT_ABOVE_32(MASK_OUT_ABOVE_16(quotient) | (remainder << 16));\r
+                       return;\r
+               }\r
+               FLAG_V = VFLAG_SET;\r
+               return;\r
+       }\r
+       m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+}\r
+\r
+\r
+M68KMAKE_OP(divl, 32, ., d)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint64 divisor   = DY;\r
+               uint64 dividend  = 0;\r
+               uint64 quotient  = 0;\r
+               uint64 remainder = 0;\r
+\r
+               if(divisor != 0)\r
+               {\r
+                       if(BIT_A(word2))        /* 64 bit */\r
+                       {\r
+                               dividend = REG_D[word2 & 7];\r
+                               dividend <<= 32;\r
+                               dividend |= REG_D[(word2 >> 12) & 7];\r
+\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       quotient  = (uint64)((sint64)dividend / (sint64)((sint32)divisor));\r
+                                       remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));\r
+                                       if((sint64)quotient != (sint64)((sint32)quotient))\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                               }\r
+                               else                                    /* unsigned */\r
+                               {\r
+                                       quotient = dividend / divisor;\r
+                                       if(quotient > 0xffffffff)\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                                       remainder = dividend % divisor;\r
+                               }\r
+                       }\r
+                       else    /* 32 bit */\r
+                       {\r
+                               dividend = REG_D[(word2 >> 12) & 7];\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       quotient  = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));\r
+                                       remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));\r
+                               }\r
+                               else                                    /* unsigned */\r
+                               {\r
+                                       quotient = dividend / divisor;\r
+                                       remainder = dividend % divisor;\r
+                               }\r
+                       }\r
+\r
+                       REG_D[word2 & 7] = remainder;\r
+                       REG_D[(word2 >> 12) & 7] = quotient;\r
+\r
+                       FLAG_N = NFLAG_32(quotient);\r
+                       FLAG_Z = quotient;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#else\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint divisor = DY;\r
+               uint dividend_hi = REG_D[word2 & 7];\r
+               uint dividend_lo = REG_D[(word2 >> 12) & 7];\r
+               uint quotient = 0;\r
+               uint remainder = 0;\r
+               uint dividend_neg = 0;\r
+               uint divisor_neg = 0;\r
+               sint i;\r
+               uint overflow;\r
+\r
+               if(divisor != 0)\r
+               {\r
+                       /* quad / long : long quotient, long remainder */\r
+                       if(BIT_A(word2))\r
+                       {\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       /* special case in signed divide */\r
+                                       if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)\r
+                                       {\r
+                                               REG_D[word2 & 7] = 0;\r
+                                               REG_D[(word2 >> 12) & 7] = 0x80000000;\r
+\r
+                                               FLAG_N = NFLAG_SET;\r
+                                               FLAG_Z = ZFLAG_CLEAR;\r
+                                               FLAG_V = VFLAG_CLEAR;\r
+                                               FLAG_C = CFLAG_CLEAR;\r
+                                               return;\r
+                                       }\r
+                                       if(GET_MSB_32(dividend_hi))\r
+                                       {\r
+                                               dividend_neg = 1;\r
+                                               dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));\r
+                                               dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);\r
+                                       }\r
+                                       if(GET_MSB_32(divisor))\r
+                                       {\r
+                                               divisor_neg = 1;\r
+                                               divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);\r
+\r
+                                       }\r
+                               }\r
+\r
+                               /* if the upper long is greater than the divisor, we're overflowing. */\r
+                               if(dividend_hi >= divisor)\r
+                               {\r
+                                       FLAG_V = VFLAG_SET;\r
+                                       return;\r
+                               }\r
+\r
+                               for(i = 31; i >= 0; i--)\r
+                               {\r
+                                       quotient <<= 1;\r
+                                       remainder = (remainder << 1) + ((dividend_hi >> i) & 1);\r
+                                       if(remainder >= divisor)\r
+                                       {\r
+                                               remainder -= divisor;\r
+                                               quotient++;\r
+                                       }\r
+                               }\r
+                               for(i = 31; i >= 0; i--)\r
+                               {\r
+                                       quotient <<= 1;\r
+                                       overflow = GET_MSB_32(remainder);\r
+                                       remainder = (remainder << 1) + ((dividend_lo >> i) & 1);\r
+                                       if(remainder >= divisor || overflow)\r
+                                       {\r
+                                               remainder -= divisor;\r
+                                               quotient++;\r
+                                       }\r
+                               }\r
+\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       if(quotient > 0x7fffffff)\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                                       if(dividend_neg)\r
+                                       {\r
+                                               remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);\r
+                                               quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);\r
+                                       }\r
+                                       if(divisor_neg)\r
+                                               quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);\r
+                               }\r
+\r
+                               REG_D[word2 & 7] = remainder;\r
+                               REG_D[(word2 >> 12) & 7] = quotient;\r
+\r
+                               FLAG_N = NFLAG_32(quotient);\r
+                               FLAG_Z = quotient;\r
+                               FLAG_V = VFLAG_CLEAR;\r
+                               FLAG_C = CFLAG_CLEAR;\r
+                               return;\r
+                       }\r
+\r
+                       /* long / long: long quotient, maybe long remainder */\r
+                       if(BIT_B(word2))           /* signed */\r
+                       {\r
+                               /* Special case in divide */\r
+                               if(dividend_lo == 0x80000000 && divisor == 0xffffffff)\r
+                               {\r
+                                       FLAG_N = NFLAG_SET;\r
+                                       FLAG_Z = ZFLAG_CLEAR;\r
+                                       FLAG_V = VFLAG_CLEAR;\r
+                                       FLAG_C = CFLAG_CLEAR;\r
+                                       REG_D[(word2 >> 12) & 7] = 0x80000000;\r
+                                       REG_D[word2 & 7] = 0;\r
+                                       return;\r
+                               }\r
+                               REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);\r
+                               quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);\r
+                       }\r
+                       else\r
+                       {\r
+                               REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);\r
+                               quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);\r
+                       }\r
+\r
+                       FLAG_N = NFLAG_32(quotient);\r
+                       FLAG_Z = quotient;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(divl, 32, ., .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint64 divisor = M68KMAKE_GET_OPER_AY_32;\r
+               uint64 dividend  = 0;\r
+               uint64 quotient  = 0;\r
+               uint64 remainder = 0;\r
+\r
+               if(divisor != 0)\r
+               {\r
+                       if(BIT_A(word2))        /* 64 bit */\r
+                       {\r
+                               dividend = REG_D[word2 & 7];\r
+                               dividend <<= 32;\r
+                               dividend |= REG_D[(word2 >> 12) & 7];\r
+\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       quotient  = (uint64)((sint64)dividend / (sint64)((sint32)divisor));\r
+                                       remainder = (uint64)((sint64)dividend % (sint64)((sint32)divisor));\r
+                                       if((sint64)quotient != (sint64)((sint32)quotient))\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                               }\r
+                               else                                    /* unsigned */\r
+                               {\r
+                                       quotient = dividend / divisor;\r
+                                       if(quotient > 0xffffffff)\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                                       remainder = dividend % divisor;\r
+                               }\r
+                       }\r
+                       else    /* 32 bit */\r
+                       {\r
+                               dividend = REG_D[(word2 >> 12) & 7];\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       quotient  = (uint64)((sint64)((sint32)dividend) / (sint64)((sint32)divisor));\r
+                                       remainder = (uint64)((sint64)((sint32)dividend) % (sint64)((sint32)divisor));\r
+                               }\r
+                               else                                    /* unsigned */\r
+                               {\r
+                                       quotient = dividend / divisor;\r
+                                       remainder = dividend % divisor;\r
+                               }\r
+                       }\r
+\r
+                       REG_D[word2 & 7] = remainder;\r
+                       REG_D[(word2 >> 12) & 7] = quotient;\r
+\r
+                       FLAG_N = NFLAG_32(quotient);\r
+                       FLAG_Z = quotient;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#else\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint divisor = M68KMAKE_GET_OPER_AY_32;\r
+               uint dividend_hi = REG_D[word2 & 7];\r
+               uint dividend_lo = REG_D[(word2 >> 12) & 7];\r
+               uint quotient = 0;\r
+               uint remainder = 0;\r
+               uint dividend_neg = 0;\r
+               uint divisor_neg = 0;\r
+               sint i;\r
+               uint overflow;\r
+\r
+               if(divisor != 0)\r
+               {\r
+                       /* quad / long : long quotient, long remainder */\r
+                       if(BIT_A(word2))\r
+                       {\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       /* special case in signed divide */\r
+                                       if(dividend_hi == 0 && dividend_lo == 0x80000000 && divisor == 0xffffffff)\r
+                                       {\r
+                                               REG_D[word2 & 7] = 0;\r
+                                               REG_D[(word2 >> 12) & 7] = 0x80000000;\r
+\r
+                                               FLAG_N = NFLAG_SET;\r
+                                               FLAG_Z = ZFLAG_CLEAR;\r
+                                               FLAG_V = VFLAG_CLEAR;\r
+                                               FLAG_C = CFLAG_CLEAR;\r
+                                               return;\r
+                                       }\r
+                                       if(GET_MSB_32(dividend_hi))\r
+                                       {\r
+                                               dividend_neg = 1;\r
+                                               dividend_hi = (uint)MASK_OUT_ABOVE_32((-(sint)dividend_hi) - (dividend_lo != 0));\r
+                                               dividend_lo = (uint)MASK_OUT_ABOVE_32(-(sint)dividend_lo);\r
+                                       }\r
+                                       if(GET_MSB_32(divisor))\r
+                                       {\r
+                                               divisor_neg = 1;\r
+                                               divisor = (uint)MASK_OUT_ABOVE_32(-(sint)divisor);\r
+\r
+                                       }\r
+                               }\r
+\r
+                               /* if the upper long is greater than the divisor, we're overflowing. */\r
+                               if(dividend_hi >= divisor)\r
+                               {\r
+                                       FLAG_V = VFLAG_SET;\r
+                                       return;\r
+                               }\r
+\r
+                               for(i = 31; i >= 0; i--)\r
+                               {\r
+                                       quotient <<= 1;\r
+                                       remainder = (remainder << 1) + ((dividend_hi >> i) & 1);\r
+                                       if(remainder >= divisor)\r
+                                       {\r
+                                               remainder -= divisor;\r
+                                               quotient++;\r
+                                       }\r
+                               }\r
+                               for(i = 31; i >= 0; i--)\r
+                               {\r
+                                       quotient <<= 1;\r
+                                       overflow = GET_MSB_32(remainder);\r
+                                       remainder = (remainder << 1) + ((dividend_lo >> i) & 1);\r
+                                       if(remainder >= divisor || overflow)\r
+                                       {\r
+                                               remainder -= divisor;\r
+                                               quotient++;\r
+                                       }\r
+                               }\r
+\r
+                               if(BIT_B(word2))           /* signed */\r
+                               {\r
+                                       if(quotient > 0x7fffffff)\r
+                                       {\r
+                                               FLAG_V = VFLAG_SET;\r
+                                               return;\r
+                                       }\r
+                                       if(dividend_neg)\r
+                                       {\r
+                                               remainder = (uint)MASK_OUT_ABOVE_32(-(sint)remainder);\r
+                                               quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);\r
+                                       }\r
+                                       if(divisor_neg)\r
+                                               quotient = (uint)MASK_OUT_ABOVE_32(-(sint)quotient);\r
+                               }\r
+\r
+                               REG_D[word2 & 7] = remainder;\r
+                               REG_D[(word2 >> 12) & 7] = quotient;\r
+\r
+                               FLAG_N = NFLAG_32(quotient);\r
+                               FLAG_Z = quotient;\r
+                               FLAG_V = VFLAG_CLEAR;\r
+                               FLAG_C = CFLAG_CLEAR;\r
+                               return;\r
+                       }\r
+\r
+                       /* long / long: long quotient, maybe long remainder */\r
+                       if(BIT_B(word2))           /* signed */\r
+                       {\r
+                               /* Special case in divide */\r
+                               if(dividend_lo == 0x80000000 && divisor == 0xffffffff)\r
+                               {\r
+                                       FLAG_N = NFLAG_SET;\r
+                                       FLAG_Z = ZFLAG_CLEAR;\r
+                                       FLAG_V = VFLAG_CLEAR;\r
+                                       FLAG_C = CFLAG_CLEAR;\r
+                                       REG_D[(word2 >> 12) & 7] = 0x80000000;\r
+                                       REG_D[word2 & 7] = 0;\r
+                                       return;\r
+                               }\r
+                               REG_D[word2 & 7] = MAKE_INT_32(dividend_lo) % MAKE_INT_32(divisor);\r
+                               quotient = REG_D[(word2 >> 12) & 7] = MAKE_INT_32(dividend_lo) / MAKE_INT_32(divisor);\r
+                       }\r
+                       else\r
+                       {\r
+                               REG_D[word2 & 7] = MASK_OUT_ABOVE_32(dividend_lo) % MASK_OUT_ABOVE_32(divisor);\r
+                               quotient = REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(dividend_lo) / MASK_OUT_ABOVE_32(divisor);\r
+                       }\r
+\r
+                       FLAG_N = NFLAG_32(quotient);\r
+                       FLAG_Z = quotient;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       FLAG_C = CFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               m68ki_exception_trap(EXCEPTION_ZERO_DIVIDE);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 8, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY ^= MASK_OUT_ABOVE_8(DX));\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = MASK_OUT_ABOVE_8(DX ^ m68ki_read_8(ea));\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 16, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY ^= MASK_OUT_ABOVE_16(DX));\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = MASK_OUT_ABOVE_16(DX ^ m68ki_read_16(ea));\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 32, ., d)\r
+{\r
+       uint res = DY ^= DX;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eor, 32, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = DX ^ m68ki_read_32(ea);\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 8, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY ^= OPER_I_8());\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = src ^ m68ki_read_8(ea);\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 16, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY ^= OPER_I_16());\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = src ^ m68ki_read_16(ea);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 32, ., d)\r
+{\r
+       uint res = DY ^= OPER_I_32();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = src ^ m68ki_read_32(ea);\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 16, toc, .)\r
+{\r
+       m68ki_set_ccr(m68ki_get_ccr() ^ OPER_I_16());\r
+}\r
+\r
+\r
+M68KMAKE_OP(eori, 16, tos, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint src = OPER_I_16();\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_set_sr(m68ki_get_sr() ^ src);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(exg, 32, dd, .)\r
+{\r
+       uint* reg_a = &DX;\r
+       uint* reg_b = &DY;\r
+       uint tmp = *reg_a;\r
+       *reg_a = *reg_b;\r
+       *reg_b = tmp;\r
+}\r
+\r
+\r
+M68KMAKE_OP(exg, 32, aa, .)\r
+{\r
+       uint* reg_a = &AX;\r
+       uint* reg_b = &AY;\r
+       uint tmp = *reg_a;\r
+       *reg_a = *reg_b;\r
+       *reg_b = tmp;\r
+}\r
+\r
+\r
+M68KMAKE_OP(exg, 32, da, .)\r
+{\r
+       uint* reg_a = &DX;\r
+       uint* reg_b = &AY;\r
+       uint tmp = *reg_a;\r
+       *reg_a = *reg_b;\r
+       *reg_b = tmp;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ext, 16, ., .)\r
+{\r
+       uint* r_dst = &DY;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xff00 : 0);\r
+\r
+       FLAG_N = NFLAG_16(*r_dst);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ext, 32, ., .)\r
+{\r
+       uint* r_dst = &DY;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_16(*r_dst) | (GET_MSB_16(*r_dst) ? 0xffff0000 : 0);\r
+\r
+       FLAG_N = NFLAG_32(*r_dst);\r
+       FLAG_Z = *r_dst;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(extb, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint* r_dst = &DY;\r
+\r
+               *r_dst = MASK_OUT_ABOVE_8(*r_dst) | (GET_MSB_8(*r_dst) ? 0xffffff00 : 0);\r
+\r
+               FLAG_N = NFLAG_32(*r_dst);\r
+               FLAG_Z = *r_dst;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(illegal, 0, ., .)\r
+{\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+M68KMAKE_OP(jmp, 32, ., .)\r
+{\r
+       m68ki_jump(M68KMAKE_GET_EA_AY_32);\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       if(REG_PC == REG_PPC)\r
+               USE_ALL_CYCLES();\r
+}\r
+\r
+\r
+M68KMAKE_OP(jsr, 32, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       m68ki_push_32(REG_PC);\r
+       m68ki_jump(ea);\r
+}\r
+\r
+\r
+M68KMAKE_OP(lea, 32, ., .)\r
+{\r
+       AX = M68KMAKE_GET_EA_AY_32;\r
+}\r
+\r
+\r
+M68KMAKE_OP(link, 16, ., a7)\r
+{\r
+       REG_A[7] -= 4;\r
+       m68ki_write_32(REG_A[7], REG_A[7]);\r
+       REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));\r
+}\r
+\r
+\r
+M68KMAKE_OP(link, 16, ., .)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       m68ki_push_32(*r_dst);\r
+       *r_dst = REG_A[7];\r
+       REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));\r
+}\r
+\r
+\r
+M68KMAKE_OP(link, 32, ., a7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               REG_A[7] -= 4;\r
+               m68ki_write_32(REG_A[7], REG_A[7]);\r
+               REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(link, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint* r_dst = &AY;\r
+\r
+               m68ki_push_32(*r_dst);\r
+               *r_dst = REG_A[7];\r
+               REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + OPER_I_32());\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = src >> shift;\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src << (9-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift <= 8)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+                       FLAG_X = FLAG_C = src << (9-shift);\r
+                       FLAG_N = NFLAG_CLEAR;\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffffff00;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift <= 16)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+                       FLAG_C = FLAG_X = (src >> (shift - 1))<<8;\r
+                       FLAG_N = NFLAG_CLEAR;\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffff0000;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = *r_dst;\r
+       uint res = src >> shift;\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 32)\r
+               {\r
+                       *r_dst = res;\r
+                       FLAG_C = FLAG_X = (src >> (shift - 1))<<8;\r
+                       FLAG_N = NFLAG_CLEAR;\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst = 0;\r
+               FLAG_X = FLAG_C = (shift == 32 ? GET_MSB_32(src)>>23 : 0);\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsr, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = src >> 1;\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_CLEAR;\r
+       FLAG_Z = res;\r
+       FLAG_C = FLAG_X = src << 8;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_8(src << shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src << shift;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_16(src << shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> (8-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32(src << shift);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> (24-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_8(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift <= 8)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+                       FLAG_X = FLAG_C = src << shift;\r
+                       FLAG_N = NFLAG_8(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffffff00;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_16(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift <= 16)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+                       FLAG_X = FLAG_C = (src << shift) >> 8;\r
+                       FLAG_N = NFLAG_16(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst &= 0xffff0000;\r
+               FLAG_X = XFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = DX & 0x3f;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32(src << shift);\r
+\r
+       if(shift != 0)\r
+       {\r
+               USE_CYCLES(shift<<CYC_SHIFT);\r
+\r
+               if(shift < 32)\r
+               {\r
+                       *r_dst = res;\r
+                       FLAG_X = FLAG_C = (src >> (32 - shift)) << 8;\r
+                       FLAG_N = NFLAG_32(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               *r_dst = 0;\r
+               FLAG_X = FLAG_C = ((shift == 32 ? src & 1 : 0))<<8;\r
+               FLAG_N = NFLAG_CLEAR;\r
+               FLAG_Z = ZFLAG_SET;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(lsl, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = MASK_OUT_ABOVE_16(src << 1);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_X = FLAG_C = src >> 7;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, d, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, d, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, ai, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AX_AI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, ai, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AX_AI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pi7, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_A7_PI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pi, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AX_PI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pi7, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_A7_PI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pi, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AX_PI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pd7, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_A7_PD_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pd, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AX_PD_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pd7, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_A7_PD_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, pd, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AX_PD_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, di, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AX_DI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, di, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AX_DI_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, ix, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AX_IX_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, ix, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AX_IX_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, aw, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AW_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, aw, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AW_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, al, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+       uint ea = EA_AL_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 8, al, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_8;\r
+       uint ea = EA_AL_8();\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, d, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, d, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, d, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ai, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AX_AI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ai, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AX_AI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ai, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AX_AI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pi, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AX_PI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pi, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AX_PI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pi, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AX_PI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pd, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AX_PD_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pd, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AX_PD_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, pd, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AX_PD_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, di, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AX_DI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, di, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AX_DI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, di, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AX_DI_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ix, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AX_IX_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ix, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AX_IX_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, ix, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AX_IX_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, aw, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AW_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, aw, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AW_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, aw, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AW_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, al, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+       uint ea = EA_AL_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, al, a)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(AY);\r
+       uint ea = EA_AL_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, al, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+       uint ea = EA_AL_16();\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, d, d)\r
+{\r
+       uint res = DY;\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, d, a)\r
+{\r
+       uint res = AY;\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, d, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ai, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AX_AI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ai, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AX_AI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ai, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AX_AI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pi, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AX_PI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pi, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AX_PI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pi, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AX_PI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pd, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AX_PD_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pd, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AX_PD_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, pd, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AX_PD_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, di, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AX_DI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, di, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AX_DI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, di, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AX_DI_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ix, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AX_IX_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ix, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AX_IX_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, ix, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AX_IX_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, aw, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AW_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, aw, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AW_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, aw, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AW_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, al, d)\r
+{\r
+       uint res = DY;\r
+       uint ea = EA_AL_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, al, a)\r
+{\r
+       uint res = AY;\r
+       uint ea = EA_AL_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, al, .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+       uint ea = EA_AL_32();\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 16, ., d)\r
+{\r
+       AX = MAKE_INT_16(DY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 16, ., a)\r
+{\r
+       AX = MAKE_INT_16(AY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 16, ., .)\r
+{\r
+       AX = MAKE_INT_16(M68KMAKE_GET_OPER_AY_16);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 32, ., d)\r
+{\r
+       AX = DY;\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 32, ., a)\r
+{\r
+       AX = AY;\r
+}\r
+\r
+\r
+M68KMAKE_OP(movea, 32, ., .)\r
+{\r
+       AX = M68KMAKE_GET_OPER_AY_32;\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, frc, d)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               DY = MASK_OUT_BELOW_16(DY) | m68ki_get_ccr();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, frc, .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               m68ki_write_16(M68KMAKE_GET_EA_AY_16, m68ki_get_ccr());\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, toc, d)\r
+{\r
+       m68ki_set_ccr(DY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, toc, .)\r
+{\r
+       m68ki_set_ccr(M68KMAKE_GET_OPER_AY_16);\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, frs, d)\r
+{\r
+       if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */\r
+       {\r
+               DY = MASK_OUT_BELOW_16(DY) | m68ki_get_sr();\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, frs, .)\r
+{\r
+       if(CPU_TYPE_IS_000(CPU_TYPE) || FLAG_S) /* NS990408 */\r
+       {\r
+               uint ea = M68KMAKE_GET_EA_AY_16;\r
+               m68ki_write_16(ea, m68ki_get_sr());\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, tos, d)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               m68ki_set_sr(DY);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 16, tos, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint new_sr = M68KMAKE_GET_OPER_AY_16;\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_set_sr(new_sr);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, fru, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               AY = REG_USP;\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(move, 32, tou, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               REG_USP = AY;\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(movec, 32, cr, .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               if(FLAG_S)\r
+               {\r
+                       uint word2 = OPER_I_16();\r
+\r
+                       m68ki_trace_t0();                  /* auto-disable (see m68kcpu.h) */\r
+                       switch (word2 & 0xfff)\r
+                       {\r
+                       case 0x000:                        /* SFC */\r
+                               REG_DA[(word2 >> 12) & 15] = REG_SFC;\r
+                               return;\r
+                       case 0x001:                        /* DFC */\r
+                               REG_DA[(word2 >> 12) & 15] = REG_DFC;\r
+                               return;\r
+                       case 0x002:                        /* CACR */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_DA[(word2 >> 12) & 15] = REG_CACR;\r
+                                       return;\r
+                               }\r
+                               return;\r
+                       case 0x800:                        /* USP */\r
+                               REG_DA[(word2 >> 12) & 15] = REG_USP;\r
+                               return;\r
+                       case 0x801:                        /* VBR */\r
+                               REG_DA[(word2 >> 12) & 15] = REG_VBR;\r
+                               return;\r
+                       case 0x802:                        /* CAAR */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_DA[(word2 >> 12) & 15] = REG_CAAR;\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               break;\r
+                       case 0x803:                        /* MSP */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_SP : REG_MSP;\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       case 0x804:                        /* ISP */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_DA[(word2 >> 12) & 15] = FLAG_M ? REG_ISP : REG_SP;\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       default:\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       }\r
+               }\r
+               m68ki_exception_privilege_violation();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(movec, 32, rc, .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               if(FLAG_S)\r
+               {\r
+                       uint word2 = OPER_I_16();\r
+\r
+                       m68ki_trace_t0();                  /* auto-disable (see m68kcpu.h) */\r
+                       switch (word2 & 0xfff)\r
+                       {\r
+                       case 0x000:                        /* SFC */\r
+                               REG_SFC = REG_DA[(word2 >> 12) & 15] & 7;\r
+                               return;\r
+                       case 0x001:                        /* DFC */\r
+                               REG_DFC = REG_DA[(word2 >> 12) & 15] & 7;\r
+                               return;\r
+                       case 0x002:                        /* CACR */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_CACR = REG_DA[(word2 >> 12) & 15];\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       case 0x800:                        /* USP */\r
+                               REG_USP = REG_DA[(word2 >> 12) & 15];\r
+                               return;\r
+                       case 0x801:                        /* VBR */\r
+                               REG_VBR = REG_DA[(word2 >> 12) & 15];\r
+                               return;\r
+                       case 0x802:                        /* CAAR */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       REG_CAAR = REG_DA[(word2 >> 12) & 15];\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       case 0x803:                        /* MSP */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       /* we are in supervisor mode so just check for M flag */\r
+                                       if(!FLAG_M)\r
+                                       {\r
+                                               REG_MSP = REG_DA[(word2 >> 12) & 15];\r
+                                               return;\r
+                                       }\r
+                                       REG_SP = REG_DA[(word2 >> 12) & 15];\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       case 0x804:                        /* ISP */\r
+                               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                               {\r
+                                       if(!FLAG_M)\r
+                                       {\r
+                                               REG_SP = REG_DA[(word2 >> 12) & 15];\r
+                                               return;\r
+                                       }\r
+                                       REG_ISP = REG_DA[(word2 >> 12) & 15];\r
+                                       return;\r
+                               }\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       default:\r
+                               m68ki_exception_illegal();\r
+                               return;\r
+                       }\r
+               }\r
+               m68ki_exception_privilege_violation();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 16, re, pd)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = AY;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       ea -= 2;\r
+                       m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[15-i]));\r
+                       count++;\r
+               }\r
+       AY = ea;\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_W);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 16, re, .)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       m68ki_write_16(ea, MASK_OUT_ABOVE_16(REG_DA[i]));\r
+                       ea += 2;\r
+                       count++;\r
+               }\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_W);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 32, re, pd)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = AY;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       ea -= 4;\r
+                       m68ki_write_32(ea, REG_DA[15-i]);\r
+                       count++;\r
+               }\r
+       AY = ea;\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_L);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 32, re, .)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       m68ki_write_32(ea, REG_DA[i]);\r
+                       ea += 4;\r
+                       count++;\r
+               }\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_L);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 16, er, pi)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = AY;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));\r
+                       ea += 2;\r
+                       count++;\r
+               }\r
+       AY = ea;\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_W);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 16, er, .)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       REG_DA[i] = MAKE_INT_16(MASK_OUT_ABOVE_16(m68ki_read_16(ea)));\r
+                       ea += 2;\r
+                       count++;\r
+               }\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_W);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 32, er, pi)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = AY;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       REG_DA[i] = m68ki_read_32(ea);\r
+                       ea += 4;\r
+                       count++;\r
+               }\r
+       AY = ea;\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_L);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movem, 32, er, .)\r
+{\r
+       uint i = 0;\r
+       uint register_list = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint count = 0;\r
+\r
+       for(; i < 16; i++)\r
+               if(register_list & (1 << i))\r
+               {\r
+                       REG_DA[i] = m68ki_read_32(ea);\r
+                       ea += 4;\r
+                       count++;\r
+               }\r
+\r
+       USE_CYCLES(count<<CYC_MOVEM_L);\r
+}\r
+\r
+\r
+M68KMAKE_OP(movep, 16, re, .)\r
+{\r
+       uint ea = EA_AY_DI_16();\r
+       uint src = DX;\r
+\r
+       m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 8));\r
+       m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));\r
+}\r
+\r
+\r
+M68KMAKE_OP(movep, 32, re, .)\r
+{\r
+       uint ea = EA_AY_DI_32();\r
+       uint src = DX;\r
+\r
+       m68ki_write_8(ea, MASK_OUT_ABOVE_8(src >> 24));\r
+       m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 16));\r
+       m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src >> 8));\r
+       m68ki_write_8(ea += 2, MASK_OUT_ABOVE_8(src));\r
+}\r
+\r
+\r
+M68KMAKE_OP(movep, 16, er, .)\r
+{\r
+       uint ea = EA_AY_DI_16();\r
+       uint* r_dst = &DX;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | ((m68ki_read_8(ea) << 8) + m68ki_read_8(ea + 2));\r
+}\r
+\r
+\r
+M68KMAKE_OP(movep, 32, er, .)\r
+{\r
+       uint ea = EA_AY_DI_32();\r
+\r
+       DX = (m68ki_read_8(ea) << 24) + (m68ki_read_8(ea + 2) << 16)\r
+               + (m68ki_read_8(ea + 4) << 8) + m68ki_read_8(ea + 6);\r
+}\r
+\r
+\r
+M68KMAKE_OP(moves, 8, ., .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               if(FLAG_S)\r
+               {\r
+                       uint word2 = OPER_I_16();\r
+                       uint ea = M68KMAKE_GET_EA_AY_8;\r
+\r
+                       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+                       if(BIT_B(word2))                   /* Register to memory */\r
+                       {\r
+                               m68ki_write_8_fc(ea, REG_DFC, MASK_OUT_ABOVE_8(REG_DA[(word2 >> 12) & 15]));\r
+                               return;\r
+                       }\r
+                       if(BIT_F(word2))                   /* Memory to address register */\r
+                       {\r
+                               REG_A[(word2 >> 12) & 7] = MAKE_INT_8(m68ki_read_8_fc(ea, REG_SFC));\r
+                               if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                                       USE_CYCLES(2);\r
+                               return;\r
+                       }\r
+                       /* Memory to data register */\r
+                       REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_8(REG_D[(word2 >> 12) & 7]) | m68ki_read_8_fc(ea, REG_SFC);\r
+                       if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                               USE_CYCLES(2);\r
+                       return;\r
+               }\r
+               m68ki_exception_privilege_violation();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(moves, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               if(FLAG_S)\r
+               {\r
+                       uint word2 = OPER_I_16();\r
+                       uint ea = M68KMAKE_GET_EA_AY_16;\r
+\r
+                       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+                       if(BIT_B(word2))                   /* Register to memory */\r
+                       {\r
+                               m68ki_write_16_fc(ea, REG_DFC, MASK_OUT_ABOVE_16(REG_DA[(word2 >> 12) & 15]));\r
+                               return;\r
+                       }\r
+                       if(BIT_F(word2))                   /* Memory to address register */\r
+                       {\r
+                               REG_A[(word2 >> 12) & 7] = MAKE_INT_16(m68ki_read_16_fc(ea, REG_SFC));\r
+                               if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                                       USE_CYCLES(2);\r
+                               return;\r
+                       }\r
+                       /* Memory to data register */\r
+                       REG_D[(word2 >> 12) & 7] = MASK_OUT_BELOW_16(REG_D[(word2 >> 12) & 7]) | m68ki_read_16_fc(ea, REG_SFC);\r
+                       if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                               USE_CYCLES(2);\r
+                       return;\r
+               }\r
+               m68ki_exception_privilege_violation();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(moves, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               if(FLAG_S)\r
+               {\r
+                       uint word2 = OPER_I_16();\r
+                       uint ea = M68KMAKE_GET_EA_AY_32;\r
+\r
+                       m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+                       if(BIT_B(word2))                   /* Register to memory */\r
+                       {\r
+                               m68ki_write_32_fc(ea, REG_DFC, REG_DA[(word2 >> 12) & 15]);\r
+                               if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                                       USE_CYCLES(2);\r
+                               return;\r
+                       }\r
+                       /* Memory to register */\r
+                       REG_DA[(word2 >> 12) & 15] = m68ki_read_32_fc(ea, REG_SFC);\r
+                       if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+                               USE_CYCLES(2);\r
+                       return;\r
+               }\r
+               m68ki_exception_privilege_violation();\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(moveq, 32, ., .)\r
+{\r
+       uint res = DX = MAKE_INT_8(MASK_OUT_ABOVE_8(REG_IR));\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(muls, 16, ., d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(DY) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_Z = res;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(muls, 16, ., .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint res = MASK_OUT_ABOVE_32(MAKE_INT_16(M68KMAKE_GET_OPER_AY_16) * MAKE_INT_16(MASK_OUT_ABOVE_16(*r_dst)));\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_Z = res;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(mulu, 16, ., d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint res = MASK_OUT_ABOVE_16(DY) * MASK_OUT_ABOVE_16(*r_dst);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_Z = res;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(mulu, 16, ., .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint res = M68KMAKE_GET_OPER_AY_16 * MASK_OUT_ABOVE_16(*r_dst);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_Z = res;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(mull, 32, ., d)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint64 src = DY;\r
+               uint64 dst = REG_D[(word2 >> 12) & 7];\r
+               uint64 res;\r
+\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               if(BIT_B(word2))                           /* signed */\r
+               {\r
+                       res = (sint64)((sint32)src) * (sint64)((sint32)dst);\r
+                       if(!BIT_A(word2))\r
+                       {\r
+                               FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+                               FLAG_N = NFLAG_32(res);\r
+                               FLAG_V = ((sint64)res != (sint32)res)<<7;\r
+                               REG_D[(word2 >> 12) & 7] = FLAG_Z;\r
+                               return;\r
+                       }\r
+                       FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);\r
+                       FLAG_N = NFLAG_64(res);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       REG_D[word2 & 7] = (res >> 32);\r
+                       REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);\r
+                       return;\r
+               }\r
+\r
+               res = src * dst;\r
+               if(!BIT_A(word2))\r
+               {\r
+                       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+                       FLAG_N = NFLAG_32(res);\r
+                       FLAG_V = (res > 0xffffffff)<<7;\r
+                       REG_D[(word2 >> 12) & 7] = FLAG_Z;\r
+                       return;\r
+               }\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);\r
+               FLAG_N = NFLAG_64(res);\r
+               FLAG_V = VFLAG_CLEAR;\r
+               REG_D[word2 & 7] = (res >> 32);\r
+               REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#else\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint src = DY;\r
+               uint dst = REG_D[(word2 >> 12) & 7];\r
+               uint neg = GET_MSB_32(src ^ dst);\r
+               uint src1;\r
+               uint src2;\r
+               uint dst1;\r
+               uint dst2;\r
+               uint r1;\r
+               uint r2;\r
+               uint r3;\r
+               uint r4;\r
+               uint lo;\r
+               uint hi;\r
+\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               if(BIT_B(word2))                           /* signed */\r
+               {\r
+                       if(GET_MSB_32(src))\r
+                               src = (uint)MASK_OUT_ABOVE_32(-(sint)src);\r
+                       if(GET_MSB_32(dst))\r
+                               dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);\r
+               }\r
+\r
+               src1 = MASK_OUT_ABOVE_16(src);\r
+               src2 = src>>16;\r
+               dst1 = MASK_OUT_ABOVE_16(dst);\r
+               dst2 = dst>>16;\r
+\r
+\r
+               r1 = src1 * dst1;\r
+               r2 = src1 * dst2;\r
+               r3 = src2 * dst1;\r
+               r4 = src2 * dst2;\r
+\r
+               lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);\r
+               hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);\r
+\r
+               if(BIT_B(word2) && neg)\r
+               {\r
+                       hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));\r
+                       lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);\r
+               }\r
+\r
+               if(BIT_A(word2))\r
+               {\r
+                       REG_D[word2 & 7] = hi;\r
+                       REG_D[(word2 >> 12) & 7] = lo;\r
+                       FLAG_N = NFLAG_32(hi);\r
+                       FLAG_Z = hi | lo;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               REG_D[(word2 >> 12) & 7] = lo;\r
+               FLAG_N = NFLAG_32(lo);\r
+               FLAG_Z = lo;\r
+               if(BIT_B(word2))\r
+                       FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;\r
+               else\r
+                       FLAG_V = (hi != 0) << 7;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(mull, 32, ., .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint64 src = M68KMAKE_GET_OPER_AY_32;\r
+               uint64 dst = REG_D[(word2 >> 12) & 7];\r
+               uint64 res;\r
+\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               if(BIT_B(word2))                           /* signed */\r
+               {\r
+                       res = (sint64)((sint32)src) * (sint64)((sint32)dst);\r
+                       if(!BIT_A(word2))\r
+                       {\r
+                               FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+                               FLAG_N = NFLAG_32(res);\r
+                               FLAG_V = ((sint64)res != (sint32)res)<<7;\r
+                               REG_D[(word2 >> 12) & 7] = FLAG_Z;\r
+                               return;\r
+                       }\r
+                       FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);\r
+                       FLAG_N = NFLAG_64(res);\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       REG_D[word2 & 7] = (res >> 32);\r
+                       REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);\r
+                       return;\r
+               }\r
+\r
+               res = src * dst;\r
+               if(!BIT_A(word2))\r
+               {\r
+                       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+                       FLAG_N = NFLAG_32(res);\r
+                       FLAG_V = (res > 0xffffffff)<<7;\r
+                       REG_D[(word2 >> 12) & 7] = FLAG_Z;\r
+                       return;\r
+               }\r
+               FLAG_Z = MASK_OUT_ABOVE_32(res) | (res>>32);\r
+               FLAG_N = NFLAG_64(res);\r
+               FLAG_V = VFLAG_CLEAR;\r
+               REG_D[word2 & 7] = (res >> 32);\r
+               REG_D[(word2 >> 12) & 7] = MASK_OUT_ABOVE_32(res);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#else\r
+\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint word2 = OPER_I_16();\r
+               uint src = M68KMAKE_GET_OPER_AY_32;\r
+               uint dst = REG_D[(word2 >> 12) & 7];\r
+               uint neg = GET_MSB_32(src ^ dst);\r
+               uint src1;\r
+               uint src2;\r
+               uint dst1;\r
+               uint dst2;\r
+               uint r1;\r
+               uint r2;\r
+               uint r3;\r
+               uint r4;\r
+               uint lo;\r
+               uint hi;\r
+\r
+               FLAG_C = CFLAG_CLEAR;\r
+\r
+               if(BIT_B(word2))                           /* signed */\r
+               {\r
+                       if(GET_MSB_32(src))\r
+                               src = (uint)MASK_OUT_ABOVE_32(-(sint)src);\r
+                       if(GET_MSB_32(dst))\r
+                               dst = (uint)MASK_OUT_ABOVE_32(-(sint)dst);\r
+               }\r
+\r
+               src1 = MASK_OUT_ABOVE_16(src);\r
+               src2 = src>>16;\r
+               dst1 = MASK_OUT_ABOVE_16(dst);\r
+               dst2 = dst>>16;\r
+\r
+\r
+               r1 = src1 * dst1;\r
+               r2 = src1 * dst2;\r
+               r3 = src2 * dst1;\r
+               r4 = src2 * dst2;\r
+\r
+               lo = r1 + (MASK_OUT_ABOVE_16(r2)<<16) + (MASK_OUT_ABOVE_16(r3)<<16);\r
+               hi = r4 + (r2>>16) + (r3>>16) + (((r1>>16) + MASK_OUT_ABOVE_16(r2) + MASK_OUT_ABOVE_16(r3)) >> 16);\r
+\r
+               if(BIT_B(word2) && neg)\r
+               {\r
+                       hi = (uint)MASK_OUT_ABOVE_32((-(sint)hi) - (lo != 0));\r
+                       lo = (uint)MASK_OUT_ABOVE_32(-(sint)lo);\r
+               }\r
+\r
+               if(BIT_A(word2))\r
+               {\r
+                       REG_D[word2 & 7] = hi;\r
+                       REG_D[(word2 >> 12) & 7] = lo;\r
+                       FLAG_N = NFLAG_32(hi);\r
+                       FLAG_Z = hi | lo;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+\r
+               REG_D[(word2 >> 12) & 7] = lo;\r
+               FLAG_N = NFLAG_32(lo);\r
+               FLAG_Z = lo;\r
+               if(BIT_B(word2))\r
+                       FLAG_V = (!((GET_MSB_32(lo) && hi == 0xffffffff) || (!GET_MSB_32(lo) && !hi)))<<7;\r
+               else\r
+                       FLAG_V = (hi != 0) << 7;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(nbcd, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint dst = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());\r
+\r
+       if(res != 0x9a)\r
+       {\r
+               if((res & 0x0f) == 0xa)\r
+                       res = (res & 0xf0) + 0x10;\r
+\r
+               res = MASK_OUT_ABOVE_8(res);\r
+\r
+               *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+               FLAG_Z |= res;\r
+               FLAG_C = CFLAG_SET;\r
+               FLAG_X = XFLAG_SET;\r
+       }\r
+       else\r
+       {\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_X = XFLAG_CLEAR;\r
+       }\r
+       FLAG_N = NFLAG_8(res);  /* officially undefined */\r
+}\r
+\r
+\r
+M68KMAKE_OP(nbcd, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = MASK_OUT_ABOVE_8(0x9a - dst - XFLAG_AS_1());\r
+\r
+       if(res != 0x9a)\r
+       {\r
+               if((res & 0x0f) == 0xa)\r
+                       res = (res & 0xf0) + 0x10;\r
+\r
+               res = MASK_OUT_ABOVE_8(res);\r
+\r
+               m68ki_write_8(ea, MASK_OUT_ABOVE_8(res));\r
+\r
+               FLAG_Z |= res;\r
+               FLAG_C = CFLAG_SET;\r
+               FLAG_X = XFLAG_SET;\r
+       }\r
+       else\r
+       {\r
+               FLAG_C = CFLAG_CLEAR;\r
+               FLAG_X = XFLAG_CLEAR;\r
+       }\r
+       FLAG_N = NFLAG_8(res);  /* officially undefined */\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - MASK_OUT_ABOVE_8(*r_dst);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_C = FLAG_X = CFLAG_8(res);\r
+       FLAG_V = *r_dst & res;\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+       uint res = 0 - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_C = FLAG_X = CFLAG_8(res);\r
+       FLAG_V = src & res;\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - MASK_OUT_ABOVE_16(*r_dst);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_C = FLAG_X = CFLAG_16(res);\r
+       FLAG_V = (*r_dst & res)>>8;\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = 0 - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_C = FLAG_X = CFLAG_16(res);\r
+       FLAG_V = (src & res)>>8;\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - *r_dst;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_C = FLAG_X = CFLAG_SUB_32(*r_dst, 0, res);\r
+       FLAG_V = (*r_dst & res)>>24;\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(neg, 32, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint src = m68ki_read_32(ea);\r
+       uint res = 0 - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_C = FLAG_X = CFLAG_SUB_32(src, 0, res);\r
+       FLAG_V = (src & res)>>24;\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - MASK_OUT_ABOVE_8(*r_dst) - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = *r_dst & res;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = m68ki_read_8(ea);\r
+       uint res = 0 - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = src & res;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - MASK_OUT_ABOVE_16(*r_dst) - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = (*r_dst & res)>>8;\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 16, ., .)\r
+{\r
+       uint ea  = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = 0 - MASK_OUT_ABOVE_16(src) - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = (src & res)>>8;\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_16(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = 0 - MASK_OUT_ABOVE_32(*r_dst) - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(*r_dst, 0, res);\r
+       FLAG_V = (*r_dst & res)>>24;\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(negx, 32, ., .)\r
+{\r
+       uint ea  = M68KMAKE_GET_EA_AY_32;\r
+       uint src = m68ki_read_32(ea);\r
+       uint res = 0 - MASK_OUT_ABOVE_32(src) - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, 0, res);\r
+       FLAG_V = (src & res)>>24;\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_32(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(nop, 0, ., .)\r
+{\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = MASK_OUT_ABOVE_8(~*r_dst);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = MASK_OUT_ABOVE_8(~m68ki_read_8(ea));\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = MASK_OUT_ABOVE_16(~*r_dst);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = MASK_OUT_ABOVE_16(~m68ki_read_16(ea));\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint res = *r_dst = MASK_OUT_ABOVE_32(~*r_dst);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(not, 32, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = MASK_OUT_ABOVE_32(~m68ki_read_32(ea));\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 8, er, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8((DX |= MASK_OUT_ABOVE_8(DY)));\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 8, er, .)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8((DX |= M68KMAKE_GET_OPER_AY_8));\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 16, er, d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16((DX |= MASK_OUT_ABOVE_16(DY)));\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 16, er, .)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16((DX |= M68KMAKE_GET_OPER_AY_16));\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 32, er, d)\r
+{\r
+       uint res = DX |= DY;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 32, er, .)\r
+{\r
+       uint res = DX |= M68KMAKE_GET_OPER_AY_32;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 8, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = MASK_OUT_ABOVE_8(DX | m68ki_read_8(ea));\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 16, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = MASK_OUT_ABOVE_16(DX | m68ki_read_16(ea));\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(or, 32, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = DX | m68ki_read_32(ea);\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 8, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8((DY |= OPER_I_8()));\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = MASK_OUT_ABOVE_8(src | m68ki_read_8(ea));\r
+\r
+       m68ki_write_8(ea, res);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 16, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY |= OPER_I_16());\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint res = MASK_OUT_ABOVE_16(src | m68ki_read_16(ea));\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 32, ., d)\r
+{\r
+       uint res = DY |= OPER_I_32();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint res = src | m68ki_read_32(ea);\r
+\r
+       m68ki_write_32(ea, res);\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 16, toc, .)\r
+{\r
+       m68ki_set_ccr(m68ki_get_ccr() | OPER_I_16());\r
+}\r
+\r
+\r
+M68KMAKE_OP(ori, 16, tos, .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint src = OPER_I_16();\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               m68ki_set_sr(m68ki_get_sr() | src);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pack, 16, rr, .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: DX and DY are reversed in Motorola's docs */\r
+               uint src = DY + OPER_I_16();\r
+               uint* r_dst = &DX;\r
+\r
+               *r_dst = MASK_OUT_BELOW_8(*r_dst) | ((src >> 4) & 0x00f0) | (src & 0x000f);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pack, 16, mm, ax7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint ea_src = EA_AY_PD_8();\r
+               uint src = m68ki_read_8(ea_src);\r
+               ea_src = EA_AY_PD_8();\r
+               src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();\r
+\r
+               m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pack, 16, mm, ay7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint ea_src = EA_A7_PD_8();\r
+               uint src = m68ki_read_8(ea_src);\r
+               ea_src = EA_A7_PD_8();\r
+               src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();\r
+\r
+               m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pack, 16, mm, axy7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint ea_src = EA_A7_PD_8();\r
+               uint src = m68ki_read_8(ea_src);\r
+               ea_src = EA_A7_PD_8();\r
+               src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();\r
+\r
+               m68ki_write_8(EA_A7_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pack, 16, mm, .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint ea_src = EA_AY_PD_8();\r
+               uint src = m68ki_read_8(ea_src);\r
+               ea_src = EA_AY_PD_8();\r
+               src = ((src << 8) | m68ki_read_8(ea_src)) + OPER_I_16();\r
+\r
+               m68ki_write_8(EA_AX_PD_8(), ((src >> 4) & 0x00f0) | (src & 0x000f));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(pea, 32, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+\r
+       m68ki_push_32(ea);\r
+}\r
+\r
+\r
+M68KMAKE_OP(reset, 0, ., .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               m68ki_output_reset();              /* auto-disable (see m68kcpu.h) */\r
+               USE_CYCLES(CYC_RESET);\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint shift = orig_shift & 7;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROR_8(src, shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src << (9-orig_shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = ROR_16(src, shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src << (9-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint64 src = *r_dst;\r
+       uint res = ROR_32(src, shift);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src << (9-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 7;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROR_8(src, shift);\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+               FLAG_C = src << (8-((shift-1)&7));\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 15;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = ROR_16(src, shift);\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+               FLAG_C = (src >> ((shift - 1) & 15)) << 8;\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 31;\r
+       uint64 src = *r_dst;\r
+       uint res = ROR_32(src, shift);\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               *r_dst = res;\r
+               FLAG_C = (src >> ((shift - 1) & 31)) << 8;\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(ror, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = ROR_16(src, 1);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src << 8;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint shift = orig_shift & 7;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROL_8(src, shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src << orig_shift;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = ROL_16(src, shift);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src >> (8-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 32, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint64 src = *r_dst;\r
+       uint res = ROL_32(src, shift);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src >> (24-shift);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 7;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROL_8(src, shift);\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               if(shift != 0)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+                       FLAG_C = src << shift;\r
+                       FLAG_N = NFLAG_8(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               FLAG_C = (src & 1)<<8;\r
+               FLAG_N = NFLAG_8(src);\r
+               FLAG_Z = src;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_8(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 15;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = MASK_OUT_ABOVE_16(ROL_16(src, shift));\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               if(shift != 0)\r
+               {\r
+                       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+                       FLAG_C = (src << shift) >> 8;\r
+                       FLAG_N = NFLAG_16(res);\r
+                       FLAG_Z = res;\r
+                       FLAG_V = VFLAG_CLEAR;\r
+                       return;\r
+               }\r
+               FLAG_C = (src & 1)<<8;\r
+               FLAG_N = NFLAG_16(src);\r
+               FLAG_Z = src;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_16(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 32, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift & 31;\r
+       uint64 src = *r_dst;\r
+       uint res = ROL_32(src, shift);\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               *r_dst = res;\r
+\r
+               FLAG_C = (src >> (32 - shift)) << 8;\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_N = NFLAG_32(src);\r
+       FLAG_Z = src;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rol, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = MASK_OUT_ABOVE_16(ROL_16(src, 1));\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_C = src >> 7;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROR_9(src | (XFLAG_AS_1() << 8), shift);\r
+\r
+       FLAG_C = FLAG_X = res;\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = ROR_17(src | (XFLAG_AS_1() << 16), shift);\r
+\r
+       FLAG_C = FLAG_X = res >> 8;\r
+       res = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 32, s, .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       uint*  r_dst = &DY;\r
+       uint   shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint64 src   = *r_dst;\r
+       uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);\r
+\r
+       res = ROR_33_64(res, shift);\r
+\r
+       FLAG_C = FLAG_X = res >> 24;\r
+       res = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst =  res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#else\r
+\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));\r
+       uint new_x_flag = src & (1 << (shift - 1));\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_C = FLAG_X = (new_x_flag != 0)<<8;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint shift = orig_shift % 9;\r
+               uint src   = MASK_OUT_ABOVE_8(*r_dst);\r
+               uint res   = ROR_9(src | (XFLAG_AS_1() << 8), shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res;\r
+               res = MASK_OUT_ABOVE_8(res);\r
+\r
+               *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_8(*r_dst);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint shift = orig_shift % 17;\r
+               uint src   = MASK_OUT_ABOVE_16(*r_dst);\r
+               uint res   = ROR_17(src | (XFLAG_AS_1() << 16), shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res >> 8;\r
+               res = MASK_OUT_ABOVE_16(res);\r
+\r
+               *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_16(*r_dst);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 32, r, .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       uint*  r_dst = &DY;\r
+       uint   orig_shift = DX & 0x3f;\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint   shift = orig_shift % 33;\r
+               uint64 src   = *r_dst;\r
+               uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);\r
+\r
+               res = ROR_33_64(res, shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res >> 24;\r
+               res = MASK_OUT_ABOVE_32(res);\r
+\r
+               *r_dst = res;\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_32(*r_dst);\r
+       FLAG_Z = *r_dst;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#else\r
+\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift % 33;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32((ROR_33(src, shift) & ~(1 << (32 - shift))) | (XFLAG_AS_1() << (32 - shift)));\r
+       uint new_x_flag = src & (1 << (shift - 1));\r
+\r
+       if(orig_shift != 0)\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+       if(shift != 0)\r
+       {\r
+               *r_dst = res;\r
+               FLAG_X = (new_x_flag != 0)<<8;\r
+       }\r
+       else\r
+               res = src;\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxr, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = ROR_17(src | (XFLAG_AS_1() << 16), 1);\r
+\r
+       FLAG_C = FLAG_X = res >> 8;\r
+       res = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 8, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = ROL_9(src | (XFLAG_AS_1() << 8), shift);\r
+\r
+       FLAG_C = FLAG_X = res;\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 16, s, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = ROL_17(src | (XFLAG_AS_1() << 16), shift);\r
+\r
+       FLAG_C = FLAG_X = res >> 8;\r
+       res = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 32, s, .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       uint*  r_dst = &DY;\r
+       uint   shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint64 src   = *r_dst;\r
+       uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);\r
+\r
+       res = ROL_33_64(res, shift);\r
+\r
+       FLAG_C = FLAG_X = res >> 24;\r
+       res = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#else\r
+\r
+       uint* r_dst = &DY;\r
+       uint shift = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));\r
+       uint new_x_flag = src & (1 << (32 - shift));\r
+\r
+       *r_dst = res;\r
+\r
+       FLAG_C = FLAG_X = (new_x_flag != 0)<<8;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 8, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint shift = orig_shift % 9;\r
+               uint src   = MASK_OUT_ABOVE_8(*r_dst);\r
+               uint res   = ROL_9(src | (XFLAG_AS_1() << 8), shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res;\r
+               res = MASK_OUT_ABOVE_8(res);\r
+\r
+               *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_8(*r_dst);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 16, r, .)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint shift = orig_shift % 17;\r
+               uint src   = MASK_OUT_ABOVE_16(*r_dst);\r
+               uint res   = ROL_17(src | (XFLAG_AS_1() << 16), shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res >> 8;\r
+               res = MASK_OUT_ABOVE_16(res);\r
+\r
+               *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_16(*r_dst);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 32, r, .)\r
+{\r
+#if M68K_USE_64_BIT\r
+\r
+       uint*  r_dst = &DY;\r
+       uint   orig_shift = DX & 0x3f;\r
+\r
+       if(orig_shift != 0)\r
+       {\r
+               uint   shift = orig_shift % 33;\r
+               uint64 src   = *r_dst;\r
+               uint64 res   = src | (((uint64)XFLAG_AS_1()) << 32);\r
+\r
+               res = ROL_33_64(res, shift);\r
+\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+               FLAG_C = FLAG_X = res >> 24;\r
+               res = MASK_OUT_ABOVE_32(res);\r
+\r
+               *r_dst = res;\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               return;\r
+       }\r
+\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_32(*r_dst);\r
+       FLAG_Z = *r_dst;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#else\r
+\r
+       uint* r_dst = &DY;\r
+       uint orig_shift = DX & 0x3f;\r
+       uint shift = orig_shift % 33;\r
+       uint src = *r_dst;\r
+       uint res = MASK_OUT_ABOVE_32((ROL_33(src, shift) & ~(1 << (shift - 1))) | (XFLAG_AS_1() << (shift - 1)));\r
+       uint new_x_flag = src & (1 << (32 - shift));\r
+\r
+       if(orig_shift != 0)\r
+               USE_CYCLES(orig_shift<<CYC_SHIFT);\r
+\r
+       if(shift != 0)\r
+       {\r
+               *r_dst = res;\r
+               FLAG_X = (new_x_flag != 0)<<8;\r
+       }\r
+       else\r
+               res = src;\r
+       FLAG_C = FLAG_X;\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+\r
+#endif\r
+}\r
+\r
+\r
+M68KMAKE_OP(roxl, 16, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = m68ki_read_16(ea);\r
+       uint res = ROL_17(src | (XFLAG_AS_1() << 16), 1);\r
+\r
+       FLAG_C = FLAG_X = res >> 8;\r
+       res = MASK_OUT_ABOVE_16(res);\r
+\r
+       m68ki_write_16(ea, res);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(rtd, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_010_PLUS(CPU_TYPE))\r
+       {\r
+               uint new_pc = m68ki_pull_32();\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               REG_A[7] = MASK_OUT_ABOVE_32(REG_A[7] + MAKE_INT_16(OPER_I_16()));\r
+               m68ki_jump(new_pc);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(rte, 32, ., .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint new_sr;\r
+               uint new_pc;\r
+               uint format_word;\r
+\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+\r
+               if(CPU_TYPE_IS_000(CPU_TYPE))\r
+               {\r
+                       new_sr = m68ki_pull_16();\r
+                       new_pc = m68ki_pull_32();\r
+                       m68ki_jump(new_pc);\r
+                       m68ki_set_sr(new_sr);\r
+                       return;\r
+               }\r
+\r
+               if(CPU_TYPE_IS_010(CPU_TYPE))\r
+               {\r
+                       format_word = m68ki_read_16(REG_A[7]+6) >> 12;\r
+                       if(format_word == 0)\r
+                       {\r
+                               new_sr = m68ki_pull_16();\r
+                               new_pc = m68ki_pull_32();\r
+                               m68ki_fake_pull_16();   /* format word */\r
+                               m68ki_jump(new_pc);\r
+                               m68ki_set_sr(new_sr);\r
+                               return;\r
+                       }\r
+                       /* Not handling bus fault (9) */\r
+                       m68ki_exception_format_error();\r
+                       return;\r
+               }\r
+\r
+               /* Otherwise it's 020 */\r
+rte_loop:\r
+               format_word = m68ki_read_16(REG_A[7]+6) >> 12;\r
+               switch(format_word)\r
+               {\r
+                       case 0: /* Normal */\r
+                               new_sr = m68ki_pull_16();\r
+                               new_pc = m68ki_pull_32();\r
+                               m68ki_fake_pull_16();   /* format word */\r
+                               m68ki_jump(new_pc);\r
+                               m68ki_set_sr(new_sr);\r
+                               return;\r
+                       case 1: /* Throwaway */\r
+                               new_sr = m68ki_pull_16();\r
+                               m68ki_fake_pull_32();   /* program counter */\r
+                               m68ki_fake_pull_16();   /* format word */\r
+                               m68ki_set_sr_noint(new_sr);\r
+                               goto rte_loop;\r
+                       case 2: /* Trap */\r
+                               new_sr = m68ki_pull_16();\r
+                               new_pc = m68ki_pull_32();\r
+                               m68ki_fake_pull_16();   /* format word */\r
+                               m68ki_fake_pull_32();   /* address */\r
+                               m68ki_jump(new_pc);\r
+                               m68ki_set_sr(new_sr);\r
+                               return;\r
+               }\r
+               /* Not handling long or short bus fault */\r
+               m68ki_exception_format_error();\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(rtm, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_020_VARIANT(CPU_TYPE))\r
+       {\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: called unimplemented instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC - 2), REG_IR,\r
+                                        m68k_disassemble_quick(ADDRESS_68K(REG_PC - 2))));\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(rtr, 32, ., .)\r
+{\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       m68ki_set_ccr(m68ki_pull_16());\r
+       m68ki_jump(m68ki_pull_32());\r
+}\r
+\r
+\r
+M68KMAKE_OP(rts, 32, ., .)\r
+{\r
+       m68ki_trace_t0();                                  /* auto-disable (see m68kcpu.h) */\r
+       m68ki_jump(m68ki_pull_32());\r
+}\r
+\r
+\r
+M68KMAKE_OP(sbcd, 8, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res -= 6;\r
+       res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res += 0xa0;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sbcd, 8, mm, ax7)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res -= 6;\r
+       res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res += 0xa0;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sbcd, 8, mm, ay7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res -= 6;\r
+       res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res += 0xa0;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sbcd, 8, mm, axy7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res -= 6;\r
+       res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res += 0xa0;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sbcd, 8, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = LOW_NIBBLE(dst) - LOW_NIBBLE(src) - XFLAG_AS_1();\r
+\r
+       if(res > 9)\r
+               res -= 6;\r
+       res += HIGH_NIBBLE(dst) - HIGH_NIBBLE(src);\r
+       FLAG_X = FLAG_C = (res > 0x99) << 8;\r
+       if(FLAG_C)\r
+               res += 0xa0;\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+\r
+       FLAG_N = NFLAG_8(res); /* officially undefined */\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(st, 8, ., d)\r
+{\r
+       DY |= 0xff;\r
+}\r
+\r
+\r
+M68KMAKE_OP(st, 8, ., .)\r
+{\r
+       m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0xff);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sf, 8, ., d)\r
+{\r
+       DY &= 0xffffff00;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sf, 8, ., .)\r
+{\r
+       m68ki_write_8(M68KMAKE_GET_EA_AY_8, 0);\r
+}\r
+\r
+\r
+M68KMAKE_OP(scc, 8, ., d)\r
+{\r
+       if(M68KMAKE_CC)\r
+       {\r
+               DY |= 0xff;\r
+               return;\r
+       }\r
+       DY &= 0xffffff00;\r
+}\r
+\r
+\r
+M68KMAKE_OP(scc, 8, ., .)\r
+{\r
+       m68ki_write_8(M68KMAKE_GET_EA_AY_8, M68KMAKE_CC ? 0xff : 0);\r
+}\r
+\r
+\r
+M68KMAKE_OP(stop, 0, ., .)\r
+{\r
+       if(FLAG_S)\r
+       {\r
+               uint new_sr = OPER_I_16();\r
+               m68ki_trace_t0();                          /* auto-disable (see m68kcpu.h) */\r
+               CPU_STOPPED |= STOP_LEVEL_STOP;\r
+               m68ki_set_sr(new_sr);\r
+               m68ki_remaining_cycles = 0;\r
+               return;\r
+       }\r
+       m68ki_exception_privilege_violation();\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 8, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_8(DY);\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 8, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_8;\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 16, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 16, er, a)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(AY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 16, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_16;\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 32, er, d)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 32, er, a)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = AY;\r
+       uint dst = *r_dst;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 32, er, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = M68KMAKE_GET_OPER_AY_32;\r
+       uint dst = *r_dst;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 8, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint src = MASK_OUT_ABOVE_8(DX);\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 16, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint src = MASK_OUT_ABOVE_16(DX);\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(sub, 32, re, .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint src = DX;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 16, ., d)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(DY));\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 16, ., a)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(AY));\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 16, ., .)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - MAKE_INT_16(M68KMAKE_GET_OPER_AY_16));\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 32, ., d)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - DY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 32, ., a)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - AY);\r
+}\r
+\r
+\r
+M68KMAKE_OP(suba, 32, ., .)\r
+{\r
+       uint* r_dst = &AX;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - M68KMAKE_GET_OPER_AY_32);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_8();\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 8, ., .)\r
+{\r
+       uint src = OPER_I_8();\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_16();\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 16, ., .)\r
+{\r
+       uint src = OPER_I_16();\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = OPER_I_32();\r
+       uint dst = *r_dst;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subi, 32, ., .)\r
+{\r
+       uint src = OPER_I_32();\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 8, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       m68ki_write_8(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 16, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 16, ., a)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 16, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_16;\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       m68ki_write_16(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 32, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint dst = *r_dst;\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       *r_dst = FLAG_Z;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 32, ., a)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       *r_dst = MASK_OUT_ABOVE_32(*r_dst - ((((REG_IR >> 9) - 1) & 7) + 1));\r
+}\r
+\r
+\r
+M68KMAKE_OP(subq, 32, ., .)\r
+{\r
+       uint src = (((REG_IR >> 9) - 1) & 7) + 1;\r
+       uint ea = M68KMAKE_GET_EA_AY_32;\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = dst - src;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = MASK_OUT_ABOVE_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       m68ki_write_32(ea, FLAG_Z);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 8, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_8(DY);\r
+       uint dst = MASK_OUT_ABOVE_8(*r_dst);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_8(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 16, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = MASK_OUT_ABOVE_16(DY);\r
+       uint dst = MASK_OUT_ABOVE_16(*r_dst);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = MASK_OUT_BELOW_16(*r_dst) | res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 32, rr, .)\r
+{\r
+       uint* r_dst = &DX;\r
+       uint src = DY;\r
+       uint dst = *r_dst;\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       *r_dst = res;\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 8, mm, ax7)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 8, mm, ay7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 8, mm, axy7)\r
+{\r
+       uint src = OPER_A7_PD_8();\r
+       uint ea  = EA_A7_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 8, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_8();\r
+       uint ea  = EA_AX_PD_8();\r
+       uint dst = m68ki_read_8(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_X = FLAG_C = CFLAG_8(res);\r
+       FLAG_V = VFLAG_SUB_8(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_8(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_8(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 16, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_16();\r
+       uint ea  = EA_AX_PD_16();\r
+       uint dst = m68ki_read_16(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_X = FLAG_C = CFLAG_16(res);\r
+       FLAG_V = VFLAG_SUB_16(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_16(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_16(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(subx, 32, mm, .)\r
+{\r
+       uint src = OPER_AY_PD_32();\r
+       uint ea  = EA_AX_PD_32();\r
+       uint dst = m68ki_read_32(ea);\r
+       uint res = dst - src - XFLAG_AS_1();\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_X = FLAG_C = CFLAG_SUB_32(src, dst, res);\r
+       FLAG_V = VFLAG_SUB_32(src, dst, res);\r
+\r
+       res = MASK_OUT_ABOVE_32(res);\r
+       FLAG_Z |= res;\r
+\r
+       m68ki_write_32(ea, res);\r
+}\r
+\r
+\r
+M68KMAKE_OP(swap, 32, ., .)\r
+{\r
+       uint* r_dst = &DY;\r
+\r
+       FLAG_Z = MASK_OUT_ABOVE_32(*r_dst<<16);\r
+       *r_dst = (*r_dst>>16) | FLAG_Z;\r
+\r
+       FLAG_Z = *r_dst;\r
+       FLAG_N = NFLAG_32(*r_dst);\r
+       FLAG_C = CFLAG_CLEAR;\r
+       FLAG_V = VFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tas, 8, ., d)\r
+{\r
+       uint* r_dst = &DY;\r
+\r
+       FLAG_Z = MASK_OUT_ABOVE_8(*r_dst);\r
+       FLAG_N = NFLAG_8(*r_dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       *r_dst |= 0x80;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tas, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint dst = m68ki_read_8(ea);\r
+\r
+       FLAG_Z = dst;\r
+       FLAG_N = NFLAG_8(dst);\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+       m68ki_write_8(ea, dst | 0x80);\r
+}\r
+\r
+\r
+M68KMAKE_OP(trap, 0, ., .)\r
+{\r
+       /* Trap#n stacks exception frame type 0 */\r
+       m68ki_exception_trapN(EXCEPTION_TRAP_BASE + (REG_IR & 0xf));    /* HJB 990403 */\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapt, 0, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapt, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapt, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapf, 0, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapf, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               REG_PC += 2;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapf, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               REG_PC += 4;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapcc, 0, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               if(M68KMAKE_CC)\r
+                       m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapcc, 16, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               if(M68KMAKE_CC)\r
+               {\r
+                       m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+                       return;\r
+               }\r
+               REG_PC += 2;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapcc, 32, ., .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               if(M68KMAKE_CC)\r
+               {\r
+                       m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+                       return;\r
+               }\r
+               REG_PC += 4;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(trapv, 0, ., .)\r
+{\r
+       if(COND_VC())\r
+       {\r
+               return;\r
+       }\r
+       m68ki_exception_trap(EXCEPTION_TRAPV);  /* HJB 990403 */\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 8, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_8(DY);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 8, ., .)\r
+{\r
+       uint ea = M68KMAKE_GET_EA_AY_8;\r
+       uint res = m68ki_read_8(ea);\r
+\r
+       FLAG_N = NFLAG_8(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 8, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCDI_8();\r
+\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 8, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCIX_8();\r
+\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 8, ., i)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_I_8();\r
+\r
+               FLAG_N = NFLAG_8(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., d)\r
+{\r
+       uint res = MASK_OUT_ABOVE_16(DY);\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., a)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = MAKE_INT_16(AY);\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_16;\r
+\r
+       FLAG_N = NFLAG_16(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCDI_16();\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCIX_16();\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 16, ., i)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_I_16();\r
+\r
+               FLAG_N = NFLAG_16(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., d)\r
+{\r
+       uint res = DY;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., a)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = AY;\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., .)\r
+{\r
+       uint res = M68KMAKE_GET_OPER_AY_32;\r
+\r
+       FLAG_N = NFLAG_32(res);\r
+       FLAG_Z = res;\r
+       FLAG_V = VFLAG_CLEAR;\r
+       FLAG_C = CFLAG_CLEAR;\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., pcdi)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCDI_32();\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., pcix)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_PCIX_32();\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(tst, 32, ., i)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint res = OPER_I_32();\r
+\r
+               FLAG_N = NFLAG_32(res);\r
+               FLAG_Z = res;\r
+               FLAG_V = VFLAG_CLEAR;\r
+               FLAG_C = CFLAG_CLEAR;\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unlk, 32, ., a7)\r
+{\r
+       REG_A[7] = m68ki_read_32(REG_A[7]);\r
+}\r
+\r
+\r
+M68KMAKE_OP(unlk, 32, ., .)\r
+{\r
+       uint* r_dst = &AY;\r
+\r
+       REG_A[7] = *r_dst;\r
+       *r_dst = m68ki_pull_32();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unpk, 16, rr, .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: DX and DY are reversed in Motorola's docs */\r
+               uint src = DY;\r
+               uint* r_dst = &DX;\r
+\r
+               *r_dst = MASK_OUT_BELOW_16(*r_dst) | (((((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16()) & 0xffff);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unpk, 16, mm, ax7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint src = OPER_AY_PD_8();\r
+               uint ea_dst;\r
+\r
+               src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();\r
+               ea_dst = EA_A7_PD_8();\r
+               m68ki_write_8(ea_dst, (src >> 8) & 0xff);\r
+               ea_dst = EA_A7_PD_8();\r
+               m68ki_write_8(ea_dst, src & 0xff);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unpk, 16, mm, ay7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint src = OPER_A7_PD_8();\r
+               uint ea_dst;\r
+\r
+               src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();\r
+               ea_dst = EA_AX_PD_8();\r
+               m68ki_write_8(ea_dst, (src >> 8) & 0xff);\r
+               ea_dst = EA_AX_PD_8();\r
+               m68ki_write_8(ea_dst, src & 0xff);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unpk, 16, mm, axy7)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               uint src = OPER_A7_PD_8();\r
+               uint ea_dst;\r
+\r
+               src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();\r
+               ea_dst = EA_A7_PD_8();\r
+               m68ki_write_8(ea_dst, (src >> 8) & 0xff);\r
+               ea_dst = EA_A7_PD_8();\r
+               m68ki_write_8(ea_dst, src & 0xff);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+M68KMAKE_OP(unpk, 16, mm, .)\r
+{\r
+       if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Note: AX and AY are reversed in Motorola's docs */\r
+               uint src = OPER_AY_PD_8();\r
+               uint ea_dst;\r
+\r
+               src = (((src << 4) & 0x0f00) | (src & 0x000f)) + OPER_I_16();\r
+               ea_dst = EA_AX_PD_8();\r
+               m68ki_write_8(ea_dst, (src >> 8) & 0xff);\r
+               ea_dst = EA_AX_PD_8();\r
+               m68ki_write_8(ea_dst, src & 0xff);\r
+               return;\r
+       }\r
+       m68ki_exception_illegal();\r
+}\r
+\r
+\r
+\r
+XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\r
+M68KMAKE_END\r
diff --git a/src/m68kconf.h b/src/m68kconf.h
new file mode 100644 (file)
index 0000000..a38613f
--- /dev/null
@@ -0,0 +1,194 @@
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+#ifndef M68KCONF__HEADER\r
+#define M68KCONF__HEADER\r
+\r
+\r
+/* Configuration switches.\r
+ * Use OPT_SPECIFY_HANDLER for configuration options that allow callbacks.\r
+ * OPT_SPECIFY_HANDLER causes the core to link directly to the function\r
+ * or macro you specify, rather than using callback functions whose pointer\r
+ * must be passed in using m68k_set_xxx_callback().\r
+ */\r
+#define OPT_OFF             0\r
+#define OPT_ON              1\r
+#define OPT_SPECIFY_HANDLER 2\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== MAME STUFF ============================== */\r
+/* ======================================================================== */\r
+\r
+/* If you're compiling this for MAME, only change M68K_COMPILE_FOR_MAME\r
+ * to OPT_ON and use m68kmame.h to configure the 68k core.\r
+ */\r
+#ifndef M68K_COMPILE_FOR_MAME\r
+#define M68K_COMPILE_FOR_MAME      OPT_OFF\r
+#endif /* M68K_COMPILE_FOR_MAME */\r
+\r
+#if M68K_COMPILE_FOR_MAME == OPT_ON\r
+#include "m68kmame.h"\r
+#else\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================= CONFIGURATION ============================ */\r
+/* ======================================================================== */\r
+\r
+/* Turn on if you want to use the following M68K variants */\r
+#define M68K_EMULATE_010            OPT_OFF\r
+#define M68K_EMULATE_EC020          OPT_OFF\r
+#define M68K_EMULATE_020            OPT_OFF\r
+\r
+\r
+/* If on, the CPU will call m68k_read_immediate_xx() for immediate addressing\r
+ * and m68k_read_pcrelative_xx() for PC-relative addressing.\r
+ * If off, all read requests from the CPU will be redirected to m68k_read_xx()\r
+ */\r
+#define M68K_SEPARATE_READS         OPT_OFF\r
+\r
+\r
+/* If on, CPU will call the interrupt acknowledge callback when it services an\r
+ * interrupt.\r
+ * If off, all interrupts will be autovectored and all interrupt requests will\r
+ * auto-clear when the interrupt is serviced.\r
+ */\r
+//#define M68K_EMULATE_INT_ACK        OPT_OFF\r
+//#define M68K_INT_ACK_CALLBACK(A)    your_int_ack_handler_function(A)\r
+\r
+//#ifdef __cplusplus\r
+//extern "C" {\r
+//#endif\r
+int irq_ack_handler(int);\r
+//#ifdef __cplusplus\r
+//}\r
+//#endif\r
+\r
+#define M68K_EMULATE_INT_ACK        OPT_SPECIFY_HANDLER\r
+#define M68K_INT_ACK_CALLBACK(A)    irq_ack_handler(A)\r
+\r
+\r
+/* If on, CPU will call the breakpoint acknowledge callback when it encounters\r
+ * a breakpoint instruction and it is running a 68010+.\r
+ */\r
+#define M68K_EMULATE_BKPT_ACK       OPT_OFF\r
+#define M68K_BKPT_ACK_CALLBACK()    your_bkpt_ack_handler_function()\r
+\r
+\r
+/* If on, the CPU will monitor the trace flags and take trace exceptions\r
+ */\r
+#define M68K_EMULATE_TRACE          OPT_OFF\r
+\r
+\r
+/* If on, CPU will call the output reset callback when it encounters a reset\r
+ * instruction.\r
+ */\r
+#define M68K_EMULATE_RESET          OPT_OFF\r
+#define M68K_RESET_CALLBACK()       your_reset_handler_function()\r
+\r
+\r
+/* If on, CPU will call the set fc callback on every memory access to\r
+ * differentiate between user/supervisor, program/data access like a real\r
+ * 68000 would.  This should be enabled and the callback should be set if you\r
+ * want to properly emulate the m68010 or higher. (moves uses function codes\r
+ * to read/write data from different address spaces)\r
+ */\r
+#define M68K_EMULATE_FC             OPT_OFF\r
+#define M68K_SET_FC_CALLBACK(A)     your_set_fc_handler_function(A)\r
+\r
+\r
+/* If on, CPU will call the pc changed callback when it changes the PC by a\r
+ * large value.  This allows host programs to be nicer when it comes to\r
+ * fetching immediate data and instructions on a banked memory system.\r
+ */\r
+#define M68K_MONITOR_PC             OPT_OFF\r
+#define M68K_SET_PC_CALLBACK(A)     your_pc_changed_handler_function(A)\r
+\r
+\r
+/* If on, CPU will call the instruction hook callback before every\r
+ * instruction.\r
+ */\r
+#define M68K_INSTRUCTION_HOOK       OPT_OFF\r
+#define M68K_INSTRUCTION_CALLBACK() your_instruction_hook_function()\r
+\r
+\r
+/* If on, the CPU will emulate the 4-byte prefetch queue of a real 68000 */\r
+#define M68K_EMULATE_PREFETCH       OPT_OFF\r
+\r
+\r
+/* If on, the CPU will generate address error exceptions if it tries to\r
+ * access a word or longword at an odd address.\r
+ * NOTE: Do not enable this!  It is not working!\r
+ */\r
+#define M68K_EMULATE_ADDRESS_ERROR  OPT_OFF\r
+\r
+\r
+/* Turn on to enable logging of illegal instruction calls.\r
+ * M68K_LOG_FILEHANDLE must be #defined to a stdio file stream.\r
+ * Turn on M68K_LOG_1010_1111 to log all 1010 and 1111 calls.\r
+ */\r
+#define M68K_LOG_ENABLE             OPT_OFF\r
+#define M68K_LOG_1010_1111          OPT_OFF\r
+#define M68K_LOG_FILEHANDLE         some_file_handle\r
+\r
+\r
+/* ----------------------------- COMPATIBILITY ---------------------------- */\r
+\r
+/* The following options set optimizations that violate the current ANSI\r
+ * standard, but will be compliant under the forthcoming C9X standard.\r
+ */\r
+\r
+\r
+/* If on, the enulation core will use 64-bit integers to speed up some\r
+ * operations.\r
+*/\r
+#define M68K_USE_64_BIT  OPT_OFF\r
+\r
+\r
+/* Set to your compiler's static inline keyword to enable it, or\r
+ * set it to blank to disable it.\r
+ * If you define INLINE in the makefile, it will override this value.\r
+ * NOTE: not enabling inline functions will SEVERELY slow down emulation.\r
+ */\r
+#ifndef INLINE\r
+#define INLINE static __inline__\r
+#endif /* INLINE */\r
+\r
+\r
+/* If your environment requires special prefixes for system callback functions\r
+ * such as the argument to qsort(), then set them here or in the makefile.\r
+ */\r
+#ifndef DECL_SPEC\r
+#define DECL_SPEC\r
+#endif\r
+\r
+#endif /* M68K_COMPILE_FOR_MAME */\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+#endif /* M68KCONF__HEADER */\r
diff --git a/src/m68kcpu.c b/src/m68kcpu.c
new file mode 100644 (file)
index 0000000..e979343
--- /dev/null
@@ -0,0 +1,894 @@
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+\r
+#if 0\r
+static const char* copyright_notice =\r
+"MUSASHI\n"\r
+"Version 3.3 (2001-01-29)\n"\r
+"A portable Motorola M680x0 processor emulation engine.\n"\r
+"Copyright 1998-2001 Karl Stenerud.  All rights reserved.\n"\r
+"\n"\r
+"This code may be freely used for non-commercial purpooses as long as this\n"\r
+"copyright notice remains unaltered in the source code and any binary files\n"\r
+"containing this code in compiled form.\n"\r
+"\n"\r
+"All other lisencing terms must be negotiated with the author\n"\r
+"(Karl Stenerud).\n"\r
+"\n"\r
+"The latest version of this code can be obtained at:\n"\r
+"http://kstenerud.cjb.net\n"\r
+;\r
+#endif\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================= NOTES ================================ */\r
+/* ======================================================================== */\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================ INCLUDES ============================== */\r
+/* ======================================================================== */\r
+\r
+#include "m68kops.h"\r
+#include "m68kcpu.h"\r
+\r
+/* ======================================================================== */\r
+/* ================================= DATA ================================= */\r
+/* ======================================================================== */\r
+\r
+int  m68ki_initial_cycles;\r
+int  m68ki_remaining_cycles = 0;                     /* Number of clocks remaining */\r
+uint m68ki_tracing = 0;\r
+uint m68ki_address_space;\r
+\r
+#ifdef M68K_LOG_ENABLE\r
+char* m68ki_cpu_names[9] =\r
+{\r
+       "Invalid CPU",\r
+       "M68000",\r
+       "M68010",\r
+       "Invalid CPU",\r
+       "M68EC020"\r
+       "Invalid CPU",\r
+       "Invalid CPU",\r
+       "Invalid CPU",\r
+       "M68020"\r
+};\r
+#endif /* M68K_LOG_ENABLE */\r
+\r
+/* The CPU core */\r
+m68ki_cpu_core m68ki_cpu = {0};\r
+\r
+#if M68K_EMULATE_ADDRESS_ERROR\r
+jmp_buf m68ki_address_error_trap;\r
+#endif /* M68K_EMULATE_ADDRESS_ERROR */\r
+\r
+/* Used by shift & rotate instructions */\r
+uint8 m68ki_shift_8_table[65] =\r
+{\r
+       0x00, 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, 0xff,\r
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+       0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\r
+       0xff, 0xff, 0xff, 0xff, 0xff\r
+};\r
+uint16 m68ki_shift_16_table[65] =\r
+{\r
+       0x0000, 0x8000, 0xc000, 0xe000, 0xf000, 0xf800, 0xfc00, 0xfe00, 0xff00,\r
+       0xff80, 0xffc0, 0xffe0, 0xfff0, 0xfff8, 0xfffc, 0xfffe, 0xffff, 0xffff,\r
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,\r
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,\r
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,\r
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,\r
+       0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff, 0xffff,\r
+       0xffff, 0xffff\r
+};\r
+uint m68ki_shift_32_table[65] =\r
+{\r
+       0x00000000, 0x80000000, 0xc0000000, 0xe0000000, 0xf0000000, 0xf8000000,\r
+       0xfc000000, 0xfe000000, 0xff000000, 0xff800000, 0xffc00000, 0xffe00000,\r
+       0xfff00000, 0xfff80000, 0xfffc0000, 0xfffe0000, 0xffff0000, 0xffff8000,\r
+       0xffffc000, 0xffffe000, 0xfffff000, 0xfffff800, 0xfffffc00, 0xfffffe00,\r
+       0xffffff00, 0xffffff80, 0xffffffc0, 0xffffffe0, 0xfffffff0, 0xfffffff8,\r
+       0xfffffffc, 0xfffffffe, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\r
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\r
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\r
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\r
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff,\r
+       0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff\r
+};\r
+\r
+\r
+/* Number of clock cycles to use for exception processing.\r
+ * I used 4 for any vectors that are undocumented for processing times.\r
+ */\r
+uint8 m68ki_exception_cycle_table[3][256] =\r
+{\r
+       { /* 000 */\r
+                 4, /*  0: Reset - Initial Stack Pointer                      */\r
+                 4, /*  1: Reset - Initial Program Counter                    */\r
+                50, /*  2: Bus Error                             (unemulated) */\r
+                50, /*  3: Address Error                         (unemulated) */\r
+                34, /*  4: Illegal Instruction                                */\r
+                38, /*  5: Divide by Zero -- ASG: changed from 42             */\r
+                40, /*  6: CHK -- ASG: chanaged from 44                       */\r
+                34, /*  7: TRAPV                                              */\r
+                34, /*  8: Privilege Violation                                */\r
+                34, /*  9: Trace                                              */\r
+                 4, /* 10: 1010                                               */\r
+                 4, /* 11: 1111                                               */\r
+                 4, /* 12: RESERVED                                           */\r
+                 4, /* 13: Coprocessor Protocol Violation        (unemulated) */\r
+                 4, /* 14: Format Error                                       */\r
+                44, /* 15: Uninitialized Interrupt                            */\r
+                 4, /* 16: RESERVED                                           */\r
+                 4, /* 17: RESERVED                                           */\r
+                 4, /* 18: RESERVED                                           */\r
+                 4, /* 19: RESERVED                                           */\r
+                 4, /* 20: RESERVED                                           */\r
+                 4, /* 21: RESERVED                                           */\r
+                 4, /* 22: RESERVED                                           */\r
+                 4, /* 23: RESERVED                                           */\r
+                44, /* 24: Spurious Interrupt                                 */\r
+                44, /* 25: Level 1 Interrupt Autovector                       */\r
+                44, /* 26: Level 2 Interrupt Autovector                       */\r
+                44, /* 27: Level 3 Interrupt Autovector                       */\r
+                44, /* 28: Level 4 Interrupt Autovector                       */\r
+                44, /* 29: Level 5 Interrupt Autovector                       */\r
+                44, /* 30: Level 6 Interrupt Autovector                       */\r
+                44, /* 31: Level 7 Interrupt Autovector                       */\r
+                34, /* 32: TRAP #0 -- ASG: chanaged from 38                   */\r
+                34, /* 33: TRAP #1                                            */\r
+                34, /* 34: TRAP #2                                            */\r
+                34, /* 35: TRAP #3                                            */\r
+                34, /* 36: TRAP #4                                            */\r
+                34, /* 37: TRAP #5                                            */\r
+                34, /* 38: TRAP #6                                            */\r
+                34, /* 39: TRAP #7                                            */\r
+                34, /* 40: TRAP #8                                            */\r
+                34, /* 41: TRAP #9                                            */\r
+                34, /* 42: TRAP #10                                           */\r
+                34, /* 43: TRAP #11                                           */\r
+                34, /* 44: TRAP #12                                           */\r
+                34, /* 45: TRAP #13                                           */\r
+                34, /* 46: TRAP #14                                           */\r
+                34, /* 47: TRAP #15                                           */\r
+                 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */\r
+                 4, /* 49: FP Inexact Result                     (unemulated) */\r
+                 4, /* 50: FP Divide by Zero                     (unemulated) */\r
+                 4, /* 51: FP Underflow                          (unemulated) */\r
+                 4, /* 52: FP Operand Error                      (unemulated) */\r
+                 4, /* 53: FP Overflow                           (unemulated) */\r
+                 4, /* 54: FP Signaling NAN                      (unemulated) */\r
+                 4, /* 55: FP Unimplemented Data Type            (unemulated) */\r
+                 4, /* 56: MMU Configuration Error               (unemulated) */\r
+                 4, /* 57: MMU Illegal Operation Error           (unemulated) */\r
+                 4, /* 58: MMU Access Level Violation Error      (unemulated) */\r
+                 4, /* 59: RESERVED                                           */\r
+                 4, /* 60: RESERVED                                           */\r
+                 4, /* 61: RESERVED                                           */\r
+                 4, /* 62: RESERVED                                           */\r
+                 4, /* 63: RESERVED                                           */\r
+                    /* 64-255: User Defined                                   */\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\r
+       },\r
+       { /* 010 */\r
+                 4, /*  0: Reset - Initial Stack Pointer                      */\r
+                 4, /*  1: Reset - Initial Program Counter                    */\r
+               126, /*  2: Bus Error                             (unemulated) */\r
+               126, /*  3: Address Error                         (unemulated) */\r
+                38, /*  4: Illegal Instruction                                */\r
+                44, /*  5: Divide by Zero                                     */\r
+                44, /*  6: CHK                                                */\r
+                34, /*  7: TRAPV                                              */\r
+                38, /*  8: Privilege Violation                                */\r
+                38, /*  9: Trace                                              */\r
+                 4, /* 10: 1010                                               */\r
+                 4, /* 11: 1111                                               */\r
+                 4, /* 12: RESERVED                                           */\r
+                 4, /* 13: Coprocessor Protocol Violation        (unemulated) */\r
+                 4, /* 14: Format Error                                       */\r
+                44, /* 15: Uninitialized Interrupt                            */\r
+                 4, /* 16: RESERVED                                           */\r
+                 4, /* 17: RESERVED                                           */\r
+                 4, /* 18: RESERVED                                           */\r
+                 4, /* 19: RESERVED                                           */\r
+                 4, /* 20: RESERVED                                           */\r
+                 4, /* 21: RESERVED                                           */\r
+                 4, /* 22: RESERVED                                           */\r
+                 4, /* 23: RESERVED                                           */\r
+                46, /* 24: Spurious Interrupt                                 */\r
+                46, /* 25: Level 1 Interrupt Autovector                       */\r
+                46, /* 26: Level 2 Interrupt Autovector                       */\r
+                46, /* 27: Level 3 Interrupt Autovector                       */\r
+                46, /* 28: Level 4 Interrupt Autovector                       */\r
+                46, /* 29: Level 5 Interrupt Autovector                       */\r
+                46, /* 30: Level 6 Interrupt Autovector                       */\r
+                46, /* 31: Level 7 Interrupt Autovector                       */\r
+                38, /* 32: TRAP #0                                            */\r
+                38, /* 33: TRAP #1                                            */\r
+                38, /* 34: TRAP #2                                            */\r
+                38, /* 35: TRAP #3                                            */\r
+                38, /* 36: TRAP #4                                            */\r
+                38, /* 37: TRAP #5                                            */\r
+                38, /* 38: TRAP #6                                            */\r
+                38, /* 39: TRAP #7                                            */\r
+                38, /* 40: TRAP #8                                            */\r
+                38, /* 41: TRAP #9                                            */\r
+                38, /* 42: TRAP #10                                           */\r
+                38, /* 43: TRAP #11                                           */\r
+                38, /* 44: TRAP #12                                           */\r
+                38, /* 45: TRAP #13                                           */\r
+                38, /* 46: TRAP #14                                           */\r
+                38, /* 47: TRAP #15                                           */\r
+                 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */\r
+                 4, /* 49: FP Inexact Result                     (unemulated) */\r
+                 4, /* 50: FP Divide by Zero                     (unemulated) */\r
+                 4, /* 51: FP Underflow                          (unemulated) */\r
+                 4, /* 52: FP Operand Error                      (unemulated) */\r
+                 4, /* 53: FP Overflow                           (unemulated) */\r
+                 4, /* 54: FP Signaling NAN                      (unemulated) */\r
+                 4, /* 55: FP Unimplemented Data Type            (unemulated) */\r
+                 4, /* 56: MMU Configuration Error               (unemulated) */\r
+                 4, /* 57: MMU Illegal Operation Error           (unemulated) */\r
+                 4, /* 58: MMU Access Level Violation Error      (unemulated) */\r
+                 4, /* 59: RESERVED                                           */\r
+                 4, /* 60: RESERVED                                           */\r
+                 4, /* 61: RESERVED                                           */\r
+                 4, /* 62: RESERVED                                           */\r
+                 4, /* 63: RESERVED                                           */\r
+                    /* 64-255: User Defined                                   */\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\r
+       },\r
+       { /* 020 */\r
+                 4, /*  0: Reset - Initial Stack Pointer                      */\r
+                 4, /*  1: Reset - Initial Program Counter                    */\r
+                50, /*  2: Bus Error                             (unemulated) */\r
+                50, /*  3: Address Error                         (unemulated) */\r
+                20, /*  4: Illegal Instruction                                */\r
+                38, /*  5: Divide by Zero                                     */\r
+                40, /*  6: CHK                                                */\r
+                20, /*  7: TRAPV                                              */\r
+                34, /*  8: Privilege Violation                                */\r
+                25, /*  9: Trace                                              */\r
+                20, /* 10: 1010                                               */\r
+                20, /* 11: 1111                                               */\r
+                 4, /* 12: RESERVED                                           */\r
+                 4, /* 13: Coprocessor Protocol Violation        (unemulated) */\r
+                 4, /* 14: Format Error                                       */\r
+                30, /* 15: Uninitialized Interrupt                            */\r
+                 4, /* 16: RESERVED                                           */\r
+                 4, /* 17: RESERVED                                           */\r
+                 4, /* 18: RESERVED                                           */\r
+                 4, /* 19: RESERVED                                           */\r
+                 4, /* 20: RESERVED                                           */\r
+                 4, /* 21: RESERVED                                           */\r
+                 4, /* 22: RESERVED                                           */\r
+                 4, /* 23: RESERVED                                           */\r
+                30, /* 24: Spurious Interrupt                                 */\r
+                30, /* 25: Level 1 Interrupt Autovector                       */\r
+                30, /* 26: Level 2 Interrupt Autovector                       */\r
+                30, /* 27: Level 3 Interrupt Autovector                       */\r
+                30, /* 28: Level 4 Interrupt Autovector                       */\r
+                30, /* 29: Level 5 Interrupt Autovector                       */\r
+                30, /* 30: Level 6 Interrupt Autovector                       */\r
+                30, /* 31: Level 7 Interrupt Autovector                       */\r
+                20, /* 32: TRAP #0                                            */\r
+                20, /* 33: TRAP #1                                            */\r
+                20, /* 34: TRAP #2                                            */\r
+                20, /* 35: TRAP #3                                            */\r
+                20, /* 36: TRAP #4                                            */\r
+                20, /* 37: TRAP #5                                            */\r
+                20, /* 38: TRAP #6                                            */\r
+                20, /* 39: TRAP #7                                            */\r
+                20, /* 40: TRAP #8                                            */\r
+                20, /* 41: TRAP #9                                            */\r
+                20, /* 42: TRAP #10                                           */\r
+                20, /* 43: TRAP #11                                           */\r
+                20, /* 44: TRAP #12                                           */\r
+                20, /* 45: TRAP #13                                           */\r
+                20, /* 46: TRAP #14                                           */\r
+                20, /* 47: TRAP #15                                           */\r
+                 4, /* 48: FP Branch or Set on Unknown Condition (unemulated) */\r
+                 4, /* 49: FP Inexact Result                     (unemulated) */\r
+                 4, /* 50: FP Divide by Zero                     (unemulated) */\r
+                 4, /* 51: FP Underflow                          (unemulated) */\r
+                 4, /* 52: FP Operand Error                      (unemulated) */\r
+                 4, /* 53: FP Overflow                           (unemulated) */\r
+                 4, /* 54: FP Signaling NAN                      (unemulated) */\r
+                 4, /* 55: FP Unimplemented Data Type            (unemulated) */\r
+                 4, /* 56: MMU Configuration Error               (unemulated) */\r
+                 4, /* 57: MMU Illegal Operation Error           (unemulated) */\r
+                 4, /* 58: MMU Access Level Violation Error      (unemulated) */\r
+                 4, /* 59: RESERVED                                           */\r
+                 4, /* 60: RESERVED                                           */\r
+                 4, /* 61: RESERVED                                           */\r
+                 4, /* 62: RESERVED                                           */\r
+                 4, /* 63: RESERVED                                           */\r
+                    /* 64-255: User Defined                                   */\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,\r
+                 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4\r
+       }\r
+};\r
+\r
+uint8 m68ki_ea_idx_cycle_table[64] =\r
+{\r
+        0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,\r
+        0, /* ..01.000 no memory indirect, base NULL             */\r
+        5, /* ..01..01 memory indirect,    base NULL, outer NULL */\r
+        7, /* ..01..10 memory indirect,    base NULL, outer 16   */\r
+        7, /* ..01..11 memory indirect,    base NULL, outer 32   */\r
+        0,  5,  7,  7,  0,  5,  7,  7,  0,  5,  7,  7,\r
+        2, /* ..10.000 no memory indirect, base 16               */\r
+        7, /* ..10..01 memory indirect,    base 16,   outer NULL */\r
+        9, /* ..10..10 memory indirect,    base 16,   outer 16   */\r
+        9, /* ..10..11 memory indirect,    base 16,   outer 32   */\r
+        0,  7,  9,  9,  0,  7,  9,  9,  0,  7,  9,  9,\r
+        6, /* ..11.000 no memory indirect, base 32               */\r
+       11, /* ..11..01 memory indirect,    base 32,   outer NULL */\r
+       13, /* ..11..10 memory indirect,    base 32,   outer 16   */\r
+       13, /* ..11..11 memory indirect,    base 32,   outer 32   */\r
+        0, 11, 13, 13,  0, 11, 13, 13,  0, 11, 13, 13\r
+};\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* =============================== CALLBACKS ============================== */\r
+/* ======================================================================== */\r
+\r
+/* Default callbacks used if the callback hasn't been set yet, or if the\r
+ * callback is set to NULL\r
+ */\r
+\r
+/* Interrupt acknowledge */\r
+static int default_int_ack_callback_data;\r
+static int default_int_ack_callback(int int_level)\r
+{\r
+       default_int_ack_callback_data = int_level;\r
+       CPU_INT_LEVEL = 0;\r
+       return M68K_INT_ACK_AUTOVECTOR;\r
+}\r
+\r
+/* Breakpoint acknowledge */\r
+static unsigned int default_bkpt_ack_callback_data;\r
+static void default_bkpt_ack_callback(unsigned int data)\r
+{\r
+       default_bkpt_ack_callback_data = data;\r
+}\r
+\r
+/* Called when a reset instruction is executed */\r
+static void default_reset_instr_callback(void)\r
+{\r
+}\r
+\r
+/* Called when the program counter changed by a large value */\r
+static unsigned int default_pc_changed_callback_data;\r
+static void default_pc_changed_callback(unsigned int new_pc)\r
+{\r
+       default_pc_changed_callback_data = new_pc;\r
+}\r
+\r
+/* Called every time there's bus activity (read/write to/from memory */\r
+static unsigned int default_set_fc_callback_data;\r
+static void default_set_fc_callback(unsigned int new_fc)\r
+{\r
+       default_set_fc_callback_data = new_fc;\r
+}\r
+\r
+/* Called every instruction cycle prior to execution */\r
+static void default_instr_hook_callback(void)\r
+{\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================= API ================================== */\r
+/* ======================================================================== */\r
+\r
+/* Access the internals of the CPU */\r
+unsigned int m68k_get_reg(void* context, m68k_register_t regnum)\r
+{\r
+       m68ki_cpu_core* cpu = context != NULL ?(m68ki_cpu_core*)context : &m68ki_cpu;\r
+\r
+       switch(regnum)\r
+       {\r
+               case M68K_REG_D0:       return cpu->dar[0];\r
+               case M68K_REG_D1:       return cpu->dar[1];\r
+               case M68K_REG_D2:       return cpu->dar[2];\r
+               case M68K_REG_D3:       return cpu->dar[3];\r
+               case M68K_REG_D4:       return cpu->dar[4];\r
+               case M68K_REG_D5:       return cpu->dar[5];\r
+               case M68K_REG_D6:       return cpu->dar[6];\r
+               case M68K_REG_D7:       return cpu->dar[7];\r
+               case M68K_REG_A0:       return cpu->dar[8];\r
+               case M68K_REG_A1:       return cpu->dar[9];\r
+               case M68K_REG_A2:       return cpu->dar[10];\r
+               case M68K_REG_A3:       return cpu->dar[11];\r
+               case M68K_REG_A4:       return cpu->dar[12];\r
+               case M68K_REG_A5:       return cpu->dar[13];\r
+               case M68K_REG_A6:       return cpu->dar[14];\r
+               case M68K_REG_A7:       return cpu->dar[15];\r
+               case M68K_REG_PC:       return MASK_OUT_ABOVE_32(cpu->pc);\r
+               case M68K_REG_SR:       return  cpu->t1_flag                                            |\r
+                                                                       cpu->t0_flag                                            |\r
+                                                                       (cpu->s_flag << 11)                                     |\r
+                                                                       (cpu->m_flag << 11)                                     |\r
+                                                                       cpu->int_mask                                           |\r
+                                                                       ((cpu->x_flag & XFLAG_SET) >> 4)        |\r
+                                                                       ((cpu->n_flag & NFLAG_SET) >> 4)        |\r
+                                                                       ((!cpu->not_z_flag) << 2)                       |\r
+                                                                       ((cpu->v_flag & VFLAG_SET) >> 6)        |\r
+                                                                       ((cpu->c_flag & CFLAG_SET) >> 8);\r
+               case M68K_REG_SP:       return cpu->dar[15];\r
+               case M68K_REG_USP:      return cpu->s_flag ? cpu->sp[0] : cpu->dar[15];\r
+               case M68K_REG_ISP:      return cpu->s_flag && !cpu->m_flag ? cpu->dar[15] : cpu->sp[4];\r
+               case M68K_REG_MSP:      return cpu->s_flag && cpu->m_flag ? cpu->dar[15] : cpu->sp[6];\r
+               case M68K_REG_SFC:      return cpu->sfc;\r
+               case M68K_REG_DFC:      return cpu->dfc;\r
+               case M68K_REG_VBR:      return cpu->vbr;\r
+               case M68K_REG_CACR:     return cpu->cacr;\r
+               case M68K_REG_CAAR:     return cpu->caar;\r
+               case M68K_REG_PREF_ADDR:        return cpu->pref_addr;\r
+               case M68K_REG_PREF_DATA:        return cpu->pref_data;\r
+               case M68K_REG_PPC:      return MASK_OUT_ABOVE_32(cpu->ppc);\r
+               case M68K_REG_IR:       return cpu->ir;\r
+               case M68K_REG_CPU_TYPE:\r
+                       switch(cpu->cpu_type)\r
+                       {\r
+                               case CPU_TYPE_000:              return (unsigned int)M68K_CPU_TYPE_68000;\r
+                               case CPU_TYPE_010:              return (unsigned int)M68K_CPU_TYPE_68010;\r
+                               case CPU_TYPE_EC020:    return (unsigned int)M68K_CPU_TYPE_68EC020;\r
+                               case CPU_TYPE_020:              return (unsigned int)M68K_CPU_TYPE_68020;\r
+                       }\r
+                       return M68K_CPU_TYPE_INVALID;\r
+               default:                        return 0;\r
+       }\r
+       return 0;\r
+}\r
+\r
+void m68k_set_reg(m68k_register_t regnum, unsigned int value)\r
+{\r
+       switch(regnum)\r
+       {\r
+               case M68K_REG_D0:       REG_D[0] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D1:       REG_D[1] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D2:       REG_D[2] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D3:       REG_D[3] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D4:       REG_D[4] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D5:       REG_D[5] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D6:       REG_D[6] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_D7:       REG_D[7] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A0:       REG_A[0] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A1:       REG_A[1] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A2:       REG_A[2] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A3:       REG_A[3] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A4:       REG_A[4] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A5:       REG_A[5] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A6:       REG_A[6] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_A7:       REG_A[7] = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_PC:       m68ki_jump(MASK_OUT_ABOVE_32(value)); return;\r
+               case M68K_REG_SR:       m68ki_set_sr(value); return;\r
+               case M68K_REG_SP:       REG_SP = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_USP:      if(FLAG_S)\r
+                                                               REG_USP = MASK_OUT_ABOVE_32(value);\r
+                                                       else\r
+                                                               REG_SP = MASK_OUT_ABOVE_32(value);\r
+                                                       return;\r
+               case M68K_REG_ISP:      if(FLAG_S && !FLAG_M)\r
+                                                               REG_SP = MASK_OUT_ABOVE_32(value);\r
+                                                       else\r
+                                                               REG_ISP = MASK_OUT_ABOVE_32(value);\r
+                                                       return;\r
+               case M68K_REG_MSP:      if(FLAG_S && FLAG_M)\r
+                                                               REG_SP = MASK_OUT_ABOVE_32(value);\r
+                                                       else\r
+                                                               REG_MSP = MASK_OUT_ABOVE_32(value);\r
+                                                       return;\r
+               case M68K_REG_VBR:      REG_VBR = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_SFC:      REG_SFC = value & 7; return;\r
+               case M68K_REG_DFC:      REG_DFC = value & 7; return;\r
+               case M68K_REG_CACR:     REG_CACR = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_CAAR:     REG_CAAR = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_PPC:      REG_PPC = MASK_OUT_ABOVE_32(value); return;\r
+               case M68K_REG_IR:       REG_IR = MASK_OUT_ABOVE_16(value); return;\r
+               case M68K_REG_CPU_TYPE: m68k_set_cpu_type(value); return;\r
+               default:                        return;\r
+       }\r
+}\r
+\r
+/* Set the callbacks */\r
+void m68k_set_int_ack_callback(int  (*callback)(int int_level))\r
+{\r
+       CALLBACK_INT_ACK = callback ? callback : default_int_ack_callback;\r
+}\r
+\r
+void m68k_set_bkpt_ack_callback(void  (*callback)(unsigned int data))\r
+{\r
+       CALLBACK_BKPT_ACK = callback ? callback : default_bkpt_ack_callback;\r
+}\r
+\r
+void m68k_set_reset_instr_callback(void  (*callback)(void))\r
+{\r
+       CALLBACK_RESET_INSTR = callback ? callback : default_reset_instr_callback;\r
+}\r
+\r
+void m68k_set_pc_changed_callback(void  (*callback)(unsigned int new_pc))\r
+{\r
+       CALLBACK_PC_CHANGED = callback ? callback : default_pc_changed_callback;\r
+}\r
+\r
+void m68k_set_fc_callback(void  (*callback)(unsigned int new_fc))\r
+{\r
+       CALLBACK_SET_FC = callback ? callback : default_set_fc_callback;\r
+}\r
+\r
+void m68k_set_instr_hook_callback(void  (*callback)(void))\r
+{\r
+       CALLBACK_INSTR_HOOK = callback ? callback : default_instr_hook_callback;\r
+}\r
+\r
+#include <stdio.h>\r
+/* Set the CPU type. */\r
+void m68k_set_cpu_type(unsigned int cpu_type)\r
+{\r
+       switch(cpu_type)\r
+       {\r
+               case M68K_CPU_TYPE_68000:\r
+                       CPU_TYPE         = CPU_TYPE_000;\r
+                       CPU_ADDRESS_MASK = 0x00ffffff;\r
+                       CPU_SR_MASK      = 0xa71f; /* T1 -- S  -- -- I2 I1 I0 -- -- -- X  N  Z  V  C  */\r
+                       CYC_INSTRUCTION  = m68ki_cycles[0];\r
+                       CYC_EXCEPTION    = m68ki_exception_cycle_table[0];\r
+                       CYC_BCC_NOTAKE_B = -2;\r
+                       CYC_BCC_NOTAKE_W = 2;\r
+                       CYC_DBCC_F_NOEXP = -2;\r
+                       CYC_DBCC_F_EXP   = 2;\r
+                       CYC_SCC_R_FALSE  = 2;\r
+                       CYC_MOVEM_W      = 2;\r
+                       CYC_MOVEM_L      = 3;\r
+                       CYC_SHIFT        = 1;\r
+                       CYC_RESET        = 132;\r
+                       return;\r
+               case M68K_CPU_TYPE_68010:\r
+                       CPU_TYPE         = CPU_TYPE_010;\r
+                       CPU_ADDRESS_MASK = 0x00ffffff;\r
+                       CPU_SR_MASK      = 0xa71f; /* T1 -- S  -- -- I2 I1 I0 -- -- -- X  N  Z  V  C  */\r
+                       CYC_INSTRUCTION  = m68ki_cycles[1];\r
+                       CYC_EXCEPTION    = m68ki_exception_cycle_table[1];\r
+                       CYC_BCC_NOTAKE_B = -4;\r
+                       CYC_BCC_NOTAKE_W = 0;\r
+                       CYC_DBCC_F_NOEXP = 0;\r
+                       CYC_DBCC_F_EXP   = 6;\r
+                       CYC_SCC_R_FALSE  = 0;\r
+                       CYC_MOVEM_W      = 2;\r
+                       CYC_MOVEM_L      = 3;\r
+                       CYC_SHIFT        = 1;\r
+                       CYC_RESET        = 130;\r
+                       return;\r
+               case M68K_CPU_TYPE_68EC020:\r
+                       CPU_TYPE         = CPU_TYPE_EC020;\r
+                       CPU_ADDRESS_MASK = 0x00ffffff;\r
+                       CPU_SR_MASK      = 0xf71f; /* T1 T0 S  M  -- I2 I1 I0 -- -- -- X  N  Z  V  C  */\r
+                       CYC_INSTRUCTION  = m68ki_cycles[2];\r
+                       CYC_EXCEPTION    = m68ki_exception_cycle_table[2];\r
+                       CYC_BCC_NOTAKE_B = -2;\r
+                       CYC_BCC_NOTAKE_W = 0;\r
+                       CYC_DBCC_F_NOEXP = 0;\r
+                       CYC_DBCC_F_EXP   = 4;\r
+                       CYC_SCC_R_FALSE  = 0;\r
+                       CYC_MOVEM_W      = 2;\r
+                       CYC_MOVEM_L      = 2; \r
+                       CYC_SHIFT        = 0;\r
+                       CYC_RESET        = 518;\r
+                       return;\r
+               case M68K_CPU_TYPE_68020:\r
+                       CPU_TYPE         = CPU_TYPE_020;\r
+                       CPU_ADDRESS_MASK = 0xffffffff;\r
+                       CPU_SR_MASK      = 0xf71f; /* T1 T0 S  M  -- I2 I1 I0 -- -- -- X  N  Z  V  C  */\r
+                       CYC_INSTRUCTION  = m68ki_cycles[2];\r
+                       CYC_EXCEPTION    = m68ki_exception_cycle_table[2];\r
+                       CYC_BCC_NOTAKE_B = -2;\r
+                       CYC_BCC_NOTAKE_W = 0;\r
+                       CYC_DBCC_F_NOEXP = 0;\r
+                       CYC_DBCC_F_EXP   = 4;\r
+                       CYC_SCC_R_FALSE  = 0;\r
+                       CYC_MOVEM_W      = 2;\r
+                       CYC_MOVEM_L      = 2;\r
+                       CYC_SHIFT        = 0;\r
+                       CYC_RESET        = 518;\r
+                       return;\r
+       }\r
+}\r
+\r
+/* Execute some instructions until we use up num_cycles clock cycles */\r
+/* ASG: removed per-instruction interrupt checks */\r
+int m68k_execute(int num_cycles)\r
+{\r
+       /* Make sure we're not stopped */\r
+       if(!CPU_STOPPED)\r
+       {\r
+               /* Set our pool of clock cycles available */\r
+               SET_CYCLES(num_cycles);\r
+               m68ki_initial_cycles = num_cycles;\r
+\r
+               /* ASG: update cycles */\r
+               USE_CYCLES(CPU_INT_CYCLES);\r
+               CPU_INT_CYCLES = 0;\r
+\r
+               /* Return point if we had an address error */\r
+               m68ki_set_address_error_trap(); /* auto-disable (see m68kcpu.h) */\r
+\r
+               /* Main loop.  Keep going until we run out of clock cycles */\r
+               do\r
+               {\r
+                       /* Set tracing accodring to T1. (T0 is done inside instruction) */\r
+                       m68ki_trace_t1(); /* auto-disable (see m68kcpu.h) */\r
+\r
+                       /* Set the address space for reads */\r
+                       m68ki_use_data_space(); /* auto-disable (see m68kcpu.h) */\r
+\r
+                       /* Call external hook to peek at CPU */\r
+                       m68ki_instr_hook(); /* auto-disable (see m68kcpu.h) */\r
+\r
+                       /* Record previous program counter */\r
+                       REG_PPC = REG_PC;\r
+\r
+                       /* Read an instruction and call its handler */\r
+                       REG_IR = m68ki_read_imm_16();\r
+                       m68ki_instruction_jump_table[REG_IR]();\r
+                       USE_CYCLES(CYC_INSTRUCTION[REG_IR]);\r
+\r
+                       /* Trace m68k_exception, if necessary */\r
+                       m68ki_exception_if_trace(); /* auto-disable (see m68kcpu.h) */\r
+               } while(GET_CYCLES() > 0);\r
+\r
+               /* set previous PC to current PC for the next entry into the loop */\r
+               REG_PPC = REG_PC;\r
+\r
+               /* ASG: update cycles */\r
+               USE_CYCLES(CPU_INT_CYCLES);\r
+               CPU_INT_CYCLES = 0;\r
+\r
+               /* return how many clocks we used */\r
+               return m68ki_initial_cycles - GET_CYCLES();\r
+       }\r
+\r
+       /* We get here if the CPU is stopped or halted */\r
+       SET_CYCLES(0);\r
+       CPU_INT_CYCLES = 0;\r
+\r
+       return num_cycles;\r
+}\r
+\r
+\r
+int m68k_cycles_run(void)\r
+{\r
+       return m68ki_initial_cycles - GET_CYCLES();\r
+}\r
+\r
+int m68k_cycles_remaining(void)\r
+{\r
+       return GET_CYCLES();\r
+}\r
+\r
+/* Change the timeslice */\r
+void m68k_modify_timeslice(int cycles)\r
+{\r
+       m68ki_initial_cycles += cycles;\r
+       ADD_CYCLES(cycles);\r
+}\r
+\r
+\r
+void m68k_end_timeslice(void)\r
+{\r
+       m68ki_initial_cycles = GET_CYCLES();\r
+       SET_CYCLES(0);\r
+}\r
+\r
+\r
+/* ASG: rewrote so that the int_level is a mask of the IPL0/IPL1/IPL2 bits */\r
+/* KS: Modified so that IPL* bits match with mask positions in the SR\r
+ *     and cleaned out remenants of the interrupt controller.\r
+ */\r
+void m68k_set_irq(unsigned int int_level)\r
+{\r
+       uint old_level = CPU_INT_LEVEL;\r
+       CPU_INT_LEVEL = int_level << 8;\r
+\r
+       /* A transition from < 7 to 7 always interrupts (NMI) */\r
+       /* Note: Level 7 can also level trigger like a normal IRQ */\r
+       if(old_level != 0x0700 && CPU_INT_LEVEL == 0x0700)\r
+               m68ki_exception_interrupt(7); /* Edge triggered level 7 (NMI) */\r
+       else\r
+               m68ki_check_interrupts(); /* Level triggered (IRQ) */\r
+}\r
+\r
+\r
+/* Pulse the RESET line on the CPU */\r
+void m68k_pulse_reset(void)\r
+{\r
+       static uint emulation_initialized = 0;\r
+\r
+       /* The first call to this function initializes the opcode handler jump table */\r
+       if(!emulation_initialized)\r
+       {\r
+               m68ki_build_opcode_table();\r
+               m68k_set_int_ack_callback(NULL);\r
+               m68k_set_bkpt_ack_callback(NULL);\r
+               m68k_set_reset_instr_callback(NULL);\r
+               m68k_set_pc_changed_callback(NULL);\r
+               m68k_set_fc_callback(NULL);\r
+               m68k_set_instr_hook_callback(NULL);\r
+\r
+               emulation_initialized = 1;\r
+       }\r
+\r
+\r
+       if(CPU_TYPE == 0)       /* KW 990319 */\r
+               m68k_set_cpu_type(M68K_CPU_TYPE_68000);\r
+\r
+       /* Clear all stop levels and eat up all remaining cycles */\r
+       CPU_STOPPED = 0;\r
+       SET_CYCLES(0);\r
+\r
+       /* Turn off tracing */\r
+       FLAG_T1 = FLAG_T0 = 0;\r
+       m68ki_clear_trace();\r
+       /* Interrupt mask to level 7 */\r
+       FLAG_INT_MASK = 0x0700;\r
+       /* Reset VBR */\r
+       REG_VBR = 0;\r
+       /* Go to supervisor mode */\r
+       m68ki_set_sm_flag(SFLAG_SET | MFLAG_CLEAR);\r
+\r
+       /* Invalidate the prefetch queue */\r
+#if M68K_EMULATE_PREFETCH\r
+       /* Set to arbitrary number since our first fetch is from 0 */\r
+       CPU_PREF_ADDR = 0x1000;\r
+#endif /* M68K_EMULATE_PREFETCH */\r
+\r
+       /* Read the initial stack pointer and program counter */\r
+       m68ki_jump(0);\r
+       REG_SP = m68ki_read_imm_32();\r
+       REG_PC = m68ki_read_imm_32();\r
+       m68ki_jump(REG_PC);\r
+}\r
+\r
+/* Pulse the HALT line on the CPU */\r
+void m68k_pulse_halt(void)\r
+{\r
+       CPU_STOPPED |= STOP_LEVEL_HALT;\r
+}\r
+\r
+\r
+/* Get and set the current CPU context */\r
+/* This is to allow for multiple CPUs */\r
+unsigned int m68k_context_size()\r
+{\r
+       return sizeof(m68ki_cpu_core);\r
+}\r
+\r
+unsigned int m68k_get_context(void* dst)\r
+{\r
+       if(dst) *(m68ki_cpu_core*)dst = m68ki_cpu;\r
+       return sizeof(m68ki_cpu_core);\r
+}\r
+\r
+void m68k_set_context(void* src)\r
+{\r
+       if(src) m68ki_cpu = *(m68ki_cpu_core*)src;\r
+}\r
+\r
+void m68k_save_context(        void (*save_value)(char*, unsigned int))\r
+{\r
+       if(!save_value)\r
+               return;\r
+\r
+       save_value("CPU_TYPE"  , m68k_get_reg(NULL, M68K_REG_CPU_TYPE));\r
+       save_value("D0"        , REG_D[0]);\r
+       save_value("D1"        , REG_D[1]);\r
+       save_value("D2"        , REG_D[2]);\r
+       save_value("D3"        , REG_D[3]);\r
+       save_value("D4"        , REG_D[4]);\r
+       save_value("D5"        , REG_D[5]);\r
+       save_value("D6"        , REG_D[6]);\r
+       save_value("D7"        , REG_D[7]);\r
+       save_value("A0"        , REG_A[0]);\r
+       save_value("A1"        , REG_A[1]);\r
+       save_value("A2"        , REG_A[2]);\r
+       save_value("A3"        , REG_A[3]);\r
+       save_value("A4"        , REG_A[4]);\r
+       save_value("A5"        , REG_A[5]);\r
+       save_value("A6"        , REG_A[6]);\r
+       save_value("A7"        , REG_A[7]);\r
+       save_value("PPC"       , REG_PPC);\r
+       save_value("PC"        , REG_PC);\r
+       save_value("USP"       , REG_USP);\r
+       save_value("ISP"       , REG_ISP);\r
+       save_value("MSP"       , REG_MSP);\r
+       save_value("VBR"       , REG_VBR);\r
+       save_value("SFC"       , REG_SFC);\r
+       save_value("DFC"       , REG_DFC);\r
+       save_value("CACR"      , REG_CACR);\r
+       save_value("CAAR"      , REG_CAAR);\r
+       save_value("SR"        , m68ki_get_sr());\r
+       save_value("INT_LEVEL" , CPU_INT_LEVEL);\r
+       save_value("INT_CYCLES", CPU_INT_CYCLES);\r
+       save_value("STOPPED"   , (CPU_STOPPED & STOP_LEVEL_STOP) != 0);\r
+       save_value("HALTED"    , (CPU_STOPPED & STOP_LEVEL_HALT) != 0);\r
+       save_value("PREF_ADDR" , CPU_PREF_ADDR);\r
+       save_value("PREF_DATA" , CPU_PREF_DATA);\r
+}\r
+\r
+void m68k_load_context(unsigned int (*load_value)(char*))\r
+{\r
+       unsigned int temp;\r
+\r
+       m68k_set_cpu_type(load_value("CPU_TYPE"));\r
+       REG_PPC = load_value("PPC");\r
+       REG_PC = load_value("PC");\r
+       m68ki_jump(REG_PC);\r
+       CPU_INT_LEVEL = 0;\r
+       m68ki_set_sr_noint(load_value("SR"));\r
+       REG_D[0]       = load_value("D0");\r
+       REG_D[1]       = load_value("D1");\r
+       REG_D[2]       = load_value("D2");\r
+       REG_D[3]       = load_value("D3");\r
+       REG_D[4]       = load_value("D4");\r
+       REG_D[5]       = load_value("D5");\r
+       REG_D[6]       = load_value("D6");\r
+       REG_D[7]       = load_value("D7");\r
+       REG_A[0]       = load_value("A0");\r
+       REG_A[1]       = load_value("A1");\r
+       REG_A[2]       = load_value("A2");\r
+       REG_A[3]       = load_value("A3");\r
+       REG_A[4]       = load_value("A4");\r
+       REG_A[5]       = load_value("A5");\r
+       REG_A[6]       = load_value("A6");\r
+       REG_A[7]       = load_value("A7");\r
+       REG_USP        = load_value("USP");\r
+       REG_ISP        = load_value("ISP");\r
+       REG_MSP        = load_value("MSP");\r
+       REG_VBR        = load_value("VBR");\r
+       REG_SFC        = load_value("SFC");\r
+       REG_DFC        = load_value("DFC");\r
+       REG_CACR       = load_value("CACR");\r
+       REG_CAAR       = load_value("CAAR");\r
+       CPU_INT_LEVEL  = load_value("INT_LEVEL");\r
+       CPU_INT_CYCLES = load_value("INT_CYCLES");\r
+\r
+       CPU_STOPPED = 0;\r
+       temp           = load_value("STOPPED");\r
+       if(temp) CPU_STOPPED |= STOP_LEVEL_STOP;\r
+       temp           = load_value("HALTED");\r
+       if(temp) CPU_STOPPED |= STOP_LEVEL_HALT;\r
+\r
+       CPU_PREF_ADDR  = load_value("PREF_ADDR");\r
+       CPU_PREF_DATA  = load_value("PREF_DATA");\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
diff --git a/src/m68kcpu.h b/src/m68kcpu.h
new file mode 100644 (file)
index 0000000..6ea7a57
--- /dev/null
@@ -0,0 +1,1838 @@
+#include <stdio.h>\r
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+\r
+#ifndef M68KCPU__HEADER\r
+#define M68KCPU__HEADER\r
+\r
+#include "m68k.h"\r
+#include <limits.h>\r
+\r
+#if M68K_EMULATE_ADDRESS_ERROR\r
+#include <setjmp.h>\r
+#endif /* M68K_EMULATE_ADDRESS_ERROR */\r
+\r
+/* ======================================================================== */\r
+/* ==================== ARCHITECTURE-DEPENDANT DEFINES ==================== */\r
+/* ======================================================================== */\r
+\r
+/* Check for > 32bit sizes */\r
+#if UINT_MAX > 0xffffffff\r
+       #define M68K_INT_GT_32_BIT  1\r
+#endif\r
+\r
+/* Data types used in this emulation core */\r
+#undef sint8\r
+#undef sint16\r
+#undef sint32\r
+#undef sint64\r
+#undef uint8\r
+#undef uint16\r
+#undef uint32\r
+#undef uint64\r
+#undef sint\r
+#undef uint\r
+\r
+#define sint8  signed   char                   /* ASG: changed from char to signed char */\r
+#define sint16 signed   short\r
+#define sint32 signed   long\r
+#define uint8  unsigned char\r
+#define uint16 unsigned short\r
+#define uint32 unsigned long\r
+\r
+/* signed and unsigned int must be at least 32 bits wide */\r
+#define sint   signed   int\r
+#define uint   unsigned int\r
+\r
+\r
+#if M68K_USE_64_BIT\r
+#define sint64 signed   long long\r
+#define uint64 unsigned long long\r
+#else\r
+#define sint64 sint32\r
+#define uint64 uint32\r
+#endif /* M68K_USE_64_BIT */\r
+\r
+\r
+\r
+/* Allow for architectures that don't have 8-bit sizes */\r
+#if UCHAR_MAX == 0xff\r
+       #define MAKE_INT_8(A) (sint8)(A)\r
+#else\r
+       #undef  sint8\r
+       #define sint8  signed   int\r
+       #undef  uint8\r
+       #define uint8  unsigned int\r
+       INLINE sint MAKE_INT_8(uint value)\r
+       {\r
+               return (value & 0x80) ? value | ~0xff : value & 0xff;\r
+       }\r
+#endif /* UCHAR_MAX == 0xff */\r
+\r
+\r
+/* Allow for architectures that don't have 16-bit sizes */\r
+#if USHRT_MAX == 0xffff\r
+       #define MAKE_INT_16(A) (sint16)(A)\r
+#else\r
+       #undef  sint16\r
+       #define sint16 signed   int\r
+       #undef  uint16\r
+       #define uint16 unsigned int\r
+       INLINE sint MAKE_INT_16(uint value)\r
+       {\r
+               return (value & 0x8000) ? value | ~0xffff : value & 0xffff;\r
+       }\r
+#endif /* USHRT_MAX == 0xffff */\r
+\r
+\r
+/* Allow for architectures that don't have 32-bit sizes */\r
+#if ULONG_MAX == 0xffffffff\r
+       #define MAKE_INT_32(A) (sint32)(A)\r
+#else\r
+       #undef  sint32\r
+       #define sint32  signed   int\r
+       #undef  uint32\r
+       #define uint32  unsigned int\r
+       INLINE sint MAKE_INT_32(uint value)\r
+       {\r
+               return (value & 0x80000000) ? value | ~0xffffffff : value & 0xffffffff;\r
+       }\r
+#endif /* ULONG_MAX == 0xffffffff */\r
+\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================ GENERAL DEFINES =========================== */\r
+/* ======================================================================== */\r
+\r
+/* Exception Vectors handled by emulation */\r
+#define EXCEPTION_BUS_ERROR                2 /* This one is not emulated! */\r
+#define EXCEPTION_ADDRESS_ERROR            3 /* This one is partially emulated (doesn't stack a proper frame yet) */\r
+#define EXCEPTION_ILLEGAL_INSTRUCTION      4\r
+#define EXCEPTION_ZERO_DIVIDE              5\r
+#define EXCEPTION_CHK                      6\r
+#define EXCEPTION_TRAPV                    7\r
+#define EXCEPTION_PRIVILEGE_VIOLATION      8\r
+#define EXCEPTION_TRACE                    9\r
+#define EXCEPTION_1010                    10\r
+#define EXCEPTION_1111                    11\r
+#define EXCEPTION_FORMAT_ERROR            14\r
+#define EXCEPTION_UNINITIALIZED_INTERRUPT 15\r
+#define EXCEPTION_SPURIOUS_INTERRUPT      24\r
+#define EXCEPTION_INTERRUPT_AUTOVECTOR    24\r
+#define EXCEPTION_TRAP_BASE               32\r
+\r
+/* Function codes set by CPU during data/address bus activity */\r
+#define FUNCTION_CODE_USER_DATA          1\r
+#define FUNCTION_CODE_USER_PROGRAM       2\r
+#define FUNCTION_CODE_SUPERVISOR_DATA    5\r
+#define FUNCTION_CODE_SUPERVISOR_PROGRAM 6\r
+#define FUNCTION_CODE_CPU_SPACE          7\r
+\r
+/* CPU types for deciding what to emulate */\r
+#define CPU_TYPE_000   1\r
+#define CPU_TYPE_010   2\r
+#define CPU_TYPE_EC020 4\r
+#define CPU_TYPE_020   8\r
+\r
+/* Different ways to stop the CPU */\r
+#define STOP_LEVEL_STOP 1\r
+#define STOP_LEVEL_HALT 2\r
+\r
+#ifndef NULL\r
+#define NULL ((void*)0)\r
+#endif\r
+\r
+/* ======================================================================== */\r
+/* ================================ MACROS ================================ */\r
+/* ======================================================================== */\r
+\r
+\r
+/* ---------------------------- General Macros ---------------------------- */\r
+\r
+/* Bit Isolation Macros */\r
+#define BIT_0(A)  ((A) & 0x00000001)\r
+#define BIT_1(A)  ((A) & 0x00000002)\r
+#define BIT_2(A)  ((A) & 0x00000004)\r
+#define BIT_3(A)  ((A) & 0x00000008)\r
+#define BIT_4(A)  ((A) & 0x00000010)\r
+#define BIT_5(A)  ((A) & 0x00000020)\r
+#define BIT_6(A)  ((A) & 0x00000040)\r
+#define BIT_7(A)  ((A) & 0x00000080)\r
+#define BIT_8(A)  ((A) & 0x00000100)\r
+#define BIT_9(A)  ((A) & 0x00000200)\r
+#define BIT_A(A)  ((A) & 0x00000400)\r
+#define BIT_B(A)  ((A) & 0x00000800)\r
+#define BIT_C(A)  ((A) & 0x00001000)\r
+#define BIT_D(A)  ((A) & 0x00002000)\r
+#define BIT_E(A)  ((A) & 0x00004000)\r
+#define BIT_F(A)  ((A) & 0x00008000)\r
+#define BIT_10(A) ((A) & 0x00010000)\r
+#define BIT_11(A) ((A) & 0x00020000)\r
+#define BIT_12(A) ((A) & 0x00040000)\r
+#define BIT_13(A) ((A) & 0x00080000)\r
+#define BIT_14(A) ((A) & 0x00100000)\r
+#define BIT_15(A) ((A) & 0x00200000)\r
+#define BIT_16(A) ((A) & 0x00400000)\r
+#define BIT_17(A) ((A) & 0x00800000)\r
+#define BIT_18(A) ((A) & 0x01000000)\r
+#define BIT_19(A) ((A) & 0x02000000)\r
+#define BIT_1A(A) ((A) & 0x04000000)\r
+#define BIT_1B(A) ((A) & 0x08000000)\r
+#define BIT_1C(A) ((A) & 0x10000000)\r
+#define BIT_1D(A) ((A) & 0x20000000)\r
+#define BIT_1E(A) ((A) & 0x40000000)\r
+#define BIT_1F(A) ((A) & 0x80000000)\r
+\r
+/* Get the most significant bit for specific sizes */\r
+#define GET_MSB_8(A)  ((A) & 0x80)\r
+#define GET_MSB_9(A)  ((A) & 0x100)\r
+#define GET_MSB_16(A) ((A) & 0x8000)\r
+#define GET_MSB_17(A) ((A) & 0x10000)\r
+#define GET_MSB_32(A) ((A) & 0x80000000)\r
+#if M68K_USE_64_BIT\r
+#define GET_MSB_33(A) ((A) & 0x100000000)\r
+#endif /* M68K_USE_64_BIT */\r
+\r
+/* Isolate nibbles */\r
+#define LOW_NIBBLE(A)  ((A) & 0x0f)\r
+#define HIGH_NIBBLE(A) ((A) & 0xf0)\r
+\r
+/* These are used to isolate 8, 16, and 32 bit sizes */\r
+#define MASK_OUT_ABOVE_2(A)  ((A) & 3)\r
+#define MASK_OUT_ABOVE_8(A)  ((A) & 0xff)\r
+#define MASK_OUT_ABOVE_16(A) ((A) & 0xffff)\r
+#define MASK_OUT_BELOW_2(A)  ((A) & ~3)\r
+#define MASK_OUT_BELOW_8(A)  ((A) & ~0xff)\r
+#define MASK_OUT_BELOW_16(A) ((A) & ~0xffff)\r
+\r
+/* No need to mask if we are 32 bit */\r
+#if M68K_INT_GT_32BIT || M68K_USE_64_BIT\r
+       #define MASK_OUT_ABOVE_32(A) ((A) & 0xffffffff)\r
+       #define MASK_OUT_BELOW_32(A) ((A) & ~0xffffffff)\r
+#else\r
+       #define MASK_OUT_ABOVE_32(A) (A)\r
+       #define MASK_OUT_BELOW_32(A) 0\r
+#endif /* M68K_INT_GT_32BIT || M68K_USE_64_BIT */\r
+\r
+/* Simulate address lines of 68k family */\r
+#define ADDRESS_68K(A) ((A)&CPU_ADDRESS_MASK)\r
+\r
+\r
+/* Shift & Rotate Macros. */\r
+#define LSL(A, C) ((A) << (C))\r
+#define LSR(A, C) ((A) >> (C))\r
+\r
+/* Some > 32-bit optimizations */\r
+#if M68K_INT_GT_32BIT\r
+       /* Shift left and right */\r
+       #define LSR_32(A, C) ((A) >> (C))\r
+       #define LSL_32(A, C) ((A) << (C))\r
+#else\r
+       /* We have to do this because the morons at ANSI decided that shifts\r
+        * by >= data size are undefined.\r
+        */\r
+       #define LSR_32(A, C) ((C) < 32 ? (A) >> (C) : 0)\r
+       #define LSL_32(A, C) ((C) < 32 ? (A) << (C) : 0)\r
+#endif /* M68K_INT_GT_32BIT */\r
+\r
+#if M68K_USE_64_BIT\r
+       #define LSL_32_64(A, C) ((A) << (C))\r
+       #define LSR_32_64(A, C) ((A) >> (C))\r
+       #define ROL_33_64(A, C) (LSL_32_64(A, C) | LSR_32_64(A, 33-(C)))\r
+       #define ROR_33_64(A, C) (LSR_32_64(A, C) | LSL_32_64(A, 33-(C)))\r
+#endif /* M68K_USE_64_BIT */\r
+\r
+#define ROL_8(A, C)      MASK_OUT_ABOVE_8(LSL(A, C) | LSR(A, 8-(C)))\r
+#define ROL_9(A, C)                      (LSL(A, C) | LSR(A, 9-(C)))\r
+#define ROL_16(A, C)    MASK_OUT_ABOVE_16(LSL(A, C) | LSR(A, 16-(C)))\r
+#define ROL_17(A, C)                     (LSL(A, C) | LSR(A, 17-(C)))\r
+#define ROL_32(A, C)    MASK_OUT_ABOVE_32(LSL_32(A, C) | LSR_32(A, 32-(C)))\r
+#define ROL_33(A, C)                     (LSL_32(A, C) | LSR_32(A, 33-(C)))\r
+\r
+#define ROR_8(A, C)      MASK_OUT_ABOVE_8(LSR(A, C) | LSL(A, 8-(C)))\r
+#define ROR_9(A, C)                      (LSR(A, C) | LSL(A, 9-(C)))\r
+#define ROR_16(A, C)    MASK_OUT_ABOVE_16(LSR(A, C) | LSL(A, 16-(C)))\r
+#define ROR_17(A, C)                     (LSR(A, C) | LSL(A, 17-(C)))\r
+#define ROR_32(A, C)    MASK_OUT_ABOVE_32(LSR_32(A, C) | LSL_32(A, 32-(C)))\r
+#define ROR_33(A, C)                     (LSR_32(A, C) | LSL_32(A, 33-(C)))\r
+\r
+\r
+\r
+/* ------------------------------ CPU Access ------------------------------ */\r
+\r
+/* Access the CPU registers */\r
+#define CPU_TYPE         m68ki_cpu.cpu_type\r
+\r
+#define REG_DA           m68ki_cpu.dar /* easy access to data and address regs */\r
+#define REG_D            m68ki_cpu.dar\r
+#define REG_A            (m68ki_cpu.dar+8)\r
+#define REG_PPC                 m68ki_cpu.ppc\r
+#define REG_PC           m68ki_cpu.pc\r
+#define REG_SP_BASE      m68ki_cpu.sp\r
+#define REG_USP          m68ki_cpu.sp[0]\r
+#define REG_ISP          m68ki_cpu.sp[4]\r
+#define REG_MSP          m68ki_cpu.sp[6]\r
+#define REG_SP           m68ki_cpu.dar[15]\r
+#define REG_VBR          m68ki_cpu.vbr\r
+#define REG_SFC          m68ki_cpu.sfc\r
+#define REG_DFC          m68ki_cpu.dfc\r
+#define REG_CACR         m68ki_cpu.cacr\r
+#define REG_CAAR         m68ki_cpu.caar\r
+#define REG_IR           m68ki_cpu.ir\r
+\r
+#define FLAG_T1          m68ki_cpu.t1_flag\r
+#define FLAG_T0          m68ki_cpu.t0_flag\r
+#define FLAG_S           m68ki_cpu.s_flag\r
+#define FLAG_M           m68ki_cpu.m_flag\r
+#define FLAG_X           m68ki_cpu.x_flag\r
+#define FLAG_N           m68ki_cpu.n_flag\r
+#define FLAG_Z           m68ki_cpu.not_z_flag\r
+#define FLAG_V           m68ki_cpu.v_flag\r
+#define FLAG_C           m68ki_cpu.c_flag\r
+#define FLAG_INT_MASK    m68ki_cpu.int_mask\r
+\r
+#define CPU_INT_LEVEL    m68ki_cpu.int_level /* ASG: changed from CPU_INTS_PENDING */\r
+#define CPU_INT_CYCLES   m68ki_cpu.int_cycles /* ASG */\r
+#define CPU_STOPPED      m68ki_cpu.stopped\r
+#define CPU_PREF_ADDR    m68ki_cpu.pref_addr\r
+#define CPU_PREF_DATA    m68ki_cpu.pref_data\r
+#define CPU_ADDRESS_MASK m68ki_cpu.address_mask\r
+#define CPU_SR_MASK      m68ki_cpu.sr_mask\r
+\r
+#define CYC_INSTRUCTION  m68ki_cpu.cyc_instruction\r
+#define CYC_EXCEPTION    m68ki_cpu.cyc_exception\r
+#define CYC_BCC_NOTAKE_B m68ki_cpu.cyc_bcc_notake_b\r
+#define CYC_BCC_NOTAKE_W m68ki_cpu.cyc_bcc_notake_w\r
+#define CYC_DBCC_F_NOEXP m68ki_cpu.cyc_dbcc_f_noexp\r
+#define CYC_DBCC_F_EXP   m68ki_cpu.cyc_dbcc_f_exp\r
+#define CYC_SCC_R_FALSE  m68ki_cpu.cyc_scc_r_false\r
+#define CYC_MOVEM_W      m68ki_cpu.cyc_movem_w\r
+#define CYC_MOVEM_L      m68ki_cpu.cyc_movem_l\r
+#define CYC_SHIFT        m68ki_cpu.cyc_shift\r
+#define CYC_RESET        m68ki_cpu.cyc_reset\r
+\r
+\r
+#define CALLBACK_INT_ACK     m68ki_cpu.int_ack_callback\r
+#define CALLBACK_BKPT_ACK    m68ki_cpu.bkpt_ack_callback\r
+#define CALLBACK_RESET_INSTR m68ki_cpu.reset_instr_callback\r
+#define CALLBACK_PC_CHANGED  m68ki_cpu.pc_changed_callback\r
+#define CALLBACK_SET_FC      m68ki_cpu.set_fc_callback\r
+#define CALLBACK_INSTR_HOOK  m68ki_cpu.instr_hook_callback\r
+\r
+\r
+\r
+/* ----------------------------- Configuration ---------------------------- */\r
+\r
+/* These defines are dependant on the configuration defines in m68kconf.h */\r
+\r
+/* Disable certain comparisons if we're not using all CPU types */\r
+#if M68K_EMULATE_020\r
+       #define CPU_TYPE_IS_020_PLUS(A)    ((A) & CPU_TYPE_020)\r
+       #define CPU_TYPE_IS_020_LESS(A)    1\r
+#else\r
+       #define CPU_TYPE_IS_020_PLUS(A)    0\r
+       #define CPU_TYPE_IS_020_LESS(A)    1\r
+#endif\r
+\r
+#if M68K_EMULATE_EC020\r
+       #define CPU_TYPE_IS_EC020_PLUS(A)  ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))\r
+       #define CPU_TYPE_IS_EC020_LESS(A)  ((A) & (CPU_TYPE_000 | CPU_TYPE_010 | CPU_TYPE_EC020))\r
+#else\r
+       #define CPU_TYPE_IS_EC020_PLUS(A)  CPU_TYPE_IS_020_PLUS(A)\r
+       #define CPU_TYPE_IS_EC020_LESS(A)  CPU_TYPE_IS_020_LESS(A)\r
+#endif\r
+\r
+#if M68K_EMULATE_010\r
+       #define CPU_TYPE_IS_010(A)         ((A) == CPU_TYPE_010)\r
+       #define CPU_TYPE_IS_010_PLUS(A)    ((A) & (CPU_TYPE_010 | CPU_TYPE_EC020 | CPU_TYPE_020))\r
+       #define CPU_TYPE_IS_010_LESS(A)    ((A) & (CPU_TYPE_000 | CPU_TYPE_010))\r
+#else\r
+       #define CPU_TYPE_IS_010(A)         0\r
+       #define CPU_TYPE_IS_010_PLUS(A)    CPU_TYPE_IS_EC020_PLUS(A)\r
+       #define CPU_TYPE_IS_010_LESS(A)    CPU_TYPE_IS_EC020_LESS(A)\r
+#endif\r
+\r
+#if M68K_EMULATE_020 || M68K_EMULATE_EC020\r
+       #define CPU_TYPE_IS_020_VARIANT(A) ((A) & (CPU_TYPE_EC020 | CPU_TYPE_020))\r
+#else\r
+       #define CPU_TYPE_IS_020_VARIANT(A) 0\r
+#endif\r
+\r
+#if M68K_EMULATE_020 || M68K_EMULATE_EC020 || M68K_EMULATE_010\r
+       #define CPU_TYPE_IS_000(A)         ((A) == CPU_TYPE_000)\r
+#else\r
+       #define CPU_TYPE_IS_000(A)         1\r
+#endif\r
+\r
+\r
+#if !M68K_SEPARATE_READS\r
+#define m68k_read_immediate_16(A) m68ki_read_program_16(A)\r
+#define m68k_read_immediate_32(A) m68ki_read_program_32(A)\r
+\r
+#define m68k_read_pcrelative_8(A) m68ki_read_program_8(A)\r
+#define m68k_read_pcrelative_16(A) m68ki_read_program_16(A)\r
+#define m68k_read_pcrelative_32(A) m68ki_read_program_32(A)\r
+#endif /* M68K_SEPARATE_READS */\r
+\r
+\r
+/* Enable or disable callback functions */\r
+#if M68K_EMULATE_INT_ACK\r
+       #if M68K_EMULATE_INT_ACK == OPT_SPECIFY_HANDLER\r
+               #define m68ki_int_ack(A) M68K_INT_ACK_CALLBACK(A)\r
+       #else\r
+               #define m68ki_int_ack(A) CALLBACK_INT_ACK(A)\r
+       #endif\r
+#else\r
+       /* Default action is to used autovector mode, which is most common */\r
+       #define m68ki_int_ack(A) M68K_INT_ACK_AUTOVECTOR\r
+#endif /* M68K_EMULATE_INT_ACK */\r
+\r
+#if M68K_EMULATE_BKPT_ACK\r
+       #if M68K_EMULATE_BKPT_ACK == OPT_SPECIFY_HANDLER\r
+               #define m68ki_bkpt_ack(A) M68K_BKPT_ACK_CALLBACK(A)\r
+       #else\r
+               #define m68ki_bkpt_ack(A) CALLBACK_BKPT_ACK(A)\r
+       #endif\r
+#else\r
+       #define m68ki_bkpt_ack(A)\r
+#endif /* M68K_EMULATE_BKPT_ACK */\r
+\r
+#if M68K_EMULATE_RESET\r
+       #if M68K_EMULATE_RESET == OPT_SPECIFY_HANDLER\r
+               #define m68ki_output_reset() M68K_RESET_CALLBACK()\r
+       #else\r
+               #define m68ki_output_reset() CALLBACK_RESET_INSTR()\r
+       #endif\r
+#else\r
+       #define m68ki_output_reset()\r
+#endif /* M68K_EMULATE_RESET */\r
+\r
+#if M68K_INSTRUCTION_HOOK\r
+       #if M68K_INSTRUCTION_HOOK == OPT_SPECIFY_HANDLER\r
+               #define m68ki_instr_hook() M68K_INSTRUCTION_CALLBACK()\r
+       #else\r
+               #define m68ki_instr_hook() CALLBACK_INSTR_HOOK()\r
+       #endif\r
+#else\r
+       #define m68ki_instr_hook()\r
+#endif /* M68K_INSTRUCTION_HOOK */\r
+\r
+#if M68K_MONITOR_PC\r
+       #if M68K_MONITOR_PC == OPT_SPECIFY_HANDLER\r
+               #define m68ki_pc_changed(A) M68K_SET_PC_CALLBACK(ADDRESS_68K(A))\r
+       #else\r
+               #define m68ki_pc_changed(A) CALLBACK_PC_CHANGED(ADDRESS_68K(A))\r
+       #endif\r
+#else\r
+       #define m68ki_pc_changed(A)\r
+#endif /* M68K_MONITOR_PC */\r
+\r
+\r
+/* Enable or disable function code emulation */\r
+#if M68K_EMULATE_FC\r
+       #if M68K_EMULATE_FC == OPT_SPECIFY_HANDLER\r
+               #define m68ki_set_fc(A) M68K_SET_FC_CALLBACK(A)\r
+       #else\r
+               #define m68ki_set_fc(A) CALLBACK_SET_FC(A)\r
+       #endif\r
+       #define m68ki_use_data_space() m68ki_address_space = FUNCTION_CODE_USER_DATA\r
+       #define m68ki_use_program_space() m68ki_address_space = FUNCTION_CODE_USER_PROGRAM\r
+       #define m68ki_get_address_space() m68ki_address_space\r
+#else\r
+       #define m68ki_set_fc(A)\r
+       #define m68ki_use_data_space()\r
+       #define m68ki_use_program_space()\r
+       #define m68ki_get_address_space() FUNCTION_CODE_USER_DATA\r
+#endif /* M68K_EMULATE_FC */\r
+\r
+\r
+/* Enable or disable trace emulation */\r
+#if M68K_EMULATE_TRACE\r
+       /* Initiates trace checking before each instruction (t1) */\r
+       #define m68ki_trace_t1() m68ki_tracing = FLAG_T1\r
+       /* adds t0 to trace checking if we encounter change of flow */\r
+       #define m68ki_trace_t0() m68ki_tracing |= FLAG_T0\r
+       /* Clear all tracing */\r
+       #define m68ki_clear_trace() m68ki_tracing = 0\r
+       /* Cause a trace exception if we are tracing */\r
+       #define m68ki_exception_if_trace() if(m68ki_tracing) m68ki_exception_trace()\r
+#else\r
+       #define m68ki_trace_t1()\r
+       #define m68ki_trace_t0()\r
+       #define m68ki_clear_trace()\r
+       #define m68ki_exception_if_trace()\r
+#endif /* M68K_EMULATE_TRACE */\r
+\r
+\r
+\r
+/* Address error */\r
+#if M68K_EMULATE_ADDRESS_ERROR\r
+       extern jmp_buf m68ki_address_error_trap;\r
+       #define m68ki_set_address_error_trap() if(setjmp(m68ki_address_error_trap)) m68ki_exception_address_error();\r
+       #define m68ki_check_address_error(A) if((A)&1) longjmp(m68ki_address_error_jump, 1);\r
+#else\r
+       #define m68ki_set_address_error_trap()\r
+       #define m68ki_check_address_error(A)\r
+#endif /* M68K_ADDRESS_ERROR */\r
+\r
+/* Logging */\r
+#if M68K_LOG_ENABLE\r
+       #include <stdio.h>\r
+       extern FILE* M68K_LOG_FILEHANDLE\r
+       extern char* m68ki_cpu_names[];\r
+\r
+       #define M68K_DO_LOG(A) if(M68K_LOG_FILEHANDLE) fprintf A\r
+       #if M68K_LOG_1010_1111\r
+               #define M68K_DO_LOG_EMU(A) if(M68K_LOG_FILEHANDLE) fprintf A\r
+       #else\r
+               #define M68K_DO_LOG_EMU(A)\r
+       #endif\r
+#else\r
+       #define M68K_DO_LOG(A)\r
+       #define M68K_DO_LOG_EMU(A)\r
+#endif\r
+\r
+\r
+\r
+/* -------------------------- EA / Operand Access ------------------------- */\r
+\r
+/*\r
+ * The general instruction format follows this pattern:\r
+ * .... XXX. .... .YYY\r
+ * where XXX is register X and YYY is register Y\r
+ */\r
+/* Data Register Isolation */\r
+#define DX (REG_D[(REG_IR >> 9) & 7])\r
+#define DY (REG_D[REG_IR & 7])\r
+/* Address Register Isolation */\r
+#define AX (REG_A[(REG_IR >> 9) & 7])\r
+#define AY (REG_A[REG_IR & 7])\r
+\r
+\r
+/* Effective Address Calculations */\r
+#define EA_AY_AI_8()   AY                                    /* address register indirect */\r
+#define EA_AY_AI_16()  EA_AY_AI_8()\r
+#define EA_AY_AI_32()  EA_AY_AI_8()\r
+#define EA_AY_PI_8()   (AY++)                                /* postincrement (size = byte) */\r
+#define EA_AY_PI_16()  ((AY+=2)-2)                           /* postincrement (size = word) */\r
+#define EA_AY_PI_32()  ((AY+=4)-4)                           /* postincrement (size = long) */\r
+#define EA_AY_PD_8()   (--AY)                                /* predecrement (size = byte) */\r
+#define EA_AY_PD_16()  (AY-=2)                               /* predecrement (size = word) */\r
+#define EA_AY_PD_32()  (AY-=4)                               /* predecrement (size = long) */\r
+#define EA_AY_DI_8()   (AY+MAKE_INT_16(m68ki_read_imm_16())) /* displacement */\r
+#define EA_AY_DI_16()  EA_AY_DI_8()\r
+#define EA_AY_DI_32()  EA_AY_DI_8()\r
+#define EA_AY_IX_8()   m68ki_get_ea_ix(AY)                   /* indirect + index */\r
+#define EA_AY_IX_16()  EA_AY_IX_8()\r
+#define EA_AY_IX_32()  EA_AY_IX_8()\r
+\r
+#define EA_AX_AI_8()   AX\r
+#define EA_AX_AI_16()  EA_AX_AI_8()\r
+#define EA_AX_AI_32()  EA_AX_AI_8()\r
+#define EA_AX_PI_8()   (AX++)\r
+#define EA_AX_PI_16()  ((AX+=2)-2)\r
+#define EA_AX_PI_32()  ((AX+=4)-4)\r
+#define EA_AX_PD_8()   (--AX)\r
+#define EA_AX_PD_16()  (AX-=2)\r
+#define EA_AX_PD_32()  (AX-=4)\r
+#define EA_AX_DI_8()   (AX+MAKE_INT_16(m68ki_read_imm_16()))\r
+#define EA_AX_DI_16()  EA_AX_DI_8()\r
+#define EA_AX_DI_32()  EA_AX_DI_8()\r
+#define EA_AX_IX_8()   m68ki_get_ea_ix(AX)\r
+#define EA_AX_IX_16()  EA_AX_IX_8()\r
+#define EA_AX_IX_32()  EA_AX_IX_8()\r
+\r
+#define EA_A7_PI_8()   ((REG_A[7]+=2)-2)\r
+#define EA_A7_PD_8()   (REG_A[7]-=2)\r
+\r
+#define EA_AW_8()      MAKE_INT_16(m68ki_read_imm_16())      /* absolute word */\r
+#define EA_AW_16()     EA_AW_8()\r
+#define EA_AW_32()     EA_AW_8()\r
+#define EA_AL_8()      m68ki_read_imm_32()                   /* absolute long */\r
+#define EA_AL_16()     EA_AL_8()\r
+#define EA_AL_32()     EA_AL_8()\r
+#define EA_PCDI_8()    m68ki_get_ea_pcdi()                   /* pc indirect + displacement */\r
+#define EA_PCDI_16()   EA_PCDI_8()\r
+#define EA_PCDI_32()   EA_PCDI_8()\r
+#define EA_PCIX_8()    m68ki_get_ea_pcix()                   /* pc indirect + index */\r
+#define EA_PCIX_16()   EA_PCIX_8()\r
+#define EA_PCIX_32()   EA_PCIX_8()\r
+\r
+\r
+#define OPER_I_8()     m68ki_read_imm_8()\r
+#define OPER_I_16()    m68ki_read_imm_16()\r
+#define OPER_I_32()    m68ki_read_imm_32()\r
+\r
+\r
+\r
+/* --------------------------- Status Register ---------------------------- */\r
+\r
+/* Flag Calculation Macros */\r
+#define CFLAG_8(A) (A)\r
+#define CFLAG_16(A) ((A)>>8)\r
+\r
+#if M68K_INT_GT_32_BIT\r
+       #define CFLAG_ADD_32(S, D, R) ((R)>>24)\r
+       #define CFLAG_SUB_32(S, D, R) ((R)>>24)\r
+#else\r
+       #define CFLAG_ADD_32(S, D, R) (((S & D) | (~R & (S | D)))>>23)\r
+       #define CFLAG_SUB_32(S, D, R) (((S & R) | (~D & (S | R)))>>23)\r
+#endif /* M68K_INT_GT_32_BIT */\r
+\r
+#define VFLAG_ADD_8(S, D, R) ((S^R) & (D^R))\r
+#define VFLAG_ADD_16(S, D, R) (((S^R) & (D^R))>>8)\r
+#define VFLAG_ADD_32(S, D, R) (((S^R) & (D^R))>>24)\r
+\r
+#define VFLAG_SUB_8(S, D, R) ((S^D) & (R^D))\r
+#define VFLAG_SUB_16(S, D, R) (((S^D) & (R^D))>>8)\r
+#define VFLAG_SUB_32(S, D, R) (((S^D) & (R^D))>>24)\r
+\r
+#define NFLAG_8(A) (A)\r
+#define NFLAG_16(A) ((A)>>8)\r
+#define NFLAG_32(A) ((A)>>24)\r
+#define NFLAG_64(A) ((A)>>56)\r
+\r
+#define ZFLAG_8(A) MASK_OUT_ABOVE_8(A)\r
+#define ZFLAG_16(A) MASK_OUT_ABOVE_16(A)\r
+#define ZFLAG_32(A) MASK_OUT_ABOVE_32(A)\r
+\r
+\r
+/* Flag values */\r
+#define NFLAG_SET   0x80\r
+#define NFLAG_CLEAR 0\r
+#define CFLAG_SET   0x100\r
+#define CFLAG_CLEAR 0\r
+#define XFLAG_SET   0x100\r
+#define XFLAG_CLEAR 0\r
+#define VFLAG_SET   0x80\r
+#define VFLAG_CLEAR 0\r
+#define ZFLAG_SET   0\r
+#define ZFLAG_CLEAR 0xffffffff\r
+\r
+#define SFLAG_SET   4\r
+#define SFLAG_CLEAR 0\r
+#define MFLAG_SET   2\r
+#define MFLAG_CLEAR 0\r
+\r
+/* Turn flag values into 1 or 0 */\r
+#define XFLAG_AS_1() ((FLAG_X>>8)&1)\r
+#define NFLAG_AS_1() ((FLAG_N>>7)&1)\r
+#define VFLAG_AS_1() ((FLAG_V>>7)&1)\r
+#define ZFLAG_AS_1() (!FLAG_Z)\r
+#define CFLAG_AS_1() ((FLAG_C>>8)&1)\r
+\r
+\r
+/* Conditions */\r
+#define COND_CS() (FLAG_C&0x100)\r
+#define COND_CC() (!COND_CS())\r
+#define COND_VS() (FLAG_V&0x80)\r
+#define COND_VC() (!COND_VS())\r
+#define COND_NE() FLAG_Z\r
+#define COND_EQ() (!COND_NE())\r
+#define COND_MI() (FLAG_N&0x80)\r
+#define COND_PL() (!COND_MI())\r
+#define COND_LT() ((FLAG_N^FLAG_V)&0x80)\r
+#define COND_GE() (!COND_LT())\r
+#define COND_HI() (COND_CC() && COND_NE())\r
+#define COND_LS() (COND_CS() || COND_EQ())\r
+#define COND_GT() (COND_GE() && COND_NE())\r
+#define COND_LE() (COND_LT() || COND_EQ())\r
+\r
+/* Reversed conditions */\r
+#define COND_NOT_CS() COND_CC()\r
+#define COND_NOT_CC() COND_CS()\r
+#define COND_NOT_VS() COND_VC()\r
+#define COND_NOT_VC() COND_VS()\r
+#define COND_NOT_NE() COND_EQ()\r
+#define COND_NOT_EQ() COND_NE()\r
+#define COND_NOT_MI() COND_PL()\r
+#define COND_NOT_PL() COND_MI()\r
+#define COND_NOT_LT() COND_GE()\r
+#define COND_NOT_GE() COND_LT()\r
+#define COND_NOT_HI() COND_LS()\r
+#define COND_NOT_LS() COND_HI()\r
+#define COND_NOT_GT() COND_LE()\r
+#define COND_NOT_LE() COND_GT()\r
+\r
+/* Not real conditions, but here for convenience */\r
+#define COND_XS() (FLAG_X&0x100)\r
+#define COND_XC() (!COND_XS)\r
+\r
+\r
+/* Get the condition code register */\r
+#define m68ki_get_ccr() ((COND_XS() >> 4) | \\r
+                                                (COND_MI() >> 4) | \\r
+                                                (COND_EQ() << 2) | \\r
+                                                (COND_VS() >> 6) | \\r
+                                                (COND_CS() >> 8))\r
+\r
+/* Get the status register */\r
+#define m68ki_get_sr() ( FLAG_T1              | \\r
+                                                FLAG_T0              | \\r
+                                               (FLAG_S        << 11) | \\r
+                                               (FLAG_M        << 11) | \\r
+                                                FLAG_INT_MASK        | \\r
+                                                m68ki_get_ccr())\r
+\r
+\r
+\r
+/* ---------------------------- Cycle Counting ---------------------------- */\r
+\r
+#define ADD_CYCLES(A)    m68ki_remaining_cycles += (A)\r
+#define USE_CYCLES(A)    m68ki_remaining_cycles -= (A)\r
+#define SET_CYCLES(A)    m68ki_remaining_cycles = A\r
+#define GET_CYCLES()     m68ki_remaining_cycles\r
+#define USE_ALL_CYCLES() m68ki_remaining_cycles = 0\r
+\r
+\r
+\r
+/* ----------------------------- Read / Write ----------------------------- */\r
+\r
+/* Read from the current address space */\r
+#define m68ki_read_8(A)  m68ki_read_8_fc (A, FLAG_S | m68ki_get_address_space())\r
+#define m68ki_read_16(A) m68ki_read_16_fc(A, FLAG_S | m68ki_get_address_space())\r
+#define m68ki_read_32(A) m68ki_read_32_fc(A, FLAG_S | m68ki_get_address_space())\r
+\r
+/* Write to the current data space */\r
+#define m68ki_write_8(A, V)  m68ki_write_8_fc (A, FLAG_S | FUNCTION_CODE_USER_DATA, V)\r
+#define m68ki_write_16(A, V) m68ki_write_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)\r
+#define m68ki_write_32(A, V) m68ki_write_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA, V)\r
+\r
+/* map read immediate 8 to read immediate 16 */\r
+#define m68ki_read_imm_8() MASK_OUT_ABOVE_8(m68ki_read_imm_16())\r
+\r
+/* Map PC-relative reads */\r
+#define m68ki_read_pcrel_8(A) m68k_read_pcrelative_8(A)\r
+#define m68ki_read_pcrel_16(A) m68k_read_pcrelative_16(A)\r
+#define m68ki_read_pcrel_32(A) m68k_read_pcrelative_32(A)\r
+\r
+/* Read from the program space */\r
+#define m68ki_read_program_8(A)        m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)\r
+#define m68ki_read_program_16(A)       m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)\r
+#define m68ki_read_program_32(A)       m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_PROGRAM)\r
+\r
+/* Read from the data space */\r
+#define m68ki_read_data_8(A)   m68ki_read_8_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)\r
+#define m68ki_read_data_16(A)  m68ki_read_16_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)\r
+#define m68ki_read_data_32(A)  m68ki_read_32_fc(A, FLAG_S | FUNCTION_CODE_USER_DATA)\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* =============================== PROTOTYPES ============================= */\r
+/* ======================================================================== */\r
+\r
+typedef struct\r
+{\r
+       uint cpu_type;     /* CPU Type: 68000, 68010, 68EC020, or 68020 */\r
+       uint dar[16];      /* Data and Address Registers */\r
+       uint ppc;                  /* Previous program counter */\r
+       uint pc;           /* Program Counter */\r
+       uint sp[7];        /* User, Interrupt, and Master Stack Pointers */\r
+       uint vbr;          /* Vector Base Register (m68010+) */\r
+       uint sfc;          /* Source Function Code Register (m68010+) */\r
+       uint dfc;          /* Destination Function Code Register (m68010+) */\r
+       uint cacr;         /* Cache Control Register (m68020, unemulated) */\r
+       uint caar;         /* Cache Address Register (m68020, unemulated) */\r
+       uint ir;           /* Instruction Register */\r
+       uint t1_flag;      /* Trace 1 */\r
+       uint t0_flag;      /* Trace 0 */\r
+       uint s_flag;       /* Supervisor */\r
+       uint m_flag;       /* Master/Interrupt state */\r
+       uint x_flag;       /* Extend */\r
+       uint n_flag;       /* Negative */\r
+       uint not_z_flag;   /* Zero, inverted for speedups */\r
+       uint v_flag;       /* Overflow */\r
+       uint c_flag;       /* Carry */\r
+       uint int_mask;     /* I0-I2 */\r
+       uint int_level;    /* State of interrupt pins IPL0-IPL2 -- ASG: changed from ints_pending */\r
+       uint int_cycles;   /* ASG: extra cycles from generated interrupts */\r
+       uint stopped;      /* Stopped state */\r
+       uint pref_addr;    /* Last prefetch address */\r
+       uint pref_data;    /* Data in the prefetch queue */\r
+       uint address_mask; /* Available address pins */\r
+       uint sr_mask;      /* Implemented status register bits */\r
+\r
+       /* Clocks required for instructions / exceptions */\r
+       uint cyc_bcc_notake_b;\r
+       uint cyc_bcc_notake_w;\r
+       uint cyc_dbcc_f_noexp;\r
+       uint cyc_dbcc_f_exp;\r
+       uint cyc_scc_r_false;\r
+       uint cyc_movem_w;\r
+       uint cyc_movem_l;\r
+       uint cyc_shift;\r
+       uint cyc_reset;\r
+       uint8* cyc_instruction;\r
+       uint8* cyc_exception;\r
+\r
+       /* Callbacks to host */\r
+       int  (*int_ack_callback)(int int_line);           /* Interrupt Acknowledge */\r
+       void (*bkpt_ack_callback)(unsigned int data);     /* Breakpoint Acknowledge */\r
+       void (*reset_instr_callback)(void);               /* Called when a RESET instruction is encountered */\r
+       void (*pc_changed_callback)(unsigned int new_pc); /* Called when the PC changes by a large amount */\r
+       void (*set_fc_callback)(unsigned int new_fc);     /* Called when the CPU function code changes */\r
+       void (*instr_hook_callback)(void);                /* Called every instruction cycle prior to execution */\r
+\r
+} m68ki_cpu_core;\r
+\r
+\r
+extern m68ki_cpu_core m68ki_cpu;\r
+extern sint           m68ki_remaining_cycles;\r
+extern uint           m68ki_tracing;\r
+extern uint8          m68ki_shift_8_table[];\r
+extern uint16         m68ki_shift_16_table[];\r
+extern uint           m68ki_shift_32_table[];\r
+extern uint8          m68ki_exception_cycle_table[][256];\r
+extern uint           m68ki_address_space;\r
+extern uint8          m68ki_ea_idx_cycle_table[];\r
+\r
+\r
+/* Read data immediately after the program counter */\r
+INLINE uint m68ki_read_imm_16(void);\r
+INLINE uint m68ki_read_imm_32(void);\r
+\r
+/* Read data with specific function code */\r
+INLINE uint m68ki_read_8_fc  (uint address, uint fc);\r
+INLINE uint m68ki_read_16_fc (uint address, uint fc);\r
+INLINE uint m68ki_read_32_fc (uint address, uint fc);\r
+\r
+/* Write data with specific function code */\r
+INLINE void m68ki_write_8_fc (uint address, uint fc, uint value);\r
+INLINE void m68ki_write_16_fc(uint address, uint fc, uint value);\r
+INLINE void m68ki_write_32_fc(uint address, uint fc, uint value);\r
+\r
+/* Indexed and PC-relative ea fetching */\r
+INLINE uint m68ki_get_ea_pcdi(void);\r
+INLINE uint m68ki_get_ea_pcix(void);\r
+INLINE uint m68ki_get_ea_ix(uint An);\r
+\r
+/* Operand fetching */\r
+INLINE uint OPER_AY_AI_8(void);\r
+INLINE uint OPER_AY_AI_16(void);\r
+INLINE uint OPER_AY_AI_32(void);\r
+INLINE uint OPER_AY_PI_8(void);\r
+INLINE uint OPER_AY_PI_16(void);\r
+INLINE uint OPER_AY_PI_32(void);\r
+INLINE uint OPER_AY_PD_8(void);\r
+INLINE uint OPER_AY_PD_16(void);\r
+INLINE uint OPER_AY_PD_32(void);\r
+INLINE uint OPER_AY_DI_8(void);\r
+INLINE uint OPER_AY_DI_16(void);\r
+INLINE uint OPER_AY_DI_32(void);\r
+INLINE uint OPER_AY_IX_8(void);\r
+INLINE uint OPER_AY_IX_16(void);\r
+INLINE uint OPER_AY_IX_32(void);\r
+\r
+INLINE uint OPER_AX_AI_8(void);\r
+INLINE uint OPER_AX_AI_16(void);\r
+INLINE uint OPER_AX_AI_32(void);\r
+INLINE uint OPER_AX_PI_8(void);\r
+INLINE uint OPER_AX_PI_16(void);\r
+INLINE uint OPER_AX_PI_32(void);\r
+INLINE uint OPER_AX_PD_8(void);\r
+INLINE uint OPER_AX_PD_16(void);\r
+INLINE uint OPER_AX_PD_32(void);\r
+INLINE uint OPER_AX_DI_8(void);\r
+INLINE uint OPER_AX_DI_16(void);\r
+INLINE uint OPER_AX_DI_32(void);\r
+INLINE uint OPER_AX_IX_8(void);\r
+INLINE uint OPER_AX_IX_16(void);\r
+INLINE uint OPER_AX_IX_32(void);\r
+\r
+INLINE uint OPER_A7_PI_8(void);\r
+INLINE uint OPER_A7_PD_8(void);\r
+\r
+INLINE uint OPER_AW_8(void);\r
+INLINE uint OPER_AW_16(void);\r
+INLINE uint OPER_AW_32(void);\r
+INLINE uint OPER_AL_8(void);\r
+INLINE uint OPER_AL_16(void);\r
+INLINE uint OPER_AL_32(void);\r
+INLINE uint OPER_PCDI_8(void);\r
+INLINE uint OPER_PCDI_16(void);\r
+INLINE uint OPER_PCDI_32(void);\r
+INLINE uint OPER_PCIX_8(void);\r
+INLINE uint OPER_PCIX_16(void);\r
+INLINE uint OPER_PCIX_32(void);\r
+\r
+/* Stack operations */\r
+INLINE void m68ki_push_16(uint value);\r
+INLINE void m68ki_push_32(uint value);\r
+INLINE uint m68ki_pull_16(void);\r
+INLINE uint m68ki_pull_32(void);\r
+\r
+/* Program flow operations */\r
+INLINE void m68ki_jump(uint new_pc);\r
+INLINE void m68ki_jump_vector(uint vector);\r
+INLINE void m68ki_branch_8(uint offset);\r
+INLINE void m68ki_branch_16(uint offset);\r
+INLINE void m68ki_branch_32(uint offset);\r
+\r
+/* Status register operations. */\r
+INLINE void m68ki_set_s_flag(uint value);            /* Only bit 2 of value should be set (i.e. 4 or 0) */\r
+INLINE void m68ki_set_sm_flag(uint value);           /* only bits 1 and 2 of value should be set */\r
+INLINE void m68ki_set_ccr(uint value);               /* set the condition code register */\r
+INLINE void m68ki_set_sr(uint value);                /* set the status register */\r
+INLINE void m68ki_set_sr_noint(uint value);          /* set the status register */\r
+\r
+/* Exception processing */\r
+INLINE uint m68ki_init_exception(void);              /* Initial exception processing */\r
+\r
+INLINE void m68ki_stack_frame_3word(uint pc, uint sr); /* Stack various frame types */\r
+INLINE void m68ki_stack_frame_buserr(uint pc, uint sr, uint address, uint write, uint instruction, uint fc);\r
+\r
+INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector);\r
+INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector);\r
+INLINE void m68ki_stack_frame_0010(uint sr, uint vector);\r
+INLINE void m68ki_stack_frame_1000(uint pc, uint sr, uint vector);\r
+INLINE void m68ki_stack_frame_1010(uint sr, uint vector, uint pc);\r
+INLINE void m68ki_stack_frame_1011(uint sr, uint vector, uint pc);\r
+\r
+INLINE void m68ki_exception_trap(uint vector);\r
+INLINE void m68ki_exception_trapN(uint vector);\r
+INLINE void m68ki_exception_trace(void);\r
+INLINE void m68ki_exception_privilege_violation(void);\r
+INLINE void m68ki_exception_1010(void);\r
+INLINE void m68ki_exception_1111(void);\r
+INLINE void m68ki_exception_illegal(void);\r
+INLINE void m68ki_exception_format_error(void);\r
+INLINE void m68ki_exception_address_error(void);\r
+INLINE void m68ki_exception_interrupt(uint int_level);\r
+INLINE void m68ki_check_interrupts(void);            /* ASG: check for interrupts */\r
+\r
+/* quick disassembly (used for logging) */\r
+char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type);\r
+\r
+\r
+/* ======================================================================== */\r
+/* =========================== UTILITY FUNCTIONS ========================== */\r
+/* ======================================================================== */\r
+\r
+\r
+/* ---------------------------- Read Immediate ---------------------------- */\r
+\r
+/* Handles all immediate reads, does address error check, function code setting,\r
+ * and prefetching if they are enabled in m68kconf.h\r
+ */\r
+INLINE uint m68ki_read_imm_16(void)\r
+{\r
+       m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */\r
+#if M68K_EMULATE_PREFETCH\r
+       if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)\r
+       {\r
+               CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);\r
+               CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));\r
+       }\r
+       REG_PC += 2;\r
+       return MASK_OUT_ABOVE_16(CPU_PREF_DATA >> ((2-((REG_PC-2)&2))<<3));\r
+#else\r
+       REG_PC += 2;\r
+       return m68k_read_immediate_16(ADDRESS_68K(REG_PC-2));\r
+#endif /* M68K_EMULATE_PREFETCH */\r
+}\r
+INLINE uint m68ki_read_imm_32(void)\r
+{\r
+#if M68K_EMULATE_PREFETCH\r
+       uint temp_val;\r
+\r
+       m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */\r
+       if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)\r
+       {\r
+               CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);\r
+               CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));\r
+       }\r
+       temp_val = CPU_PREF_DATA;\r
+       REG_PC += 2;\r
+       if(MASK_OUT_BELOW_2(REG_PC) != CPU_PREF_ADDR)\r
+       {\r
+               CPU_PREF_ADDR = MASK_OUT_BELOW_2(REG_PC);\r
+               CPU_PREF_DATA = m68k_read_immediate_32(ADDRESS_68K(CPU_PREF_ADDR));\r
+               temp_val = MASK_OUT_ABOVE_32((temp_val << 16) | (CPU_PREF_DATA >> 16));\r
+       }\r
+       REG_PC += 2;\r
+\r
+       return temp_val;\r
+#else\r
+       m68ki_set_fc(FLAG_S | FUNCTION_CODE_USER_PROGRAM); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(REG_PC); /* auto-disable (see m68kcpu.h) */\r
+       REG_PC += 4;\r
+       return m68k_read_immediate_32(ADDRESS_68K(REG_PC-4));\r
+#endif /* M68K_EMULATE_PREFETCH */\r
+}\r
+\r
+\r
+\r
+/* ------------------------- Top level read/write ------------------------- */\r
+\r
+/* Handles all memory accesses (except for immediate reads if they are\r
+ * configured to use separate functions in m68kconf.h).\r
+ * All memory accesses must go through these top level functions.\r
+ * These functions will also check for address error and set the function\r
+ * code if they are enabled in m68kconf.h.\r
+ */\r
+INLINE uint m68ki_read_8_fc(uint address, uint fc)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       return m68k_read_memory_8(ADDRESS_68K(address));\r
+}\r
+INLINE uint m68ki_read_16_fc(uint address, uint fc)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */\r
+       return m68k_read_memory_16(ADDRESS_68K(address));\r
+}\r
+INLINE uint m68ki_read_32_fc(uint address, uint fc)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */\r
+       return m68k_read_memory_32(ADDRESS_68K(address));\r
+}\r
+\r
+INLINE void m68ki_write_8_fc(uint address, uint fc, uint value)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       m68k_write_memory_8(ADDRESS_68K(address), value);\r
+}\r
+INLINE void m68ki_write_16_fc(uint address, uint fc, uint value)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */\r
+       m68k_write_memory_16(ADDRESS_68K(address), value);\r
+}\r
+INLINE void m68ki_write_32_fc(uint address, uint fc, uint value)\r
+{\r
+       m68ki_set_fc(fc); /* auto-disable (see m68kcpu.h) */\r
+       m68ki_check_address_error(address); /* auto-disable (see m68kcpu.h) */\r
+       m68k_write_memory_32(ADDRESS_68K(address), value);\r
+}\r
+\r
+\r
+\r
+/* --------------------- Effective Address Calculation -------------------- */\r
+\r
+/* The program counter relative addressing modes cause operands to be\r
+ * retrieved from program space, not data space.\r
+ */\r
+INLINE uint m68ki_get_ea_pcdi(void)\r
+{\r
+       uint old_pc = REG_PC;\r
+       m68ki_use_program_space(); /* auto-disable */\r
+       return old_pc + MAKE_INT_16(m68ki_read_imm_16());\r
+}\r
+\r
+\r
+INLINE uint m68ki_get_ea_pcix(void)\r
+{\r
+       m68ki_use_program_space(); /* auto-disable */\r
+       return m68ki_get_ea_ix(REG_PC);\r
+}\r
+\r
+/* Indexed addressing modes are encoded as follows:\r
+ *\r
+ * Base instruction format:\r
+ * F E D C B A 9 8 7 6 | 5 4 3 | 2 1 0\r
+ * x x x x x x x x x x | 1 1 0 | BASE REGISTER      (An)\r
+ *\r
+ * Base instruction format for destination EA in move instructions:\r
+ * F E D C | B A 9    | 8 7 6 | 5 4 3 2 1 0\r
+ * x x x x | BASE REG | 1 1 0 | X X X X X X       (An)\r
+ *\r
+ * Brief extension format:\r
+ *  F  |  E D C   |  B  |  A 9  | 8 | 7 6 5 4 3 2 1 0\r
+ * D/A | REGISTER | W/L | SCALE | 0 |  DISPLACEMENT\r
+ *\r
+ * Full extension format:\r
+ *  F     E D C      B     A 9    8   7    6    5 4       3   2 1 0\r
+ * D/A | REGISTER | W/L | SCALE | 1 | BS | IS | BD SIZE | 0 | I/IS\r
+ * BASE DISPLACEMENT (0, 16, 32 bit)                (bd)\r
+ * OUTER DISPLACEMENT (0, 16, 32 bit)               (od)\r
+ *\r
+ * D/A:     0 = Dn, 1 = An                          (Xn)\r
+ * W/L:     0 = W (sign extend), 1 = L              (.SIZE)\r
+ * SCALE:   00=1, 01=2, 10=4, 11=8                  (*SCALE)\r
+ * BS:      0=add base reg, 1=suppress base reg     (An suppressed)\r
+ * IS:      0=add index, 1=suppress index           (Xn suppressed)\r
+ * BD SIZE: 00=reserved, 01=NULL, 10=Word, 11=Long  (size of bd)\r
+ *\r
+ * IS I/IS Operation\r
+ * 0  000  No Memory Indirect\r
+ * 0  001  indir prex with null outer\r
+ * 0  010  indir prex with word outer\r
+ * 0  011  indir prex with long outer\r
+ * 0  100  reserved\r
+ * 0  101  indir postx with null outer\r
+ * 0  110  indir postx with word outer\r
+ * 0  111  indir postx with long outer\r
+ * 1  000  no memory indirect\r
+ * 1  001  mem indir with null outer\r
+ * 1  010  mem indir with word outer\r
+ * 1  011  mem indir with long outer\r
+ * 1  100-111  reserved\r
+ */\r
+INLINE uint m68ki_get_ea_ix(uint An)\r
+{\r
+       /* An = base register */\r
+       uint extension = m68ki_read_imm_16();\r
+       uint Xn = 0;                        /* Index register */\r
+       uint bd = 0;                        /* Base Displacement */\r
+       uint od = 0;                        /* Outer Displacement */\r
+\r
+       if(CPU_TYPE_IS_010_LESS(CPU_TYPE))\r
+       {\r
+               /* Calculate index */\r
+               Xn = REG_DA[extension>>12];     /* Xn */\r
+               if(!BIT_B(extension))           /* W/L */\r
+                       Xn = MAKE_INT_16(Xn);\r
+\r
+               /* Add base register and displacement and return */\r
+               return An + Xn + MAKE_INT_8(extension);\r
+       }\r
+\r
+       /* Brief extension format */\r
+       if(!BIT_8(extension))\r
+       {\r
+               /* Calculate index */\r
+               Xn = REG_DA[extension>>12];     /* Xn */\r
+               if(!BIT_B(extension))           /* W/L */\r
+                       Xn = MAKE_INT_16(Xn);\r
+               /* Add scale if proper CPU type */\r
+               if(CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+                       Xn <<= (extension>>9) & 3;  /* SCALE */\r
+\r
+               /* Add base register and displacement and return */\r
+               return An + Xn + MAKE_INT_8(extension);\r
+       }\r
+\r
+       /* Full extension format */\r
+\r
+       USE_CYCLES(m68ki_ea_idx_cycle_table[extension&0x3f]);\r
+\r
+       /* Check if base register is present */\r
+       if(BIT_7(extension))                /* BS */\r
+               An = 0;                         /* An */\r
+\r
+       /* Check if index is present */\r
+       if(!BIT_6(extension))               /* IS */\r
+       {\r
+               Xn = REG_DA[extension>>12];     /* Xn */\r
+               if(!BIT_B(extension))           /* W/L */\r
+                       Xn = MAKE_INT_16(Xn);\r
+               Xn <<= (extension>>9) & 3;      /* SCALE */\r
+       }\r
+\r
+       /* Check if base displacement is present */\r
+       if(BIT_5(extension))                /* BD SIZE */\r
+               bd = BIT_4(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16());\r
+\r
+       /* If no indirect action, we are done */\r
+       if(!(extension&7))                  /* No Memory Indirect */\r
+               return An + bd + Xn;\r
+\r
+       /* Check if outer displacement is present */\r
+       if(BIT_1(extension))                /* I/IS:  od */\r
+               od = BIT_0(extension) ? m68ki_read_imm_32() : MAKE_INT_16(m68ki_read_imm_16());\r
+\r
+       /* Postindex */\r
+       if(BIT_2(extension))                /* I/IS:  0 = preindex, 1 = postindex */\r
+               return m68ki_read_32(An + bd) + Xn + od;\r
+\r
+       /* Preindex */\r
+       return m68ki_read_32(An + bd + Xn) + od;\r
+}\r
+\r
+\r
+/* Fetch operands */\r
+INLINE uint OPER_AY_AI_8(void)  {uint ea = EA_AY_AI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AY_AI_16(void) {uint ea = EA_AY_AI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AY_AI_32(void) {uint ea = EA_AY_AI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AY_PI_8(void)  {uint ea = EA_AY_PI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AY_PI_16(void) {uint ea = EA_AY_PI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AY_PI_32(void) {uint ea = EA_AY_PI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AY_PD_8(void)  {uint ea = EA_AY_PD_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AY_PD_16(void) {uint ea = EA_AY_PD_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AY_PD_32(void) {uint ea = EA_AY_PD_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AY_DI_8(void)  {uint ea = EA_AY_DI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AY_DI_16(void) {uint ea = EA_AY_DI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AY_DI_32(void) {uint ea = EA_AY_DI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AY_IX_8(void)  {uint ea = EA_AY_IX_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AY_IX_16(void) {uint ea = EA_AY_IX_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AY_IX_32(void) {uint ea = EA_AY_IX_32(); return m68ki_read_32(ea);}\r
+\r
+INLINE uint OPER_AX_AI_8(void)  {uint ea = EA_AX_AI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AX_AI_16(void) {uint ea = EA_AX_AI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AX_AI_32(void) {uint ea = EA_AX_AI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AX_PI_8(void)  {uint ea = EA_AX_PI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AX_PI_16(void) {uint ea = EA_AX_PI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AX_PI_32(void) {uint ea = EA_AX_PI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AX_PD_8(void)  {uint ea = EA_AX_PD_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AX_PD_16(void) {uint ea = EA_AX_PD_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AX_PD_32(void) {uint ea = EA_AX_PD_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AX_DI_8(void)  {uint ea = EA_AX_DI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AX_DI_16(void) {uint ea = EA_AX_DI_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AX_DI_32(void) {uint ea = EA_AX_DI_32(); return m68ki_read_32(ea);}\r
+INLINE uint OPER_AX_IX_8(void)  {uint ea = EA_AX_IX_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_AX_IX_16(void) {uint ea = EA_AX_IX_16(); return m68ki_read_16(ea);}\r
+INLINE uint OPER_AX_IX_32(void) {uint ea = EA_AX_IX_32(); return m68ki_read_32(ea);}\r
+\r
+INLINE uint OPER_A7_PI_8(void)  {uint ea = EA_A7_PI_8();  return m68ki_read_8(ea); }\r
+INLINE uint OPER_A7_PD_8(void)  {uint ea = EA_A7_PD_8();  return m68ki_read_8(ea); }\r
+\r
+INLINE uint OPER_AW_8(void)     {uint ea = EA_AW_8();     return m68ki_read_8(ea); }\r
+INLINE uint OPER_AW_16(void)    {uint ea = EA_AW_16();    return m68ki_read_16(ea);}\r
+INLINE uint OPER_AW_32(void)    {uint ea = EA_AW_32();    return m68ki_read_32(ea);}\r
+INLINE uint OPER_AL_8(void)     {uint ea = EA_AL_8();     return m68ki_read_8(ea); }\r
+INLINE uint OPER_AL_16(void)    {uint ea = EA_AL_16();    return m68ki_read_16(ea);}\r
+INLINE uint OPER_AL_32(void)    {uint ea = EA_AL_32();    return m68ki_read_32(ea);}\r
+INLINE uint OPER_PCDI_8(void)   {uint ea = EA_PCDI_8();   return m68ki_read_pcrel_8(ea); }\r
+INLINE uint OPER_PCDI_16(void)  {uint ea = EA_PCDI_16();  return m68ki_read_pcrel_16(ea);}\r
+INLINE uint OPER_PCDI_32(void)  {uint ea = EA_PCDI_32();  return m68ki_read_pcrel_32(ea);}\r
+INLINE uint OPER_PCIX_8(void)   {uint ea = EA_PCIX_8();   return m68ki_read_pcrel_8(ea); }\r
+INLINE uint OPER_PCIX_16(void)  {uint ea = EA_PCIX_16();  return m68ki_read_pcrel_16(ea);}\r
+INLINE uint OPER_PCIX_32(void)  {uint ea = EA_PCIX_32();  return m68ki_read_pcrel_32(ea);}\r
+\r
+\r
+\r
+/* ---------------------------- Stack Functions --------------------------- */\r
+\r
+/* Push/pull data from the stack */\r
+INLINE void m68ki_push_16(uint value)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2);\r
+       m68ki_write_16(REG_SP, value);\r
+}\r
+\r
+INLINE void m68ki_push_32(uint value)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4);\r
+       m68ki_write_32(REG_SP, value);\r
+}\r
+\r
+INLINE uint m68ki_pull_16(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2);\r
+       return m68ki_read_16(REG_SP-2);\r
+}\r
+\r
+INLINE uint m68ki_pull_32(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4);\r
+       return m68ki_read_32(REG_SP-4);\r
+}\r
+\r
+\r
+/* Increment/decrement the stack as if doing a push/pull but\r
+ * don't do any memory access.\r
+ */\r
+INLINE void m68ki_fake_push_16(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP - 2);\r
+}\r
+\r
+INLINE void m68ki_fake_push_32(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP - 4);\r
+}\r
+\r
+INLINE void m68ki_fake_pull_16(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP + 2);\r
+}\r
+\r
+INLINE void m68ki_fake_pull_32(void)\r
+{\r
+       REG_SP = MASK_OUT_ABOVE_32(REG_SP + 4);\r
+}\r
+\r
+\r
+/* ----------------------------- Program Flow ----------------------------- */\r
+\r
+/* Jump to a new program location or vector.\r
+ * These functions will also call the pc_changed callback if it was enabled\r
+ * in m68kconf.h.\r
+ */\r
+INLINE void m68ki_jump(uint new_pc)\r
+{\r
+       REG_PC = new_pc;\r
+       m68ki_pc_changed(REG_PC);\r
+}\r
+\r
+INLINE void m68ki_jump_vector(uint vector)\r
+{\r
+       REG_PC = (vector<<2) + REG_VBR;\r
+       REG_PC = m68ki_read_data_32(REG_PC);\r
+       m68ki_pc_changed(REG_PC);\r
+}\r
+\r
+\r
+/* Branch to a new memory location.\r
+ * The 32-bit branch will call pc_changed if it was enabled in m68kconf.h.\r
+ * So far I've found no problems with not calling pc_changed for 8 or 16\r
+ * bit branches.\r
+ */\r
+INLINE void m68ki_branch_8(uint offset)\r
+{\r
+       REG_PC += MAKE_INT_8(offset);\r
+}\r
+\r
+INLINE void m68ki_branch_16(uint offset)\r
+{\r
+       REG_PC += MAKE_INT_16(offset);\r
+}\r
+\r
+INLINE void m68ki_branch_32(uint offset)\r
+{\r
+       REG_PC += offset;\r
+       m68ki_pc_changed(REG_PC);\r
+}\r
+\r
+\r
+\r
+/* ---------------------------- Status Register --------------------------- */\r
+\r
+/* Set the S flag and change the active stack pointer.\r
+ * Note that value MUST be 4 or 0.\r
+ */\r
+INLINE void m68ki_set_s_flag(uint value)\r
+{\r
+       /* Backup the old stack pointer */\r
+       REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP;\r
+       /* Set the S flag */\r
+       FLAG_S = value;\r
+       /* Set the new stack pointer */\r
+       REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)];\r
+}\r
+\r
+/* Set the S and M flags and change the active stack pointer.\r
+ * Note that value MUST be 0, 2, 4, or 6 (bit2 = S, bit1 = M).\r
+ */\r
+INLINE void m68ki_set_sm_flag(uint value)\r
+{\r
+       /* Backup the old stack pointer */\r
+       REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)] = REG_SP;\r
+       /* Set the S and M flags */\r
+       FLAG_S = value & SFLAG_SET;\r
+       FLAG_M = value & MFLAG_SET;\r
+       /* Set the new stack pointer */\r
+       REG_SP = REG_SP_BASE[FLAG_S | ((FLAG_S>>1) & FLAG_M)];\r
+}\r
+\r
+\r
+/* Set the condition code register */\r
+INLINE void m68ki_set_ccr(uint value)\r
+{\r
+       FLAG_X = BIT_4(value)  << 4;\r
+       FLAG_N = BIT_3(value)  << 4;\r
+       FLAG_Z = !BIT_2(value);\r
+       FLAG_V = BIT_1(value)  << 6;\r
+       FLAG_C = BIT_0(value)  << 8;\r
+}\r
+\r
+/* Set the status register but don't check for interrupts */\r
+INLINE void m68ki_set_sr_noint(uint value)\r
+{\r
+       /* Mask out the "unimplemented" bits */\r
+       value &= CPU_SR_MASK;\r
+\r
+       /* Now set the status register */\r
+       FLAG_T1 = BIT_F(value);\r
+       FLAG_T0 = BIT_E(value);\r
+       FLAG_INT_MASK = value & 0x0700;\r
+       m68ki_set_ccr(value);\r
+       m68ki_set_sm_flag((value >> 11) & 6);\r
+}\r
+\r
+/* Set the status register and check for interrupts */\r
+INLINE void m68ki_set_sr(uint value)\r
+{\r
+       m68ki_set_sr_noint(value);\r
+       m68ki_check_interrupts();\r
+}\r
+\r
+\r
+/* ------------------------- Exception Processing ------------------------- */\r
+\r
+/* Initiate exception processing */\r
+INLINE uint m68ki_init_exception(void)\r
+{\r
+       /* Save the old status register */\r
+       uint sr = m68ki_get_sr();\r
+\r
+       /* Turn off trace flag, clear pending traces */\r
+       FLAG_T1 = FLAG_T0 = 0;\r
+       m68ki_clear_trace();\r
+       /* Enter supervisor mode */\r
+       m68ki_set_s_flag(SFLAG_SET);\r
+\r
+       return sr;\r
+}\r
+\r
+/* 3 word stack frame (68000 only) */\r
+INLINE void m68ki_stack_frame_3word(uint pc, uint sr)\r
+{\r
+       m68ki_push_32(pc);\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+/* Format 0 stack frame.\r
+ * This is the standard stack frame for 68010+.\r
+ */\r
+INLINE void m68ki_stack_frame_0000(uint pc, uint sr, uint vector)\r
+{\r
+       /* Stack a 3-word frame if we are 68000 */\r
+       if(CPU_TYPE == CPU_TYPE_000)\r
+       {\r
+               m68ki_stack_frame_3word(pc, sr);\r
+               return;\r
+       }\r
+       m68ki_push_16(vector<<2);\r
+       m68ki_push_32(pc);\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+/* Format 1 stack frame (68020).\r
+ * For 68020, this is the 4 word throwaway frame.\r
+ */\r
+INLINE void m68ki_stack_frame_0001(uint pc, uint sr, uint vector)\r
+{\r
+       m68ki_push_16(0x1000 | (vector<<2));\r
+       m68ki_push_32(pc);\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+/* Format 2 stack frame.\r
+ * This is used only by 68020 for trap exceptions.\r
+ */\r
+INLINE void m68ki_stack_frame_0010(uint sr, uint vector)\r
+{\r
+       m68ki_push_32(REG_PPC);\r
+       m68ki_push_16(0x2000 | (vector<<2));\r
+       m68ki_push_32(REG_PC);\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+\r
+/* Bus error stack frame (68000 only).\r
+ */\r
+INLINE void m68ki_stack_frame_buserr(uint pc, uint sr, uint address, uint write, uint instruction, uint fc)\r
+{\r
+       m68ki_push_32(pc);\r
+       m68ki_push_16(sr);\r
+       m68ki_push_16(REG_IR);\r
+       m68ki_push_32(address); /* access address */\r
+       /* 0 0 0 0 0 0 0 0 0 0 0 R/W I/N FC\r
+        * R/W  0 = write, 1 = read\r
+        * I/N  0 = instruction, 1 = not\r
+        * FC   3-bit function code\r
+        */\r
+       m68ki_push_16(((!write)<<4) | ((!instruction)<<3) | fc);\r
+}\r
+\r
+/* Format 8 stack frame (68010).\r
+ * 68010 only.  This is the 29 word bus/address error frame.\r
+ */\r
+void m68ki_stack_frame_1000(uint pc, uint sr, uint vector)\r
+{\r
+       /* VERSION\r
+        * NUMBER\r
+        * INTERNAL INFORMATION, 16 WORDS\r
+        */\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+       m68ki_fake_push_32();\r
+\r
+       /* INSTRUCTION INPUT BUFFER */\r
+       m68ki_push_16(0);\r
+\r
+       /* UNUSED, RESERVED (not written) */\r
+       m68ki_fake_push_16();\r
+\r
+       /* DATA INPUT BUFFER */\r
+       m68ki_push_16(0);\r
+\r
+       /* UNUSED, RESERVED (not written) */\r
+       m68ki_fake_push_16();\r
+\r
+       /* DATA OUTPUT BUFFER */\r
+       m68ki_push_16(0);\r
+\r
+       /* UNUSED, RESERVED (not written) */\r
+       m68ki_fake_push_16();\r
+\r
+       /* FAULT ADDRESS */\r
+       m68ki_push_32(0);\r
+\r
+       /* SPECIAL STATUS WORD */\r
+       m68ki_push_16(0);\r
+\r
+       /* 1000, VECTOR OFFSET */\r
+       m68ki_push_16(0x8000 | (vector<<2));\r
+\r
+       /* PROGRAM COUNTER */\r
+       m68ki_push_32(pc);\r
+\r
+       /* STATUS REGISTER */\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+/* Format A stack frame (short bus fault).\r
+ * This is used only by 68020 for bus fault and address error\r
+ * if the error happens at an instruction boundary.\r
+ * PC stacked is address of next instruction.\r
+ */\r
+void m68ki_stack_frame_1010(uint sr, uint vector, uint pc)\r
+{\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* DATA OUTPUT BUFFER (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* DATA CYCLE FAULT ADDRESS (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INSTRUCTION PIPE STAGE B */\r
+       m68ki_push_16(0);\r
+\r
+       /* INSTRUCTION PIPE STAGE C */\r
+       m68ki_push_16(0);\r
+\r
+       /* SPECIAL STATUS REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* 1010, VECTOR OFFSET */\r
+       m68ki_push_16(0xa000 | (vector<<2));\r
+\r
+       /* PROGRAM COUNTER */\r
+       m68ki_push_32(pc);\r
+\r
+       /* STATUS REGISTER */\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+/* Format B stack frame (long bus fault).\r
+ * This is used only by 68020 for bus fault and address error\r
+ * if the error happens during instruction execution.\r
+ * PC stacked is address of instruction in progress.\r
+ */\r
+void m68ki_stack_frame_1011(uint sr, uint vector, uint pc)\r
+{\r
+       /* INTERNAL REGISTERS (18 words) */\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+\r
+       /* VERSION# (4 bits), INTERNAL INFORMATION */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTERS (3 words) */\r
+       m68ki_push_32(0);\r
+       m68ki_push_16(0);\r
+\r
+       /* DATA INTPUT BUFFER (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INTERNAL REGISTERS (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* STAGE B ADDRESS (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INTERNAL REGISTER (4 words) */\r
+       m68ki_push_32(0);\r
+       m68ki_push_32(0);\r
+\r
+       /* DATA OUTPUT BUFFER (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* DATA CYCLE FAULT ADDRESS (2 words) */\r
+       m68ki_push_32(0);\r
+\r
+       /* INSTRUCTION PIPE STAGE B */\r
+       m68ki_push_16(0);\r
+\r
+       /* INSTRUCTION PIPE STAGE C */\r
+       m68ki_push_16(0);\r
+\r
+       /* SPECIAL STATUS REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* INTERNAL REGISTER */\r
+       m68ki_push_16(0);\r
+\r
+       /* 1011, VECTOR OFFSET */\r
+       m68ki_push_16(0xb000 | (vector<<2));\r
+\r
+       /* PROGRAM COUNTER */\r
+       m68ki_push_32(pc);\r
+\r
+       /* STATUS REGISTER */\r
+       m68ki_push_16(sr);\r
+}\r
+\r
+\r
+/* Used for Group 2 exceptions.\r
+ * These stack a type 2 frame on the 020.\r
+ */\r
+INLINE void m68ki_exception_trap(uint vector)\r
+{\r
+       uint sr = m68ki_init_exception();\r
+\r
+       if(CPU_TYPE_IS_010_LESS(CPU_TYPE))\r
+               m68ki_stack_frame_0000(REG_PC, sr, vector);\r
+       else\r
+               m68ki_stack_frame_0010(sr, vector);\r
+\r
+       m68ki_jump_vector(vector);\r
+\r
+       /* Use up some clock cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[vector]);\r
+}\r
+\r
+/* Trap#n stacks a 0 frame but behaves like group2 otherwise */\r
+INLINE void m68ki_exception_trapN(uint vector)\r
+{\r
+       uint sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC, sr, vector);\r
+       m68ki_jump_vector(vector);\r
+\r
+       /* Use up some clock cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[vector]);\r
+}\r
+\r
+/* Exception for trace mode */\r
+INLINE void m68ki_exception_trace(void)\r
+{\r
+       uint sr = m68ki_init_exception();\r
+\r
+       if(CPU_TYPE_IS_010_LESS(CPU_TYPE))\r
+               m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_TRACE);\r
+       else\r
+               m68ki_stack_frame_0010(sr, EXCEPTION_TRACE);\r
+\r
+       m68ki_jump_vector(EXCEPTION_TRACE);\r
+\r
+       /* Trace nullifies a STOP instruction */\r
+       CPU_STOPPED &= ~STOP_LEVEL_STOP;\r
+\r
+       /* Use up some clock cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_TRACE]);\r
+}\r
+\r
+/* Exception for privilege violation */\r
+INLINE void m68ki_exception_privilege_violation(void)\r
+{\r
+       uint sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_PRIVILEGE_VIOLATION);\r
+       m68ki_jump_vector(EXCEPTION_PRIVILEGE_VIOLATION);\r
+\r
+       /* Use up some clock cycles and undo the instruction's cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_PRIVILEGE_VIOLATION] - CYC_INSTRUCTION[REG_IR]);\r
+}\r
+\r
+/* Exception for A-Line instructions */\r
+INLINE void m68ki_exception_1010(void)\r
+{\r
+       uint sr;\r
+#if M68K_LOG_1010_1111 == OPT_ON\r
+       M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1010 instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,\r
+                                        m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));\r
+#endif\r
+\r
+       sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC-2, sr, EXCEPTION_1010);\r
+       m68ki_jump_vector(EXCEPTION_1010);\r
+\r
+       /* Use up some clock cycles and undo the instruction's cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1010] - CYC_INSTRUCTION[REG_IR]);\r
+}\r
+\r
+/* Exception for F-Line instructions */\r
+INLINE void m68ki_exception_1111(void)\r
+{\r
+       uint sr;\r
+\r
+#if M68K_LOG_1010_1111 == OPT_ON\r
+       M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: called 1111 instruction %04x (%s)\n",\r
+                                        m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,\r
+                                        m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));\r
+#endif\r
+\r
+       sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC-2, sr, EXCEPTION_1111);\r
+       m68ki_jump_vector(EXCEPTION_1111);\r
+\r
+       /* Use up some clock cycles and undo the instruction's cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_1111] - CYC_INSTRUCTION[REG_IR]);\r
+}\r
+\r
+/* Exception for illegal instructions */\r
+INLINE void m68ki_exception_illegal(void)\r
+{\r
+       uint sr;\r
+\r
+       M68K_DO_LOG((M68K_LOG_FILEHANDLE "%s at %08x: illegal instruction %04x (%s)\n",\r
+                                m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PPC), REG_IR,\r
+                                m68ki_disassemble_quick(ADDRESS_68K(REG_PPC))));\r
+\r
+       sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_ILLEGAL_INSTRUCTION);\r
+       m68ki_jump_vector(EXCEPTION_ILLEGAL_INSTRUCTION);\r
+\r
+       /* Use up some clock cycles and undo the instruction's cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_ILLEGAL_INSTRUCTION] - CYC_INSTRUCTION[REG_IR]);\r
+}\r
+\r
+/* Exception for format errror in RTE */\r
+INLINE void m68ki_exception_format_error(void)\r
+{\r
+       uint sr = m68ki_init_exception();\r
+       m68ki_stack_frame_0000(REG_PC, sr, EXCEPTION_FORMAT_ERROR);\r
+       m68ki_jump_vector(EXCEPTION_FORMAT_ERROR);\r
+\r
+       /* Use up some clock cycles and undo the instruction's cycles */\r
+       USE_CYCLES(CYC_EXCEPTION[EXCEPTION_FORMAT_ERROR] - CYC_INSTRUCTION[REG_IR]);\r
+}\r
+\r
+/* Exception for address error */\r
+INLINE void m68ki_exception_address_error(void)\r
+{\r
+       /* Not emulated yet */\r
+}\r
+\r
+\r
+/* Service an interrupt request and start exception processing */\r
+void m68ki_exception_interrupt(uint int_level)\r
+{\r
+       uint vector;\r
+       uint sr;\r
+       uint new_pc;\r
+\r
+       /* Turn off the stopped state */\r
+       CPU_STOPPED &= ~STOP_LEVEL_STOP;\r
+\r
+       /* If we are halted, don't do anything */\r
+       if(CPU_STOPPED)\r
+               return;\r
+\r
+       /* Acknowledge the interrupt */\r
+       vector = m68ki_int_ack(int_level);\r
+\r
+       /* Get the interrupt vector */\r
+       if(vector == M68K_INT_ACK_AUTOVECTOR)\r
+               /* Use the autovectors.  This is the most commonly used implementation */\r
+               vector = EXCEPTION_INTERRUPT_AUTOVECTOR+int_level;\r
+       else if(vector == M68K_INT_ACK_SPURIOUS)\r
+               /* Called if no devices respond to the interrupt acknowledge */\r
+               vector = EXCEPTION_SPURIOUS_INTERRUPT;\r
+       else if(vector > 255)\r
+       {\r
+               M68K_DO_LOG_EMU((M68K_LOG_FILEHANDLE "%s at %08x: Interrupt acknowledge returned invalid vector $%x\n",\r
+                                m68ki_cpu_names[CPU_TYPE], ADDRESS_68K(REG_PC), vector));\r
+               return;\r
+       }\r
+\r
+       /* Start exception processing */\r
+       sr = m68ki_init_exception();\r
+\r
+       /* Set the interrupt mask to the level of the one being serviced */\r
+       FLAG_INT_MASK = int_level<<8;\r
+\r
+       /* Get the new PC */\r
+       new_pc = m68ki_read_data_32((vector<<2) + REG_VBR);\r
+\r
+       /* If vector is uninitialized, call the uninitialized interrupt vector */\r
+       if(new_pc == 0)\r
+               new_pc = m68ki_read_data_32((EXCEPTION_UNINITIALIZED_INTERRUPT<<2) + REG_VBR);\r
+\r
+       /* Generate a stack frame */\r
+       m68ki_stack_frame_0000(REG_PC, sr, vector);\r
+       if(FLAG_M && CPU_TYPE_IS_EC020_PLUS(CPU_TYPE))\r
+       {\r
+               /* Create throwaway frame */\r
+               m68ki_set_sm_flag(FLAG_S);      /* clear M */\r
+               sr |= 0x2000; /* Same as SR in master stack frame except S is forced high */\r
+               m68ki_stack_frame_0001(REG_PC, sr, vector);\r
+       }\r
+\r
+       m68ki_jump(new_pc);\r
+\r
+       /* Defer cycle counting until later */\r
+       CPU_INT_CYCLES += CYC_EXCEPTION[vector];\r
+\r
+#if !M68K_EMULATE_INT_ACK\r
+       /* Automatically clear IRQ if we are not using an acknowledge scheme */\r
+       CPU_INT_LEVEL = 0;\r
+#endif /* M68K_EMULATE_INT_ACK */\r
+}\r
+\r
+\r
+/* ASG: Check for interrupts */\r
+INLINE void m68ki_check_interrupts(void)\r
+{\r
+       if(CPU_INT_LEVEL > FLAG_INT_MASK)\r
+               m68ki_exception_interrupt(CPU_INT_LEVEL>>8);\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
+\r
+#endif /* M68KCPU__HEADER */\r
diff --git a/src/m68kdasm.c b/src/m68kdasm.c
new file mode 100644 (file)
index 0000000..7ded380
--- /dev/null
@@ -0,0 +1,3443 @@
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================ INCLUDES ============================== */\r
+/* ======================================================================== */\r
+\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include "m68k.h"\r
+\r
+/* ======================================================================== */\r
+/* ============================ GENERAL DEFINES =========================== */\r
+/* ======================================================================== */\r
+\r
+/* unsigned int and int must be at least 32 bits wide */\r
+#undef uint\r
+#define uint unsigned int\r
+\r
+/* Bit Isolation Functions */\r
+#define BIT_0(A)  ((A) & 0x00000001)\r
+#define BIT_1(A)  ((A) & 0x00000002)\r
+#define BIT_2(A)  ((A) & 0x00000004)\r
+#define BIT_3(A)  ((A) & 0x00000008)\r
+#define BIT_4(A)  ((A) & 0x00000010)\r
+#define BIT_5(A)  ((A) & 0x00000020)\r
+#define BIT_6(A)  ((A) & 0x00000040)\r
+#define BIT_7(A)  ((A) & 0x00000080)\r
+#define BIT_8(A)  ((A) & 0x00000100)\r
+#define BIT_9(A)  ((A) & 0x00000200)\r
+#define BIT_A(A)  ((A) & 0x00000400)\r
+#define BIT_B(A)  ((A) & 0x00000800)\r
+#define BIT_C(A)  ((A) & 0x00001000)\r
+#define BIT_D(A)  ((A) & 0x00002000)\r
+#define BIT_E(A)  ((A) & 0x00004000)\r
+#define BIT_F(A)  ((A) & 0x00008000)\r
+#define BIT_10(A) ((A) & 0x00010000)\r
+#define BIT_11(A) ((A) & 0x00020000)\r
+#define BIT_12(A) ((A) & 0x00040000)\r
+#define BIT_13(A) ((A) & 0x00080000)\r
+#define BIT_14(A) ((A) & 0x00100000)\r
+#define BIT_15(A) ((A) & 0x00200000)\r
+#define BIT_16(A) ((A) & 0x00400000)\r
+#define BIT_17(A) ((A) & 0x00800000)\r
+#define BIT_18(A) ((A) & 0x01000000)\r
+#define BIT_19(A) ((A) & 0x02000000)\r
+#define BIT_1A(A) ((A) & 0x04000000)\r
+#define BIT_1B(A) ((A) & 0x08000000)\r
+#define BIT_1C(A) ((A) & 0x10000000)\r
+#define BIT_1D(A) ((A) & 0x20000000)\r
+#define BIT_1E(A) ((A) & 0x40000000)\r
+#define BIT_1F(A) ((A) & 0x80000000)\r
+\r
+/* These are the CPU types understood by this disassembler */\r
+#define TYPE_68000 1\r
+#define TYPE_68010 2\r
+#define TYPE_68020 4\r
+#define TYPE_68030 8\r
+#define TYPE_68040 16\r
+\r
+#define M68000_ONLY            TYPE_68000\r
+\r
+#define M68010_ONLY            TYPE_68010\r
+#define M68010_LESS            (TYPE_68000 | TYPE_68010)\r
+#define M68010_PLUS            (TYPE_68010 | TYPE_68020 | TYPE_68030 | TYPE_68040)\r
+\r
+#define M68020_ONLY    TYPE_68020\r
+#define M68020_LESS    (TYPE_68010 | TYPE_68020)\r
+#define M68020_PLUS            (TYPE_68020 | TYPE_68030 | TYPE_68040)\r
+\r
+#define M68030_ONLY    TYPE_68030\r
+#define M68030_LESS    (TYPE_68010 | TYPE_68020 | TYPE_68030)\r
+#define M68030_PLUS            (TYPE_68030 | TYPE_68040)\r
+\r
+#define M68040_PLUS            TYPE_68040\r
+\r
+\r
+/* Extension word formats */\r
+#define EXT_8BIT_DISPLACEMENT(A)          ((A)&0xff)\r
+#define EXT_FULL(A)                       BIT_8(A)\r
+#define EXT_EFFECTIVE_ZERO(A)             (((A)&0xe4) == 0xc4 || ((A)&0xe2) == 0xc0)\r
+#define EXT_BASE_REGISTER_PRESENT(A)      (!BIT_7(A))\r
+#define EXT_INDEX_REGISTER_PRESENT(A)     (!BIT_6(A))\r
+#define EXT_INDEX_REGISTER(A)             (((A)>>12)&7)\r
+#define EXT_INDEX_PRE_POST(A)             (EXT_INDEX_PRESENT(A) && (A)&3)\r
+#define EXT_INDEX_PRE(A)                  (EXT_INDEX_PRESENT(A) && ((A)&7) < 4 && ((A)&7) != 0)\r
+#define EXT_INDEX_POST(A)                 (EXT_INDEX_PRESENT(A) && ((A)&7) > 4)\r
+#define EXT_INDEX_SCALE(A)                (((A)>>9)&3)\r
+#define EXT_INDEX_LONG(A)                 BIT_B(A)\r
+#define EXT_INDEX_AR(A)                   BIT_F(A)\r
+#define EXT_BASE_DISPLACEMENT_PRESENT(A)  (((A)&0x30) > 0x10)\r
+#define EXT_BASE_DISPLACEMENT_WORD(A)     (((A)&0x30) == 0x20)\r
+#define EXT_BASE_DISPLACEMENT_LONG(A)     (((A)&0x30) == 0x30)\r
+#define EXT_OUTER_DISPLACEMENT_PRESENT(A) (((A)&3) > 1 && ((A)&0x47) < 0x44)\r
+#define EXT_OUTER_DISPLACEMENT_WORD(A)    (((A)&3) == 2 && ((A)&0x47) < 0x44)\r
+#define EXT_OUTER_DISPLACEMENT_LONG(A)    (((A)&3) == 3 && ((A)&0x47) < 0x44)\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* =============================== PROTOTYPES ============================= */\r
+/* ======================================================================== */\r
+\r
+/* Read data at the PC and increment PC */\r
+uint  read_imm_8(void);\r
+uint  read_imm_16(void);\r
+uint  read_imm_32(void);\r
+\r
+/* Read data at the PC but don't imcrement the PC */\r
+uint  peek_imm_8(void);\r
+uint  peek_imm_16(void);\r
+uint  peek_imm_32(void);\r
+\r
+/* make signed integers 100% portably */\r
+static int make_int_8(int value);\r
+static int make_int_16(int value);\r
+\r
+/* make a string of a hex value */\r
+static char* make_signed_hex_str_8(uint val);\r
+static char* make_signed_hex_str_16(uint val);\r
+static char* make_signed_hex_str_32(uint val);\r
+\r
+/* make string of ea mode */\r
+static char* get_ea_mode_str(uint instruction, uint size);\r
+\r
+char* get_ea_mode_str_8(uint instruction);\r
+char* get_ea_mode_str_16(uint instruction);\r
+char* get_ea_mode_str_32(uint instruction);\r
+\r
+/* make string of immediate value */\r
+static char* get_imm_str_s(uint size);\r
+static char* get_imm_str_u(uint size);\r
+\r
+char* get_imm_str_s8(void);\r
+char* get_imm_str_s16(void);\r
+char* get_imm_str_s32(void);\r
+\r
+/* Stuff to build the opcode handler jump table */\r
+static void  build_opcode_table(void);\r
+static int   valid_ea(uint opcode, uint mask);\r
+static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr);\r
+\r
+/* used to build opcode handler jump table */\r
+typedef struct\r
+{\r
+       void (*opcode_handler)(void); /* handler function */\r
+       uint mask;                    /* mask on opcode */\r
+       uint match;                   /* what to match after masking */\r
+       uint ea_mask;                 /* what ea modes are allowed */\r
+} opcode_struct;\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================= DATA ================================= */\r
+/* ======================================================================== */\r
+\r
+/* Opcode handler jump table */\r
+static void (*g_instruction_table[0x10000])(void);\r
+/* Flag if disassembler initialized */\r
+static int  g_initialized = 0;\r
+\r
+/* Address mask to simulate address lines */\r
+static unsigned int g_address_mask = 0xffffffff;\r
+\r
+static char g_dasm_str[100]; /* string to hold disassembly */\r
+static char g_helper_str[100]; /* string to hold helpful info */\r
+static uint g_cpu_pc;        /* program counter */\r
+static uint g_cpu_ir;        /* instruction register */\r
+static uint g_cpu_type;\r
+\r
+/* used by ops like asr, ror, addq, etc */\r
+static uint g_3bit_qdata_table[8] = {8, 1, 2, 3, 4, 5, 6, 7};\r
+\r
+static uint g_5bit_data_table[32] =\r
+{\r
+       32,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15,\r
+       16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31\r
+};\r
+\r
+static char* g_cc[16] =\r
+{"t", "f", "hi", "ls", "cc", "cs", "ne", "eq", "vc", "vs", "pl", "mi", "ge", "lt", "gt", "le"};\r
+\r
+static char* g_cpcc[64] =\r
+{/* 000    001    010    011    100    101    110    111 */\r
+         "f",  "eq", "ogt", "oge", "olt", "ole", "ogl",  "or", /* 000 */\r
+        "un", "ueq", "ugt", "uge", "ult", "ule",  "ne",   "t", /* 001 */\r
+        "sf", "seq",  "gt",  "ge",  "lt",  "le",  "gl"  "gle", /* 010 */\r
+  "ngle", "ngl", "nle", "nlt", "nge", "ngt", "sne",  "st", /* 011 */\r
+         "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 100 */\r
+         "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 101 */\r
+         "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?", /* 110 */\r
+         "?",   "?",   "?",   "?",   "?",   "?",   "?",   "?"  /* 111 */\r
+};\r
+\r
+\r
+/* ======================================================================== */\r
+/* =========================== UTILITY FUNCTIONS ========================== */\r
+/* ======================================================================== */\r
+\r
+#define LIMIT_CPU_TYPES(ALLOWED_CPU_TYPES)     \\r
+       if(!(g_cpu_type & ALLOWED_CPU_TYPES))   \\r
+       {                                                                               \\r
+               d68000_illegal();                                       \\r
+               return;                                                         \\r
+       }\r
+\r
+#define read_imm_8()  (m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)&0xff)\r
+#define read_imm_16() m68k_read_disassembler_16(((g_cpu_pc+=2)-2)&g_address_mask)\r
+#define read_imm_32() m68k_read_disassembler_32(((g_cpu_pc+=4)-4)&g_address_mask)\r
+\r
+#define peek_imm_8()  (m68k_read_disassembler_16(g_cpu_pc & g_address_mask)&0xff)\r
+#define peek_imm_16() m68k_read_disassembler_16(g_cpu_pc & g_address_mask)\r
+#define peek_imm_32() m68k_read_disassembler_32(g_cpu_pc & g_address_mask)\r
+\r
+/* Fake a split interface */\r
+#define get_ea_mode_str_8(instruction) get_ea_mode_str(instruction, 0)\r
+#define get_ea_mode_str_16(instruction) get_ea_mode_str(instruction, 1)\r
+#define get_ea_mode_str_32(instruction) get_ea_mode_str(instruction, 2)\r
+\r
+#define get_imm_str_s8() get_imm_str_s(0)\r
+#define get_imm_str_s16() get_imm_str_s(1)\r
+#define get_imm_str_s32() get_imm_str_s(2)\r
+\r
+#define get_imm_str_u8() get_imm_str_u(0)\r
+#define get_imm_str_u16() get_imm_str_u(1)\r
+#define get_imm_str_u32() get_imm_str_u(2)\r
+\r
+\r
+/* 100% portable signed int generators */\r
+static int make_int_8(int value)\r
+{\r
+       return (value & 0x80) ? value | ~0xff : value & 0xff;\r
+}\r
+\r
+static int make_int_16(int value)\r
+{\r
+       return (value & 0x8000) ? value | ~0xffff : value & 0xffff;\r
+}\r
+\r
+\r
+/* Get string representation of hex values */\r
+static char* make_signed_hex_str_8(uint val)\r
+{\r
+       static char str[20];\r
+\r
+       val &= 0xff;\r
+\r
+       if(val == 0x80)\r
+               sprintf(str, "-$80");\r
+       else if(val & 0x80)\r
+               sprintf(str, "-$%x", (0-val) & 0x7f);\r
+       else\r
+               sprintf(str, "$%x", val & 0x7f);\r
+\r
+       return str;\r
+}\r
+\r
+static char* make_signed_hex_str_16(uint val)\r
+{\r
+       static char str[20];\r
+\r
+       val &= 0xffff;\r
+\r
+       if(val == 0x8000)\r
+               sprintf(str, "-$8000");\r
+       else if(val & 0x8000)\r
+               sprintf(str, "-$%x", (0-val) & 0x7fff);\r
+       else\r
+               sprintf(str, "$%x", val & 0x7fff);\r
+\r
+       return str;\r
+}\r
+\r
+static char* make_signed_hex_str_32(uint val)\r
+{\r
+       static char str[20];\r
+\r
+       val &= 0xffffffff;\r
+\r
+       if(val == 0x80000000)\r
+               sprintf(str, "-$80000000");\r
+       else if(val & 0x80000000)\r
+               sprintf(str, "-$%x", (0-val) & 0x7fffffff);\r
+       else\r
+               sprintf(str, "$%x", val & 0x7fffffff);\r
+\r
+       return str;\r
+}\r
+\r
+\r
+/* make string of immediate value */\r
+static char* get_imm_str_s(uint size)\r
+{\r
+       static char str[15];\r
+       if(size == 0)\r
+               sprintf(str, "#%s", make_signed_hex_str_8(read_imm_8()));\r
+       else if(size == 1)\r
+               sprintf(str, "#%s", make_signed_hex_str_16(read_imm_16()));\r
+       else\r
+               sprintf(str, "#%s", make_signed_hex_str_32(read_imm_32()));\r
+       return str;\r
+}\r
+\r
+static char* get_imm_str_u(uint size)\r
+{\r
+       static char str[15];\r
+       if(size == 0)\r
+               sprintf(str, "#$%x", read_imm_8() & 0xff);\r
+       else if(size == 1)\r
+               sprintf(str, "#$%x", read_imm_16() & 0xffff);\r
+       else\r
+               sprintf(str, "#$%x", read_imm_32() & 0xffffffff);\r
+       return str;\r
+}\r
+\r
+/* Make string of effective address mode */\r
+static char* get_ea_mode_str(uint instruction, uint size)\r
+{\r
+       static char b1[64];\r
+       static char b2[64];\r
+       static char* mode = b2;\r
+       uint extension;\r
+       uint base;\r
+       uint outer;\r
+       char base_reg[4];\r
+       char index_reg[8];\r
+       uint preindex;\r
+       uint postindex;\r
+       uint comma = 0;\r
+       uint temp_value;\r
+\r
+       /* Switch buffers so we don't clobber on a double-call to this function */\r
+       mode = mode == b1 ? b2 : b1;\r
+\r
+       switch(instruction & 0x3f)\r
+       {\r
+               case 0x00: case 0x01: case 0x02: case 0x03: case 0x04: case 0x05: case 0x06: case 0x07:\r
+               /* data register direct */\r
+                       sprintf(mode, "D%d", instruction&7);\r
+                       break;\r
+               case 0x08: case 0x09: case 0x0a: case 0x0b: case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
+               /* address register direct */\r
+                       sprintf(mode, "A%d", instruction&7);\r
+                       break;\r
+               case 0x10: case 0x11: case 0x12: case 0x13: case 0x14: case 0x15: case 0x16: case 0x17:\r
+               /* address register indirect */\r
+                       sprintf(mode, "(A%d)", instruction&7);\r
+                       break;\r
+               case 0x18: case 0x19: case 0x1a: case 0x1b: case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
+               /* address register indirect with postincrement */\r
+                       sprintf(mode, "(A%d)+", instruction&7);\r
+                       break;\r
+               case 0x20: case 0x21: case 0x22: case 0x23: case 0x24: case 0x25: case 0x26: case 0x27:\r
+               /* address register indirect with predecrement */\r
+                       sprintf(mode, "-(A%d)", instruction&7);\r
+                       break;\r
+               case 0x28: case 0x29: case 0x2a: case 0x2b: case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
+               /* address register indirect with displacement*/\r
+                       sprintf(mode, "(%s,A%d)", make_signed_hex_str_16(read_imm_16()), instruction&7);\r
+                       break;\r
+               case 0x30: case 0x31: case 0x32: case 0x33: case 0x34: case 0x35: case 0x36: case 0x37:\r
+               /* address register indirect with index */\r
+                       extension = read_imm_16();\r
+\r
+                       if(EXT_FULL(extension))\r
+                       {\r
+                               if(EXT_EFFECTIVE_ZERO(extension))\r
+                               {\r
+                                       strcpy(mode, "0");\r
+                                       break;\r
+                               }\r
+                               base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
+                               outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
+                               if(EXT_BASE_REGISTER_PRESENT(extension))\r
+                                       sprintf(base_reg, "A%d", instruction&7);\r
+                               else\r
+                                       *base_reg = 0;\r
+                               if(EXT_INDEX_REGISTER_PRESENT(extension))\r
+                               {\r
+                                       sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                                       if(EXT_INDEX_SCALE(extension))\r
+                                               sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
+                               }\r
+                               else\r
+                                       *index_reg = 0;\r
+                               preindex = (extension&7) > 0 && (extension&7) < 4;\r
+                               postindex = (extension&7) > 4;\r
+\r
+                               strcpy(mode, "(");\r
+                               if(preindex || postindex)\r
+                                       strcat(mode, "[");\r
+                               if(base)\r
+                               {\r
+                                       strcat(mode, make_signed_hex_str_16(base));\r
+                                       comma = 1;\r
+                               }\r
+                               if(*base_reg)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, base_reg);\r
+                                       comma = 1;\r
+                               }\r
+                               if(postindex)\r
+                               {\r
+                                       strcat(mode, "]");\r
+                                       comma = 1;\r
+                               }\r
+                               if(*index_reg)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, index_reg);\r
+                                       comma = 1;\r
+                               }\r
+                               if(preindex)\r
+                               {\r
+                                       strcat(mode, "]");\r
+                                       comma = 1;\r
+                               }\r
+                               if(outer)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, make_signed_hex_str_16(outer));\r
+                               }\r
+                               strcat(mode, ")");\r
+                               break;\r
+                       }\r
+\r
+                       if(EXT_8BIT_DISPLACEMENT(extension) == 0)\r
+                               sprintf(mode, "(A%d,%c%d.%c", instruction&7, EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                       else\r
+                               sprintf(mode, "(%s,A%d,%c%d.%c", make_signed_hex_str_8(extension), instruction&7, EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                       if(EXT_INDEX_SCALE(extension))\r
+                               sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
+                       strcat(mode, ")");\r
+                       break;\r
+               case 0x38:\r
+               /* absolute short address */\r
+                       sprintf(mode, "$%x.w", read_imm_16());\r
+                       break;\r
+               case 0x39:\r
+               /* absolute long address */\r
+                       sprintf(mode, "$%x.l", read_imm_32());\r
+                       break;\r
+               case 0x3a:\r
+               /* program counter with displacement */\r
+                       temp_value = read_imm_16();\r
+                       sprintf(mode, "(%s,PC)", make_signed_hex_str_16(temp_value));\r
+                       sprintf(g_helper_str, "; ($%x)", (make_int_16(temp_value) + g_cpu_pc-2) & 0xffffffff);\r
+                       break;\r
+               case 0x3b:\r
+               /* program counter with index */\r
+                       extension = read_imm_16();\r
+\r
+                       if(EXT_FULL(extension))\r
+                       {\r
+                               if(EXT_EFFECTIVE_ZERO(extension))\r
+                               {\r
+                                       strcpy(mode, "0");\r
+                                       break;\r
+                               }\r
+                               base = EXT_BASE_DISPLACEMENT_PRESENT(extension) ? (EXT_BASE_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
+                               outer = EXT_OUTER_DISPLACEMENT_PRESENT(extension) ? (EXT_OUTER_DISPLACEMENT_LONG(extension) ? read_imm_32() : read_imm_16()) : 0;\r
+                               if(EXT_BASE_REGISTER_PRESENT(extension))\r
+                                       strcpy(base_reg, "PC");\r
+                               else\r
+                                       *base_reg = 0;\r
+                               if(EXT_INDEX_REGISTER_PRESENT(extension))\r
+                               {\r
+                                       sprintf(index_reg, "%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                                       if(EXT_INDEX_SCALE(extension))\r
+                                               sprintf(index_reg+strlen(index_reg), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
+                               }\r
+                               else\r
+                                       *index_reg = 0;\r
+                               preindex = (extension&7) > 0 && (extension&7) < 4;\r
+                               postindex = (extension&7) > 4;\r
+\r
+                               strcpy(mode, "(");\r
+                               if(preindex || postindex)\r
+                                       strcat(mode, "[");\r
+                               if(base)\r
+                               {\r
+                                       strcat(mode, make_signed_hex_str_16(base));\r
+                                       comma = 1;\r
+                               }\r
+                               if(*base_reg)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, base_reg);\r
+                                       comma = 1;\r
+                               }\r
+                               if(postindex)\r
+                               {\r
+                                       strcat(mode, "]");\r
+                                       comma = 1;\r
+                               }\r
+                               if(*index_reg)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, index_reg);\r
+                                       comma = 1;\r
+                               }\r
+                               if(preindex)\r
+                               {\r
+                                       strcat(mode, "]");\r
+                                       comma = 1;\r
+                               }\r
+                               if(outer)\r
+                               {\r
+                                       if(comma)\r
+                                               strcat(mode, ",");\r
+                                       strcat(mode, make_signed_hex_str_16(outer));\r
+                               }\r
+                               strcat(mode, ")");\r
+                               break;\r
+                       }\r
+\r
+                       if(EXT_8BIT_DISPLACEMENT(extension) == 0)\r
+                               sprintf(mode, "(PC,%c%d.%c", EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                       else\r
+                               sprintf(mode, "(%s,PC,%c%d.%c", make_signed_hex_str_8(extension), EXT_INDEX_AR(extension) ? 'A' : 'D', EXT_INDEX_REGISTER(extension), EXT_INDEX_LONG(extension) ? 'l' : 'w');\r
+                       if(EXT_INDEX_SCALE(extension))\r
+                               sprintf(mode+strlen(mode), "*%d", 1 << EXT_INDEX_SCALE(extension));\r
+                       strcat(mode, ")");\r
+                       break;\r
+               case 0x3c:\r
+               /* Immediate */\r
+                       sprintf(mode, "%s", get_imm_str_u(size));\r
+                       break;\r
+               default:\r
+                       sprintf(mode, "INVALID %x", instruction & 0x3f);\r
+       }\r
+       return mode;\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ========================= INSTRUCTION HANDLERS ========================= */\r
+/* ======================================================================== */\r
+/* Instruction handler function names follow this convention:\r
+ *\r
+ * d68000_NAME_EXTENSIONS(void)\r
+ * where NAME is the name of the opcode it handles and EXTENSIONS are any\r
+ * extensions for special instances of that opcode.\r
+ *\r
+ * Examples:\r
+ *   d68000_add_er_8(): add opcode, from effective address to register,\r
+ *                      size = byte\r
+ *\r
+ *   d68000_asr_s_8(): arithmetic shift right, static count, size = byte\r
+ *\r
+ *\r
+ * Common extensions:\r
+ * 8   : size = byte\r
+ * 16  : size = word\r
+ * 32  : size = long\r
+ * rr  : register to register\r
+ * mm  : memory to memory\r
+ * r   : register\r
+ * s   : static\r
+ * er  : effective address -> register\r
+ * re  : register -> effective address\r
+ * ea  : using effective address mode of operation\r
+ * d   : data register direct\r
+ * a   : address register direct\r
+ * ai  : address register indirect\r
+ * pi  : address register indirect with postincrement\r
+ * pd  : address register indirect with predecrement\r
+ * di  : address register indirect with displacement\r
+ * ix  : address register indirect with index\r
+ * aw  : absolute word\r
+ * al  : absolute long\r
+ */\r
+\r
+static void d68000_illegal(void)\r
+{\r
+       sprintf(g_dasm_str, "dc.w $%04x; ILLEGAL", g_cpu_ir);\r
+}\r
+\r
+static void d68000_1010(void)\r
+{\r
+       sprintf(g_dasm_str, "dc.w    $%04x; opcode 1010", g_cpu_ir);\r
+}\r
+\r
+\r
+static void d68000_1111(void)\r
+{\r
+       sprintf(g_dasm_str, "dc.w    $%04x; opcode 1111", g_cpu_ir);\r
+}\r
+\r
+\r
+static void d68000_abcd_rr(void)\r
+{\r
+       sprintf(g_dasm_str, "abcd    D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+\r
+static void d68000_abcd_mm(void)\r
+{\r
+       sprintf(g_dasm_str, "abcd    -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_add_er_8(void)\r
+{\r
+       sprintf(g_dasm_str, "add.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+\r
+static void d68000_add_er_16(void)\r
+{\r
+       sprintf(g_dasm_str, "add.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_add_er_32(void)\r
+{\r
+       sprintf(g_dasm_str, "add.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_add_re_8(void)\r
+{\r
+       sprintf(g_dasm_str, "add.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_add_re_16(void)\r
+{\r
+       sprintf(g_dasm_str, "add.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_add_re_32(void)\r
+{\r
+       sprintf(g_dasm_str, "add.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_adda_16(void)\r
+{\r
+       sprintf(g_dasm_str, "adda.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_adda_32(void)\r
+{\r
+       sprintf(g_dasm_str, "adda.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addi_8(void)\r
+{\r
+       char* str = get_imm_str_s8();\r
+       sprintf(g_dasm_str, "addi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addi_16(void)\r
+{\r
+       char* str = get_imm_str_s16();\r
+       sprintf(g_dasm_str, "addi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addi_32(void)\r
+{\r
+       char* str = get_imm_str_s32();\r
+       sprintf(g_dasm_str, "addi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addq_8(void)\r
+{\r
+       sprintf(g_dasm_str, "addq.b  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addq_16(void)\r
+{\r
+       sprintf(g_dasm_str, "addq.w  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addq_32(void)\r
+{\r
+       sprintf(g_dasm_str, "addq.l  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_addx_rr_8(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.b  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addx_rr_16(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.w  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addx_rr_32(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.l  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addx_mm_8(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.b  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addx_mm_16(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.w  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_addx_mm_32(void)\r
+{\r
+       sprintf(g_dasm_str, "addx.l  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_and_er_8(void)\r
+{\r
+       sprintf(g_dasm_str, "and.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_and_er_16(void)\r
+{\r
+       sprintf(g_dasm_str, "and.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_and_er_32(void)\r
+{\r
+       sprintf(g_dasm_str, "and.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_and_re_8(void)\r
+{\r
+       sprintf(g_dasm_str, "and.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_and_re_16(void)\r
+{\r
+       sprintf(g_dasm_str, "and.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_and_re_32(void)\r
+{\r
+       sprintf(g_dasm_str, "and.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_andi_8(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "andi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_andi_16(void)\r
+{\r
+       char* str = get_imm_str_u16();\r
+       sprintf(g_dasm_str, "andi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_andi_32(void)\r
+{\r
+       char* str = get_imm_str_u32();\r
+       sprintf(g_dasm_str, "andi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_andi_to_ccr(void)\r
+{\r
+       sprintf(g_dasm_str, "andi    %s, CCR", get_imm_str_u8());\r
+}\r
+\r
+static void d68000_andi_to_sr(void)\r
+{\r
+       sprintf(g_dasm_str, "andi    %s, SR", get_imm_str_u16());\r
+}\r
+\r
+static void d68000_asr_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asr_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "asr.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_asl_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_asl_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "asl.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bcc_8(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "b%-2s     %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bcc_16(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "b%-2s     %x", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + make_int_16(read_imm_16()));\r
+}\r
+\r
+static void d68020_bcc_32(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "b%-2s     %x; (2+)", g_cc[(g_cpu_ir>>8)&0xf], temp_pc + read_imm_32());\r
+}\r
+\r
+static void d68000_bchg_r(void)\r
+{\r
+       sprintf(g_dasm_str, "bchg    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bchg_s(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "bchg    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bclr_r(void)\r
+{\r
+       sprintf(g_dasm_str, "bclr    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bclr_s(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "bclr    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68010_bkpt(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       sprintf(g_dasm_str, "bkpt #%d; (1+)", g_cpu_ir&7);\r
+}\r
+\r
+static void d68020_bfchg(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfchg   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfclr(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfclr   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfexts(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfexts  D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfextu(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfextu  D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfffo(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfffo   D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfins(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfins   D%d, %s {%s:%s}; (2+)", (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bfset(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bfset   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68020_bftst(void)\r
+{\r
+       uint extension;\r
+       char offset[3];\r
+       char width[3];\r
+\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_B(extension))\r
+               sprintf(offset, "D%d", (extension>>6)&7);\r
+       else\r
+               sprintf(offset, "%d", (extension>>6)&31);\r
+       if(BIT_5(extension))\r
+               sprintf(width, "D%d", extension&7);\r
+       else\r
+               sprintf(width, "%d", g_5bit_data_table[extension&31]);\r
+       sprintf(g_dasm_str, "bftst   %s {%s:%s}; (2+)", get_ea_mode_str_8(g_cpu_ir), offset, width);\r
+}\r
+\r
+static void d68000_bra_8(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "bra     %x", temp_pc + make_int_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bra_16(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "bra     %x", temp_pc + make_int_16(read_imm_16()));\r
+}\r
+\r
+static void d68020_bra_32(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "bra     %x; (2+)", temp_pc + read_imm_32());\r
+}\r
+\r
+static void d68000_bset_r(void)\r
+{\r
+       sprintf(g_dasm_str, "bset    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bset_s(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "bset    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bsr_8(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "bsr     %x", temp_pc + make_int_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_bsr_16(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "bsr     %x", temp_pc + make_int_16(read_imm_16()));\r
+}\r
+\r
+static void d68020_bsr_32(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "bsr     %x; (2+)", temp_pc + peek_imm_32());\r
+}\r
+\r
+static void d68000_btst_r(void)\r
+{\r
+       sprintf(g_dasm_str, "btst    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_btst_s(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "btst    %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_callm(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_ONLY);\r
+       str = get_imm_str_u8();\r
+\r
+       sprintf(g_dasm_str, "callm   %s, %s; (2)", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cas_8(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "cas.b   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cas_16(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "cas.w   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cas_32(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "cas.l   D%d, D%d, %s; (2+)", extension&7, (extension>>8)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cas2_16(void)\r
+{\r
+/* CAS2 Dc1:Dc2,Du1:Dc2:(Rn1):(Rn2)\r
+f e d c b a 9 8 7 6 5 4 3 2 1 0\r
+ DARn1  0 0 0  Du1  0 0 0  Dc1\r
+ DARn2  0 0 0  Du2  0 0 0  Dc2\r
+*/\r
+\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_32();\r
+       sprintf(g_dasm_str, "cas2.w  D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",\r
+               (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,\r
+               BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,\r
+               BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68020_cas2_32(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_32();\r
+       sprintf(g_dasm_str, "cas2.l  D%d:D%d:D%d:D%d, (%c%d):(%c%d); (2+)",\r
+               (extension>>16)&7, extension&7, (extension>>22)&7, (extension>>6)&7,\r
+               BIT_1F(extension) ? 'A' : 'D', (extension>>28)&7,\r
+               BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68000_chk_16(void)\r
+{\r
+       sprintf(g_dasm_str, "chk.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68020_chk_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "chk.l   %s, D%d; (2+)", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68020_chk2_cmp2_8(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "%s.b  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_8(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68020_chk2_cmp2_16(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "%s.w  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68020_chk2_cmp2_32(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       sprintf(g_dasm_str, "%s.l  %s, %c%d; (2+)", BIT_B(extension) ? "chk2" : "cmp2", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68040_cinv(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       switch((g_cpu_ir>>3)&3)\r
+       {\r
+               case 0:\r
+                       sprintf(g_dasm_str, "cinv (illegal scope); (4)");\r
+                       break;\r
+               case 1:\r
+                       sprintf(g_dasm_str, "cinvl   %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
+                       break;\r
+               case 2:\r
+                       sprintf(g_dasm_str, "cinvp   %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
+                       break;\r
+               case 3:\r
+                       sprintf(g_dasm_str, "cinva   %d; (4)", (g_cpu_ir>>6)&3);\r
+                       break;\r
+       }\r
+}\r
+\r
+static void d68000_clr_8(void)\r
+{\r
+       sprintf(g_dasm_str, "clr.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_clr_16(void)\r
+{\r
+       sprintf(g_dasm_str, "clr.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_clr_32(void)\r
+{\r
+       sprintf(g_dasm_str, "clr.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_cmp_8(void)\r
+{\r
+       sprintf(g_dasm_str, "cmp.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmp_16(void)\r
+{\r
+       sprintf(g_dasm_str, "cmp.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmp_32(void)\r
+{\r
+       sprintf(g_dasm_str, "cmp.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmpa_16(void)\r
+{\r
+       sprintf(g_dasm_str, "cmpa.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmpa_32(void)\r
+{\r
+       sprintf(g_dasm_str, "cmpa.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmpi_8(void)\r
+{\r
+       char* str = get_imm_str_s8();\r
+       sprintf(g_dasm_str, "cmpi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcdi_8(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s8();\r
+       sprintf(g_dasm_str, "cmpi.b  %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcix_8(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s8();\r
+       sprintf(g_dasm_str, "cmpi.b  %s, %s; (2+)", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_cmpi_16(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s16();\r
+       sprintf(g_dasm_str, "cmpi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcdi_16(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s16();\r
+       sprintf(g_dasm_str, "cmpi.w  %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcix_16(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s16();\r
+       sprintf(g_dasm_str, "cmpi.w  %s, %s; (2+)", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_cmpi_32(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s32();\r
+       sprintf(g_dasm_str, "cmpi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcdi_32(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s32();\r
+       sprintf(g_dasm_str, "cmpi.l  %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cmpi_pcix_32(void)\r
+{\r
+       char* str;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       str = get_imm_str_s32();\r
+       sprintf(g_dasm_str, "cmpi.l  %s, %s; (2+)", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_cmpm_8(void)\r
+{\r
+       sprintf(g_dasm_str, "cmpm.b  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmpm_16(void)\r
+{\r
+       sprintf(g_dasm_str, "cmpm.w  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_cmpm_32(void)\r
+{\r
+       sprintf(g_dasm_str, "cmpm.l  (A%d)+, (A%d)+", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68020_cpbcc_16(void)\r
+{\r
+       uint extension;\r
+       uint new_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       new_pc += make_int_16(peek_imm_16());\r
+       sprintf(g_dasm_str, "%db%-4s  %s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[g_cpu_ir&0x3f], get_imm_str_s16(), new_pc, extension);\r
+}\r
+\r
+static void d68020_cpbcc_32(void)\r
+{\r
+       uint extension;\r
+       uint new_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+       new_pc += peek_imm_32();\r
+       sprintf(g_dasm_str, "%db%-4s  %s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[g_cpu_ir&0x3f], get_imm_str_s16(), new_pc, extension);\r
+}\r
+\r
+static void d68020_cpdbcc(void)\r
+{\r
+       uint extension1;\r
+       uint extension2;\r
+       uint new_pc = g_cpu_pc;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension1 = read_imm_16();\r
+       extension2 = read_imm_16();\r
+       new_pc += make_int_16(peek_imm_16());\r
+       sprintf(g_dasm_str, "%ddb%-4s D%d,%s; %x (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], g_cpu_ir&7, get_imm_str_s16(), new_pc, extension2);\r
+}\r
+\r
+static void d68020_cpgen(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "%dgen    %s; (2-3)", (g_cpu_ir>>9)&7, get_imm_str_u32());\r
+}\r
+\r
+static void d68020_cprestore(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "%drestore %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cpsave(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "%dsave   %s; (2-3)", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_cpscc(void)\r
+{\r
+       uint extension1;\r
+       uint extension2;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension1 = read_imm_16();\r
+       extension2 = read_imm_16();\r
+       sprintf(g_dasm_str, "%ds%-4s  %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_ea_mode_str_8(g_cpu_ir), extension2);\r
+}\r
+\r
+static void d68020_cptrapcc_0(void)\r
+{\r
+       uint extension1;\r
+       uint extension2;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension1 = read_imm_16();\r
+       extension2 = read_imm_16();\r
+       sprintf(g_dasm_str, "%dtrap%-4s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], extension2);\r
+}\r
+\r
+static void d68020_cptrapcc_16(void)\r
+{\r
+       uint extension1;\r
+       uint extension2;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension1 = read_imm_16();\r
+       extension2 = read_imm_16();\r
+       sprintf(g_dasm_str, "%dtrap%-4s %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_imm_str_u16(), extension2);\r
+}\r
+\r
+static void d68020_cptrapcc_32(void)\r
+{\r
+       uint extension1;\r
+       uint extension2;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension1 = read_imm_16();\r
+       extension2 = read_imm_16();\r
+       sprintf(g_dasm_str, "%dtrap%-4s %s; (extension = %x) (2-3)", (g_cpu_ir>>9)&7, g_cpcc[extension1&0x3f], get_imm_str_u32(), extension2);\r
+}\r
+\r
+static void d68040_cpush(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       switch((g_cpu_ir>>3)&3)\r
+       {\r
+               case 0:\r
+                       sprintf(g_dasm_str, "cpush (illegal scope); (4)");\r
+                       break;\r
+               case 1:\r
+                       sprintf(g_dasm_str, "cpushl  %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
+                       break;\r
+               case 2:\r
+                       sprintf(g_dasm_str, "cpushp  %d, (A%d); (4)", (g_cpu_ir>>6)&3, g_cpu_ir&7);\r
+                       break;\r
+               case 3:\r
+                       sprintf(g_dasm_str, "cpusha  %d; (4)", (g_cpu_ir>>6)&3);\r
+                       break;\r
+       }\r
+}\r
+\r
+static void d68000_dbra(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "dbra    D%d, %x", g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));\r
+}\r
+\r
+static void d68000_dbcc(void)\r
+{\r
+       uint temp_pc = g_cpu_pc;\r
+       sprintf(g_dasm_str, "db%-2s    D%d, %x", g_cc[(g_cpu_ir>>8)&0xf], g_cpu_ir & 7, temp_pc + make_int_16(read_imm_16()));\r
+}\r
+\r
+static void d68000_divs(void)\r
+{\r
+       sprintf(g_dasm_str, "divs.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_divu(void)\r
+{\r
+       sprintf(g_dasm_str, "divu.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68020_divl(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_A(extension))\r
+               sprintf(g_dasm_str, "div%c.l  %s, D%d:D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
+       else if((extension&7) == ((extension>>12)&7))\r
+               sprintf(g_dasm_str, "div%c.l  %s, D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), (extension>>12)&7);\r
+       else\r
+               sprintf(g_dasm_str, "div%cl.l %s, D%d:D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
+}\r
+\r
+static void d68000_eor_8(void)\r
+{\r
+       sprintf(g_dasm_str, "eor.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eor_16(void)\r
+{\r
+       sprintf(g_dasm_str, "eor.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eor_32(void)\r
+{\r
+       sprintf(g_dasm_str, "eor.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eori_8(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "eori.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eori_16(void)\r
+{\r
+       char* str = get_imm_str_u16();\r
+       sprintf(g_dasm_str, "eori.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eori_32(void)\r
+{\r
+       char* str = get_imm_str_u32();\r
+       sprintf(g_dasm_str, "eori.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_eori_to_ccr(void)\r
+{\r
+       sprintf(g_dasm_str, "eori    %s, CCR", get_imm_str_u8());\r
+}\r
+\r
+static void d68000_eori_to_sr(void)\r
+{\r
+       sprintf(g_dasm_str, "eori    %s, SR", get_imm_str_u16());\r
+}\r
+\r
+static void d68000_exg_dd(void)\r
+{\r
+       sprintf(g_dasm_str, "exg     D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_exg_aa(void)\r
+{\r
+       sprintf(g_dasm_str, "exg     A%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_exg_da(void)\r
+{\r
+       sprintf(g_dasm_str, "exg     D%d, A%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ext_16(void)\r
+{\r
+       sprintf(g_dasm_str, "ext.w   D%d", g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ext_32(void)\r
+{\r
+       sprintf(g_dasm_str, "ext.l   D%d", g_cpu_ir&7);\r
+}\r
+\r
+static void d68020_extb_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "extb.l  D%d; (2+)", g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_jmp(void)\r
+{\r
+       sprintf(g_dasm_str, "jmp     %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_jsr(void)\r
+{\r
+       sprintf(g_dasm_str, "jsr     %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_lea(void)\r
+{\r
+       sprintf(g_dasm_str, "lea     %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_link_16(void)\r
+{\r
+       sprintf(g_dasm_str, "link    A%d, %s", g_cpu_ir&7, get_imm_str_s16());\r
+}\r
+\r
+static void d68020_link_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "link    A%d, %s; (2+)", g_cpu_ir&7, get_imm_str_s32());\r
+}\r
+\r
+static void d68000_lsr_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsr_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "lsr.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_lsl_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_lsl_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "lsl.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_move_8(void)\r
+{\r
+       char* str = get_ea_mode_str_8(g_cpu_ir);\r
+       sprintf(g_dasm_str, "move.b  %s, %s", str, get_ea_mode_str_8(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
+}\r
+\r
+static void d68000_move_16(void)\r
+{\r
+       char* str = get_ea_mode_str_16(g_cpu_ir);\r
+       sprintf(g_dasm_str, "move.w  %s, %s", str, get_ea_mode_str_16(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
+}\r
+\r
+static void d68000_move_32(void)\r
+{\r
+       char* str = get_ea_mode_str_32(g_cpu_ir);\r
+       sprintf(g_dasm_str, "move.l  %s, %s", str, get_ea_mode_str_32(((g_cpu_ir>>9) & 7) | ((g_cpu_ir>>3) & 0x38)));\r
+}\r
+\r
+static void d68000_movea_16(void)\r
+{\r
+       sprintf(g_dasm_str, "movea.w %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_movea_32(void)\r
+{\r
+       sprintf(g_dasm_str, "movea.l %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_move_to_ccr(void)\r
+{\r
+       sprintf(g_dasm_str, "move    %s, CCR", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68010_move_fr_ccr(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       sprintf(g_dasm_str, "move    CCR, %s; (1+)", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_move_fr_sr(void)\r
+{\r
+       sprintf(g_dasm_str, "move    SR, %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_move_to_sr(void)\r
+{\r
+       sprintf(g_dasm_str, "move    %s, SR", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_move_fr_usp(void)\r
+{\r
+       sprintf(g_dasm_str, "move    USP, A%d", g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_move_to_usp(void)\r
+{\r
+       sprintf(g_dasm_str, "move    A%d, USP", g_cpu_ir&7);\r
+}\r
+\r
+static void d68010_movec(void)\r
+{\r
+       uint extension;\r
+       char* reg_name;\r
+       char* processor;\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       extension = read_imm_16();\r
+\r
+       switch(extension & 0xfff)\r
+       {\r
+               case 0x000:\r
+                       reg_name = "SFC";\r
+                       processor = "1+";\r
+                       break;\r
+               case 0x001:\r
+                       reg_name = "DFC";\r
+                       processor = "1+";\r
+                       break;\r
+               case 0x800:\r
+                       reg_name = "USP";\r
+                       processor = "1+";\r
+                       break;\r
+               case 0x801:\r
+                       reg_name = "VBR";\r
+                       processor = "1+";\r
+                       break;\r
+               case 0x002:\r
+                       reg_name = "CACR";\r
+                       processor = "2+";\r
+                       break;\r
+               case 0x802:\r
+                       reg_name = "CAAR";\r
+                       processor = "2,3";\r
+                       break;\r
+               case 0x803:\r
+                       reg_name = "MSP";\r
+                       processor = "2+";\r
+                       break;\r
+               case 0x804:\r
+                       reg_name = "ISP";\r
+                       processor = "2+";\r
+                       break;\r
+               case 0x003:\r
+                       reg_name = "TC";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x004:\r
+                       reg_name = "ITT0";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x005:\r
+                       reg_name = "ITT1";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x006:\r
+                       reg_name = "DTT0";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x007:\r
+                       reg_name = "DTT1";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x805:\r
+                       reg_name = "MMUSR";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x806:\r
+                       reg_name = "URP";\r
+                       processor = "4+";\r
+                       break;\r
+               case 0x807:\r
+                       reg_name = "SRP";\r
+                       processor = "4+";\r
+                       break;\r
+               default:\r
+                       reg_name = make_signed_hex_str_16(extension & 0xfff);\r
+                       processor = "?";\r
+       }\r
+\r
+       if(BIT_1(g_cpu_ir))\r
+               sprintf(g_dasm_str, "movec %c%d, %s; (%s)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, reg_name, processor);\r
+       else\r
+               sprintf(g_dasm_str, "movec %s, %c%d; (%s)", reg_name, BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, processor);\r
+}\r
+\r
+static void d68000_movem_pd_16(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(15-i)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(15-i)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(7-i)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(7-i)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_movem_pd_32(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(15-i)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(15-i)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(7-i)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(7-i)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_movem_er_16(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<i))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<i))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(i+8)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(i+8)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.w %s, %s", get_ea_mode_str_16(g_cpu_ir), buffer);\r
+}\r
+\r
+static void d68000_movem_er_32(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<i))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<i))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(i+8)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(i+8)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.l %s, %s", get_ea_mode_str_32(g_cpu_ir), buffer);\r
+}\r
+\r
+static void d68000_movem_re_16(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<i))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<i))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(i+8)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(i+8)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.w %s, %s", buffer, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_movem_re_32(void)\r
+{\r
+       uint data = read_imm_16();\r
+       char buffer[40];\r
+       uint first;\r
+       uint run_length;\r
+       uint i;\r
+\r
+       buffer[0] = 0;\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<i))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<i))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "D%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-D%d", first + run_length);\r
+               }\r
+       }\r
+       for(i=0;i<8;i++)\r
+       {\r
+               if(data&(1<<(i+8)))\r
+               {\r
+                       first = i;\r
+                       run_length = 0;\r
+                       for(i++;i<8;i++)\r
+                               if(data&(1<<(i+8)))\r
+                                       run_length++;\r
+                       if(buffer[0] != 0)\r
+                               strcat(buffer, "/");\r
+                       sprintf(buffer+strlen(buffer), "A%d", first);\r
+                       if(run_length > 0)\r
+                               sprintf(buffer+strlen(buffer), "-A%d", first + run_length);\r
+               }\r
+       }\r
+       sprintf(g_dasm_str, "movem.l %s, %s", buffer, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_movep_re_16(void)\r
+{\r
+       sprintf(g_dasm_str, "movep.w D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_movep_re_32(void)\r
+{\r
+       sprintf(g_dasm_str, "movep.l D%d, ($%x,A%d)", (g_cpu_ir>>9)&7, read_imm_16(), g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_movep_er_16(void)\r
+{\r
+       sprintf(g_dasm_str, "movep.w ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_movep_er_32(void)\r
+{\r
+       sprintf(g_dasm_str, "movep.l ($%x,A%d), D%d", read_imm_16(), g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68010_moves_8(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       extension = read_imm_16();\r
+       if(BIT_B(extension))\r
+               sprintf(g_dasm_str, "moves.b %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_8(g_cpu_ir));\r
+       else\r
+               sprintf(g_dasm_str, "moves.b %s, %c%d; (1+)", get_ea_mode_str_8(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68010_moves_16(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       extension = read_imm_16();\r
+       if(BIT_B(extension))\r
+               sprintf(g_dasm_str, "moves.w %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_16(g_cpu_ir));\r
+       else\r
+               sprintf(g_dasm_str, "moves.w %s, %c%d; (1+)", get_ea_mode_str_16(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68010_moves_32(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       extension = read_imm_16();\r
+       if(BIT_B(extension))\r
+               sprintf(g_dasm_str, "moves.l %c%d, %s; (1+)", BIT_F(extension) ? 'A' : 'D', (extension>>12)&7, get_ea_mode_str_32(g_cpu_ir));\r
+       else\r
+               sprintf(g_dasm_str, "moves.l %s, %c%d; (1+)", get_ea_mode_str_32(g_cpu_ir), BIT_F(extension) ? 'A' : 'D', (extension>>12)&7);\r
+}\r
+\r
+static void d68000_moveq(void)\r
+{\r
+       sprintf(g_dasm_str, "moveq   #%s, D%d", make_signed_hex_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68040_move16_pi_pi(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       sprintf(g_dasm_str, "move16  (A%d)+, (A%d)+; (4)", g_cpu_ir&7, (read_imm_16()>>12)&7);\r
+}\r
+\r
+static void d68040_move16_pi_al(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       sprintf(g_dasm_str, "move16  (A%d)+, %s; (4)", g_cpu_ir&7, get_imm_str_u32());\r
+}\r
+\r
+static void d68040_move16_al_pi(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       sprintf(g_dasm_str, "move16  %s, (A%d)+; (4)", get_imm_str_u32(), g_cpu_ir&7);\r
+}\r
+\r
+static void d68040_move16_ai_al(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       sprintf(g_dasm_str, "move16  (A%d), %s; (4)", g_cpu_ir&7, get_imm_str_u32());\r
+}\r
+\r
+static void d68040_move16_al_ai(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68040_PLUS);\r
+       sprintf(g_dasm_str, "move16  %s, (A%d); (4)", get_imm_str_u32(), g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_muls(void)\r
+{\r
+       sprintf(g_dasm_str, "muls.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_mulu(void)\r
+{\r
+       sprintf(g_dasm_str, "mulu.w  %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68020_mull(void)\r
+{\r
+       uint extension;\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       extension = read_imm_16();\r
+\r
+       if(BIT_A(extension))\r
+               sprintf(g_dasm_str, "mul%c.l %s, D%d-D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), extension&7, (extension>>12)&7);\r
+       else\r
+               sprintf(g_dasm_str, "mul%c.l  %s, D%d; (2+)", BIT_B(extension) ? 's' : 'u', get_ea_mode_str_32(g_cpu_ir), (extension>>12)&7);\r
+}\r
+\r
+static void d68000_nbcd(void)\r
+{\r
+       sprintf(g_dasm_str, "nbcd    %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_neg_8(void)\r
+{\r
+       sprintf(g_dasm_str, "neg.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_neg_16(void)\r
+{\r
+       sprintf(g_dasm_str, "neg.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_neg_32(void)\r
+{\r
+       sprintf(g_dasm_str, "neg.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_negx_8(void)\r
+{\r
+       sprintf(g_dasm_str, "negx.b  %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_negx_16(void)\r
+{\r
+       sprintf(g_dasm_str, "negx.w  %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_negx_32(void)\r
+{\r
+       sprintf(g_dasm_str, "negx.l  %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_nop(void)\r
+{\r
+       sprintf(g_dasm_str, "nop");\r
+}\r
+\r
+static void d68000_not_8(void)\r
+{\r
+       sprintf(g_dasm_str, "not.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_not_16(void)\r
+{\r
+       sprintf(g_dasm_str, "not.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_not_32(void)\r
+{\r
+       sprintf(g_dasm_str, "not.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_or_er_8(void)\r
+{\r
+       sprintf(g_dasm_str, "or.b    %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_or_er_16(void)\r
+{\r
+       sprintf(g_dasm_str, "or.w    %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_or_er_32(void)\r
+{\r
+       sprintf(g_dasm_str, "or.l    %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_or_re_8(void)\r
+{\r
+       sprintf(g_dasm_str, "or.b    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_or_re_16(void)\r
+{\r
+       sprintf(g_dasm_str, "or.w    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_or_re_32(void)\r
+{\r
+       sprintf(g_dasm_str, "or.l    D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_ori_8(void)\r
+{\r
+       char* str = get_imm_str_u8();\r
+       sprintf(g_dasm_str, "ori.b   %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_ori_16(void)\r
+{\r
+       char* str = get_imm_str_u16();\r
+       sprintf(g_dasm_str, "ori.w   %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_ori_32(void)\r
+{\r
+       char* str = get_imm_str_u32();\r
+       sprintf(g_dasm_str, "ori.l   %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_ori_to_ccr(void)\r
+{\r
+       sprintf(g_dasm_str, "ori     %s, CCR", get_imm_str_u8());\r
+}\r
+\r
+static void d68000_ori_to_sr(void)\r
+{\r
+       sprintf(g_dasm_str, "ori     %s, SR", get_imm_str_u16());\r
+}\r
+\r
+static void d68020_pack_rr(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "pack    D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
+}\r
+\r
+static void d68020_pack_mm(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "pack    -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
+}\r
+\r
+static void d68000_pea(void)\r
+{\r
+       sprintf(g_dasm_str, "pea     %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_reset(void)\r
+{\r
+       sprintf(g_dasm_str, "reset");\r
+}\r
+\r
+static void d68000_ror_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7],g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_ror_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "ror.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_rol_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.b   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.w   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.l   #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.b   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.w   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.l   D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rol_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "rol.w   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_roxr_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.b  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxr_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.w  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+\r
+static void d68000_roxr_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.l  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxr_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.b  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxr_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.w  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxr_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.l  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxr_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "roxr.w  %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_roxl_s_8(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.b  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_s_16(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.w  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_s_32(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.l  #%d, D%d", g_3bit_qdata_table[(g_cpu_ir>>9)&7], g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_r_8(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.b  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_r_16(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.w  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_r_32(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.l  D%d, D%d", (g_cpu_ir>>9)&7, g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_roxl_ea(void)\r
+{\r
+       sprintf(g_dasm_str, "roxl.w  %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68010_rtd(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68010_PLUS);\r
+       sprintf(g_dasm_str, "rtd     %s; (1+)", get_imm_str_s16());\r
+}\r
+\r
+static void d68000_rte(void)\r
+{\r
+       sprintf(g_dasm_str, "rte");\r
+}\r
+\r
+static void d68020_rtm(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_ONLY);\r
+       sprintf(g_dasm_str, "rtm     %c%d; (2+)", BIT_3(g_cpu_ir) ? 'A' : 'D', g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_rtr(void)\r
+{\r
+       sprintf(g_dasm_str, "rtr");\r
+}\r
+\r
+static void d68000_rts(void)\r
+{\r
+       sprintf(g_dasm_str, "rts");\r
+}\r
+\r
+static void d68000_sbcd_rr(void)\r
+{\r
+       sprintf(g_dasm_str, "sbcd    D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_sbcd_mm(void)\r
+{\r
+       sprintf(g_dasm_str, "sbcd    -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_scc(void)\r
+{\r
+       sprintf(g_dasm_str, "s%-2s     %s", g_cc[(g_cpu_ir>>8)&0xf], get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_stop(void)\r
+{\r
+       sprintf(g_dasm_str, "stop    %s", get_imm_str_s16());\r
+}\r
+\r
+static void d68000_sub_er_8(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.b   %s, D%d", get_ea_mode_str_8(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_sub_er_16(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.w   %s, D%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_sub_er_32(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.l   %s, D%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_sub_re_8(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.b   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_sub_re_16(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.w   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_sub_re_32(void)\r
+{\r
+       sprintf(g_dasm_str, "sub.l   D%d, %s", (g_cpu_ir>>9)&7, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_suba_16(void)\r
+{\r
+       sprintf(g_dasm_str, "suba.w  %s, A%d", get_ea_mode_str_16(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_suba_32(void)\r
+{\r
+       sprintf(g_dasm_str, "suba.l  %s, A%d", get_ea_mode_str_32(g_cpu_ir), (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subi_8(void)\r
+{\r
+       char* str = get_imm_str_s8();\r
+       sprintf(g_dasm_str, "subi.b  %s, %s", str, get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subi_16(void)\r
+{\r
+       char* str = get_imm_str_s16();\r
+       sprintf(g_dasm_str, "subi.w  %s, %s", str, get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subi_32(void)\r
+{\r
+       char* str = get_imm_str_s32();\r
+       sprintf(g_dasm_str, "subi.l  %s, %s", str, get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subq_8(void)\r
+{\r
+       sprintf(g_dasm_str, "subq.b  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subq_16(void)\r
+{\r
+       sprintf(g_dasm_str, "subq.w  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subq_32(void)\r
+{\r
+       sprintf(g_dasm_str, "subq.l  #%d, %s", g_3bit_qdata_table[(g_cpu_ir>>9)&7], get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_subx_rr_8(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.b  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subx_rr_16(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.w  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subx_rr_32(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.l  D%d, D%d", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subx_mm_8(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.b  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subx_mm_16(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.w  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_subx_mm_32(void)\r
+{\r
+       sprintf(g_dasm_str, "subx.l  -(A%d), -(A%d)", g_cpu_ir&7, (g_cpu_ir>>9)&7);\r
+}\r
+\r
+static void d68000_swap(void)\r
+{\r
+       sprintf(g_dasm_str, "swap    D%d", g_cpu_ir&7);\r
+}\r
+\r
+static void d68000_tas(void)\r
+{\r
+       sprintf(g_dasm_str, "tas     %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_trap(void)\r
+{\r
+       sprintf(g_dasm_str, "trap    #$%x", g_cpu_ir&0xf);\r
+}\r
+\r
+static void d68020_trapcc_0(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "trap%-2s; (2+)", g_cc[(g_cpu_ir>>8)&0xf]);\r
+}\r
+\r
+static void d68020_trapcc_16(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "trap%-2s  %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u16());\r
+}\r
+\r
+static void d68020_trapcc_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "trap%-2s  %s; (2+)", g_cc[(g_cpu_ir>>8)&0xf], get_imm_str_u32());\r
+}\r
+\r
+static void d68000_trapv(void)\r
+{\r
+       sprintf(g_dasm_str, "trapv");\r
+}\r
+\r
+static void d68000_tst_8(void)\r
+{\r
+       sprintf(g_dasm_str, "tst.b   %s", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcdi_8(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcix_8(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_i_8(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.b   %s; (2+)", get_ea_mode_str_8(g_cpu_ir));\r
+}\r
+\r
+static void d68000_tst_16(void)\r
+{\r
+       sprintf(g_dasm_str, "tst.w   %s", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_a_16(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcdi_16(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcix_16(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_i_16(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.w   %s; (2+)", get_ea_mode_str_16(g_cpu_ir));\r
+}\r
+\r
+static void d68000_tst_32(void)\r
+{\r
+       sprintf(g_dasm_str, "tst.l   %s", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_a_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcdi_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_pcix_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68020_tst_i_32(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "tst.l   %s; (2+)", get_ea_mode_str_32(g_cpu_ir));\r
+}\r
+\r
+static void d68000_unlk(void)\r
+{\r
+       sprintf(g_dasm_str, "unlk    A%d", g_cpu_ir&7);\r
+}\r
+\r
+static void d68020_unpk_rr(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "unpk    D%d, D%d, %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
+}\r
+\r
+static void d68020_unpk_mm(void)\r
+{\r
+       LIMIT_CPU_TYPES(M68020_PLUS);\r
+       sprintf(g_dasm_str, "unpk    -(A%d), -(A%d), %s; (2+)", g_cpu_ir&7, (g_cpu_ir>>9)&7, get_imm_str_u16());\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ======================= INSTRUCTION TABLE BUILDER ====================== */\r
+/* ======================================================================== */\r
+\r
+/* EA Masks:\r
+800 = data register direct\r
+400 = address register direct\r
+200 = address register indirect\r
+100 = ARI postincrement\r
+ 80 = ARI pre-decrement\r
+ 40 = ARI displacement\r
+ 20 = ARI index\r
+ 10 = absolute short\r
+  8 = absolute long\r
+  4 = immediate / sr\r
+  2 = pc displacement\r
+  1 = pc idx\r
+*/\r
+\r
+static opcode_struct g_opcode_info[] =\r
+{\r
+/*  opcode handler    mask    match   ea mask */\r
+       {d68000_1010         , 0xf000, 0xa000, 0x000},\r
+       {d68000_1111         , 0xf000, 0xf000, 0x000},\r
+       {d68000_abcd_rr      , 0xf1f8, 0xc100, 0x000},\r
+       {d68000_abcd_mm      , 0xf1f8, 0xc108, 0x000},\r
+       {d68000_add_er_8     , 0xf1c0, 0xd000, 0xbff},\r
+       {d68000_add_er_16    , 0xf1c0, 0xd040, 0xfff},\r
+       {d68000_add_er_32    , 0xf1c0, 0xd080, 0xfff},\r
+       {d68000_add_re_8     , 0xf1c0, 0xd100, 0x3f8},\r
+       {d68000_add_re_16    , 0xf1c0, 0xd140, 0x3f8},\r
+       {d68000_add_re_32    , 0xf1c0, 0xd180, 0x3f8},\r
+       {d68000_adda_16      , 0xf1c0, 0xd0c0, 0xfff},\r
+       {d68000_adda_32      , 0xf1c0, 0xd1c0, 0xfff},\r
+       {d68000_addi_8       , 0xffc0, 0x0600, 0xbf8},\r
+       {d68000_addi_16      , 0xffc0, 0x0640, 0xbf8},\r
+       {d68000_addi_32      , 0xffc0, 0x0680, 0xbf8},\r
+       {d68000_addq_8       , 0xf1c0, 0x5000, 0xbf8},\r
+       {d68000_addq_16      , 0xf1c0, 0x5040, 0xff8},\r
+       {d68000_addq_32      , 0xf1c0, 0x5080, 0xff8},\r
+       {d68000_addx_rr_8    , 0xf1f8, 0xd100, 0x000},\r
+       {d68000_addx_rr_16   , 0xf1f8, 0xd140, 0x000},\r
+       {d68000_addx_rr_32   , 0xf1f8, 0xd180, 0x000},\r
+       {d68000_addx_mm_8    , 0xf1f8, 0xd108, 0x000},\r
+       {d68000_addx_mm_16   , 0xf1f8, 0xd148, 0x000},\r
+       {d68000_addx_mm_32   , 0xf1f8, 0xd188, 0x000},\r
+       {d68000_and_er_8     , 0xf1c0, 0xc000, 0xbff},\r
+       {d68000_and_er_16    , 0xf1c0, 0xc040, 0xbff},\r
+       {d68000_and_er_32    , 0xf1c0, 0xc080, 0xbff},\r
+       {d68000_and_re_8     , 0xf1c0, 0xc100, 0x3f8},\r
+       {d68000_and_re_16    , 0xf1c0, 0xc140, 0x3f8},\r
+       {d68000_and_re_32    , 0xf1c0, 0xc180, 0x3f8},\r
+       {d68000_andi_to_ccr  , 0xffff, 0x023c, 0x000},\r
+       {d68000_andi_to_sr   , 0xffff, 0x027c, 0x000},\r
+       {d68000_andi_8       , 0xffc0, 0x0200, 0xbf8},\r
+       {d68000_andi_16      , 0xffc0, 0x0240, 0xbf8},\r
+       {d68000_andi_32      , 0xffc0, 0x0280, 0xbf8},\r
+       {d68000_asr_s_8      , 0xf1f8, 0xe000, 0x000},\r
+       {d68000_asr_s_16     , 0xf1f8, 0xe040, 0x000},\r
+       {d68000_asr_s_32     , 0xf1f8, 0xe080, 0x000},\r
+       {d68000_asr_r_8      , 0xf1f8, 0xe020, 0x000},\r
+       {d68000_asr_r_16     , 0xf1f8, 0xe060, 0x000},\r
+       {d68000_asr_r_32     , 0xf1f8, 0xe0a0, 0x000},\r
+       {d68000_asr_ea       , 0xffc0, 0xe0c0, 0x3f8},\r
+       {d68000_asl_s_8      , 0xf1f8, 0xe100, 0x000},\r
+       {d68000_asl_s_16     , 0xf1f8, 0xe140, 0x000},\r
+       {d68000_asl_s_32     , 0xf1f8, 0xe180, 0x000},\r
+       {d68000_asl_r_8      , 0xf1f8, 0xe120, 0x000},\r
+       {d68000_asl_r_16     , 0xf1f8, 0xe160, 0x000},\r
+       {d68000_asl_r_32     , 0xf1f8, 0xe1a0, 0x000},\r
+       {d68000_asl_ea       , 0xffc0, 0xe1c0, 0x3f8},\r
+       {d68000_bcc_8        , 0xf000, 0x6000, 0x000},\r
+       {d68000_bcc_16       , 0xf0ff, 0x6000, 0x000},\r
+       {d68020_bcc_32       , 0xf0ff, 0x60ff, 0x000},\r
+       {d68000_bchg_r       , 0xf1c0, 0x0140, 0xbf8},\r
+       {d68000_bchg_s       , 0xffc0, 0x0840, 0xbf8},\r
+       {d68000_bclr_r       , 0xf1c0, 0x0180, 0xbf8},\r
+       {d68000_bclr_s       , 0xffc0, 0x0880, 0xbf8},\r
+       {d68020_bfchg        , 0xffc0, 0xeac0, 0xa78},\r
+       {d68020_bfclr        , 0xffc0, 0xecc0, 0xa78},\r
+       {d68020_bfexts       , 0xffc0, 0xebc0, 0xa7b},\r
+       {d68020_bfextu       , 0xffc0, 0xe9c0, 0xa7b},\r
+       {d68020_bfffo        , 0xffc0, 0xedc0, 0xa7b},\r
+       {d68020_bfins        , 0xffc0, 0xefc0, 0xa78},\r
+       {d68020_bfset        , 0xffc0, 0xeec0, 0xa78},\r
+       {d68020_bftst        , 0xffc0, 0xe8c0, 0xa7b},\r
+       {d68010_bkpt         , 0xfff8, 0x4848, 0x000},\r
+       {d68000_bra_8        , 0xff00, 0x6000, 0x000},\r
+       {d68000_bra_16       , 0xffff, 0x6000, 0x000},\r
+       {d68020_bra_32       , 0xffff, 0x60ff, 0x000},\r
+       {d68000_bset_r       , 0xf1c0, 0x01c0, 0xbf8},\r
+       {d68000_bset_s       , 0xffc0, 0x08c0, 0xbf8},\r
+       {d68000_bsr_8        , 0xff00, 0x6100, 0x000},\r
+       {d68000_bsr_16       , 0xffff, 0x6100, 0x000},\r
+       {d68020_bsr_32       , 0xffff, 0x61ff, 0x000},\r
+       {d68000_btst_r       , 0xf1c0, 0x0100, 0xbff},\r
+       {d68000_btst_s       , 0xffc0, 0x0800, 0xbfb},\r
+       {d68020_callm        , 0xffc0, 0x06c0, 0x27b},\r
+       {d68020_cas_8        , 0xffc0, 0x0ac0, 0x3f8},\r
+       {d68020_cas_16       , 0xffc0, 0x0cc0, 0x3f8},\r
+       {d68020_cas_32       , 0xffc0, 0x0ec0, 0x3f8},\r
+       {d68020_cas2_16      , 0xffff, 0x0cfc, 0x000},\r
+       {d68020_cas2_32      , 0xffff, 0x0efc, 0x000},\r
+       {d68000_chk_16       , 0xf1c0, 0x4180, 0xbff},\r
+       {d68020_chk_32       , 0xf1c0, 0x4100, 0xbff},\r
+       {d68020_chk2_cmp2_8  , 0xffc0, 0x00c0, 0x27b},\r
+       {d68020_chk2_cmp2_16 , 0xffc0, 0x02c0, 0x27b},\r
+       {d68020_chk2_cmp2_32 , 0xffc0, 0x04c0, 0x27b},\r
+       {d68040_cinv         , 0xff20, 0xf400, 0x000},\r
+       {d68000_clr_8        , 0xffc0, 0x4200, 0xbf8},\r
+       {d68000_clr_16       , 0xffc0, 0x4240, 0xbf8},\r
+       {d68000_clr_32       , 0xffc0, 0x4280, 0xbf8},\r
+       {d68000_cmp_8        , 0xf1c0, 0xb000, 0xbff},\r
+       {d68000_cmp_16       , 0xf1c0, 0xb040, 0xfff},\r
+       {d68000_cmp_32       , 0xf1c0, 0xb080, 0xfff},\r
+       {d68000_cmpa_16      , 0xf1c0, 0xb0c0, 0xfff},\r
+       {d68000_cmpa_32      , 0xf1c0, 0xb1c0, 0xfff},\r
+       {d68000_cmpi_8       , 0xffc0, 0x0c00, 0xbf8},\r
+       {d68020_cmpi_pcdi_8  , 0xffff, 0x0c3a, 0x000},\r
+       {d68020_cmpi_pcix_8  , 0xffff, 0x0c3b, 0x000},\r
+       {d68000_cmpi_16      , 0xffc0, 0x0c40, 0xbf8},\r
+       {d68020_cmpi_pcdi_16 , 0xffff, 0x0c7a, 0x000},\r
+       {d68020_cmpi_pcix_16 , 0xffff, 0x0c7b, 0x000},\r
+       {d68000_cmpi_32      , 0xffc0, 0x0c80, 0xbf8},\r
+       {d68020_cmpi_pcdi_32 , 0xffff, 0x0cba, 0x000},\r
+       {d68020_cmpi_pcix_32 , 0xffff, 0x0cbb, 0x000},\r
+       {d68000_cmpm_8       , 0xf1f8, 0xb108, 0x000},\r
+       {d68000_cmpm_16      , 0xf1f8, 0xb148, 0x000},\r
+       {d68000_cmpm_32      , 0xf1f8, 0xb188, 0x000},\r
+       {d68020_cpbcc_16     , 0xf1c0, 0xf080, 0x000},\r
+       {d68020_cpbcc_32     , 0xf1c0, 0xf0c0, 0x000},\r
+       {d68020_cpdbcc       , 0xf1f8, 0xf048, 0x000},\r
+       {d68020_cpgen        , 0xf1c0, 0xf000, 0x000},\r
+       {d68020_cprestore    , 0xf1c0, 0xf140, 0x37f},\r
+       {d68020_cpsave       , 0xf1c0, 0xf100, 0x2f8},\r
+       {d68020_cpscc        , 0xf1c0, 0xf040, 0xbf8},\r
+       {d68020_cptrapcc_0   , 0xf1ff, 0xf07c, 0x000},\r
+       {d68020_cptrapcc_16  , 0xf1ff, 0xf07a, 0x000},\r
+       {d68020_cptrapcc_32  , 0xf1ff, 0xf07b, 0x000},\r
+       {d68040_cpush        , 0xff20, 0xf420, 0x000},\r
+       {d68000_dbcc         , 0xf0f8, 0x50c8, 0x000},\r
+       {d68000_dbra         , 0xfff8, 0x51c8, 0x000},\r
+       {d68000_divs         , 0xf1c0, 0x81c0, 0xbff},\r
+       {d68000_divu         , 0xf1c0, 0x80c0, 0xbff},\r
+       {d68020_divl         , 0xffc0, 0x4c40, 0xbff},\r
+       {d68000_eor_8        , 0xf1c0, 0xb100, 0xbf8},\r
+       {d68000_eor_16       , 0xf1c0, 0xb140, 0xbf8},\r
+       {d68000_eor_32       , 0xf1c0, 0xb180, 0xbf8},\r
+       {d68000_eori_to_ccr  , 0xffff, 0x0a3c, 0x000},\r
+       {d68000_eori_to_sr   , 0xffff, 0x0a7c, 0x000},\r
+       {d68000_eori_8       , 0xffc0, 0x0a00, 0xbf8},\r
+       {d68000_eori_16      , 0xffc0, 0x0a40, 0xbf8},\r
+       {d68000_eori_32      , 0xffc0, 0x0a80, 0xbf8},\r
+       {d68000_exg_dd       , 0xf1f8, 0xc140, 0x000},\r
+       {d68000_exg_aa       , 0xf1f8, 0xc148, 0x000},\r
+       {d68000_exg_da       , 0xf1f8, 0xc188, 0x000},\r
+       {d68020_extb_32      , 0xfff8, 0x49c0, 0x000},\r
+       {d68000_ext_16       , 0xfff8, 0x4880, 0x000},\r
+       {d68000_ext_32       , 0xfff8, 0x48c0, 0x000},\r
+       {d68000_illegal      , 0xffff, 0x4afc, 0x000},\r
+       {d68000_jmp          , 0xffc0, 0x4ec0, 0x27b},\r
+       {d68000_jsr          , 0xffc0, 0x4e80, 0x27b},\r
+       {d68000_lea          , 0xf1c0, 0x41c0, 0x27b},\r
+       {d68000_link_16      , 0xfff8, 0x4e50, 0x000},\r
+       {d68020_link_32      , 0xfff8, 0x4808, 0x000},\r
+       {d68000_lsr_s_8      , 0xf1f8, 0xe008, 0x000},\r
+       {d68000_lsr_s_16     , 0xf1f8, 0xe048, 0x000},\r
+       {d68000_lsr_s_32     , 0xf1f8, 0xe088, 0x000},\r
+       {d68000_lsr_r_8      , 0xf1f8, 0xe028, 0x000},\r
+       {d68000_lsr_r_16     , 0xf1f8, 0xe068, 0x000},\r
+       {d68000_lsr_r_32     , 0xf1f8, 0xe0a8, 0x000},\r
+       {d68000_lsr_ea       , 0xffc0, 0xe2c0, 0x3f8},\r
+       {d68000_lsl_s_8      , 0xf1f8, 0xe108, 0x000},\r
+       {d68000_lsl_s_16     , 0xf1f8, 0xe148, 0x000},\r
+       {d68000_lsl_s_32     , 0xf1f8, 0xe188, 0x000},\r
+       {d68000_lsl_r_8      , 0xf1f8, 0xe128, 0x000},\r
+       {d68000_lsl_r_16     , 0xf1f8, 0xe168, 0x000},\r
+       {d68000_lsl_r_32     , 0xf1f8, 0xe1a8, 0x000},\r
+       {d68000_lsl_ea       , 0xffc0, 0xe3c0, 0x3f8},\r
+       {d68000_move_8       , 0xf000, 0x1000, 0xbff},\r
+       {d68000_move_16      , 0xf000, 0x3000, 0xfff},\r
+       {d68000_move_32      , 0xf000, 0x2000, 0xfff},\r
+       {d68000_movea_16     , 0xf1c0, 0x3040, 0xfff},\r
+       {d68000_movea_32     , 0xf1c0, 0x2040, 0xfff},\r
+       {d68000_move_to_ccr  , 0xffc0, 0x44c0, 0xbff},\r
+       {d68010_move_fr_ccr  , 0xffc0, 0x42c0, 0xbf8},\r
+       {d68000_move_to_sr   , 0xffc0, 0x46c0, 0xbff},\r
+       {d68000_move_fr_sr   , 0xffc0, 0x40c0, 0xbf8},\r
+       {d68000_move_to_usp  , 0xfff8, 0x4e60, 0x000},\r
+       {d68000_move_fr_usp  , 0xfff8, 0x4e68, 0x000},\r
+       {d68010_movec        , 0xfffe, 0x4e7a, 0x000},\r
+       {d68000_movem_pd_16  , 0xfff8, 0x48a0, 0x000},\r
+       {d68000_movem_pd_32  , 0xfff8, 0x48e0, 0x000},\r
+       {d68000_movem_re_16  , 0xffc0, 0x4880, 0x2f8},\r
+       {d68000_movem_re_32  , 0xffc0, 0x48c0, 0x2f8},\r
+       {d68000_movem_er_16  , 0xffc0, 0x4c80, 0x37b},\r
+       {d68000_movem_er_32  , 0xffc0, 0x4cc0, 0x37b},\r
+       {d68000_movep_er_16  , 0xf1f8, 0x0108, 0x000},\r
+       {d68000_movep_er_32  , 0xf1f8, 0x0148, 0x000},\r
+       {d68000_movep_re_16  , 0xf1f8, 0x0188, 0x000},\r
+       {d68000_movep_re_32  , 0xf1f8, 0x01c8, 0x000},\r
+       {d68010_moves_8      , 0xffc0, 0x0e00, 0x3f8},\r
+       {d68010_moves_16     , 0xffc0, 0x0e40, 0x3f8},\r
+       {d68010_moves_32     , 0xffc0, 0x0e80, 0x3f8},\r
+       {d68000_moveq        , 0xf100, 0x7000, 0x000},\r
+       {d68040_move16_pi_pi , 0xfff8, 0xf620, 0x000},\r
+       {d68040_move16_pi_al , 0xfff8, 0xf600, 0x000},\r
+       {d68040_move16_al_pi , 0xfff8, 0xf608, 0x000},\r
+       {d68040_move16_ai_al , 0xfff8, 0xf610, 0x000},\r
+       {d68040_move16_al_ai , 0xfff8, 0xf618, 0x000},\r
+       {d68000_muls         , 0xf1c0, 0xc1c0, 0xbff},\r
+       {d68000_mulu         , 0xf1c0, 0xc0c0, 0xbff},\r
+       {d68020_mull         , 0xffc0, 0x4c00, 0xbff},\r
+       {d68000_nbcd         , 0xffc0, 0x4800, 0xbf8},\r
+       {d68000_neg_8        , 0xffc0, 0x4400, 0xbf8},\r
+       {d68000_neg_16       , 0xffc0, 0x4440, 0xbf8},\r
+       {d68000_neg_32       , 0xffc0, 0x4480, 0xbf8},\r
+       {d68000_negx_8       , 0xffc0, 0x4000, 0xbf8},\r
+       {d68000_negx_16      , 0xffc0, 0x4040, 0xbf8},\r
+       {d68000_negx_32      , 0xffc0, 0x4080, 0xbf8},\r
+       {d68000_nop          , 0xffff, 0x4e71, 0x000},\r
+       {d68000_not_8        , 0xffc0, 0x4600, 0xbf8},\r
+       {d68000_not_16       , 0xffc0, 0x4640, 0xbf8},\r
+       {d68000_not_32       , 0xffc0, 0x4680, 0xbf8},\r
+       {d68000_or_er_8      , 0xf1c0, 0x8000, 0xbff},\r
+       {d68000_or_er_16     , 0xf1c0, 0x8040, 0xbff},\r
+       {d68000_or_er_32     , 0xf1c0, 0x8080, 0xbff},\r
+       {d68000_or_re_8      , 0xf1c0, 0x8100, 0x3f8},\r
+       {d68000_or_re_16     , 0xf1c0, 0x8140, 0x3f8},\r
+       {d68000_or_re_32     , 0xf1c0, 0x8180, 0x3f8},\r
+       {d68000_ori_to_ccr   , 0xffff, 0x003c, 0x000},\r
+       {d68000_ori_to_sr    , 0xffff, 0x007c, 0x000},\r
+       {d68000_ori_8        , 0xffc0, 0x0000, 0xbf8},\r
+       {d68000_ori_16       , 0xffc0, 0x0040, 0xbf8},\r
+       {d68000_ori_32       , 0xffc0, 0x0080, 0xbf8},\r
+       {d68020_pack_rr      , 0xf1f8, 0x8140, 0x000},\r
+       {d68020_pack_mm      , 0xf1f8, 0x8148, 0x000},\r
+       {d68000_pea          , 0xffc0, 0x4840, 0x27b},\r
+       {d68000_reset        , 0xffff, 0x4e70, 0x000},\r
+       {d68000_ror_s_8      , 0xf1f8, 0xe018, 0x000},\r
+       {d68000_ror_s_16     , 0xf1f8, 0xe058, 0x000},\r
+       {d68000_ror_s_32     , 0xf1f8, 0xe098, 0x000},\r
+       {d68000_ror_r_8      , 0xf1f8, 0xe038, 0x000},\r
+       {d68000_ror_r_16     , 0xf1f8, 0xe078, 0x000},\r
+       {d68000_ror_r_32     , 0xf1f8, 0xe0b8, 0x000},\r
+       {d68000_ror_ea       , 0xffc0, 0xe6c0, 0x3f8},\r
+       {d68000_rol_s_8      , 0xf1f8, 0xe118, 0x000},\r
+       {d68000_rol_s_16     , 0xf1f8, 0xe158, 0x000},\r
+       {d68000_rol_s_32     , 0xf1f8, 0xe198, 0x000},\r
+       {d68000_rol_r_8      , 0xf1f8, 0xe138, 0x000},\r
+       {d68000_rol_r_16     , 0xf1f8, 0xe178, 0x000},\r
+       {d68000_rol_r_32     , 0xf1f8, 0xe1b8, 0x000},\r
+       {d68000_rol_ea       , 0xffc0, 0xe7c0, 0x3f8},\r
+       {d68000_roxr_s_8     , 0xf1f8, 0xe010, 0x000},\r
+       {d68000_roxr_s_16    , 0xf1f8, 0xe050, 0x000},\r
+       {d68000_roxr_s_32    , 0xf1f8, 0xe090, 0x000},\r
+       {d68000_roxr_r_8     , 0xf1f8, 0xe030, 0x000},\r
+       {d68000_roxr_r_16    , 0xf1f8, 0xe070, 0x000},\r
+       {d68000_roxr_r_32    , 0xf1f8, 0xe0b0, 0x000},\r
+       {d68000_roxr_ea      , 0xffc0, 0xe4c0, 0x3f8},\r
+       {d68000_roxl_s_8     , 0xf1f8, 0xe110, 0x000},\r
+       {d68000_roxl_s_16    , 0xf1f8, 0xe150, 0x000},\r
+       {d68000_roxl_s_32    , 0xf1f8, 0xe190, 0x000},\r
+       {d68000_roxl_r_8     , 0xf1f8, 0xe130, 0x000},\r
+       {d68000_roxl_r_16    , 0xf1f8, 0xe170, 0x000},\r
+       {d68000_roxl_r_32    , 0xf1f8, 0xe1b0, 0x000},\r
+       {d68000_roxl_ea      , 0xffc0, 0xe5c0, 0x3f8},\r
+       {d68010_rtd          , 0xffff, 0x4e74, 0x000},\r
+       {d68000_rte          , 0xffff, 0x4e73, 0x000},\r
+       {d68020_rtm          , 0xfff0, 0x06c0, 0x000},\r
+       {d68000_rtr          , 0xffff, 0x4e77, 0x000},\r
+       {d68000_rts          , 0xffff, 0x4e75, 0x000},\r
+       {d68000_sbcd_rr      , 0xf1f8, 0x8100, 0x000},\r
+       {d68000_sbcd_mm      , 0xf1f8, 0x8108, 0x000},\r
+       {d68000_scc          , 0xf0c0, 0x50c0, 0xbf8},\r
+       {d68000_stop         , 0xffff, 0x4e72, 0x000},\r
+       {d68000_sub_er_8     , 0xf1c0, 0x9000, 0xbff},\r
+       {d68000_sub_er_16    , 0xf1c0, 0x9040, 0xfff},\r
+       {d68000_sub_er_32    , 0xf1c0, 0x9080, 0xfff},\r
+       {d68000_sub_re_8     , 0xf1c0, 0x9100, 0x3f8},\r
+       {d68000_sub_re_16    , 0xf1c0, 0x9140, 0x3f8},\r
+       {d68000_sub_re_32    , 0xf1c0, 0x9180, 0x3f8},\r
+       {d68000_suba_16      , 0xf1c0, 0x90c0, 0xfff},\r
+       {d68000_suba_32      , 0xf1c0, 0x91c0, 0xfff},\r
+       {d68000_subi_8       , 0xffc0, 0x0400, 0xbf8},\r
+       {d68000_subi_16      , 0xffc0, 0x0440, 0xbf8},\r
+       {d68000_subi_32      , 0xffc0, 0x0480, 0xbf8},\r
+       {d68000_subq_8       , 0xf1c0, 0x5100, 0xbf8},\r
+       {d68000_subq_16      , 0xf1c0, 0x5140, 0xff8},\r
+       {d68000_subq_32      , 0xf1c0, 0x5180, 0xff8},\r
+       {d68000_subx_rr_8    , 0xf1f8, 0x9100, 0x000},\r
+       {d68000_subx_rr_16   , 0xf1f8, 0x9140, 0x000},\r
+       {d68000_subx_rr_32   , 0xf1f8, 0x9180, 0x000},\r
+       {d68000_subx_mm_8    , 0xf1f8, 0x9108, 0x000},\r
+       {d68000_subx_mm_16   , 0xf1f8, 0x9148, 0x000},\r
+       {d68000_subx_mm_32   , 0xf1f8, 0x9188, 0x000},\r
+       {d68000_swap         , 0xfff8, 0x4840, 0x000},\r
+       {d68000_tas          , 0xffc0, 0x4ac0, 0xbf8},\r
+       {d68000_trap         , 0xfff0, 0x4e40, 0x000},\r
+       {d68020_trapcc_0     , 0xf0ff, 0x50fc, 0x000},\r
+       {d68020_trapcc_16    , 0xf0ff, 0x50fa, 0x000},\r
+       {d68020_trapcc_32    , 0xf0ff, 0x50fb, 0x000},\r
+       {d68000_trapv        , 0xffff, 0x4e76, 0x000},\r
+       {d68000_tst_8        , 0xffc0, 0x4a00, 0xbf8},\r
+       {d68020_tst_pcdi_8   , 0xffff, 0x4a3a, 0x000},\r
+       {d68020_tst_pcix_8   , 0xffff, 0x4a3b, 0x000},\r
+       {d68020_tst_i_8      , 0xffff, 0x4a3c, 0x000},\r
+       {d68000_tst_16       , 0xffc0, 0x4a40, 0xbf8},\r
+       {d68020_tst_a_16     , 0xfff8, 0x4a48, 0x000},\r
+       {d68020_tst_pcdi_16  , 0xffff, 0x4a7a, 0x000},\r
+       {d68020_tst_pcix_16  , 0xffff, 0x4a7b, 0x000},\r
+       {d68020_tst_i_16     , 0xffff, 0x4a7c, 0x000},\r
+       {d68000_tst_32       , 0xffc0, 0x4a80, 0xbf8},\r
+       {d68020_tst_a_32     , 0xfff8, 0x4a88, 0x000},\r
+       {d68020_tst_pcdi_32  , 0xffff, 0x4aba, 0x000},\r
+       {d68020_tst_pcix_32  , 0xffff, 0x4abb, 0x000},\r
+       {d68020_tst_i_32     , 0xffff, 0x4abc, 0x000},\r
+       {d68000_unlk         , 0xfff8, 0x4e58, 0x000},\r
+       {d68020_unpk_rr      , 0xf1f8, 0x8180, 0x000},\r
+       {d68020_unpk_mm      , 0xf1f8, 0x8188, 0x000},\r
+       {0, 0, 0, 0}\r
+};\r
+\r
+/* Check if opcode is using a valid ea mode */\r
+static int valid_ea(uint opcode, uint mask)\r
+{\r
+       if(mask == 0)\r
+               return 1;\r
+\r
+       switch(opcode & 0x3f)\r
+       {\r
+               case 0x00: case 0x01: case 0x02: case 0x03:\r
+               case 0x04: case 0x05: case 0x06: case 0x07:\r
+                       return (mask & 0x800) != 0;\r
+               case 0x08: case 0x09: case 0x0a: case 0x0b:\r
+               case 0x0c: case 0x0d: case 0x0e: case 0x0f:\r
+                       return (mask & 0x400) != 0;\r
+               case 0x10: case 0x11: case 0x12: case 0x13:\r
+               case 0x14: case 0x15: case 0x16: case 0x17:\r
+                       return (mask & 0x200) != 0;\r
+               case 0x18: case 0x19: case 0x1a: case 0x1b:\r
+               case 0x1c: case 0x1d: case 0x1e: case 0x1f:\r
+                       return (mask & 0x100) != 0;\r
+               case 0x20: case 0x21: case 0x22: case 0x23:\r
+               case 0x24: case 0x25: case 0x26: case 0x27:\r
+                       return (mask & 0x080) != 0;\r
+               case 0x28: case 0x29: case 0x2a: case 0x2b:\r
+               case 0x2c: case 0x2d: case 0x2e: case 0x2f:\r
+                       return (mask & 0x040) != 0;\r
+               case 0x30: case 0x31: case 0x32: case 0x33:\r
+               case 0x34: case 0x35: case 0x36: case 0x37:\r
+                       return (mask & 0x020) != 0;\r
+               case 0x38:\r
+                       return (mask & 0x010) != 0;\r
+               case 0x39:\r
+                       return (mask & 0x008) != 0;\r
+               case 0x3a:\r
+                       return (mask & 0x002) != 0;\r
+               case 0x3b:\r
+                       return (mask & 0x001) != 0;\r
+               case 0x3c:\r
+                       return (mask & 0x004) != 0;\r
+       }\r
+       return 0;\r
+\r
+}\r
+\r
+/* Used by qsort */\r
+static int DECL_SPEC compare_nof_true_bits(const void *aptr, const void *bptr)\r
+{\r
+       uint a = ((const opcode_struct*)aptr)->mask;\r
+       uint b = ((const opcode_struct*)bptr)->mask;\r
+\r
+       a = ((a & 0xAAAA) >> 1) + (a & 0x5555);\r
+       a = ((a & 0xCCCC) >> 2) + (a & 0x3333);\r
+       a = ((a & 0xF0F0) >> 4) + (a & 0x0F0F);\r
+       a = ((a & 0xFF00) >> 8) + (a & 0x00FF);\r
+\r
+       b = ((b & 0xAAAA) >> 1) + (b & 0x5555);\r
+       b = ((b & 0xCCCC) >> 2) + (b & 0x3333);\r
+       b = ((b & 0xF0F0) >> 4) + (b & 0x0F0F);\r
+       b = ((b & 0xFF00) >> 8) + (b & 0x00FF);\r
+\r
+       return b - a; /* reversed to get greatest to least sorting */\r
+}\r
+\r
+/* build the opcode handler jump table */\r
+static void build_opcode_table(void)\r
+{\r
+       uint i;\r
+       uint opcode;\r
+       opcode_struct* ostruct;\r
+       uint opcode_info_length = 0;\r
+\r
+       for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)\r
+               opcode_info_length++;\r
+\r
+       qsort((void *)g_opcode_info, opcode_info_length, sizeof(g_opcode_info[0]), compare_nof_true_bits);\r
+\r
+       for(i=0;i<0x10000;i++)\r
+       {\r
+               g_instruction_table[i] = d68000_illegal; /* default to illegal */\r
+               opcode = i;\r
+               /* search through opcode info for a match */\r
+               for(ostruct = g_opcode_info;ostruct->opcode_handler != 0;ostruct++)\r
+               {\r
+                       /* match opcode mask and allowed ea modes */\r
+                       if((opcode & ostruct->mask) == ostruct->match)\r
+                       {\r
+                               /* Handle destination ea for move instructions */\r
+                               if((ostruct->opcode_handler == d68000_move_8 ||\r
+                                        ostruct->opcode_handler == d68000_move_16 ||\r
+                                        ostruct->opcode_handler == d68000_move_32) &&\r
+                                        !valid_ea(((opcode>>9)&7) | ((opcode>>3)&0x38), 0xbf8))\r
+                                               continue;\r
+                               if(valid_ea(opcode, ostruct->ea_mask))\r
+                               {\r
+                                       g_instruction_table[i] = ostruct->opcode_handler;\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================= API ================================== */\r
+/* ======================================================================== */\r
+\r
+/* Disasemble one instruction at pc and store in str_buff */\r
+unsigned int m68k_disassemble(char* str_buff, unsigned int pc, unsigned int cpu_type)\r
+{\r
+       if(!g_initialized)\r
+       {\r
+               build_opcode_table();\r
+               g_initialized = 1;\r
+       }\r
+       switch(cpu_type)\r
+       {\r
+               case M68K_CPU_TYPE_68000:\r
+                       g_cpu_type = TYPE_68000;\r
+                       g_address_mask = 0x00ffffff;\r
+                       break;\r
+               case M68K_CPU_TYPE_68010:\r
+                       g_cpu_type = TYPE_68010;\r
+                       g_address_mask = 0x00ffffff;\r
+                       break;\r
+               case M68K_CPU_TYPE_68EC020:\r
+                       g_cpu_type = TYPE_68020;\r
+                       g_address_mask = 0x00ffffff;\r
+                       break;\r
+               case M68K_CPU_TYPE_68020:\r
+                       g_cpu_type = TYPE_68020;\r
+                       g_address_mask = 0xffffffff;\r
+                       break;\r
+               case M68K_CPU_TYPE_68030:\r
+                       g_cpu_type = TYPE_68030;\r
+                       g_address_mask = 0xffffffff;\r
+                       break;\r
+               case M68K_CPU_TYPE_68040:\r
+                       g_cpu_type = TYPE_68040;\r
+                       g_address_mask = 0xffffffff;\r
+                       break;\r
+               default:\r
+                       return 0;\r
+       }\r
+\r
+       g_cpu_pc = pc;\r
+       g_helper_str[0] = 0;\r
+       g_cpu_ir = read_imm_16();\r
+       g_instruction_table[g_cpu_ir]();\r
+       sprintf(str_buff, "%s%s", g_dasm_str, g_helper_str);\r
+       return g_cpu_pc - pc;\r
+}\r
+\r
+char* m68ki_disassemble_quick(unsigned int pc, unsigned int cpu_type)\r
+{\r
+       static char buff[100];\r
+       buff[0] = 0;\r
+       m68k_disassemble(buff, pc, cpu_type);\r
+       return buff;\r
+}\r
+\r
+/* Check if the instruction is a valid one */\r
+unsigned int m68k_is_valid_instruction(unsigned int instruction, unsigned int cpu_type)\r
+{\r
+       if(!g_initialized)\r
+       {\r
+               build_opcode_table();\r
+               g_initialized = 1;\r
+       }\r
+\r
+       instruction &= 0xffff;\r
+       if(g_instruction_table[instruction] == d68000_illegal)\r
+               return 0;\r
+\r
+       switch(cpu_type)\r
+       {\r
+               case M68K_CPU_TYPE_68000:\r
+                       if(g_instruction_table[instruction] == d68010_bkpt)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_move_fr_ccr)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_movec)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_moves_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_moves_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_moves_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68010_rtd)\r
+                               return 0;\r
+               case M68K_CPU_TYPE_68010:\r
+                       if(g_instruction_table[instruction] == d68020_bcc_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfchg)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfclr)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfexts)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfextu)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfffo)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfins)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bfset)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bftst)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bra_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_bsr_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_callm)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cas_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cas_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cas_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cas2_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cas2_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_chk_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_chk2_cmp2_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_chk2_cmp2_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_chk2_cmp2_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcdi_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcix_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcdi_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcix_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcdi_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cmpi_pcix_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpbcc_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpbcc_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpdbcc)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpgen)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cprestore)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpsave)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cpscc)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_0)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_cptrapcc_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_divl)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_extb_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_link_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_mull)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_pack_rr)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_pack_mm)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_rtm)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_trapcc_0)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_trapcc_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_trapcc_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcdi_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcix_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_i_8)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_a_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcdi_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcix_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_i_16)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_a_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcdi_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_pcix_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_tst_i_32)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_unpk_rr)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68020_unpk_mm)\r
+                               return 0;\r
+               case M68K_CPU_TYPE_68EC020:\r
+               case M68K_CPU_TYPE_68020:\r
+               case M68K_CPU_TYPE_68030:\r
+                       if(g_instruction_table[instruction] == d68040_cinv)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_cpush)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_move16_pi_pi)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_move16_pi_al)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_move16_al_pi)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_move16_ai_al)\r
+                               return 0;\r
+                       if(g_instruction_table[instruction] == d68040_move16_al_ai)\r
+                               return 0;\r
+       }\r
+       if(cpu_type != M68K_CPU_TYPE_68020 && cpu_type != M68K_CPU_TYPE_68EC020 &&\r
+         (g_instruction_table[instruction] == d68020_callm ||\r
+         g_instruction_table[instruction] == d68020_rtm))\r
+               return 0;\r
+\r
+       return 1;\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
diff --git a/src/m68kdasmAG.cpp b/src/m68kdasmAG.cpp
new file mode 100644 (file)
index 0000000..b254b2d
--- /dev/null
@@ -0,0 +1,2344 @@
+/*\r
+ *   A MC68000/MC68010 disassembler\r
+ *\r
+ *   Note: this is probably not the most efficient disassembler in the world :-)\r
+ *\r
+ *   This code written by Aaron Giles (agiles@sirius.com) for the MAME project\r
+ *\r
+ */\r
+\r
+#include <string.h>\r
+#include <stdio.h>\r
+\r
+static char *ccodes[16] = { "T ", "F ", "HI", "LS", "CC", "CS", "NE", "EQ", "VC", "VS", "PL", "MI", "GE", "LT", "GT", "LE" };\r
+\r
+#define PARAM_WORD(v) ((v) = *(unsigned short *)&p[0], p += 2)\r
+#define PARAM_LONG(v) ((v) = (*(unsigned short *)&p[0] << 16) + *(unsigned short *)&p[2], p += 4)\r
+\r
+#ifdef LOGGING\r
+\r
+static char *MakeEA (int lo, char *pBase, int size, int *count)\r
+{\r
+       static char buffer[2][80];\r
+       static int which;\r
+\r
+       unsigned char *p = (unsigned char *)pBase;\r
+       char *buf = buffer[which];\r
+       int reg = lo & 7;\r
+       unsigned long pm;\r
+       int temp;\r
+\r
+       which ^= 1;\r
+       switch ((lo >> 3) & 7)\r
+       {\r
+               case 0:\r
+                       sprintf (buf, "D%d", reg);\r
+                       break;\r
+               case 1:\r
+                       sprintf (buf, "A%d", reg);\r
+                       break;\r
+               case 2:\r
+                       sprintf (buf, "(A%d)", reg);\r
+                       break;\r
+               case 3:\r
+                       sprintf (buf, "(A%d)+", reg);\r
+                       break;\r
+               case 4:\r
+                       sprintf (buf, "-(A%d)", reg);\r
+                       break;\r
+               case 5:\r
+                       PARAM_WORD (pm);\r
+                       if (pm & 0x8000)\r
+                               sprintf (buf, "(-$%X,A%d)", -(signed short)pm & 0xffff, reg);\r
+                       else\r
+                               sprintf (buf, "($%lX,A%d)", pm, reg);\r
+                       break;\r
+               case 6:\r
+                       PARAM_WORD (pm);\r
+                       temp = pm & 0xff;\r
+                       if (temp & 0x80)\r
+                               sprintf (buf, "(-$%X,A%d,D%ld.%c)", -(signed char)temp & 0xff, reg, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                       else\r
+                               sprintf (buf, "($%X,A%d,D%ld.%c)", temp, reg, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                       break;\r
+               case 7:\r
+                       switch (reg)\r
+                       {\r
+                               case 0:\r
+                                       PARAM_WORD (pm);\r
+                                       sprintf (buf, "$%lX", pm);\r
+                                       break;\r
+                               case 1:\r
+                                       PARAM_LONG (pm);\r
+                                       sprintf (buf, "$%lX", pm);\r
+                                       break;\r
+                               case 2:\r
+                                       PARAM_WORD (pm);\r
+                                       if (pm & 0x8000)\r
+                                               sprintf (buf, "(-$%X,PC)", -(signed short)pm & 0xffff);\r
+                                       else\r
+                                               sprintf (buf, "($%lX,PC)", pm);\r
+                                       break;\r
+                               case 3:\r
+                                       PARAM_WORD (pm);\r
+                                       temp = pm & 0xff;\r
+                                       if (temp & 0x80)\r
+                                               sprintf (buf, "(-$%X,PC,D%ld.%c)", -(signed char)temp & 0xff, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                                       else\r
+                                               sprintf (buf, "($%X,PC,D%ld.%c)", temp, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                                       break;\r
+                               case 4:\r
+                                       if (size == 1)\r
+                                       {\r
+                                               PARAM_WORD (pm);\r
+                                               temp = pm & 0xff;\r
+                                               sprintf (buf, "#$%X", temp);\r
+                                       }\r
+                                       else if (size == 2)\r
+                                       {\r
+                                               PARAM_WORD (pm);\r
+                                               sprintf (buf, "#$%lX", pm);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               PARAM_LONG (pm);\r
+                                               sprintf (buf, "#$%lX", pm);\r
+                                       }\r
+                                       break;\r
+                       }\r
+                       break;\r
+       }\r
+\r
+       *count = p - ((unsigned char*)pBase);\r
+       return buf;\r
+}\r
+\r
+static char *MakeRegList (char *p, unsigned short pm)\r
+{\r
+       int start = -1, sep = 0;\r
+       int i;\r
+\r
+       for (i = 0; i < 8; i++, pm >>= 1)\r
+       {\r
+               if ((pm & 1) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 1) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "D%d", start);\r
+                       else p += sprintf (p, "D%d-D%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "D7");\r
+               else p += sprintf (p, "D%d-D7", start);\r
+               start = -1;\r
+       }\r
+\r
+       for (i = 0; i < 8; i++, pm >>= 1)\r
+       {\r
+               if ((pm & 1) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 1) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "A%d", start);\r
+                       else p += sprintf (p, "A%d-A%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "A7");\r
+               else p += sprintf (p, "A%d-A7", start);\r
+       }\r
+\r
+       return p;\r
+}\r
+\r
+static char *MakeRevRegList (char *p, unsigned short pm)\r
+{\r
+       int start = -1, sep = 0;\r
+       int i;\r
+\r
+       for (i = 0; i < 8; i++, pm <<= 1)\r
+       {\r
+               if ((pm & 0x8000) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 0x8000) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "D%d", start);\r
+                       else p += sprintf (p, "D%d-D%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "D7");\r
+               else p += sprintf (p, "D%d-D7", start);\r
+               start = -1;\r
+       }\r
+\r
+       for (i = 0; i < 8; i++, pm <<= 1)\r
+       {\r
+               if ((pm & 0x8000) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 0x8000) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "A%d", start);\r
+                       else p += sprintf (p, "A%d-A%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "A7");\r
+               else p += sprintf (p, "A%d-A7", start);\r
+       }\r
+\r
+       return p;\r
+}\r
+\r
+\r
+int Dasm68000 (char *pBase, char *buffer, int pc)\r
+{\r
+       char *ea, *ea2, *p = pBase;\r
+       unsigned short op, lo, rhi, rlo;\r
+       unsigned long pm;\r
+       int count;\r
+\r
+       PARAM_WORD(op);\r
+\r
+       lo = op & 0x3f;\r
+       rhi = (op >> 9) & 7;\r
+       rlo = op & 7;\r
+       switch (op & 0xffc0)\r
+       {\r
+               case 0x0000:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ORI      #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ORI.B    #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0040:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ORI      #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ORI.W    #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0080:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ORI.L    #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0100: case 0x0300: case 0x0500: case 0x0700: case 0x0900: case 0x0b00: case 0x0d00: case 0x0f00:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.W  ($%lX,A%d),D%d", pm, rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BTST     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0140: case 0x0340: case 0x0540: case 0x0740: case 0x0940: case 0x0b40: case 0x0d40: case 0x0f40:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.L  ($%lX,A%d),D%d", pm, rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BCHG     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0180: case 0x0380: case 0x0580: case 0x0780: case 0x0980: case 0x0b80: case 0x0d80: case 0x0f80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.W  D%d,($%lX,A%d)", rhi, pm, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BCLR     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x01c0: case 0x03c0: case 0x05c0: case 0x07c0: case 0x09c0: case 0x0bc0: case 0x0dc0: case 0x0fc0:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.L  D%d,($%lX,A%d)", rhi, pm, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BSET     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0200:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ANDI     #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ANDI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0240:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ANDI     #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ANDI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0280:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ANDI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0400:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUBI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0440:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0480:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0600:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADDI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0640:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0680:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0800:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BTST     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0840:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BCHG     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0880:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BCLR     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x08c0:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BSET     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0a00:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "EORI     #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "EORI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0a40:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "EORI     #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "EORI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0a80:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "EORI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0c00:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CMPI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0c40:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMPI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0c80:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMPI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0e00:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.B  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.B  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.B  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.B  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x0e40:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.W  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.W  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.W  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.W  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x0e80:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.L  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.L  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.L  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.L  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x1000: case 0x1080: case 0x10c0: case 0x1100: case 0x1140: case 0x1180: case 0x11c0:\r
+               case 0x1200: case 0x1280: case 0x12c0: case 0x1300: case 0x1340: case 0x1380: case 0x13c0:\r
+               case 0x1400: case 0x1480: case 0x14c0: case 0x1500: case 0x1540: case 0x1580:\r
+               case 0x1600: case 0x1680: case 0x16c0: case 0x1700: case 0x1740: case 0x1780:\r
+               case 0x1800: case 0x1880: case 0x18c0: case 0x1900: case 0x1940: case 0x1980:\r
+               case 0x1a00: case 0x1a80: case 0x1ac0: case 0x1b00: case 0x1b40: case 0x1b80:\r
+               case 0x1c00: case 0x1c80: case 0x1cc0: case 0x1d00: case 0x1d40: case 0x1d80:\r
+               case 0x1e00: case 0x1e80: case 0x1ec0: case 0x1f00: case 0x1f40: case 0x1f80:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 1, &count); p += count;\r
+                       sprintf (buffer, "MOVE.B   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x2000: case 0x2080: case 0x20c0: case 0x2100: case 0x2140: case 0x2180: case 0x21c0:\r
+               case 0x2200: case 0x2280: case 0x22c0: case 0x2300: case 0x2340: case 0x2380: case 0x23c0:\r
+               case 0x2400: case 0x2480: case 0x24c0: case 0x2500: case 0x2540: case 0x2580:\r
+               case 0x2600: case 0x2680: case 0x26c0: case 0x2700: case 0x2740: case 0x2780:\r
+               case 0x2800: case 0x2880: case 0x28c0: case 0x2900: case 0x2940: case 0x2980:\r
+               case 0x2a00: case 0x2a80: case 0x2ac0: case 0x2b00: case 0x2b40: case 0x2b80:\r
+               case 0x2c00: case 0x2c80: case 0x2cc0: case 0x2d00: case 0x2d40: case 0x2d80:\r
+               case 0x2e00: case 0x2e80: case 0x2ec0: case 0x2f00: case 0x2f40: case 0x2f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 4, &count); p += count;\r
+                       sprintf (buffer, "MOVE.L   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x2040: case 0x2240: case 0x2440: case 0x2640: case 0x2840: case 0x2a40: case 0x2c40: case 0x2e40:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "MOVEA.L  %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x3000: case 0x3080: case 0x30c0: case 0x3100: case 0x3140: case 0x3180: case 0x31c0:\r
+               case 0x3200: case 0x3280: case 0x32c0: case 0x3300: case 0x3340: case 0x3380: case 0x33c0:\r
+               case 0x3400: case 0x3480: case 0x34c0: case 0x3500: case 0x3540: case 0x3580:\r
+               case 0x3600: case 0x3680: case 0x36c0: case 0x3700: case 0x3740: case 0x3780:\r
+               case 0x3800: case 0x3880: case 0x38c0: case 0x3900: case 0x3940: case 0x3980:\r
+               case 0x3a00: case 0x3a80: case 0x3ac0: case 0x3b00: case 0x3b40: case 0x3b80:\r
+               case 0x3c00: case 0x3c80: case 0x3cc0: case 0x3d00: case 0x3d40: case 0x3d80:\r
+               case 0x3e00: case 0x3e80: case 0x3ec0: case 0x3f00: case 0x3f40: case 0x3f80:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE.W   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x3040: case 0x3240: case 0x3440: case 0x3640: case 0x3840: case 0x3a40: case 0x3c40: case 0x3e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVEA.W  %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x4000:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NEGX.B   %s", ea);\r
+                       break;\r
+               case 0x4040:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NEGX.W   %s", ea);\r
+                       break;\r
+               case 0x4080:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NEGX.L   %s", ea);\r
+                       break;\r
+               case 0x40c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     SR,%s", ea);\r
+                       break;\r
+               case 0x4180: case 0x4380: case 0x4580: case 0x4780: case 0x4980: case 0x4b80: case 0x4d80: case 0x4f80:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CHK.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x41c0: case 0x43c0: case 0x45c0: case 0x47c0: case 0x49c0: case 0x4bc0: case 0x4dc0: case 0x4fc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "LEA      %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x4200:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CLR.B    %s", ea);\r
+                       break;\r
+               case 0x4240:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CLR.W    %s", ea);\r
+                       break;\r
+               case 0x4280:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CLR.L    %s", ea);\r
+                       break;\r
+               case 0x42c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     CCR,%s", ea);\r
+                       break;\r
+               case 0x4400:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NEG.B    %s", ea);\r
+                       break;\r
+               case 0x4440:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NEG.W    %s", ea);\r
+                       break;\r
+               case 0x4480:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NEG.L    %s", ea);\r
+                       break;\r
+               case 0x44c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     %s,CCR", ea);\r
+                       break;\r
+               case 0x4600:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NOT.B    %s", ea);\r
+                       break;\r
+               case 0x4640:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NOT.W    %s", ea);\r
+                       break;\r
+               case 0x4680:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NOT.L    %s", ea);\r
+                       break;\r
+               case 0x46c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     %s,SR", ea);\r
+                       break;\r
+               case 0x4800:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NBCD.B   %s", ea);\r
+                       break;\r
+               case 0x4840:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "SWAP     D%d", rlo);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "PEA      %s", ea);\r
+                       }\r
+                       break;\r
+               case 0x4880:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "EXT.W    D%d", rlo);\r
+                       else\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.W  ");\r
+                               if ((lo & 0x38) != 0x20) b = MakeRegList (b, pm);\r
+                               else b = MakeRevRegList (b, pm);\r
+                               sprintf (b, ",%s", ea);\r
+                       }\r
+                       break;\r
+               case 0x48c0:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "EXT.L    D%d", rlo);\r
+                       else\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.L  ");\r
+                               if ((lo & 0x38) != 0x20) b = MakeRegList (b, pm);\r
+                               else b = MakeRevRegList (b, pm);\r
+                               sprintf (b, ",%s", ea);\r
+                       }\r
+                       break;\r
+               case 0x4a00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "TST.B    %s", ea);\r
+                       break;\r
+               case 0x4a40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "TST.W    %s", ea);\r
+                       break;\r
+               case 0x4a80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "TST.L    %s", ea);\r
+                       break;\r
+               case 0x4ac0:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "TAS.B    %s", ea);\r
+                       break;\r
+               case 0x4c80:\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.W  %s,", ea);\r
+                               b = MakeRegList (b, pm);\r
+                       }\r
+                       break;\r
+               case 0x4cc0:\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.L  %s,", ea);\r
+                               b = MakeRegList (b, pm);\r
+                       }\r
+                       break;\r
+               case 0x4e40:\r
+                       if ((lo & 30) == 0x00)\r
+                               sprintf (buffer, "TRAP     #$%X", lo & 15);\r
+                       else if ((lo & 0x38) == 0x10)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               sprintf (buffer, "LINK     A%d,#$%lX", rlo, pm);\r
+                       }\r
+                       else if ((lo & 0x38) == 0x18)\r
+                       {\r
+                               sprintf (buffer, "UNLK     A%d", rlo);\r
+                       }\r
+                       else if ((lo & 0x38) == 0x20)\r
+                               sprintf (buffer, "MOVE     A%d,USP", rlo);\r
+                       else if ((lo & 0x38) == 0x28)\r
+                               sprintf (buffer, "MOVE     USP,A%d", rlo);\r
+                       else if (lo == 0x30)\r
+                               sprintf (buffer, "RESET");\r
+                       else if (lo == 0x31)\r
+                               sprintf (buffer, "NOP");\r
+                       else if (lo == 0x32)\r
+                               sprintf (buffer, "STOP");\r
+                       else if (lo == 0x33)\r
+                               sprintf (buffer, "RTE");\r
+                       else if (lo == 0x35)\r
+                               sprintf (buffer, "RTS");\r
+                       else if (lo == 0x36)\r
+                               sprintf (buffer, "TRAPV");\r
+                       else if (lo == 0x37)\r
+                               sprintf (buffer, "RTR");\r
+                       else if (lo == 0x3a)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               switch (pm & 0xfff)\r
+                               {\r
+                                       case 0x000:     ea = "SFC";     break;\r
+                                       case 0x001:     ea = "DFC"; break;\r
+                                       case 0x800: ea = "USP"; break;\r
+                                       case 0x801: ea = "VBR"; break;\r
+                                       default: ea = "???"; break;\r
+                               }\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVEC    %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVEC    %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       else if (lo == 0x3b)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               switch (pm & 0xfff)\r
+                               {\r
+                                       case 0x000:     ea = "SFC";     break;\r
+                                       case 0x001:     ea = "DFC"; break;\r
+                                       case 0x800: ea = "USP"; break;\r
+                                       case 0x801: ea = "VBR"; break;\r
+                                       default: ea = "???"; break;\r
+                               }\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVEC    A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVEC    D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                               sprintf (buffer, "DC.W     $%X", op);\r
+                       break;\r
+               case 0x4e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "JSR      %s", ea);\r
+                       break;\r
+               case 0x4ec0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "JMP      %s", ea);\r
+                       break;\r
+               case 0x5000: case 0x5200: case 0x5400: case 0x5600: case 0x5800: case 0x5a00: case 0x5c00: case 0x5e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.B   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5040: case 0x5240: case 0x5440: case 0x5640: case 0x5840: case 0x5a40: case 0x5c40: case 0x5e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.W   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5080: case 0x5280: case 0x5480: case 0x5680: case 0x5880: case 0x5a80: case 0x5c80: case 0x5e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.L   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x50c0: case 0x52c0: case 0x54c0: case 0x56c0: case 0x58c0: case 0x5ac0: case 0x5cc0: case 0x5ec0:\r
+               case 0x51c0: case 0x53c0: case 0x55c0: case 0x57c0: case 0x59c0: case 0x5bc0: case 0x5dc0: case 0x5fc0:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "DB%s     D%d,*-$%X [%X]", ccodes[(op >> 8) & 15], rlo, (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "DB%s     D%d,*+$%lX [%lX]", ccodes[(op >> 8) & 15], rlo, pm - 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "S%s.B    %s", ccodes[(op >> 8) & 15], ea);\r
+                       }\r
+                       break;\r
+               case 0x5100: case 0x5300: case 0x5500: case 0x5700: case 0x5900: case 0x5b00: case 0x5d00: case 0x5f00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.B   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5140: case 0x5340: case 0x5540: case 0x5740: case 0x5940: case 0x5b40: case 0x5d40: case 0x5f40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.W   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5180: case 0x5380: case 0x5580: case 0x5780: case 0x5980: case 0x5b80: case 0x5d80: case 0x5f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.L   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x6000: case 0x6040: case 0x6080: case 0x60c0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "BRA      *-$%X [%X]", (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BRA      *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "BRA.S    *-$%X [%X]", (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BRA.S    *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x6100: case 0x6140: case 0x6180: case 0x61c0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "BSR      *-$%X [%X]", (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BSR      *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "BSR.S    *-$%X [%X]", (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BSR.S    *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x6200: case 0x6240: case 0x6280: case 0x62c0: case 0x6300: case 0x6340: case 0x6380: case 0x63c0:\r
+               case 0x6400: case 0x6440: case 0x6480: case 0x64c0: case 0x6500: case 0x6540: case 0x6580: case 0x65c0:\r
+               case 0x6600: case 0x6640: case 0x6680: case 0x66c0: case 0x6700: case 0x6740: case 0x6780: case 0x67c0:\r
+               case 0x6800: case 0x6840: case 0x6880: case 0x68c0: case 0x6900: case 0x6940: case 0x6980: case 0x69c0:\r
+               case 0x6a00: case 0x6a40: case 0x6a80: case 0x6ac0: case 0x6b00: case 0x6b40: case 0x6b80: case 0x6bc0:\r
+               case 0x6c00: case 0x6c40: case 0x6c80: case 0x6cc0: case 0x6d00: case 0x6d40: case 0x6d80: case 0x6dc0:\r
+               case 0x6e00: case 0x6e40: case 0x6e80: case 0x6ec0: case 0x6f00: case 0x6f40: case 0x6f80: case 0x6fc0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "B%s      *-$%X [%X]", ccodes[(op >> 8) & 15], (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "B%s      *+$%lX [%lX]", ccodes[(op >> 8) & 15], pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "B%s.S    *-$%X [%X]", ccodes[(op >> 8) & 15], (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "B%s.S    *+$%lX [%lX]", ccodes[(op >> 8) & 15], pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x7000: case 0x7040: case 0x7080: case 0x70c0:\r
+               case 0x7200: case 0x7240: case 0x7280: case 0x72c0:\r
+               case 0x7400: case 0x7440: case 0x7480: case 0x74c0:\r
+               case 0x7600: case 0x7640: case 0x7680: case 0x76c0:\r
+               case 0x7800: case 0x7840: case 0x7880: case 0x78c0:\r
+               case 0x7a00: case 0x7a40: case 0x7a80: case 0x7ac0:\r
+               case 0x7c00: case 0x7c40: case 0x7c80: case 0x7cc0:\r
+               case 0x7e00: case 0x7e40: case 0x7e80: case 0x7ec0:\r
+                       pm = op & 0xff;\r
+                       if (pm & 0x80)\r
+                               sprintf (buffer, "MOVEQ    #$-%X,D%d", -(signed char)pm, rhi);\r
+                       else\r
+                               sprintf (buffer, "MOVEQ    #$%lX,D%d", pm, rhi);\r
+                       break;\r
+               case 0x8000: case 0x8200: case 0x8400: case 0x8600: case 0x8800: case 0x8a00: case 0x8c00: case 0x8e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "OR.B     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8040: case 0x8240: case 0x8440: case 0x8640: case 0x8840: case 0x8a40: case 0x8c40: case 0x8e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "OR.W     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8080: case 0x8280: case 0x8480: case 0x8680: case 0x8880: case 0x8a80: case 0x8c80: case 0x8e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "OR.L     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x80c0: case 0x82c0: case 0x84c0: case 0x86c0: case 0x88c0: case 0x8ac0: case 0x8cc0: case 0x8ec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "DIVU.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8100: case 0x8300: case 0x8500: case 0x8700: case 0x8900: case 0x8b00: case 0x8d00: case 0x8f00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "OR.B     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x8140: case 0x8340: case 0x8540: case 0x8740: case 0x8940: case 0x8b40: case 0x8d40: case 0x8f40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "OR.W     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x8180: case 0x8380: case 0x8580: case 0x8780: case 0x8980: case 0x8b80: case 0x8d80: case 0x8f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "OR.L     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x81c0: case 0x83c0: case 0x85c0: case 0x87c0: case 0x89c0: case 0x8bc0: case 0x8dc0: case 0x8fc0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "DIVS.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9000: case 0x9200: case 0x9400: case 0x9600: case 0x9800: case 0x9a00: case 0x9c00: case 0x9e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUB.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9040: case 0x9240: case 0x9440: case 0x9640: case 0x9840: case 0x9a40: case 0x9c40: case 0x9e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUB.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9080: case 0x9280: case 0x9480: case 0x9680: case 0x9880: case 0x9a80: case 0x9c80: case 0x9e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUB.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x90c0: case 0x92c0: case 0x94c0: case 0x96c0: case 0x98c0: case 0x9ac0: case 0x9cc0: case 0x9ec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x9100: case 0x9300: case 0x9500: case 0x9700: case 0x9900: case 0x9b00: case 0x9d00: case 0x9f00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1,&count); p += count;\r
+                               sprintf (buffer, "SUB.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x9140: case 0x9340: case 0x9540: case 0x9740: case 0x9940: case 0x9b40: case 0x9d40: case 0x9f40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.W   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.W   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "SUB.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x9180: case 0x9380: case 0x9580: case 0x9780: case 0x9980: case 0x9b80: case 0x9d80: case 0x9f80:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.L   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.L   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "SUB.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x91c0: case 0x93c0: case 0x95c0: case 0x97c0: case 0x99c0: case 0x9bc0: case 0x9dc0: case 0x9fc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xb000: case 0xb200: case 0xb400: case 0xb600: case 0xb800: case 0xba00: case 0xbc00: case 0xbe00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CMP.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb040: case 0xb240: case 0xb440: case 0xb640: case 0xb840: case 0xba40: case 0xbc40: case 0xbe40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMP.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb080: case 0xb280: case 0xb480: case 0xb680: case 0xb880: case 0xba80: case 0xbc80: case 0xbe80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMP.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb0c0: case 0xb2c0: case 0xb4c0: case 0xb6c0: case 0xb8c0: case 0xbac0: case 0xbcc0: case 0xbec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMPA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xb100: case 0xb300: case 0xb500: case 0xb700: case 0xb900: case 0xbb00: case 0xbd00: case 0xbf00:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.B   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "EOR.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb140: case 0xb340: case 0xb540: case 0xb740: case 0xb940: case 0xbb40: case 0xbd40: case 0xbf40:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.W   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "EOR.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb180: case 0xb380: case 0xb580: case 0xb780: case 0xb980: case 0xbb80: case 0xbd80: case 0xbf80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.L   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "EOR.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb1c0: case 0xb3c0: case 0xb5c0: case 0xb7c0: case 0xb9c0: case 0xbbc0: case 0xbdc0: case 0xbfc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMPA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xc000: case 0xc200: case 0xc400: case 0xc600: case 0xc800: case 0xca00: case 0xcc00: case 0xce00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "AND.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc040: case 0xc240: case 0xc440: case 0xc640: case 0xc840: case 0xca40: case 0xcc40: case 0xce40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "AND.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc080: case 0xc280: case 0xc480: case 0xc680: case 0xc880: case 0xca80: case 0xcc80: case 0xce80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "AND.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc0c0: case 0xc2c0: case 0xc4c0: case 0xc6c0: case 0xc8c0: case 0xcac0: case 0xccc0: case 0xcec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MULU.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc100: case 0xc300: case 0xc500: case 0xc700: case 0xc900: case 0xcb00: case 0xcd00: case 0xcf00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ABCD.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ABCD.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "AND.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc140: case 0xc340: case 0xc540: case 0xc740: case 0xc940: case 0xcb40: case 0xcd40: case 0xcf40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "EXG      A%d,A%d", rhi, rlo);\r
+                               else\r
+                                       sprintf (buffer, "EXG      D%d,D%d", rhi, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2,&count); p += count;\r
+                               sprintf (buffer, "AND.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc180: case 0xc380: case 0xc580: case 0xc780: case 0xc980: case 0xcb80: case 0xcd80: case 0xcf80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "EXG      D%d,A%d", rhi, rlo);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "AND.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc1c0: case 0xc3c0: case 0xc5c0: case 0xc7c0: case 0xc9c0: case 0xcbc0: case 0xcdc0: case 0xcfc0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MULS.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd000: case 0xd200: case 0xd400: case 0xd600: case 0xd800: case 0xda00: case 0xdc00: case 0xde00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADD.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd040: case 0xd240: case 0xd440: case 0xd640: case 0xd840: case 0xda40: case 0xdc40: case 0xde40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADD.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd080: case 0xd280: case 0xd480: case 0xd680: case 0xd880: case 0xda80: case 0xdc80: case 0xde80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADD.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd0c0: case 0xd2c0: case 0xd4c0: case 0xd6c0: case 0xd8c0: case 0xdac0: case 0xdcc0: case 0xdec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xd100: case 0xd300: case 0xd500: case 0xd700: case 0xd900: case 0xdb00: case 0xdd00: case 0xdf00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ADD.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd140: case 0xd340: case 0xd540: case 0xd740: case 0xd940: case 0xdb40: case 0xdd40: case 0xdf40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.W   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.W   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ADD.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd180: case 0xd380: case 0xd580: case 0xd780: case 0xd980: case 0xdb80: case 0xdd80: case 0xdf80:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.L   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.L   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4,&count); p += count;\r
+                               sprintf (buffer, "ADD.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd1c0: case 0xd3c0: case 0xd5c0: case 0xd7c0: case 0xd9c0: case 0xdbc0: case 0xddc0: case 0xdfc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xe000: case 0xe200: case 0xe400: case 0xe600: case 0xe800: case 0xea00: case 0xec00: case 0xee00:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.B   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.B   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.B    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe040: case 0xe240: case 0xe440: case 0xe640: case 0xe840: case 0xea40: case 0xec40: case 0xee40:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.W   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.W   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.W    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe080: case 0xe280: case 0xe480: case 0xe680: case 0xe880: case 0xea80: case 0xec80: case 0xee80:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.L   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.L   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.L    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe0c0: case 0xe2c0: case 0xe4c0: case 0xe6c0:\r
+               case 0xe1c0: case 0xe3c0: case 0xe5c0: case 0xe7c0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       switch ((op >> 8) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.L    #1,%s", ea);         break;\r
+                               case 1: sprintf (buffer, "ASL.L    #1,%s", ea);         break;\r
+                               case 2: sprintf (buffer, "LSR.L    #1,%s", ea);         break;\r
+                               case 3: sprintf (buffer, "LSL.L    #1,%s", ea);         break;\r
+                               case 4: sprintf (buffer, "ROXR.L   #1,%s", ea);         break;\r
+                               case 5: sprintf (buffer, "ROXL.L   #1,%s", ea);         break;\r
+                               case 6: sprintf (buffer, "ROR.L    #1,%s", ea);         break;\r
+                               case 7: sprintf (buffer, "ROL.L    #1,%s", ea);         break;\r
+                       }\r
+                       break;\r
+               case 0xe100: case 0xe300: case 0xe500: case 0xe700: case 0xe900: case 0xeb00: case 0xed00: case 0xef00:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.B   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.B   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.B    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe140: case 0xe340: case 0xe540: case 0xe740: case 0xe940: case 0xeb40: case 0xed40: case 0xef40:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.W   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.W   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.W    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe180: case 0xe380: case 0xe580: case 0xe780: case 0xe980: case 0xeb80: case 0xed80: case 0xef80:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.L   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.L   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.L    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               default:\r
+                       sprintf (buffer, "DC.W     $%X", op);\r
+                       break;\r
+       }\r
+\r
+       return p - pBase;\r
+}\r
+\r
+#else\r
+\r
+static char *MakeEA (int lo, char *pBase, int size, int *count)\r
+{\r
+       static char buffer[2][80];\r
+       static int which;\r
+\r
+       unsigned char *p = (unsigned char *)pBase;\r
+       char *buf = buffer[which];\r
+       int reg = lo & 7;\r
+       unsigned long pm;\r
+       int temp;\r
+\r
+       which ^= 1;\r
+       switch ((lo >> 3) & 7)\r
+       {\r
+               case 0:\r
+                       sprintf (buf, "D%d", reg);\r
+                       break;\r
+               case 1:\r
+                       sprintf (buf, "A%d", reg);\r
+                       break;\r
+               case 2:\r
+                       sprintf (buf, "(A%d)", reg);\r
+                       break;\r
+               case 3:\r
+                       sprintf (buf, "(A%d)+", reg);\r
+                       break;\r
+               case 4:\r
+                       sprintf (buf, "-(A%d)", reg);\r
+                       break;\r
+               case 5:\r
+                       PARAM_WORD (pm);\r
+                       if (pm & 0x8000)\r
+                               sprintf (buf, "(-$%X,A%d)", -(signed short)pm & 0xffff, reg);\r
+                       else\r
+                               sprintf (buf, "($%lX,A%d)", pm, reg);\r
+                       break;\r
+               case 6:\r
+                       PARAM_WORD (pm);\r
+                       temp = pm & 0xff;\r
+                       if (temp & 0x80)\r
+                               sprintf (buf, "(-$%X,A%d,D%ld.%c)", -(signed char)temp & 0xff, reg, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                       else\r
+                               sprintf (buf, "($%X,A%d,D%ld.%c)", temp, reg, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                       break;\r
+               case 7:\r
+                       switch (reg)\r
+                       {\r
+                               case 0:\r
+                                       PARAM_WORD (pm);\r
+                                       sprintf (buf, "$%lX", pm);\r
+                                       break;\r
+                               case 1:\r
+                                       PARAM_LONG (pm);\r
+                                       sprintf (buf, "$%lX", pm);\r
+                                       break;\r
+                               case 2:\r
+                                       PARAM_WORD (pm);\r
+                                       if (pm & 0x8000)\r
+                                               sprintf (buf, "(-$%X,PC)", -(signed short)pm & 0xffff);\r
+                                       else\r
+                                               sprintf (buf, "($%lX,PC)", pm);\r
+                                       break;\r
+                               case 3:\r
+                                       PARAM_WORD (pm);\r
+                                       temp = pm & 0xff;\r
+                                       if (temp & 0x80)\r
+                                               sprintf (buf, "(-$%X,PC,D%ld.%c)", -(signed char)temp & 0xff, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                                       else\r
+                                               sprintf (buf, "($%X,PC,D%ld.%c)", temp, (pm >> 12) & 7, (pm & 800) ? 'L' : 'W');\r
+                                       break;\r
+                               case 4:\r
+                                       if (size == 1)\r
+                                       {\r
+                                               PARAM_WORD (pm);\r
+                                               temp = pm & 0xff;\r
+                                               sprintf (buf, "#$%X", temp);\r
+                                       }\r
+                                       else if (size == 2)\r
+                                       {\r
+                                               PARAM_WORD (pm);\r
+                                               sprintf (buf, "#$%lX", pm);\r
+                                       }\r
+                                       else\r
+                                       {\r
+                                               PARAM_LONG (pm);\r
+                                               sprintf (buf, "#$%lX", pm);\r
+                                       }\r
+                                       break;\r
+                       }\r
+                       break;\r
+       }\r
+\r
+       *count = p - ((unsigned char*)pBase);\r
+       return buf;\r
+}\r
+\r
+static char *MakeRegList (char *p, unsigned short pm)\r
+{\r
+       int start = -1, sep = 0;\r
+       int i;\r
+\r
+       for (i = 0; i < 8; i++, pm >>= 1)\r
+       {\r
+               if ((pm & 1) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 1) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "D%d", start);\r
+                       else p += sprintf (p, "D%d-D%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "D7");\r
+               else p += sprintf (p, "D%d-D7", start);\r
+               start = -1;\r
+       }\r
+\r
+       for (i = 0; i < 8; i++, pm >>= 1)\r
+       {\r
+               if ((pm & 1) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 1) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "A%d", start);\r
+                       else p += sprintf (p, "A%d-A%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "A7");\r
+               else p += sprintf (p, "A%d-A7", start);\r
+       }\r
+\r
+       return p;\r
+}\r
+\r
+static char *MakeRevRegList (char *p, unsigned short pm)\r
+{\r
+       int start = -1, sep = 0;\r
+       int i;\r
+\r
+       for (i = 0; i < 8; i++, pm <<= 1)\r
+       {\r
+               if ((pm & 0x8000) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 0x8000) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "D%d", start);\r
+                       else p += sprintf (p, "D%d-D%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "D7");\r
+               else p += sprintf (p, "D%d-D7", start);\r
+               start = -1;\r
+       }\r
+\r
+       for (i = 0; i < 8; i++, pm <<= 1)\r
+       {\r
+               if ((pm & 0x8000) && start == -1)\r
+                       start = i;\r
+               else if (!(pm & 0x8000) && start != -1)\r
+               {\r
+                       if (sep++) p += sprintf (p, "/");\r
+                       if (start == i - 1) p += sprintf (p, "A%d", start);\r
+                       else p += sprintf (p, "A%d-A%d", start, i - 1);\r
+                       start = -1;\r
+               }\r
+       }\r
+       if (start != -1)\r
+       {\r
+               if (sep++) p += sprintf (p, "/");\r
+               if (start == 7) p += sprintf (p, "A7");\r
+               else p += sprintf (p, "A%d-A7", start);\r
+       }\r
+\r
+       return p;\r
+}\r
+\r
+\r
+int Dasm68000 (char *pBase, char *buffer, int pc)\r
+{\r
+       char *ea, *ea2, *p = pBase;\r
+       unsigned short op, lo, rhi, rlo;\r
+       unsigned long pm;\r
+       int count;\r
+\r
+       PARAM_WORD(op);\r
+\r
+       lo = op & 0x3f;\r
+       rhi = (op >> 9) & 7;\r
+       rlo = op & 7;\r
+       switch (op & 0xffc0)\r
+       {\r
+               case 0x0000:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ORI      #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ORI.B    #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0040:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ORI      #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ORI.W    #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0080:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ORI.L    #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0100: case 0x0300: case 0x0500: case 0x0700: case 0x0900: case 0x0b00: case 0x0d00: case 0x0f00:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.W  ($%lX,A%d),D%d", pm, rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BTST     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0140: case 0x0340: case 0x0540: case 0x0740: case 0x0940: case 0x0b40: case 0x0d40: case 0x0f40:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.L  ($%lX,A%d),D%d", pm, rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BCHG     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0180: case 0x0380: case 0x0580: case 0x0780: case 0x0980: case 0x0b80: case 0x0d80: case 0x0f80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.W  D%d,($%lX,A%d)", rhi, pm, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BCLR     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x01c0: case 0x03c0: case 0x05c0: case 0x07c0: case 0x09c0: case 0x0bc0: case 0x0dc0: case 0x0fc0:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               sprintf (buffer, "MOVEP.L  D%d,($%lX,A%d)", rhi, pm, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "BSET     D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x0200:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ANDI     #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ANDI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0240:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "ANDI     #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ANDI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0280:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ANDI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0400:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUBI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0440:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0480:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0600:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADDI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0640:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0680:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0800:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BTST     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0840:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BCHG     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0880:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BCLR     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x08c0:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "BSET     #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0a00:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "EORI     #$%lX,CCR", pm & 0xff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "EORI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0a40:\r
+                       PARAM_WORD(pm);\r
+                       if (lo == 0x3c)\r
+                               sprintf (buffer, "EORI     #$%lX,SR", pm & 0xffff);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "EORI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       }\r
+                       break;\r
+               case 0x0a80:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "EORI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0c00:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CMPI.B   #$%lX,%s", pm & 0xff, ea);\r
+                       break;\r
+               case 0x0c40:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMPI.W   #$%lX,%s", pm & 0xffff, ea);\r
+                       break;\r
+               case 0x0c80:\r
+                       PARAM_LONG(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMPI.L   #$%lX,%s", pm, ea);\r
+                       break;\r
+               case 0x0e00:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.B  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.B  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.B  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.B  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x0e40:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.W  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.W  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.W  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.W  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x0e80:\r
+                       PARAM_WORD(pm); ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       if (pm & 0x0800)\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.L  A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.L  D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVES.L  %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVES.L  %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       break;\r
+               case 0x1000: case 0x1080: case 0x10c0: case 0x1100: case 0x1140: case 0x1180: case 0x11c0:\r
+               case 0x1200: case 0x1280: case 0x12c0: case 0x1300: case 0x1340: case 0x1380: case 0x13c0:\r
+               case 0x1400: case 0x1480: case 0x14c0: case 0x1500: case 0x1540: case 0x1580:\r
+               case 0x1600: case 0x1680: case 0x16c0: case 0x1700: case 0x1740: case 0x1780:\r
+               case 0x1800: case 0x1880: case 0x18c0: case 0x1900: case 0x1940: case 0x1980:\r
+               case 0x1a00: case 0x1a80: case 0x1ac0: case 0x1b00: case 0x1b40: case 0x1b80:\r
+               case 0x1c00: case 0x1c80: case 0x1cc0: case 0x1d00: case 0x1d40: case 0x1d80:\r
+               case 0x1e00: case 0x1e80: case 0x1ec0: case 0x1f00: case 0x1f40: case 0x1f80:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 1, &count); p += count;\r
+                       sprintf (buffer, "MOVE.B   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x2000: case 0x2080: case 0x20c0: case 0x2100: case 0x2140: case 0x2180: case 0x21c0:\r
+               case 0x2200: case 0x2280: case 0x22c0: case 0x2300: case 0x2340: case 0x2380: case 0x23c0:\r
+               case 0x2400: case 0x2480: case 0x24c0: case 0x2500: case 0x2540: case 0x2580:\r
+               case 0x2600: case 0x2680: case 0x26c0: case 0x2700: case 0x2740: case 0x2780:\r
+               case 0x2800: case 0x2880: case 0x28c0: case 0x2900: case 0x2940: case 0x2980:\r
+               case 0x2a00: case 0x2a80: case 0x2ac0: case 0x2b00: case 0x2b40: case 0x2b80:\r
+               case 0x2c00: case 0x2c80: case 0x2cc0: case 0x2d00: case 0x2d40: case 0x2d80:\r
+               case 0x2e00: case 0x2e80: case 0x2ec0: case 0x2f00: case 0x2f40: case 0x2f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 4, &count); p += count;\r
+                       sprintf (buffer, "MOVE.L   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x2040: case 0x2240: case 0x2440: case 0x2640: case 0x2840: case 0x2a40: case 0x2c40: case 0x2e40:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "MOVEA.L  %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x3000: case 0x3080: case 0x30c0: case 0x3100: case 0x3140: case 0x3180: case 0x31c0:\r
+               case 0x3200: case 0x3280: case 0x32c0: case 0x3300: case 0x3340: case 0x3380: case 0x33c0:\r
+               case 0x3400: case 0x3480: case 0x34c0: case 0x3500: case 0x3540: case 0x3580:\r
+               case 0x3600: case 0x3680: case 0x36c0: case 0x3700: case 0x3740: case 0x3780:\r
+               case 0x3800: case 0x3880: case 0x38c0: case 0x3900: case 0x3940: case 0x3980:\r
+               case 0x3a00: case 0x3a80: case 0x3ac0: case 0x3b00: case 0x3b40: case 0x3b80:\r
+               case 0x3c00: case 0x3c80: case 0x3cc0: case 0x3d00: case 0x3d40: case 0x3d80:\r
+               case 0x3e00: case 0x3e80: case 0x3ec0: case 0x3f00: case 0x3f40: case 0x3f80:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count; ea2 = MakeEA (((op >> 9) & 0x07) + ((op >> 3) & 0x38), p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE.W   %s,%s", ea, ea2);\r
+                       break;\r
+               case 0x3040: case 0x3240: case 0x3440: case 0x3640: case 0x3840: case 0x3a40: case 0x3c40: case 0x3e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVEA.W  %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x4000:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NEGX.B   %s", ea);\r
+                       break;\r
+               case 0x4040:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NEGX.W   %s", ea);\r
+                       break;\r
+               case 0x4080:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NEGX.L   %s", ea);\r
+                       break;\r
+               case 0x40c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     SR,%s", ea);\r
+                       break;\r
+               case 0x4180: case 0x4380: case 0x4580: case 0x4780: case 0x4980: case 0x4b80: case 0x4d80: case 0x4f80:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CHK.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x41c0: case 0x43c0: case 0x45c0: case 0x47c0: case 0x49c0: case 0x4bc0: case 0x4dc0: case 0x4fc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "LEA      %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x4200:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CLR.B    %s", ea);\r
+                       break;\r
+               case 0x4240:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CLR.W    %s", ea);\r
+                       break;\r
+               case 0x4280:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CLR.L    %s", ea);\r
+                       break;\r
+               case 0x42c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     CCR,%s", ea);\r
+                       break;\r
+               case 0x4400:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NEG.B    %s", ea);\r
+                       break;\r
+               case 0x4440:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NEG.W    %s", ea);\r
+                       break;\r
+               case 0x4480:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NEG.L    %s", ea);\r
+                       break;\r
+               case 0x44c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     %s,CCR", ea);\r
+                       break;\r
+               case 0x4600:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NOT.B    %s", ea);\r
+                       break;\r
+               case 0x4640:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "NOT.W    %s", ea);\r
+                       break;\r
+               case 0x4680:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "NOT.L    %s", ea);\r
+                       break;\r
+               case 0x46c0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MOVE     %s,SR", ea);\r
+                       break;\r
+               case 0x4800:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "NBCD.B   %s", ea);\r
+                       break;\r
+               case 0x4840:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "SWAP     D%d", rlo);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "PEA      %s", ea);\r
+                       }\r
+                       break;\r
+               case 0x4880:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "EXT.W    D%d", rlo);\r
+                       else\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.W  ");\r
+                               if ((lo & 0x38) != 0x20) b = MakeRegList (b, pm);\r
+                               else b = MakeRevRegList (b, pm);\r
+                               sprintf (b, ",%s", ea);\r
+                       }\r
+                       break;\r
+               case 0x48c0:\r
+                       if ((lo & 0x38) == 0x00)\r
+                               sprintf (buffer, "EXT.L    D%d", rlo);\r
+                       else\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.L  ");\r
+                               if ((lo & 0x38) != 0x20) b = MakeRegList (b, pm);\r
+                               else b = MakeRevRegList (b, pm);\r
+                               sprintf (b, ",%s", ea);\r
+                       }\r
+                       break;\r
+               case 0x4a00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "TST.B    %s", ea);\r
+                       break;\r
+               case 0x4a40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "TST.W    %s", ea);\r
+                       break;\r
+               case 0x4a80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "TST.L    %s", ea);\r
+                       break;\r
+               case 0x4ac0:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "TAS.B    %s", ea);\r
+                       break;\r
+               case 0x4c80:\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.W  %s,", ea);\r
+                               b = MakeRegList (b, pm);\r
+                       }\r
+                       break;\r
+               case 0x4cc0:\r
+                       {\r
+                               char *b = buffer;\r
+                               PARAM_WORD (pm);        ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               b += sprintf (b, "MOVEM.L  %s,", ea);\r
+                               b = MakeRegList (b, pm);\r
+                       }\r
+                       break;\r
+               case 0x4e40:\r
+                       if ((lo & 30) == 0x00)\r
+                               sprintf (buffer, "TRAP     #$%X", lo & 15);\r
+                       else if ((lo & 0x38) == 0x10)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               sprintf (buffer, "LINK     A%d,#$%lX", rlo, pm);\r
+                       }\r
+                       else if ((lo & 0x38) == 0x18)\r
+                       {\r
+                               sprintf (buffer, "UNLK     A%d", rlo);\r
+                       }\r
+                       else if ((lo & 0x38) == 0x20)\r
+                               sprintf (buffer, "MOVE     A%d,USP", rlo);\r
+                       else if ((lo & 0x38) == 0x28)\r
+                               sprintf (buffer, "MOVE     USP,A%d", rlo);\r
+                       else if (lo == 0x30)\r
+                               sprintf (buffer, "RESET");\r
+                       else if (lo == 0x31)\r
+                               sprintf (buffer, "NOP");\r
+                       else if (lo == 0x32)\r
+                               sprintf (buffer, "STOP");\r
+                       else if (lo == 0x33)\r
+                               sprintf (buffer, "RTE");\r
+                       else if (lo == 0x35)\r
+                               sprintf (buffer, "RTS");\r
+                       else if (lo == 0x36)\r
+                               sprintf (buffer, "TRAPV");\r
+                       else if (lo == 0x37)\r
+                               sprintf (buffer, "RTR");\r
+                       else if (lo == 0x3a)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               switch (pm & 0xfff)\r
+                               {\r
+                                       case 0x000:     ea = "SFC";     break;\r
+                                       case 0x001:     ea = "DFC"; break;\r
+                                       case 0x800: ea = "USP"; break;\r
+                                       case 0x801: ea = "VBR"; break;\r
+                                       default: ea = "???"; break;\r
+                               }\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVEC    %s,A%ld", ea, (pm >> 12) & 7);\r
+                               else\r
+                                       sprintf (buffer, "MOVEC    %s,D%ld", ea, (pm >> 12) & 7);\r
+                       }\r
+                       else if (lo == 0x3b)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               switch (pm & 0xfff)\r
+                               {\r
+                                       case 0x000:     ea = "SFC";     break;\r
+                                       case 0x001:     ea = "DFC"; break;\r
+                                       case 0x800: ea = "USP"; break;\r
+                                       case 0x801: ea = "VBR"; break;\r
+                                       default: ea = "???"; break;\r
+                               }\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "MOVEC    A%ld,%s", (pm >> 12) & 7, ea);\r
+                               else\r
+                                       sprintf (buffer, "MOVEC    D%ld,%s", (pm >> 12) & 7, ea);\r
+                       }\r
+                       else\r
+                               sprintf (buffer, "DC.W     $%X", op);\r
+                       break;\r
+               case 0x4e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "JSR      %s", ea);\r
+                       break;\r
+               case 0x4ec0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "JMP      %s", ea);\r
+                       break;\r
+               case 0x5000: case 0x5200: case 0x5400: case 0x5600: case 0x5800: case 0x5a00: case 0x5c00: case 0x5e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.B   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5040: case 0x5240: case 0x5440: case 0x5640: case 0x5840: case 0x5a40: case 0x5c40: case 0x5e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.W   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5080: case 0x5280: case 0x5480: case 0x5680: case 0x5880: case 0x5a80: case 0x5c80: case 0x5e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDQ.L   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x50c0: case 0x52c0: case 0x54c0: case 0x56c0: case 0x58c0: case 0x5ac0: case 0x5cc0: case 0x5ec0:\r
+               case 0x51c0: case 0x53c0: case 0x55c0: case 0x57c0: case 0x59c0: case 0x5bc0: case 0x5dc0: case 0x5fc0:\r
+                       if ((lo & 0x38) == 0x08)\r
+                       {\r
+                               PARAM_WORD (pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "DB%s     D%d,*-$%X [%X]", ccodes[(op >> 8) & 15], rlo, (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "DB%s     D%d,*+$%lX [%lX]", ccodes[(op >> 8) & 15], rlo, pm - 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "S%s.B    %s", ccodes[(op >> 8) & 15], ea);\r
+                       }\r
+                       break;\r
+               case 0x5100: case 0x5300: case 0x5500: case 0x5700: case 0x5900: case 0x5b00: case 0x5d00: case 0x5f00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.B   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5140: case 0x5340: case 0x5540: case 0x5740: case 0x5940: case 0x5b40: case 0x5d40: case 0x5f40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.W   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x5180: case 0x5380: case 0x5580: case 0x5780: case 0x5980: case 0x5b80: case 0x5d80: case 0x5f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBQ.L   #%d,%s", (rhi == 0) ? 8 : rhi, ea);\r
+                       break;\r
+               case 0x6000: case 0x6040: case 0x6080: case 0x60c0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "BRA      *-$%X [%X]", (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BRA      *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "BRA.S    *-$%X [%X]", (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BRA.S    *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x6100: case 0x6140: case 0x6180: case 0x61c0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "BSR      *-$%X [%X]", (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BSR      *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "BSR.S    *-$%X [%X]", (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "BSR.S    *+$%lX [%lX]", pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x6200: case 0x6240: case 0x6280: case 0x62c0: case 0x6300: case 0x6340: case 0x6380: case 0x63c0:\r
+               case 0x6400: case 0x6440: case 0x6480: case 0x64c0: case 0x6500: case 0x6540: case 0x6580: case 0x65c0:\r
+               case 0x6600: case 0x6640: case 0x6680: case 0x66c0: case 0x6700: case 0x6740: case 0x6780: case 0x67c0:\r
+               case 0x6800: case 0x6840: case 0x6880: case 0x68c0: case 0x6900: case 0x6940: case 0x6980: case 0x69c0:\r
+               case 0x6a00: case 0x6a40: case 0x6a80: case 0x6ac0: case 0x6b00: case 0x6b40: case 0x6b80: case 0x6bc0:\r
+               case 0x6c00: case 0x6c40: case 0x6c80: case 0x6cc0: case 0x6d00: case 0x6d40: case 0x6d80: case 0x6dc0:\r
+               case 0x6e00: case 0x6e40: case 0x6e80: case 0x6ec0: case 0x6f00: case 0x6f40: case 0x6f80: case 0x6fc0:\r
+                       pm = op & 0xff;\r
+                       if (pm == 0)\r
+                       {\r
+                               PARAM_WORD(pm);\r
+                               if (pm & 0x8000)\r
+                                       sprintf (buffer, "B%s      *-$%X [%X]", ccodes[(op >> 8) & 15], (int)(-(signed short)pm) - 2, pc + (signed short)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "B%s      *+$%lX [%lX]", ccodes[(op >> 8) & 15], pm + 2, pc + pm + 2);\r
+                       }\r
+                       else\r
+                       {\r
+                               if (pm & 0x80)\r
+                                       sprintf (buffer, "B%s.S    *-$%X [%X]", ccodes[(op >> 8) & 15], (int)(-(signed char)pm) - 2, pc + (signed char)pm + 2);\r
+                               else\r
+                                       sprintf (buffer, "B%s.S    *+$%lX [%lX]", ccodes[(op >> 8) & 15], pm + 2, pc + pm + 2);\r
+                       }\r
+                       break;\r
+               case 0x7000: case 0x7040: case 0x7080: case 0x70c0:\r
+               case 0x7200: case 0x7240: case 0x7280: case 0x72c0:\r
+               case 0x7400: case 0x7440: case 0x7480: case 0x74c0:\r
+               case 0x7600: case 0x7640: case 0x7680: case 0x76c0:\r
+               case 0x7800: case 0x7840: case 0x7880: case 0x78c0:\r
+               case 0x7a00: case 0x7a40: case 0x7a80: case 0x7ac0:\r
+               case 0x7c00: case 0x7c40: case 0x7c80: case 0x7cc0:\r
+               case 0x7e00: case 0x7e40: case 0x7e80: case 0x7ec0:\r
+                       pm = op & 0xff;\r
+                       if (pm & 0x80)\r
+                               sprintf (buffer, "MOVEQ    #$-%X,D%d", -(signed char)pm, rhi);\r
+                       else\r
+                               sprintf (buffer, "MOVEQ    #$%lX,D%d", pm, rhi);\r
+                       break;\r
+               case 0x8000: case 0x8200: case 0x8400: case 0x8600: case 0x8800: case 0x8a00: case 0x8c00: case 0x8e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "OR.B     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8040: case 0x8240: case 0x8440: case 0x8640: case 0x8840: case 0x8a40: case 0x8c40: case 0x8e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "OR.W     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8080: case 0x8280: case 0x8480: case 0x8680: case 0x8880: case 0x8a80: case 0x8c80: case 0x8e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "OR.L     %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x80c0: case 0x82c0: case 0x84c0: case 0x86c0: case 0x88c0: case 0x8ac0: case 0x8cc0: case 0x8ec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "DIVU.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x8100: case 0x8300: case 0x8500: case 0x8700: case 0x8900: case 0x8b00: case 0x8d00: case 0x8f00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "OR.B     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x8140: case 0x8340: case 0x8540: case 0x8740: case 0x8940: case 0x8b40: case 0x8d40: case 0x8f40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "OR.W     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x8180: case 0x8380: case 0x8580: case 0x8780: case 0x8980: case 0x8b80: case 0x8d80: case 0x8f80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "OR.L     D%d,%s", rhi, ea);\r
+                       break;\r
+               case 0x81c0: case 0x83c0: case 0x85c0: case 0x87c0: case 0x89c0: case 0x8bc0: case 0x8dc0: case 0x8fc0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "DIVS.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9000: case 0x9200: case 0x9400: case 0x9600: case 0x9800: case 0x9a00: case 0x9c00: case 0x9e00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "SUB.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9040: case 0x9240: case 0x9440: case 0x9640: case 0x9840: case 0x9a40: case 0x9c40: case 0x9e40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUB.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x9080: case 0x9280: case 0x9480: case 0x9680: case 0x9880: case 0x9a80: case 0x9c80: case 0x9e80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUB.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0x90c0: case 0x92c0: case 0x94c0: case 0x96c0: case 0x98c0: case 0x9ac0: case 0x9cc0: case 0x9ec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "SUBA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0x9100: case 0x9300: case 0x9500: case 0x9700: case 0x9900: case 0x9b00: case 0x9d00: case 0x9f00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1,&count); p += count;\r
+                               sprintf (buffer, "SUB.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x9140: case 0x9340: case 0x9540: case 0x9740: case 0x9940: case 0x9b40: case 0x9d40: case 0x9f40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.W   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.W   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "SUB.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x9180: case 0x9380: case 0x9580: case 0x9780: case 0x9980: case 0x9b80: case 0x9d80: case 0x9f80:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "SUBX.L   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "SUBX.L   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "SUB.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0x91c0: case 0x93c0: case 0x95c0: case 0x97c0: case 0x99c0: case 0x9bc0: case 0x9dc0: case 0x9fc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "SUBA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xb000: case 0xb200: case 0xb400: case 0xb600: case 0xb800: case 0xba00: case 0xbc00: case 0xbe00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "CMP.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb040: case 0xb240: case 0xb440: case 0xb640: case 0xb840: case 0xba40: case 0xbc40: case 0xbe40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMP.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb080: case 0xb280: case 0xb480: case 0xb680: case 0xb880: case 0xba80: case 0xbc80: case 0xbe80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMP.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xb0c0: case 0xb2c0: case 0xb4c0: case 0xb6c0: case 0xb8c0: case 0xbac0: case 0xbcc0: case 0xbec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "CMPA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xb100: case 0xb300: case 0xb500: case 0xb700: case 0xb900: case 0xbb00: case 0xbd00: case 0xbf00:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.B   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "EOR.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb140: case 0xb340: case 0xb540: case 0xb740: case 0xb940: case 0xbb40: case 0xbd40: case 0xbf40:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.W   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "EOR.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb180: case 0xb380: case 0xb580: case 0xb780: case 0xb980: case 0xbb80: case 0xbd80: case 0xbf80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "CMPM.L   (A%d)+,(A%d)+", rlo, rhi);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "EOR.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xb1c0: case 0xb3c0: case 0xb5c0: case 0xb7c0: case 0xb9c0: case 0xbbc0: case 0xbdc0: case 0xbfc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "CMPA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xc000: case 0xc200: case 0xc400: case 0xc600: case 0xc800: case 0xca00: case 0xcc00: case 0xce00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "AND.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc040: case 0xc240: case 0xc440: case 0xc640: case 0xc840: case 0xca40: case 0xcc40: case 0xce40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "AND.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc080: case 0xc280: case 0xc480: case 0xc680: case 0xc880: case 0xca80: case 0xcc80: case 0xce80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "AND.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc0c0: case 0xc2c0: case 0xc4c0: case 0xc6c0: case 0xc8c0: case 0xcac0: case 0xccc0: case 0xcec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MULU.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xc100: case 0xc300: case 0xc500: case 0xc700: case 0xc900: case 0xcb00: case 0xcd00: case 0xcf00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ABCD.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ABCD.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "AND.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc140: case 0xc340: case 0xc540: case 0xc740: case 0xc940: case 0xcb40: case 0xcd40: case 0xcf40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "EXG      A%d,A%d", rhi, rlo);\r
+                               else\r
+                                       sprintf (buffer, "EXG      D%d,D%d", rhi, rlo);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2,&count); p += count;\r
+                               sprintf (buffer, "AND.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc180: case 0xc380: case 0xc580: case 0xc780: case 0xc980: case 0xcb80: case 0xcd80: case 0xcf80:\r
+                       if ((lo & 0x38) == 0x08)\r
+                               sprintf (buffer, "EXG      D%d,A%d", rhi, rlo);\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4, &count); p += count;\r
+                               sprintf (buffer, "AND.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xc1c0: case 0xc3c0: case 0xc5c0: case 0xc7c0: case 0xc9c0: case 0xcbc0: case 0xcdc0: case 0xcfc0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "MULS.W   %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd000: case 0xd200: case 0xd400: case 0xd600: case 0xd800: case 0xda00: case 0xdc00: case 0xde00:\r
+                       ea = MakeEA (lo, p, 1, &count); p += count;\r
+                       sprintf (buffer, "ADD.B    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd040: case 0xd240: case 0xd440: case 0xd640: case 0xd840: case 0xda40: case 0xdc40: case 0xde40:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADD.W    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd080: case 0xd280: case 0xd480: case 0xd680: case 0xd880: case 0xda80: case 0xdc80: case 0xde80:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADD.L    %s,D%d", ea, rhi);\r
+                       break;\r
+               case 0xd0c0: case 0xd2c0: case 0xd4c0: case 0xd6c0: case 0xd8c0: case 0xdac0: case 0xdcc0: case 0xdec0:\r
+                       ea = MakeEA (lo, p, 2, &count); p += count;\r
+                       sprintf (buffer, "ADDA.W   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xd100: case 0xd300: case 0xd500: case 0xd700: case 0xd900: case 0xdb00: case 0xdd00: case 0xdf00:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.B   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.B   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 1, &count); p += count;\r
+                               sprintf (buffer, "ADD.B    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd140: case 0xd340: case 0xd540: case 0xd740: case 0xd940: case 0xdb40: case 0xdd40: case 0xdf40:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.W   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.W   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 2, &count); p += count;\r
+                               sprintf (buffer, "ADD.W    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd180: case 0xd380: case 0xd580: case 0xd780: case 0xd980: case 0xdb80: case 0xdd80: case 0xdf80:\r
+                       if ((lo & 0x30) == 0)\r
+                       {\r
+                               if (lo & 0x08)\r
+                                       sprintf (buffer, "ADDX.L   -(A%d),-(A%d)", rlo, rhi);\r
+                               else\r
+                                       sprintf (buffer, "ADDX.L   D%d,D%d", rlo, rhi);\r
+                       }\r
+                       else\r
+                       {\r
+                               ea = MakeEA (lo, p, 4,&count); p += count;\r
+                               sprintf (buffer, "ADD.L    D%d,%s", rhi, ea);\r
+                       }\r
+                       break;\r
+               case 0xd1c0: case 0xd3c0: case 0xd5c0: case 0xd7c0: case 0xd9c0: case 0xdbc0: case 0xddc0: case 0xdfc0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       sprintf (buffer, "ADDA.L   %s,A%d", ea, rhi);\r
+                       break;\r
+               case 0xe000: case 0xe200: case 0xe400: case 0xe600: case 0xe800: case 0xea00: case 0xec00: case 0xee00:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.B   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.B   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.B    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe040: case 0xe240: case 0xe440: case 0xe640: case 0xe840: case 0xea40: case 0xec40: case 0xee40:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.W   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.W   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.W    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe080: case 0xe280: case 0xe480: case 0xe680: case 0xe880: case 0xea80: case 0xec80: case 0xee80:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXR.L   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROR.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASR.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSR.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXR.L   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROR.L    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe0c0: case 0xe2c0: case 0xe4c0: case 0xe6c0:\r
+               case 0xe1c0: case 0xe3c0: case 0xe5c0: case 0xe7c0:\r
+                       ea = MakeEA (lo, p, 4, &count); p += count;\r
+                       switch ((op >> 8) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASR.L    #1,%s", ea);         break;\r
+                               case 1: sprintf (buffer, "ASL.L    #1,%s", ea);         break;\r
+                               case 2: sprintf (buffer, "LSR.L    #1,%s", ea);         break;\r
+                               case 3: sprintf (buffer, "LSL.L    #1,%s", ea);         break;\r
+                               case 4: sprintf (buffer, "ROXR.L   #1,%s", ea);         break;\r
+                               case 5: sprintf (buffer, "ROXL.L   #1,%s", ea);         break;\r
+                               case 6: sprintf (buffer, "ROR.L    #1,%s", ea);         break;\r
+                               case 7: sprintf (buffer, "ROL.L    #1,%s", ea);         break;\r
+                       }\r
+                       break;\r
+               case 0xe100: case 0xe300: case 0xe500: case 0xe700: case 0xe900: case 0xeb00: case 0xed00: case 0xef00:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.B   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.B    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.B    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.B   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.B    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe140: case 0xe340: case 0xe540: case 0xe740: case 0xe940: case 0xeb40: case 0xed40: case 0xef40:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.W   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.W    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.W    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.W   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.W    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               case 0xe180: case 0xe380: case 0xe580: case 0xe780: case 0xe980: case 0xeb80: case 0xed80: case 0xef80:\r
+                       switch ((lo >> 3) & 7)\r
+                       {\r
+                               case 0: sprintf (buffer, "ASL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 1: sprintf (buffer, "LSL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 2: sprintf (buffer, "ROXL.L   #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 3: sprintf (buffer, "ROL.L    #%d,D%d", (rhi == 0) ? 8 : rhi, rlo);                break;\r
+                               case 4: sprintf (buffer, "ASL.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 5: sprintf (buffer, "LSL.L    D%d,D%d", rhi, rlo);         break;\r
+                               case 6: sprintf (buffer, "ROXL.L   D%d,D%d", rhi, rlo);         break;\r
+                               case 7: sprintf (buffer, "ROL.L    D%d,D%d", rhi, rlo);         break;\r
+                       }\r
+                       break;\r
+               default:\r
+                       sprintf (buffer, "DC.W     $%X", op);\r
+                       break;\r
+       }\r
+\r
+       return p - pBase;\r
+}\r
+\r
+\r
+\r
+#endif\r
diff --git a/src/m68kmake.c b/src/m68kmake.c
new file mode 100644 (file)
index 0000000..16ee266
--- /dev/null
@@ -0,0 +1,1414 @@
+/* ======================================================================== */\r
+/* ========================= LICENSING & COPYRIGHT ======================== */\r
+/* ======================================================================== */\r
+/*\r
+ *                                  MUSASHI\r
+ *                                Version 3.3\r
+ *\r
+ * A portable Motorola M680x0 processor emulation engine.\r
+ * Copyright 1998-2001 Karl Stenerud.  All rights reserved.\r
+ *\r
+ * This code may be freely used for non-commercial purposes as long as this\r
+ * copyright notice remains unaltered in the source code and any binary files\r
+ * containing this code in compiled form.\r
+ *\r
+ * All other lisencing terms must be negotiated with the author\r
+ * (Karl Stenerud).\r
+ *\r
+ * The latest version of this code can be obtained at:\r
+ * http://kstenerud.cjb.net\r
+ */\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================ CODE GENERATOR ============================ */\r
+/* ======================================================================== */\r
+/*\r
+ * This is the code generator program which will generate the opcode table\r
+ * and the final opcode handlers.\r
+ *\r
+ * It requires an input file to function (default m68k_in.c), but you can\r
+ * specify your own like so:\r
+ *\r
+ * m68kmake <output path> <input file>\r
+ *\r
+ * where output path is the path where the output files should be placed, and\r
+ * input file is the file to use for input.\r
+ *\r
+ * If you modify the input file greatly from its released form, you may have\r
+ * to tweak the configuration section a bit since I'm using static allocation\r
+ * to keep things simple.\r
+ *\r
+ *\r
+ * TODO: - build a better code generator for the move instruction.\r
+ *       - Add callm and rtm instructions\r
+ *       - Fix RTE to handle other format words\r
+ *       - Add address error (and bus error?) handling\r
+ */\r
+\r
+\r
+char* g_version = "3.3";\r
+\r
+/* ======================================================================== */\r
+/* =============================== INCLUDES =============================== */\r
+/* ======================================================================== */\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <stdarg.h>\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================= CONFIGURATION ============================ */\r
+/* ======================================================================== */\r
+\r
+#define MAX_PATH 1024\r
+#define MAX_DIR  1024\r
+\r
+#define NUM_CPUS                          3    /* 000, 010, 020 */\r
+#define MAX_LINE_LENGTH                 200    /* length of 1 line */\r
+#define MAX_BODY_LENGTH                 300    /* Number of lines in 1 function */\r
+#define MAX_REPLACE_LENGTH               30    /* Max number of replace strings */\r
+#define MAX_INSERT_LENGTH              5000    /* Max size of insert piece */\r
+#define MAX_NAME_LENGTH                  30    /* Max length of ophandler name */\r
+#define MAX_SPEC_PROC_LENGTH              4    /* Max length of special processing str */\r
+#define MAX_SPEC_EA_LENGTH                5    /* Max length of specified EA str */\r
+#define EA_ALLOWED_LENGTH                11    /* Max length of ea allowed str */\r
+#define MAX_OPCODE_INPUT_TABLE_LENGTH  1000    /* Max length of opcode handler tbl */\r
+#define MAX_OPCODE_OUTPUT_TABLE_LENGTH 3000    /* Max length of opcode handler tbl */\r
+\r
+/* Default filenames */\r
+#define FILENAME_INPUT      "m68k_in.c"\r
+#define FILENAME_PROTOTYPE  "m68kops.h"\r
+#define FILENAME_TABLE      "m68kops.c"\r
+#define FILENAME_OPS_AC     "m68kopac.c"\r
+#define FILENAME_OPS_DM     "m68kopdm.c"\r
+#define FILENAME_OPS_NZ     "m68kopnz.c"\r
+\r
+\r
+/* Identifier sequences recognized by this program */\r
+\r
+#define ID_INPUT_SEPARATOR "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"\r
+\r
+#define ID_BASE                 "M68KMAKE"\r
+#define ID_PROTOTYPE_HEADER     ID_BASE "_PROTOTYPE_HEADER"\r
+#define ID_PROTOTYPE_FOOTER     ID_BASE "_PROTOTYPE_FOOTER"\r
+#define ID_TABLE_HEADER         ID_BASE "_TABLE_HEADER"\r
+#define ID_TABLE_FOOTER         ID_BASE "_TABLE_FOOTER"\r
+#define ID_TABLE_BODY           ID_BASE "_TABLE_BODY"\r
+#define ID_TABLE_START          ID_BASE "_TABLE_START"\r
+#define ID_OPHANDLER_HEADER     ID_BASE "_OPCODE_HANDLER_HEADER"\r
+#define ID_OPHANDLER_FOOTER     ID_BASE "_OPCODE_HANDLER_FOOTER"\r
+#define ID_OPHANDLER_BODY       ID_BASE "_OPCODE_HANDLER_BODY"\r
+#define ID_END                  ID_BASE "_END"\r
+\r
+#define ID_OPHANDLER_NAME       ID_BASE "_OP"\r
+#define ID_OPHANDLER_EA_AY_8    ID_BASE "_GET_EA_AY_8"\r
+#define ID_OPHANDLER_EA_AY_16   ID_BASE "_GET_EA_AY_16"\r
+#define ID_OPHANDLER_EA_AY_32   ID_BASE "_GET_EA_AY_32"\r
+#define ID_OPHANDLER_OPER_AY_8  ID_BASE "_GET_OPER_AY_8"\r
+#define ID_OPHANDLER_OPER_AY_16 ID_BASE "_GET_OPER_AY_16"\r
+#define ID_OPHANDLER_OPER_AY_32 ID_BASE "_GET_OPER_AY_32"\r
+#define ID_OPHANDLER_CC         ID_BASE "_CC"\r
+#define ID_OPHANDLER_NOT_CC     ID_BASE "_NOT_CC"\r
+\r
+\r
+#ifndef DECL_SPEC\r
+#define DECL_SPEC\r
+#endif /* DECL_SPEC */\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== PROTOTYPES ============================== */\r
+/* ======================================================================== */\r
+\r
+#define CPU_TYPE_000 0\r
+#define CPU_TYPE_010 1\r
+#define CPU_TYPE_020 2\r
+\r
+#define UNSPECIFIED "."\r
+#define UNSPECIFIED_CH '.'\r
+\r
+#define HAS_NO_EA_MODE(A) (strcmp(A, "..........") == 0)\r
+#define HAS_EA_AI(A)   ((A)[0] == 'A')\r
+#define HAS_EA_PI(A)   ((A)[1] == '+')\r
+#define HAS_EA_PD(A)   ((A)[2] == '-')\r
+#define HAS_EA_DI(A)   ((A)[3] == 'D')\r
+#define HAS_EA_IX(A)   ((A)[4] == 'X')\r
+#define HAS_EA_AW(A)   ((A)[5] == 'W')\r
+#define HAS_EA_AL(A)   ((A)[6] == 'L')\r
+#define HAS_EA_PCDI(A) ((A)[7] == 'd')\r
+#define HAS_EA_PCIX(A) ((A)[8] == 'x')\r
+#define HAS_EA_I(A)    ((A)[9] == 'I')\r
+\r
+enum\r
+{\r
+       EA_MODE_NONE,   /* No special addressing mode */\r
+       EA_MODE_AI,             /* Address register indirect */\r
+       EA_MODE_PI,             /* Address register indirect with postincrement */\r
+       EA_MODE_PI7,    /* Address register 7 indirect with postincrement */\r
+       EA_MODE_PD,             /* Address register indirect with predecrement */\r
+       EA_MODE_PD7,    /* Address register 7 indirect with predecrement */\r
+       EA_MODE_DI,             /* Address register indirect with displacement */\r
+       EA_MODE_IX,             /* Address register indirect with index */\r
+       EA_MODE_AW,             /* Absolute word */\r
+       EA_MODE_AL,             /* Absolute long */\r
+       EA_MODE_PCDI,   /* Program counter indirect with displacement */\r
+       EA_MODE_PCIX,   /* Program counter indirect with index */\r
+       EA_MODE_I               /* Immediate */\r
+};\r
+\r
+\r
+/* Everything we need to know about an opcode */\r
+typedef struct\r
+{\r
+       char name[MAX_NAME_LENGTH];           /* opcode handler name */\r
+       unsigned int size;                    /* Size of operation */\r
+       char spec_proc[MAX_SPEC_PROC_LENGTH]; /* Special processing mode */\r
+       char spec_ea[MAX_SPEC_EA_LENGTH];     /* Specified effective addressing mode */\r
+       unsigned int bits;                    /* Number of significant bits (used for sorting the table) */\r
+       unsigned int op_mask;                 /* Mask to apply for matching an opcode to a handler */\r
+       unsigned int op_match;                /* Value to match after masking */\r
+       char ea_allowed[EA_ALLOWED_LENGTH];   /* Effective addressing modes allowed */\r
+       char cpu_mode[NUM_CPUS];              /* User or supervisor mode */\r
+       char cpus[NUM_CPUS+1];                /* Allowed CPUs */\r
+       unsigned int cycles[NUM_CPUS];        /* cycles for 000, 010, 020 */\r
+} opcode_struct;\r
+\r
+\r
+/* All modifications necessary for a specific EA mode of an instruction */\r
+typedef struct\r
+{\r
+       char* fname_add;\r
+       char* ea_add;\r
+       unsigned int mask_add;\r
+       unsigned int match_add;\r
+} ea_info_struct;\r
+\r
+\r
+/* Holds the body of a function */\r
+typedef struct\r
+{\r
+       char body[MAX_BODY_LENGTH][MAX_LINE_LENGTH+1];\r
+       int length;\r
+} body_struct;\r
+\r
+\r
+/* Holds a sequence of search / replace strings */\r
+typedef struct\r
+{\r
+       char replace[MAX_REPLACE_LENGTH][2][MAX_LINE_LENGTH+1];\r
+       int length;\r
+} replace_struct;\r
+\r
+\r
+/* Function Prototypes */\r
+void error_exit(char* fmt, ...);\r
+void perror_exit(char* fmt, ...);\r
+int check_strsncpy(char* dst, char* src, int maxlength);\r
+int check_atoi(char* str, int *result);\r
+int skip_spaces(char* str);\r
+int num_bits(int value);\r
+int atoh(char* buff);\r
+int fgetline(char* buff, int nchars, FILE* file);\r
+int get_oper_cycles(opcode_struct* op, int ea_mode, int cpu_type);\r
+opcode_struct* find_opcode(char* name, int size, char* spec_proc, char* spec_ea);\r
+opcode_struct* find_illegal_opcode(void);\r
+int extract_opcode_info(char* src, char* name, int* size, char* spec_proc, char* spec_ea);\r
+void add_replace_string(replace_struct* replace, char* search_str, char* replace_str);\r
+void write_body(FILE* filep, body_struct* body, replace_struct* replace);\r
+void get_base_name(char* base_name, opcode_struct* op);\r
+void write_prototype(FILE* filep, char* base_name);\r
+void write_function_name(FILE* filep, char* base_name);\r
+void add_opcode_output_table_entry(opcode_struct* op, char* name);\r
+static int DECL_SPEC compare_nof_true_bits(const void* aptr, const void* bptr);\r
+void print_opcode_output_table(FILE* filep);\r
+void write_table_entry(FILE* filep, opcode_struct* op);\r
+void set_opcode_struct(opcode_struct* src, opcode_struct* dst, int ea_mode);\r
+void generate_opcode_handler(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* opinfo, int ea_mode);\r
+void generate_opcode_ea_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op);\r
+void generate_opcode_cc_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op_in, int offset);\r
+void process_opcode_handlers(void);\r
+void populate_table(void);\r
+void read_insert(char* insert);\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ================================= DATA ================================= */\r
+/* ======================================================================== */\r
+\r
+/* Name of the input file */\r
+char g_input_filename[MAX_PATH] = FILENAME_INPUT;\r
+\r
+/* File handles */\r
+FILE* g_input_file = NULL;\r
+FILE* g_prototype_file = NULL;\r
+FILE* g_table_file = NULL;\r
+FILE* g_ops_ac_file = NULL;\r
+FILE* g_ops_dm_file = NULL;\r
+FILE* g_ops_nz_file = NULL;\r
+\r
+int g_num_functions = 0;  /* Number of functions processed */\r
+int g_num_primitives = 0; /* Number of function primitives read */\r
+int g_line_number = 1;    /* Current line number */\r
+\r
+/* Opcode handler table */\r
+opcode_struct g_opcode_input_table[MAX_OPCODE_INPUT_TABLE_LENGTH];\r
+\r
+opcode_struct g_opcode_output_table[MAX_OPCODE_OUTPUT_TABLE_LENGTH];\r
+int g_opcode_output_table_length = 0;\r
+\r
+ea_info_struct g_ea_info_table[13] =\r
+{/* fname    ea        mask  match */\r
+       {"",     "",       0x00, 0x00}, /* EA_MODE_NONE */\r
+       {"ai",   "AY_AI",  0x38, 0x10}, /* EA_MODE_AI   */\r
+       {"pi",   "AY_PI",  0x38, 0x18}, /* EA_MODE_PI   */\r
+       {"pi7",  "A7_PI",  0x3f, 0x1f}, /* EA_MODE_PI7  */\r
+       {"pd",   "AY_PD",  0x38, 0x20}, /* EA_MODE_PD   */\r
+       {"pd7",  "A7_PD",  0x3f, 0x27}, /* EA_MODE_PD7  */\r
+       {"di",   "AY_DI",  0x38, 0x28}, /* EA_MODE_DI   */\r
+       {"ix",   "AY_IX",  0x38, 0x30}, /* EA_MODE_IX   */\r
+       {"aw",   "AW",     0x3f, 0x38}, /* EA_MODE_AW   */\r
+       {"al",   "AL",     0x3f, 0x39}, /* EA_MODE_AL   */\r
+       {"pcdi", "PCDI",   0x3f, 0x3a}, /* EA_MODE_PCDI */\r
+       {"pcix", "PCIX",   0x3f, 0x3b}, /* EA_MODE_PCIX */\r
+       {"i",    "I",      0x3f, 0x3c}, /* EA_MODE_I    */\r
+};\r
+\r
+\r
+char* g_cc_table[16][2] =\r
+{\r
+       { "t",  "T"}, /* 0000 */\r
+       { "f",  "F"}, /* 0001 */\r
+       {"hi", "HI"}, /* 0010 */\r
+       {"ls", "LS"}, /* 0011 */\r
+       {"cc", "CC"}, /* 0100 */\r
+       {"cs", "CS"}, /* 0101 */\r
+       {"ne", "NE"}, /* 0110 */\r
+       {"eq", "EQ"}, /* 0111 */\r
+       {"vc", "VC"}, /* 1000 */\r
+       {"vs", "VS"}, /* 1001 */\r
+       {"pl", "PL"}, /* 1010 */\r
+       {"mi", "MI"}, /* 1011 */\r
+       {"ge", "GE"}, /* 1100 */\r
+       {"lt", "LT"}, /* 1101 */\r
+       {"gt", "GT"}, /* 1110 */\r
+       {"le", "LE"}, /* 1111 */\r
+};\r
+\r
+/* size to index translator (0 -> 0, 8 and 16 -> 1, 32 -> 2) */\r
+int g_size_select_table[33] =\r
+{\r
+       0,                                                                                              /* unsized */\r
+       0, 0, 0, 0, 0, 0, 0, 1,                                                 /*    8    */\r
+       0, 0, 0, 0, 0, 0, 0, 1,                                                 /*   16    */\r
+       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2  /*   32    */\r
+};\r
+\r
+/* Extra cycles required for certain EA modes */\r
+int g_ea_cycle_table[13][NUM_CPUS][3] =\r
+{/*       000           010           020   */\r
+       {{ 0,  0,  0}, { 0,  0,  0}, { 0,  0,  0}}, /* EA_MODE_NONE */\r
+       {{ 0,  4,  8}, { 0,  4,  8}, { 0,  4,  4}}, /* EA_MODE_AI   */\r
+       {{ 0,  4,  8}, { 0,  4,  8}, { 0,  4,  4}}, /* EA_MODE_PI   */\r
+       {{ 0,  4,  8}, { 0,  4,  8}, { 0,  4,  4}}, /* EA_MODE_PI7  */\r
+       {{ 0,  6, 10}, { 0,  6, 10}, { 0,  5,  5}}, /* EA_MODE_PD   */\r
+       {{ 0,  6, 10}, { 0,  6, 10}, { 0,  5,  5}}, /* EA_MODE_PD7  */\r
+       {{ 0,  8, 12}, { 0,  8, 12}, { 0,  5,  5}}, /* EA_MODE_DI   */\r
+       {{ 0, 10, 14}, { 0, 10, 14}, { 0,  7,  7}}, /* EA_MODE_IX   */\r
+       {{ 0,  8, 12}, { 0,  8, 12}, { 0,  4,  4}}, /* EA_MODE_AW   */\r
+       {{ 0, 12, 16}, { 0, 12, 16}, { 0,  4,  4}}, /* EA_MODE_AL   */\r
+       {{ 0,  8, 12}, { 0,  8, 12}, { 0,  5,  5}}, /* EA_MODE_PCDI */\r
+       {{ 0, 10, 14}, { 0, 10, 14}, { 0,  7,  7}}, /* EA_MODE_PCIX */\r
+       {{ 0,  4,  8}, { 0,  4,  8}, { 0,  2,  4}}, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for JMP instruction (000, 010) */\r
+int g_jmp_cycle_table[13] =\r
+{\r
+        0, /* EA_MODE_NONE */\r
+        4, /* EA_MODE_AI   */\r
+        0, /* EA_MODE_PI   */\r
+        0, /* EA_MODE_PI7  */\r
+        0, /* EA_MODE_PD   */\r
+        0, /* EA_MODE_PD7  */\r
+        6, /* EA_MODE_DI   */\r
+        8, /* EA_MODE_IX   */\r
+        6, /* EA_MODE_AW   */\r
+        8, /* EA_MODE_AL   */\r
+        6, /* EA_MODE_PCDI */\r
+       10, /* EA_MODE_PCIX */\r
+        0, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for JSR instruction (000, 010) */\r
+int g_jsr_cycle_table[13] =\r
+{\r
+        0, /* EA_MODE_NONE */\r
+        4, /* EA_MODE_AI   */\r
+        0, /* EA_MODE_PI   */\r
+        0, /* EA_MODE_PI7  */\r
+        0, /* EA_MODE_PD   */\r
+        0, /* EA_MODE_PD7  */\r
+        6, /* EA_MODE_DI   */\r
+       10, /* EA_MODE_IX   */\r
+        6, /* EA_MODE_AW   */\r
+        8, /* EA_MODE_AL   */\r
+        6, /* EA_MODE_PCDI */\r
+       10, /* EA_MODE_PCIX */\r
+        0, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for LEA instruction (000, 010) */\r
+int g_lea_cycle_table[13] =\r
+{\r
+        0, /* EA_MODE_NONE */\r
+        4, /* EA_MODE_AI   */\r
+        0, /* EA_MODE_PI   */\r
+        0, /* EA_MODE_PI7  */\r
+        0, /* EA_MODE_PD   */\r
+        0, /* EA_MODE_PD7  */\r
+        8, /* EA_MODE_DI   */\r
+       12, /* EA_MODE_IX   */\r
+        8, /* EA_MODE_AW   */\r
+       12, /* EA_MODE_AL   */\r
+        8, /* EA_MODE_PCDI */\r
+       12, /* EA_MODE_PCIX */\r
+        0, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for PEA instruction (000, 010) */\r
+int g_pea_cycle_table[13] =\r
+{\r
+        0, /* EA_MODE_NONE */\r
+        4, /* EA_MODE_AI   */\r
+        0, /* EA_MODE_PI   */\r
+        0, /* EA_MODE_PI7  */\r
+        0, /* EA_MODE_PD   */\r
+        0, /* EA_MODE_PD7  */\r
+       10, /* EA_MODE_DI   */\r
+       14, /* EA_MODE_IX   */\r
+       10, /* EA_MODE_AW   */\r
+       14, /* EA_MODE_AL   */\r
+       10, /* EA_MODE_PCDI */\r
+       14, /* EA_MODE_PCIX */\r
+        0, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for MOVES instruction (010) */\r
+int g_moves_cycle_table[13][3] =\r
+{\r
+       { 0,  0,  0}, /* EA_MODE_NONE */\r
+       { 0,  4,  6}, /* EA_MODE_AI   */\r
+       { 0,  4,  6}, /* EA_MODE_PI   */\r
+       { 0,  4,  6}, /* EA_MODE_PI7  */\r
+       { 0,  6, 12}, /* EA_MODE_PD   */\r
+       { 0,  6, 12}, /* EA_MODE_PD7  */\r
+       { 0, 12, 16}, /* EA_MODE_DI   */\r
+       { 0, 16, 20}, /* EA_MODE_IX   */\r
+       { 0, 12, 16}, /* EA_MODE_AW   */\r
+       { 0, 16, 20}, /* EA_MODE_AL   */\r
+       { 0,  0,  0}, /* EA_MODE_PCDI */\r
+       { 0,  0,  0}, /* EA_MODE_PCIX */\r
+       { 0,  0,  0}, /* EA_MODE_I    */\r
+};\r
+\r
+/* Extra cycles for CLR instruction (010) */\r
+int g_clr_cycle_table[13][3] =\r
+{\r
+       { 0,  0,  0}, /* EA_MODE_NONE */\r
+       { 0,  4,  6}, /* EA_MODE_AI   */\r
+       { 0,  4,  6}, /* EA_MODE_PI   */\r
+       { 0,  4,  6}, /* EA_MODE_PI7  */\r
+       { 0,  6,  8}, /* EA_MODE_PD   */\r
+       { 0,  6,  8}, /* EA_MODE_PD7  */\r
+       { 0,  8, 10}, /* EA_MODE_DI   */\r
+       { 0, 10, 14}, /* EA_MODE_IX   */\r
+       { 0,  8, 10}, /* EA_MODE_AW   */\r
+       { 0, 10, 14}, /* EA_MODE_AL   */\r
+       { 0,  0,  0}, /* EA_MODE_PCDI */\r
+       { 0,  0,  0}, /* EA_MODE_PCIX */\r
+       { 0,  0,  0}, /* EA_MODE_I    */\r
+};\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* =========================== UTILITY FUNCTIONS ========================== */\r
+/* ======================================================================== */\r
+\r
+/* Print an error message and exit with status error */\r
+void error_exit(char* fmt, ...)\r
+{\r
+       va_list args;\r
+       fprintf(stderr, "In %s, near or on line %d:\n\t", g_input_filename, g_line_number);\r
+       va_start(args, fmt);\r
+       vfprintf(stderr, fmt, args);\r
+       va_end(args);\r
+       fprintf(stderr, "\n");\r
+\r
+       if(g_prototype_file) fclose(g_prototype_file);\r
+       if(g_table_file) fclose(g_table_file);\r
+       if(g_ops_ac_file) fclose(g_ops_ac_file);\r
+       if(g_ops_dm_file) fclose(g_ops_dm_file);\r
+       if(g_ops_nz_file) fclose(g_ops_nz_file);\r
+       if(g_input_file) fclose(g_input_file);\r
+\r
+       exit(EXIT_FAILURE);\r
+}\r
+\r
+/* Print an error message, call perror(), and exit with status error */\r
+void perror_exit(char* fmt, ...)\r
+{\r
+       va_list args;\r
+       va_start(args, fmt);\r
+       vfprintf(stderr, fmt, args);\r
+       va_end(args);\r
+       perror("");\r
+\r
+       if(g_prototype_file) fclose(g_prototype_file);\r
+       if(g_table_file) fclose(g_table_file);\r
+       if(g_ops_ac_file) fclose(g_ops_ac_file);\r
+       if(g_ops_dm_file) fclose(g_ops_dm_file);\r
+       if(g_ops_nz_file) fclose(g_ops_nz_file);\r
+       if(g_input_file) fclose(g_input_file);\r
+\r
+       exit(EXIT_FAILURE);\r
+}\r
+\r
+\r
+/* copy until 0 or space and exit with error if we read too far */\r
+int check_strsncpy(char* dst, char* src, int maxlength)\r
+{\r
+       char* p = dst;\r
+       while(*src && *src != ' ')\r
+       {\r
+               *p++ = *src++;\r
+               if(p - dst > maxlength)\r
+                       error_exit("Field too long");\r
+       }\r
+       *p = 0;\r
+       return p - dst;\r
+}\r
+\r
+/* copy until 0 or specified character and exit with error if we read too far */\r
+int check_strcncpy(char* dst, char* src, char delim, int maxlength)\r
+{\r
+       char* p = dst;\r
+       while(*src && *src != delim)\r
+       {\r
+               *p++ = *src++;\r
+               if(p - dst > maxlength)\r
+                       error_exit("Field too long");\r
+       }\r
+       *p = 0;\r
+       return p - dst;\r
+}\r
+\r
+/* convert ascii to integer and exit with error if we find invalid data */\r
+int check_atoi(char* str, int *result)\r
+{\r
+       int accum = 0;\r
+       char* p = str;\r
+       while(*p >= '0' && *p <= '9')\r
+       {\r
+               accum *= 10;\r
+               accum += *p++ - '0';\r
+       }\r
+       if(*p != ' ' && *p != 0)\r
+               error_exit("Malformed integer value (%c)", *p);\r
+       *result = accum;\r
+       return p - str;\r
+}\r
+\r
+/* Skip past spaces in a string */\r
+int skip_spaces(char* str)\r
+{\r
+       char* p = str;\r
+\r
+       while(*p == ' ')\r
+               p++;\r
+\r
+       return p - str;\r
+}\r
+\r
+/* Count the number of set bits in a value */\r
+int num_bits(int value)\r
+{\r
+    value = ((value & 0xaaaa) >> 1) + (value & 0x5555);\r
+    value = ((value & 0xcccc) >> 2) + (value & 0x3333);\r
+    value = ((value & 0xf0f0) >> 4) + (value & 0x0f0f);\r
+    value = ((value & 0xff00) >> 8) + (value & 0x00ff);\r
+       return value;\r
+}\r
+\r
+/* Convert a hex value written in ASCII */\r
+int atoh(char* buff)\r
+{\r
+       int accum = 0;\r
+\r
+       for(;;buff++)\r
+       {\r
+               if(*buff >= '0' && *buff <= '9')\r
+               {\r
+                       accum <<= 4;\r
+                       accum += *buff - '0';\r
+               }\r
+               else if(*buff >= 'a' && *buff <= 'f')\r
+               {\r
+                       accum <<= 4;\r
+                       accum += *buff - 'a' + 10;\r
+               }\r
+               else break;\r
+       }\r
+       return accum;\r
+}\r
+\r
+/* Get a line of text from a file, discarding any end-of-line characters */\r
+int fgetline(char* buff, int nchars, FILE* file)\r
+{\r
+       int length;\r
+\r
+       if(fgets(buff, nchars, file) == NULL)\r
+               return -1;\r
+       if(buff[0] == '\r')\r
+               memcpy(buff, buff + 1, nchars - 1);\r
+\r
+       length = strlen(buff);\r
+       while(length && (buff[length-1] == '\r' || buff[length-1] == '\n'))\r
+               length--;\r
+       buff[length] = 0;\r
+       g_line_number++;\r
+\r
+       return length;\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* =========================== HELPER FUNCTIONS =========================== */\r
+/* ======================================================================== */\r
+\r
+/* Calculate the number of cycles an opcode requires */\r
+int get_oper_cycles(opcode_struct* op, int ea_mode, int cpu_type)\r
+{\r
+       int size = g_size_select_table[op->size];\r
+\r
+       if(op->cpus[cpu_type] == '.')\r
+               return 0;\r
+\r
+       if(cpu_type < CPU_TYPE_020)\r
+       {\r
+               if(cpu_type == CPU_TYPE_010)\r
+               {\r
+                       if(strcmp(op->name, "moves") == 0)\r
+                               return op->cycles[cpu_type] + g_moves_cycle_table[ea_mode][size];\r
+                       if(strcmp(op->name, "clr") == 0)\r
+                               return op->cycles[cpu_type] + g_clr_cycle_table[ea_mode][size];\r
+               }\r
+\r
+               /* ASG: added these cases -- immediate modes take 2 extra cycles here */\r
+               if(cpu_type == CPU_TYPE_000 && ea_mode == EA_MODE_I &&\r
+                  ((strcmp(op->name, "add") == 0 && strcmp(op->spec_proc, "er") == 0) ||\r
+                       strcmp(op->name, "adda")   == 0                                    ||\r
+                       (strcmp(op->name, "and") == 0 && strcmp(op->spec_proc, "er") == 0) ||\r
+                       (strcmp(op->name, "or") == 0 && strcmp(op->spec_proc, "er") == 0)  ||\r
+                       (strcmp(op->name, "sub") == 0 && strcmp(op->spec_proc, "er") == 0) ||\r
+                       strcmp(op->name, "suba")   == 0))\r
+                       return op->cycles[cpu_type] + g_ea_cycle_table[ea_mode][cpu_type][size] + 2;\r
+\r
+               if(strcmp(op->name, "jmp") == 0)\r
+                       return op->cycles[cpu_type] + g_jmp_cycle_table[ea_mode];\r
+               if(strcmp(op->name, "jsr") == 0)\r
+                       return op->cycles[cpu_type] + g_jsr_cycle_table[ea_mode];\r
+               if(strcmp(op->name, "lea") == 0)\r
+                       return op->cycles[cpu_type] + g_lea_cycle_table[ea_mode];\r
+               if(strcmp(op->name, "pea") == 0)\r
+                       return op->cycles[cpu_type] + g_pea_cycle_table[ea_mode];\r
+       }\r
+       return op->cycles[cpu_type] + g_ea_cycle_table[ea_mode][cpu_type][size];\r
+}\r
+\r
+/* Find an opcode in the opcode handler list */\r
+opcode_struct* find_opcode(char* name, int size, char* spec_proc, char* spec_ea)\r
+{\r
+       opcode_struct* op;\r
+\r
+\r
+       for(op = g_opcode_input_table;op->name != NULL;op++)\r
+       {\r
+               if(     strcmp(name, op->name) == 0 &&\r
+                       (size == (int)op->size) &&\r
+                       strcmp(spec_proc, op->spec_proc) == 0 &&\r
+                       strcmp(spec_ea, op->spec_ea) == 0)\r
+                               return op;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+/* Specifically find the illegal opcode in the list */\r
+opcode_struct* find_illegal_opcode(void)\r
+{\r
+       opcode_struct* op;\r
+\r
+       for(op = g_opcode_input_table;op->name != NULL;op++)\r
+       {\r
+               if(strcmp(op->name, "illegal") == 0)\r
+                       return op;\r
+       }\r
+       return NULL;\r
+}\r
+\r
+/* Parse an opcode handler name */\r
+int extract_opcode_info(char* src, char* name, int* size, char* spec_proc, char* spec_ea)\r
+{\r
+       char* ptr = strstr(src, ID_OPHANDLER_NAME);\r
+\r
+       if(ptr == NULL)\r
+               return 0;\r
+\r
+       ptr += strlen(ID_OPHANDLER_NAME) + 1;\r
+\r
+       ptr += check_strcncpy(name, ptr, ',', MAX_NAME_LENGTH);\r
+       if(*ptr != ',') return 0;\r
+       ptr++;\r
+       ptr += skip_spaces(ptr);\r
+\r
+       *size = atoi(ptr);\r
+       ptr = strstr(ptr, ",");\r
+       if(ptr == NULL) return 0;\r
+    ptr++;\r
+       ptr += skip_spaces(ptr);\r
+\r
+       ptr += check_strcncpy(spec_proc, ptr, ',', MAX_SPEC_PROC_LENGTH);\r
+       if(*ptr != ',') return 0;\r
+       ptr++;\r
+       ptr += skip_spaces(ptr);\r
+\r
+       ptr += check_strcncpy(spec_ea, ptr, ')', MAX_SPEC_EA_LENGTH);\r
+       if(*ptr != ')') return 0;\r
+\r
+       return 1;\r
+}\r
+\r
+\r
+/* Add a search/replace pair to a replace structure */\r
+void add_replace_string(replace_struct* replace, char* search_str, char* replace_str)\r
+{\r
+       if(replace->length >= MAX_REPLACE_LENGTH)\r
+               error_exit("overflow in replace structure");\r
+\r
+       strcpy(replace->replace[replace->length][0], search_str);\r
+       strcpy(replace->replace[replace->length++][1], replace_str);\r
+}\r
+\r
+/* Write a function body while replacing any selected strings */\r
+void write_body(FILE* filep, body_struct* body, replace_struct* replace)\r
+{\r
+       int i;\r
+       int j;\r
+       char* ptr;\r
+       char output[MAX_LINE_LENGTH+1];\r
+       char temp_buff[MAX_LINE_LENGTH+1];\r
+       int found;\r
+\r
+       for(i=0;i<body->length;i++)\r
+       {\r
+               strcpy(output, body->body[i]);\r
+               /* Check for the base directive header */\r
+               if(strstr(output, ID_BASE) != NULL)\r
+               {\r
+                       /* Search for any text we need to replace */\r
+                       found = 0;\r
+                       for(j=0;j<replace->length;j++)\r
+                       {\r
+                               ptr = strstr(output, replace->replace[j][0]);\r
+                               if(ptr)\r
+                               {\r
+                                       /* We found something to replace */\r
+                                       found = 1;\r
+                                       strcpy(temp_buff, ptr+strlen(replace->replace[j][0]));\r
+                                       strcpy(ptr, replace->replace[j][1]);\r
+                                       strcat(ptr, temp_buff);\r
+                               }\r
+                       }\r
+                       /* Found a directive with no matching replace string */\r
+                       if(!found)\r
+                               error_exit("Unknown " ID_BASE " directive");\r
+               }\r
+               fprintf(filep, "%s\n", output);\r
+       }\r
+       fprintf(filep, "\n\n");\r
+}\r
+\r
+/* Generate a base function name from an opcode struct */\r
+void get_base_name(char* base_name, opcode_struct* op)\r
+{\r
+       sprintf(base_name, "m68k_op_%s", op->name);\r
+       if(op->size > 0)\r
+               sprintf(base_name+strlen(base_name), "_%d", op->size);\r
+       if(strcmp(op->spec_proc, UNSPECIFIED) != 0)\r
+               sprintf(base_name+strlen(base_name), "_%s", op->spec_proc);\r
+       if(strcmp(op->spec_ea, UNSPECIFIED) != 0)\r
+               sprintf(base_name+strlen(base_name), "_%s", op->spec_ea);\r
+}\r
+\r
+/* Write the prototype of an opcode handler function */\r
+void write_prototype(FILE* filep, char* base_name)\r
+{\r
+       fprintf(filep, "void %s(void);\n", base_name);\r
+}\r
+\r
+/* Write the name of an opcode handler function */\r
+void write_function_name(FILE* filep, char* base_name)\r
+{\r
+       fprintf(filep, "void %s(void)\n", base_name);\r
+}\r
+\r
+void add_opcode_output_table_entry(opcode_struct* op, char* name)\r
+{\r
+       opcode_struct* ptr;\r
+       if(g_opcode_output_table_length > MAX_OPCODE_OUTPUT_TABLE_LENGTH)\r
+               error_exit("Opcode output table overflow");\r
+\r
+       ptr = g_opcode_output_table + g_opcode_output_table_length++;\r
+\r
+       *ptr = *op;\r
+       strcpy(ptr->name, name);\r
+       ptr->bits = num_bits(ptr->op_mask);\r
+}\r
+\r
+/*\r
+ * Comparison function for qsort()\r
+ * For entries with an equal number of set bits in\r
+ * the mask compare the match values\r
+ */\r
+static int DECL_SPEC compare_nof_true_bits(const void* aptr, const void* bptr)\r
+{\r
+       const opcode_struct *a = aptr, *b = bptr;\r
+       if(a->bits != b->bits)\r
+               return a->bits - b->bits;\r
+       if(a->op_mask != b->op_mask)\r
+               return a->op_mask - b->op_mask;\r
+       return a->op_match - b->op_match;\r
+}\r
+\r
+void print_opcode_output_table(FILE* filep)\r
+{\r
+       int i;\r
+       qsort((void *)g_opcode_output_table, g_opcode_output_table_length, sizeof(g_opcode_output_table[0]), compare_nof_true_bits);\r
+\r
+       for(i=0;i<g_opcode_output_table_length;i++)\r
+               write_table_entry(filep, g_opcode_output_table+i);\r
+}\r
+\r
+/* Write an entry in the opcode handler table */\r
+void write_table_entry(FILE* filep, opcode_struct* op)\r
+{\r
+       int i;\r
+\r
+       fprintf(filep, "\t{%-28s, 0x%04x, 0x%04x, {",\r
+               op->name, op->op_mask, op->op_match);\r
+\r
+       for(i=0;i<NUM_CPUS;i++)\r
+       {\r
+               fprintf(filep, "%3d", op->cycles[i]);\r
+               if(i < NUM_CPUS-1)\r
+                       fprintf(filep, ", ");\r
+       }\r
+\r
+       fprintf(filep, "}},\n");\r
+}\r
+\r
+/* Fill out an opcode struct with a specific addressing mode of the source opcode struct */\r
+void set_opcode_struct(opcode_struct* src, opcode_struct* dst, int ea_mode)\r
+{\r
+       int i;\r
+\r
+       *dst = *src;\r
+\r
+       for(i=0;i<NUM_CPUS;i++)\r
+               dst->cycles[i] = get_oper_cycles(dst, ea_mode, i);\r
+       if(strcmp(dst->spec_ea, UNSPECIFIED) == 0 && ea_mode != EA_MODE_NONE)\r
+               sprintf(dst->spec_ea, "%s", g_ea_info_table[ea_mode].fname_add);\r
+       dst->op_mask |= g_ea_info_table[ea_mode].mask_add;\r
+       dst->op_match |= g_ea_info_table[ea_mode].match_add;\r
+}\r
+\r
+\r
+/* Generate a final opcode handler from the provided data */\r
+void generate_opcode_handler(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* opinfo, int ea_mode)\r
+{\r
+       char str[MAX_LINE_LENGTH+1];\r
+       opcode_struct* op = malloc(sizeof(opcode_struct));\r
+\r
+       /* Set the opcode structure and write the tables, prototypes, etc */\r
+       set_opcode_struct(opinfo, op, ea_mode);\r
+       get_base_name(str, op);\r
+       write_prototype(g_prototype_file, str);\r
+       add_opcode_output_table_entry(op, str);\r
+       write_function_name(filep, str);\r
+\r
+       /* Add any replace strings needed */\r
+       if(ea_mode != EA_MODE_NONE)\r
+       {\r
+               sprintf(str, "EA_%s_8()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_EA_AY_8, str);\r
+               sprintf(str, "EA_%s_16()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_EA_AY_16, str);\r
+               sprintf(str, "EA_%s_32()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_EA_AY_32, str);\r
+               sprintf(str, "OPER_%s_8()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_OPER_AY_8, str);\r
+               sprintf(str, "OPER_%s_16()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_OPER_AY_16, str);\r
+               sprintf(str, "OPER_%s_32()", g_ea_info_table[ea_mode].ea_add);\r
+               add_replace_string(replace, ID_OPHANDLER_OPER_AY_32, str);\r
+       }\r
+\r
+       /* Now write the function body with the selected replace strings */\r
+       write_body(filep, body, replace);\r
+       g_num_functions++;\r
+       free(op);\r
+}\r
+\r
+/* Generate opcode variants based on available addressing modes */\r
+void generate_opcode_ea_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op)\r
+{\r
+       int old_length = replace->length;\r
+\r
+       /* No ea modes available for this opcode */\r
+       if(HAS_NO_EA_MODE(op->ea_allowed))\r
+       {\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_NONE);\r
+               return;\r
+       }\r
+\r
+       /* Check for and create specific opcodes for each available addressing mode */\r
+       if(HAS_EA_AI(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_AI);\r
+       replace->length = old_length;\r
+       if(HAS_EA_PI(op->ea_allowed))\r
+       {\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_PI);\r
+               replace->length = old_length;\r
+               if(op->size == 8)\r
+                       generate_opcode_handler(filep, body, replace, op, EA_MODE_PI7);\r
+       }\r
+       replace->length = old_length;\r
+       if(HAS_EA_PD(op->ea_allowed))\r
+       {\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_PD);\r
+               replace->length = old_length;\r
+               if(op->size == 8)\r
+                       generate_opcode_handler(filep, body, replace, op, EA_MODE_PD7);\r
+       }\r
+       replace->length = old_length;\r
+       if(HAS_EA_DI(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_DI);\r
+       replace->length = old_length;\r
+       if(HAS_EA_IX(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_IX);\r
+       replace->length = old_length;\r
+       if(HAS_EA_AW(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_AW);\r
+       replace->length = old_length;\r
+       if(HAS_EA_AL(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_AL);\r
+       replace->length = old_length;\r
+       if(HAS_EA_PCDI(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_PCDI);\r
+       replace->length = old_length;\r
+       if(HAS_EA_PCIX(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_PCIX);\r
+       replace->length = old_length;\r
+       if(HAS_EA_I(op->ea_allowed))\r
+               generate_opcode_handler(filep, body, replace, op, EA_MODE_I);\r
+       replace->length = old_length;\r
+}\r
+\r
+/* Generate variants of condition code opcodes */\r
+void generate_opcode_cc_variants(FILE* filep, body_struct* body, replace_struct* replace, opcode_struct* op_in, int offset)\r
+{\r
+       char repl[20];\r
+       char replnot[20];\r
+       int i;\r
+       int old_length = replace->length;\r
+       opcode_struct* op = malloc(sizeof(opcode_struct));\r
+\r
+       *op = *op_in;\r
+\r
+       op->op_mask |= 0x0f00;\r
+\r
+       /* Do all condition codes except t and f */\r
+       for(i=2;i<16;i++)\r
+       {\r
+               /* Add replace strings for this condition code */\r
+               sprintf(repl, "COND_%s()", g_cc_table[i][1]);\r
+               sprintf(replnot, "COND_NOT_%s()", g_cc_table[i][1]);\r
+\r
+               add_replace_string(replace, ID_OPHANDLER_CC, repl);\r
+               add_replace_string(replace, ID_OPHANDLER_NOT_CC, replnot);\r
+\r
+               /* Set the new opcode info */\r
+               strcpy(op->name+offset, g_cc_table[i][0]);\r
+\r
+               op->op_match = (op->op_match & 0xf0ff) | (i<<8);\r
+\r
+               /* Generate all opcode variants for this modified opcode */\r
+               generate_opcode_ea_variants(filep, body, replace, op);\r
+               /* Remove the above replace strings */\r
+               replace->length = old_length;\r
+       }\r
+       free(op);\r
+}\r
+\r
+/* Process the opcode handlers section of the input file */\r
+void process_opcode_handlers(void)\r
+{\r
+       FILE* input_file = g_input_file;\r
+       FILE* output_file;\r
+       char func_name[MAX_LINE_LENGTH+1];\r
+       char oper_name[MAX_LINE_LENGTH+1];\r
+       int  oper_size;\r
+       char oper_spec_proc[MAX_LINE_LENGTH+1];\r
+       char oper_spec_ea[MAX_LINE_LENGTH+1];\r
+       opcode_struct* opinfo;\r
+       replace_struct* replace = malloc(sizeof(replace_struct));\r
+       body_struct* body = malloc(sizeof(body_struct));\r
+\r
+\r
+       output_file = g_ops_ac_file;\r
+\r
+       for(;;)\r
+       {\r
+               /* Find the first line of the function */\r
+               func_name[0] = 0;\r
+               while(strstr(func_name, ID_OPHANDLER_NAME) == NULL)\r
+               {\r
+                       if(strcmp(func_name, ID_INPUT_SEPARATOR) == 0)\r
+                       {\r
+                               free(replace);\r
+                               free(body);\r
+                               return; /* all done */\r
+                       }\r
+                       if(fgetline(func_name, MAX_LINE_LENGTH, input_file) < 0)\r
+                               error_exit("Premature end of file when getting function name");\r
+               }\r
+               /* Get the rest of the function */\r
+               for(body->length=0;;body->length++)\r
+               {\r
+                       if(body->length > MAX_BODY_LENGTH)\r
+                               error_exit("Function too long");\r
+\r
+                       if(fgetline(body->body[body->length], MAX_LINE_LENGTH, input_file) < 0)\r
+                               error_exit("Premature end of file when getting function body");\r
+\r
+                       if(body->body[body->length][0] == '}')\r
+                       {\r
+                               body->length++;\r
+                               break;\r
+                       }\r
+               }\r
+\r
+               g_num_primitives++;\r
+\r
+               /* Extract the function name information */\r
+               if(!extract_opcode_info(func_name, oper_name, &oper_size, oper_spec_proc, oper_spec_ea))\r
+                       error_exit("Invalid " ID_OPHANDLER_NAME " format");\r
+\r
+               /* Find the corresponding table entry */\r
+               opinfo = find_opcode(oper_name, oper_size, oper_spec_proc, oper_spec_ea);\r
+               if(opinfo == NULL)\r
+                       error_exit("Unable to find matching table entry for %s", func_name);\r
+\r
+        /* Change output files if we pass 'c' or 'n' */\r
+               if(output_file == g_ops_ac_file && oper_name[0] > 'c')\r
+                       output_file = g_ops_dm_file;\r
+               else if(output_file == g_ops_dm_file && oper_name[0] > 'm')\r
+                       output_file = g_ops_nz_file;\r
+\r
+               replace->length = 0;\r
+\r
+               /* Generate opcode variants */\r
+               if(strcmp(opinfo->name, "bcc") == 0 || strcmp(opinfo->name, "scc") == 0)\r
+                       generate_opcode_cc_variants(output_file, body, replace, opinfo, 1);\r
+               else if(strcmp(opinfo->name, "dbcc") == 0)\r
+                       generate_opcode_cc_variants(output_file, body, replace, opinfo, 2);\r
+               else if(strcmp(opinfo->name, "trapcc") == 0)\r
+                       generate_opcode_cc_variants(output_file, body, replace, opinfo, 4);\r
+               else\r
+                       generate_opcode_ea_variants(output_file, body, replace, opinfo);\r
+       }\r
+}\r
+\r
+\r
+/* Populate the opcode handler table from the input file */\r
+void populate_table(void)\r
+{\r
+       char* ptr;\r
+       char bitpattern[17];\r
+       opcode_struct* op;\r
+       char buff[MAX_LINE_LENGTH];\r
+       int i;\r
+       int temp;\r
+\r
+       buff[0] = 0;\r
+\r
+       /* Find the start of the table */\r
+       while(strcmp(buff, ID_TABLE_START) != 0)\r
+               if(fgetline(buff, MAX_LINE_LENGTH, g_input_file) < 0)\r
+                       error_exit("Premature EOF while reading table");\r
+\r
+       /* Process the entire table */\r
+       for(op = g_opcode_input_table;;op++)\r
+       {\r
+               if(fgetline(buff, MAX_LINE_LENGTH, g_input_file) < 0)\r
+                       error_exit("Premature EOF while reading table");\r
+               if(strlen(buff) == 0)\r
+                       continue;\r
+               /* We finish when we find an input separator */\r
+               if(strcmp(buff, ID_INPUT_SEPARATOR) == 0)\r
+                       break;\r
+\r
+               /* Extract the info from the table */\r
+               ptr = buff;\r
+\r
+               /* Name */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_strsncpy(op->name, ptr, MAX_NAME_LENGTH);\r
+\r
+               /* Size */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_atoi(ptr, &temp);\r
+               op->size = (unsigned char)temp;\r
+\r
+               /* Special processing */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_strsncpy(op->spec_proc, ptr, MAX_SPEC_PROC_LENGTH);\r
+\r
+               /* Specified EA Mode */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_strsncpy(op->spec_ea, ptr, MAX_SPEC_EA_LENGTH);\r
+\r
+               /* Bit Pattern (more processing later) */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_strsncpy(bitpattern, ptr, 17);\r
+\r
+               /* Allowed Addressing Mode List */\r
+               ptr += skip_spaces(ptr);\r
+               ptr += check_strsncpy(op->ea_allowed, ptr, EA_ALLOWED_LENGTH);\r
+\r
+               /* CPU operating mode (U = user or supervisor, S = supervisor only */\r
+               ptr += skip_spaces(ptr);\r
+               for(i=0;i<NUM_CPUS;i++)\r
+               {\r
+                       op->cpu_mode[i] = *ptr++;\r
+                       ptr += skip_spaces(ptr);\r
+               }\r
+\r
+               /* Allowed CPUs for this instruction */\r
+               for(i=0;i<NUM_CPUS;i++)\r
+               {\r
+                       ptr += skip_spaces(ptr);\r
+                       if(*ptr == UNSPECIFIED_CH)\r
+                       {\r
+                               op->cpus[i] = UNSPECIFIED_CH;\r
+                               op->cycles[i] = 0;\r
+                               ptr++;\r
+                       }\r
+                       else\r
+                       {\r
+                               op->cpus[i] = (char)('0' + i);\r
+                               ptr += check_atoi(ptr, &temp);\r
+                               op->cycles[i] = (unsigned char)temp;\r
+                       }\r
+               }\r
+\r
+               /* generate mask and match from bitpattern */\r
+               op->op_mask = 0;\r
+               op->op_match = 0;\r
+               for(i=0;i<16;i++)\r
+               {\r
+                       op->op_mask |= (bitpattern[i] != '.') << (15-i);\r
+                       op->op_match |= (bitpattern[i] == '1') << (15-i);\r
+               }\r
+       }\r
+       /* Terminate the list */\r
+       op->name[0] = 0;\r
+}\r
+\r
+/* Read a header or footer insert from the input file */\r
+void read_insert(char* insert)\r
+{\r
+       char* ptr = insert;\r
+       char* overflow = insert + MAX_INSERT_LENGTH - MAX_LINE_LENGTH;\r
+       int length;\r
+       char* first_blank = NULL;\r
+\r
+       /* Skip any leading blank lines */\r
+       for(length = 0;length == 0;length = fgetline(ptr, MAX_LINE_LENGTH, g_input_file))\r
+               if(ptr >= overflow)\r
+                       error_exit("Buffer overflow reading inserts");\r
+       if(length < 0)\r
+               error_exit("Premature EOF while reading inserts");\r
+\r
+       /* Advance and append newline */\r
+       ptr += length;\r
+       strcpy(ptr++, "\n");\r
+\r
+       /* Read until next separator */\r
+       for(;;)\r
+       {\r
+               /* Read a new line */\r
+               if(ptr >= overflow)\r
+                       error_exit("Buffer overflow reading inserts");\r
+               if((length = fgetline(ptr, MAX_LINE_LENGTH, g_input_file)) < 0)\r
+                       error_exit("Premature EOF while reading inserts");\r
+\r
+               /* Stop if we read a separator */\r
+               if(strcmp(ptr, ID_INPUT_SEPARATOR) == 0)\r
+                       break;\r
+\r
+               /* keep track in case there are trailing blanks */\r
+               if(length == 0)\r
+               {\r
+                       if(first_blank == NULL)\r
+                               first_blank = ptr;\r
+               }\r
+               else\r
+                       first_blank = NULL;\r
+\r
+               /* Advance and append newline */\r
+               ptr += length;\r
+               strcpy(ptr++, "\n");\r
+       }\r
+\r
+       /* kill any trailing blank lines */\r
+       if(first_blank)\r
+               ptr = first_blank;\r
+       *ptr = 0;\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================= MAIN FUNCTION ============================ */\r
+/* ======================================================================== */\r
+\r
+int main(int argc, char **argv)\r
+{\r
+       /* File stuff */\r
+       char output_path[MAX_DIR] = "";\r
+       char filename[MAX_PATH];\r
+       /* Section identifier */\r
+       char section_id[MAX_LINE_LENGTH+1];\r
+       /* Inserts */\r
+       char temp_insert[MAX_INSERT_LENGTH+1];\r
+       char prototype_footer_insert[MAX_INSERT_LENGTH+1];\r
+       char table_footer_insert[MAX_INSERT_LENGTH+1];\r
+       char ophandler_footer_insert[MAX_INSERT_LENGTH+1];\r
+       /* Flags if we've processed certain parts already */\r
+       int prototype_header_read = 0;\r
+       int prototype_footer_read = 0;\r
+       int table_header_read = 0;\r
+       int table_footer_read = 0;\r
+       int ophandler_header_read = 0;\r
+       int ophandler_footer_read = 0;\r
+       int table_body_read = 0;\r
+       int ophandler_body_read = 0;\r
+\r
+       printf("\n\t\tMusashi v%s 68000, 68010, 68EC020, 68020 emulator\n", g_version);\r
+       printf("\t\tCopyright 1998-2000 Karl Stenerud (karl@mame.net)\n\n");\r
+\r
+       /* Check if output path and source for the input file are given */\r
+    if(argc > 1)\r
+       {\r
+               char *ptr;\r
+               strcpy(output_path, argv[1]);\r
+\r
+               for(ptr = strchr(output_path, '\\'); ptr; ptr = strchr(ptr, '\\'))\r
+                       *ptr = '/';\r
+        if(output_path[strlen(output_path)-1] != '/')\r
+                       strcat(output_path, "/");\r
+               if(argc > 2)\r
+                       strcpy(g_input_filename, argv[2]);\r
+       }\r
+\r
+\r
+       /* Open the files we need */\r
+       sprintf(filename, "%s%s", output_path, FILENAME_PROTOTYPE);\r
+       if((g_prototype_file = fopen(filename, "wt")) == NULL)\r
+               perror_exit("Unable to create prototype file (%s)\n", filename);\r
+\r
+       sprintf(filename, "%s%s", output_path, FILENAME_TABLE);\r
+       if((g_table_file = fopen(filename, "wt")) == NULL)\r
+               perror_exit("Unable to create table file (%s)\n", filename);\r
+\r
+       sprintf(filename, "%s%s", output_path, FILENAME_OPS_AC);\r
+       if((g_ops_ac_file = fopen(filename, "wt")) == NULL)\r
+               perror_exit("Unable to create ops ac file (%s)\n", filename);\r
+\r
+       sprintf(filename, "%s%s", output_path, FILENAME_OPS_DM);\r
+       if((g_ops_dm_file = fopen(filename, "wt")) == NULL)\r
+               perror_exit("Unable to create ops dm file (%s)\n", filename);\r
+\r
+       sprintf(filename, "%s%s", output_path, FILENAME_OPS_NZ);\r
+       if((g_ops_nz_file = fopen(filename, "wt")) == NULL)\r
+               perror_exit("Unable to create ops nz file (%s)\n", filename);\r
+\r
+       if((g_input_file=fopen(g_input_filename, "rt")) == NULL)\r
+               perror_exit("can't open %s for input", g_input_filename);\r
+\r
+\r
+       /* Get to the first section of the input file */\r
+       section_id[0] = 0;\r
+       while(strcmp(section_id, ID_INPUT_SEPARATOR) != 0)\r
+               if(fgetline(section_id, MAX_LINE_LENGTH, g_input_file) < 0)\r
+                       error_exit("Premature EOF while reading input file");\r
+\r
+       /* Now process all sections */\r
+       for(;;)\r
+       {\r
+               if(fgetline(section_id, MAX_LINE_LENGTH, g_input_file) < 0)\r
+                       error_exit("Premature EOF while reading input file");\r
+               if(strcmp(section_id, ID_PROTOTYPE_HEADER) == 0)\r
+               {\r
+                       if(prototype_header_read)\r
+                               error_exit("Duplicate prototype header");\r
+                       read_insert(temp_insert);\r
+                       fprintf(g_prototype_file, "%s\n\n", temp_insert);\r
+                       prototype_header_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_TABLE_HEADER) == 0)\r
+               {\r
+                       if(table_header_read)\r
+                               error_exit("Duplicate table header");\r
+                       read_insert(temp_insert);\r
+                       fprintf(g_table_file, "%s", temp_insert);\r
+                       table_header_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_OPHANDLER_HEADER) == 0)\r
+               {\r
+                       if(ophandler_header_read)\r
+                               error_exit("Duplicate opcode handler header");\r
+                       read_insert(temp_insert);\r
+                       fprintf(g_ops_ac_file, "%s\n\n", temp_insert);\r
+                       fprintf(g_ops_dm_file, "%s\n\n", temp_insert);\r
+                       fprintf(g_ops_nz_file, "%s\n\n", temp_insert);\r
+                       ophandler_header_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_PROTOTYPE_FOOTER) == 0)\r
+               {\r
+                       if(prototype_footer_read)\r
+                               error_exit("Duplicate prototype footer");\r
+                       read_insert(prototype_footer_insert);\r
+                       prototype_footer_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_TABLE_FOOTER) == 0)\r
+               {\r
+                       if(table_footer_read)\r
+                               error_exit("Duplicate table footer");\r
+                       read_insert(table_footer_insert);\r
+                       table_footer_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_OPHANDLER_FOOTER) == 0)\r
+               {\r
+                       if(ophandler_footer_read)\r
+                               error_exit("Duplicate opcode handler footer");\r
+                       read_insert(ophandler_footer_insert);\r
+                       ophandler_footer_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_TABLE_BODY) == 0)\r
+               {\r
+                       if(!prototype_header_read)\r
+                               error_exit("Table body encountered before prototype header");\r
+                       if(!table_header_read)\r
+                               error_exit("Table body encountered before table header");\r
+                       if(!ophandler_header_read)\r
+                               error_exit("Table body encountered before opcode handler header");\r
+\r
+                       if(table_body_read)\r
+                               error_exit("Duplicate table body");\r
+\r
+                       populate_table();\r
+                       table_body_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_OPHANDLER_BODY) == 0)\r
+               {\r
+                       if(!prototype_header_read)\r
+                               error_exit("Opcode handlers encountered before prototype header");\r
+                       if(!table_header_read)\r
+                               error_exit("Opcode handlers encountered before table header");\r
+                       if(!ophandler_header_read)\r
+                               error_exit("Opcode handlers encountered before opcode handler header");\r
+                       if(!table_body_read)\r
+                               error_exit("Opcode handlers encountered before table body");\r
+\r
+                       if(ophandler_body_read)\r
+                               error_exit("Duplicate opcode handler section");\r
+\r
+                       process_opcode_handlers();\r
+\r
+                       ophandler_body_read = 1;\r
+               }\r
+               else if(strcmp(section_id, ID_END) == 0)\r
+               {\r
+                       /* End of input file.  Do a sanity check and then write footers */\r
+                       if(!prototype_header_read)\r
+                               error_exit("Missing prototype header");\r
+                       if(!prototype_footer_read)\r
+                               error_exit("Missing prototype footer");\r
+                       if(!table_header_read)\r
+                               error_exit("Missing table header");\r
+                       if(!table_footer_read)\r
+                               error_exit("Missing table footer");\r
+                       if(!table_body_read)\r
+                               error_exit("Missing table body");\r
+                       if(!ophandler_header_read)\r
+                               error_exit("Missing opcode handler header");\r
+                       if(!ophandler_footer_read)\r
+                               error_exit("Missing opcode handler footer");\r
+                       if(!ophandler_body_read)\r
+                               error_exit("Missing opcode handler body");\r
+\r
+                       print_opcode_output_table(g_table_file);\r
+\r
+                       fprintf(g_prototype_file, "%s\n\n", prototype_footer_insert);\r
+                       fprintf(g_table_file, "%s\n\n", table_footer_insert);\r
+                       fprintf(g_ops_ac_file, "%s\n\n", ophandler_footer_insert);\r
+                       fprintf(g_ops_dm_file, "%s\n\n", ophandler_footer_insert);\r
+                       fprintf(g_ops_nz_file, "%s\n\n", ophandler_footer_insert);\r
+\r
+                       break;\r
+               }\r
+               else\r
+               {\r
+                       error_exit("Unknown section identifier: %s", section_id);\r
+               }\r
+       }\r
+\r
+       /* Close all files and exit */\r
+       fclose(g_prototype_file);\r
+       fclose(g_table_file);\r
+       fclose(g_ops_ac_file);\r
+       fclose(g_ops_dm_file);\r
+       fclose(g_ops_nz_file);\r
+       fclose(g_input_file);\r
+\r
+       printf("Generated %d opcode handlers from %d primitives\n", g_num_functions, g_num_primitives);\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+\r
+/* ======================================================================== */\r
+/* ============================== END OF FILE ============================= */\r
+/* ======================================================================== */\r
diff --git a/src/memory.cpp b/src/memory.cpp
new file mode 100644 (file)
index 0000000..51d3f64
--- /dev/null
@@ -0,0 +1,184 @@
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/memory.h"\r
+\r
+typedef struct sMemBlockInfo\r
+{\r
+    void                    *ptr;\r
+    char                    *info;\r
+    UINT32                  size;\r
+    struct  sMemBlockInfo   *next;\r
+    struct  sMemBlockInfo   *prev;\r
+} sMemBlockInfo;\r
+\r
+sMemBlockInfo   memoryInfo;\r
+UINT32          memoryMaxAllocated;\r
+UINT32          currentAllocatedMemory;\r
+UINT32          maximumAllocatedMemory;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_addMemInfo(void *ptr, UINT32 size, char *info)\r
+{\r
+    sMemBlockInfo   *alias;\r
+\r
+    alias=&memoryInfo;\r
+    while (alias->next) alias=alias->next;\r
+    alias->next=(sMemBlockInfo*)malloc(sizeof(sMemBlockInfo));\r
+    if (alias->next==NULL)\r
+    {\r
+               exit(0);\r
+        return;\r
+    }\r
+    alias->next->prev=alias;\r
+    alias=alias->next;\r
+    alias->next=NULL;\r
+    alias->size=size;\r
+    alias->ptr=ptr;\r
+    alias->info=info;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_init(void)\r
+{\r
+    memoryInfo.next=NULL;\r
+    memoryInfo.prev=NULL;\r
+    currentAllocatedMemory=0;\r
+    maximumAllocatedMemory=0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void *memory_malloc(UINT32 size, char *info)\r
+{\r
+    void *ptr;\r
+\r
+    ptr=(void*)malloc(size);\r
+    if (ptr==NULL)\r
+    {\r
+        return(NULL);\r
+    }\r
+    memory_addMemInfo(ptr,size,info);\r
+    currentAllocatedMemory+=size;\r
+    if (currentAllocatedMemory>maximumAllocatedMemory)\r
+        maximumAllocatedMemory=currentAllocatedMemory;\r
+    return(ptr);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_malloc_secure(void **new_ptr, UINT32 size, char *info)\r
+{\r
+    void *ptr;\r
+\r
+    fprintf(log_get(),"memory: allocating %i bytes of memory for <%s>...",size,(info==NULL)?"unknown":info);\r
+    ptr=(void*)malloc(size);\r
+    if (ptr==NULL)\r
+    {\r
+               fprintf(log_get(),"failed\n");\r
+               log_done();\r
+               exit(0);\r
+    }\r
+    memory_addMemInfo(ptr,size,info);\r
+    currentAllocatedMemory+=size;\r
+    if (currentAllocatedMemory>maximumAllocatedMemory)\r
+        maximumAllocatedMemory=currentAllocatedMemory;\r
+    *new_ptr=ptr;\r
+       fprintf(log_get(),"ok\n");\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_memoryUsage(FILE *fp)\r
+{\r
+    sMemBlockInfo   *alias;\r
+    UINT32 total=0;\r
+\r
+    fprintf(fp,"Memory usage:\n");\r
+    alias=&memoryInfo;\r
+    alias=alias->next;\r
+    while (alias)\r
+    {\r
+        fprintf(fp,"\t%16i bytes : <%s> (@ 0x%.8x)\n",alias->size,alias->info,alias->ptr);\r
+        total+=alias->size;\r
+        alias=alias->next;\r
+    }\r
+    fprintf(fp,"\n\t%16i bytes total(%i Mb)\n",total,(total>>20));\r
+    fprintf(fp,"\n\t%16i bytes memory peak(%i Mb)\n",maximumAllocatedMemory,maximumAllocatedMemory>>20);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void memory_free(void *ptr)\r
+{\r
+    sMemBlockInfo   *alias;\r
+\r
+    alias=&memoryInfo;\r
+    alias=alias->next;\r
+    while (alias->ptr!=ptr)\r
+        alias=alias->next;\r
+    free(ptr);\r
+    currentAllocatedMemory-=alias->size;\r
+    alias->prev->next=alias->next;\r
+    if (alias->next!=NULL)\r
+        alias->next->prev=alias->prev;\r
+    free(alias);\r
+}\r
diff --git a/src/objectp.cpp b/src/objectp.cpp
new file mode 100644 (file)
index 0000000..42cd9a6
--- /dev/null
@@ -0,0 +1,819 @@
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include "jaguar.h"\r
+\r
+\r
+//#define OP_DEBUG\r
+//#define OP_DEBUG_BMP\r
+static int cnt = 0;\r
+extern uint32 jaguar_mainRom_crc32;\r
+\r
+static uint8 * op_blend_y;\r
+static uint8 * op_blend_cc;\r
+\r
+#define BLEND_Y(dst,src) op_blend_y[(((uint16)dst)<<8) | ((uint16)(src))]\r
+#define BLEND_CC(dst,src) op_blend_cc[(((uint16)dst)<<8) | ((uint16)(src))]\r
+\r
+\r
+static uint8 objectp_ram[0x40];\r
+uint8 objectp_running;\r
+\r
+uint8 objectp_stop_reading_list;\r
+\r
+#define OBJECT_TYPE_BITMAP     0\r
+#define OBJECT_TYPE_SCALE      1\r
+#define OBJECT_TYPE_GPU                2\r
+#define OBJECT_TYPE_BRANCH     3\r
+#define OBJECT_TYPE_STOP       4\r
+\r
+#define CONDITION_EQUAL                        0\r
+#define CONDITION_LESS_THAN            1\r
+#define CONDITION_GREATER_THAN 2\r
+#define CONDITION_OP_FLAG_SET  3\r
+#define CONDITION_SECOND_HALF_LINE     4\r
+\r
+#define FLAGS_RELEASE          8\r
+#define FLAGS_TRANSPARENT      4\r
+#define FLAGS_READMODIFY       2\r
+#define FLAGS_HFLIP                    1\r
+\r
+\r
+static char * condition_to_str[8] = {"==","<",">","(opflag set)","(second half line)","?","?","?"};\r
+\r
+static uint8 op_bitmap_bit_depth[8]={1,           2,          4,         8,       16,      24,      32,      0      };\r
+static uint32 op_bitmap_bit_size[8]={0.125*65536, 0.25*65536, 0.5*65536, 1*65536, 2*65536, 1*65536, 1*65536, 1*65536};\r
+static uint32 op_pointer;\r
+static int cnt_bitmap = 0;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_process_bitmap(int16 *backbuffer, int scanline, uint64 p0, uint64 p1, int render)\r
+{\r
+       uint8   bitdepth=(p1>>12)&0x07;\r
+       \r
+       int16   ypos=(((p0>>3)&0x3ff)/2);\r
+       int32   xpos=(((int32)((p1<<20)&0xffffffff))>>20)-tom_getHBlankWidthInPixels();\r
+       int32   iwidth=((p1>>28)&0x3ff)*4;\r
+       uint32  dwidth=((p1>>18)&0x3ff)*4;\r
+       int16   height=((p0>>14)&0x3ff)-1;\r
+       uint32  link=((p0>>24)&0x7ffff)<<3;\r
+       uint32  ptr=(((p0>>43)&0x1fffff)<<3);\r
+       uint32  firstPix=(p1>>49)&0x3f;\r
+       uint8   flags=(p1>>45)&0x0f;\r
+       uint8   idx=(p1>>38)&0x7f;\r
+       uint32  pitch=(p1>>15)&0x07;\r
+       int16   scanline_width=tom_getVideoModeWidth();\r
+       uint8   *tom_ram_8=tom_get_ram_pointer();\r
+       uint8   *current_line_buffer=&tom_ram_8[0x1800];\r
+       uint8   *paletteRam=&tom_ram_8[0x400];\r
+       uint8    doom_hack=0;\r
+\r
+       op_pointer=link;\r
+\r
+       if ((!render)||(op_pointer==0)||(height<0)||(dwidth<0)||(ptr==0)||(pitch==0))\r
+       {\r
+               return;\r
+       }\r
+       if (iwidth==0)\r
+       {\r
+               dwidth=iwidth=height;\r
+       }\r
+       if (jaguar_mainRom_crc32==0x5e705756) // doom\r
+       {\r
+               if ((iwidth==160)&&(height==179)&&(xpos==-9)&&(ypos==24))\r
+               {\r
+                       doom_hack=1;\r
+                       xpos=0;\r
+               }\r
+       }\r
+       // il y a un offset vertical de 20 pour un des bitmaps\r
+       // dans dinon olympics pour une raison encore inconnue\r
+       if (jaguar_mainRom_crc32==0x3c7bfda8)\r
+       {\r
+               if ((iwidth==220)&&(height==184)&&(ypos==0))\r
+               {\r
+                       ypos=20;\r
+               }\r
+       }\r
+       else\r
+       if (jaguar_mainRom_crc32==0x2f032271)\r
+       {\r
+               ypos+=8;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==24)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==8)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==4)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==2)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==1)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       // Power Drive Rally (fixed size bitmaps have a 240 lines vertical offset)\r
+       // but could well be a modulo 240\r
+       if (jaguar_mainRom_crc32==0x0ab88d90)\r
+               ypos%=240;\r
+\r
+\r
+#ifdef OP_DEBUG_BMP\r
+       fprintf(log_get(),"bitmap %ix%i %ibpp at %i,%i firstpix=%i ptr=0x%.8x pitch %i hflipped=%s dwidth=%i (linked to 0x%.8x) Transluency=%s\n",iwidth,height,op_bitmap_bit_depth[bitdepth],xpos,ypos,firstPix,ptr,pitch,flags&FLAGS_HFLIP?"yes":"no",dwidth,op_pointer,(flags&FLAGS_READMODIFY)?"yes":"no");\r
+#endif\r
+\r
+       if ((scanline<ypos)||(scanline>(ypos+height)))\r
+       {\r
+               return;\r
+       }\r
+       // seek to the good bitmap scanline\r
+       // not sure for palettized modes\r
+       if (op_bitmap_bit_depth[bitdepth] > 8)\r
+       {\r
+               ptr += ((dwidth * op_bitmap_bit_size[bitdepth]) >> 16) * (scanline - ypos);\r
+       }\r
+       else\r
+               ptr += dwidth * (scanline - ypos);\r
+\r
+       if (xpos < 0)\r
+       {\r
+               iwidth += xpos;\r
+               ptr += (pitch * op_bitmap_bit_size[bitdepth] * (-xpos)) >> 16;\r
+               xpos = 0;\r
+       }\r
+\r
+       if (iwidth <= 0)\r
+       {\r
+#ifdef OP_DEBUG        \r
+       fprintf(log_get(),"not rendering because iwidth<0\n");\r
+#endif\r
+               return;\r
+       }\r
+       \r
+       if (flags&FLAGS_HFLIP)\r
+       {\r
+               if ((xpos<0)||((xpos-iwidth)>=scanline_width))\r
+                       return;\r
+\r
+               if ((xpos-iwidth)<0)\r
+                       iwidth=xpos;\r
+       }\r
+       else\r
+       {\r
+               if (((xpos+iwidth)<0)||(xpos>=scanline_width))\r
+                       return;\r
+\r
+               if ((xpos+iwidth)>scanline_width)\r
+                       iwidth=scanline_width-xpos;\r
+       }\r
+\r
+\r
+       current_line_buffer+=(xpos*2); // 2 in 16 bpp modes (need to take the mode into account)\r
+\r
+       // doom switches the resolution from 320 to 160 to double the display width\r
+       // this is not yet supported\r
+       if (doom_hack)\r
+       {\r
+               while (iwidth)\r
+               {\r
+                       uint8 d0=jaguar_byte_read(ptr+0);\r
+                       uint8 d1=jaguar_byte_read(ptr+1);\r
+                       *current_line_buffer++=d0;\r
+                       *current_line_buffer++=d1;\r
+                       *current_line_buffer++=d0;\r
+                       *current_line_buffer++=d1;\r
+                       ptr+=2;\r
+                       iwidth--;\r
+               }\r
+               return;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==1)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop1.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop1p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==2)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop2.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop2p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==4)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop4.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop4p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==8)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop8.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop8p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==16)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop16.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop16p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==24)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/fbmpop24.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/fbmpop24p.h"\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_process_scaled_bitmap(int16 *backbuffer, int scanline, uint64 p0, uint64 p1, uint64 p2, int render)\r
+{\r
+       int32   xpos=(((int32)((p1<<20)&0xffffffff))>>20)-tom_getHBlankWidthInPixels();\r
+       int16   ypos=(((p0&0x3ff8)>>3)/2);\r
+       uint16  iwidth=((p1>>28)&0x3ff)*4;\r
+       uint16  dwidth=((p1>>18)&0x3ff)*4;\r
+       uint16  height=(p0>>14)&0x3ff;\r
+       uint32  link=((p0>>24)&0x7ffff)<<3;\r
+       uint32  ptr=((p0>>43)&0x1fffff)<<3;\r
+       uint32  firstPix=(p1>>49)&0x3f;\r
+       uint8   flags=(p1>>45)&0x0f;\r
+       uint8   idx=(p1>>38)&0x7f; \r
+       uint8   pitch=(p1>>15)&0x07;\r
+       uint8   bitdepth=(p1>>12)&0x07;\r
+       int16   scanline_width=tom_getVideoModeWidth();\r
+       uint8   *tom_ram_8=tom_get_ram_pointer();\r
+       uint8   *current_line_buffer=&tom_ram_8[0x1800];\r
+       float   vscale;\r
+       float   hscale;\r
+       \r
+       uint32  vscale_fixed3p5=((p2>>8)&0xff);\r
+       uint32  hscale_fixed3p5=(p2&0xff);\r
+       vscale=((float)vscale_fixed3p5)/32;\r
+       hscale=((float)hscale_fixed3p5)/32;\r
+\r
+       op_pointer=link;\r
+\r
+       if (jaguar_mainRom_crc32==0x5a5b9c68) // atari karts\r
+       {\r
+               if (vscale == 0.0f) \r
+                       vscale = 1.0f;\r
+\r
+               if (ypos == 0)\r
+                       ypos = scanline;\r
+       }\r
+#ifdef OP_DEBUG_BMP\r
+       if (xpos == -3)\r
+               fprintf(log_get(),"[scanline %i] %ix%i scaled to %ix%i scale (%f, %f)%i bpp pitch %i at (%i,%i) @ 0x%.8x Transluency=%s\n",\r
+                                                                                                                                                         scanline,\r
+                                                                                                                                                         iwidth,height,\r
+                                                                                                                                                         (int)(iwidth*hscale),\r
+                                                                                                                                                         (int)(height*vscale),\r
+                                                                                                                                                         hscale, vscale,\r
+                                                                                                                                                         op_bitmap_bit_depth[bitdepth],pitch,xpos,ypos,ptr,(flags&FLAGS_READMODIFY)?"yes":"no");\r
+#endif\r
+       if (jaguar_mainRom_crc32==0x2f032271)\r
+       {\r
+               ypos+=8;\r
+       }\r
+\r
+       if ((render==0)||(op_pointer==0)||(height<0)||(dwidth<0)||(ptr==0)||(pitch==0))\r
+       {\r
+               return;\r
+       }\r
+\r
+       if (op_bitmap_bit_depth[bitdepth]==8)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==4)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==2)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+       if (op_bitmap_bit_depth[bitdepth]==1)\r
+       {\r
+               iwidth*=2;\r
+               dwidth*=2;\r
+       }\r
+\r
+       uint16  scaled_width=iwidth*hscale;\r
+       uint16  scaled_height=height*vscale;\r
+\r
+       if (op_bitmap_bit_depth[bitdepth]==4)   // why ?\r
+               scaled_width*=2;\r
+\r
+       if (op_bitmap_bit_depth[bitdepth]==2)   // why ?\r
+               scaled_width*=4;\r
+\r
+       if (op_bitmap_bit_depth[bitdepth]==1)   // why ?\r
+               scaled_width*=8;\r
+\r
+       // seek to the good bitmap scanline\r
+       // not sure for palettized modes\r
+       if (op_bitmap_bit_depth[bitdepth]>8)\r
+               ptr+=((dwidth*op_bitmap_bit_size[bitdepth])>>16)*((uint32)((scanline-ypos)/vscale));\r
+       else\r
+               ptr+=dwidth*((uint32)((scanline-ypos)/vscale));\r
+\r
+       // visible ?\r
+       if ((scanline<ypos)||(scanline>(ypos+scaled_height))||((xpos+scaled_width)<0)||(xpos>=scanline_width))\r
+               return;\r
+\r
+       \r
+       if (xpos<0)\r
+       {\r
+               scaled_width+=xpos;\r
+               ptr+=(pitch*op_bitmap_bit_size[bitdepth]*((uint32)((-xpos)/hscale)))>>16;\r
+               xpos=0;\r
+       }\r
+\r
+       if (iwidth<=0)\r
+               return;\r
+\r
+       if (flags&FLAGS_HFLIP)\r
+       {\r
+               if ((xpos<0)||((xpos-scaled_width)>=scanline_width))\r
+                       return;\r
+\r
+               if ((xpos-scaled_width)<0)\r
+                       scaled_width=xpos;\r
+       }\r
+       else\r
+       {\r
+               if (((xpos+scaled_width)<0)||(xpos>=scanline_width))\r
+                       return;\r
+\r
+               if ((xpos+scaled_width)>scanline_width)\r
+                       scaled_width=scanline_width-xpos;\r
+       }\r
+       \r
+       current_line_buffer+=(xpos*2);\r
+\r
+       int32 hscale_fixed=(int32)(65536.0f/hscale);\r
+       int32 cnt=0;\r
+\r
+       if (op_bitmap_bit_depth[bitdepth]==1)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/zbmpop1.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/zbmpop1p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==2)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/zbmpop2.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/zbmpop2p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==4)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/zbmpop4.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/zbmpop4p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==8)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/zbmpop8.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/zbmpop8p.h"\r
+               }\r
+       }\r
+       else\r
+       if (op_bitmap_bit_depth[bitdepth]==16)\r
+       {\r
+               if (pitch==1)\r
+               {\r
+                       #include "include/zbmpop16.h"\r
+               }\r
+               else\r
+               {\r
+                       #include "include/zbmpop16p.h"\r
+               }\r
+       }\r
+       else\r
+               fprintf(log_get(),"(unimplemented) %i bpp scaled bitmap\n",op_bitmap_bit_depth[bitdepth]);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint64 op_load_phrase(uint32 offset)\r
+{\r
+       offset &= (~0x07);                                              // 8 byte alignment\r
+\r
+       uint64 data = jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+       data <<= 8;\r
+       data |= jaguar_byte_read(offset++);\r
+\r
+       return data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_process_list(int16 * backbuffer, int scanline, int render)\r
+{\r
+       uint64 p0;      \r
+\r
+       cnt_bitmap = 0;\r
+\r
+       if (scanline < tom_get_vdb())\r
+               return;\r
+\r
+       if (scanline >= 525)//tom_getVideoModeHeight()+tom_get_vdb())\r
+               return;\r
+\r
+       op_pointer = op_get_list_pointer();\r
+\r
+       objectp_stop_reading_list = 0;\r
+       cnt = 0;\r
+\r
+//     if (op_pointer) fprintf(log_get()," new op list at 0x%.8x scanline %i\n",op_pointer,scanline);\r
+       while (op_pointer)\r
+       {\r
+               if (objectp_stop_reading_list)\r
+                       return;\r
+                       \r
+               p0 = op_load_phrase(op_pointer);\r
+               op_pointer += 8;\r
+               \r
+\r
+//             fprintf(log_get(),"0x%.8x type %i\n",op_pointer,((uint8)p0&0x07));              \r
+               switch ((uint8)p0&0x07)\r
+               {\r
+               case OBJECT_TYPE_BITMAP:\r
+               {\r
+                       uint64 p1 = op_load_phrase(op_pointer);\r
+                       op_pointer += 8;\r
+                       op_process_bitmap(backbuffer, scanline, p0, p1, render);\r
+                       break;\r
+               }\r
+               case OBJECT_TYPE_SCALE:\r
+               {\r
+                       uint64 p1 = op_load_phrase(op_pointer);\r
+                       op_pointer += 8;\r
+                       uint64 p2 = op_load_phrase(op_pointer);\r
+                       op_pointer += 8;\r
+                       op_process_scaled_bitmap(backbuffer, scanline, p0, p1, p2, render);\r
+                       break;\r
+               }\r
+               case OBJECT_TYPE_GPU:\r
+               {\r
+                       uint64 data = p0 >> 3;\r
+                       op_set_current_object(p0);\r
+                       gpu_set_irq_line(3, 1); \r
+                       break;\r
+               }\r
+               case OBJECT_TYPE_BRANCH:\r
+               {\r
+                       uint16 vcnt = (p0>>3) & 0x7FF;\r
+                       uint8  cc   = (p0>>14) & 0x03;\r
+                       uint32 link = ((p0>>24) & 0x1FFFFF) << 3;\r
+                       \r
+//                     if ((vcnt!=507)&&(vcnt!=25))\r
+//                             fprintf(log_get(),"\t%i%s%i link=0x%.8x\n",scanline,condition_to_str[cc],vcnt>>1,link);\r
+                       switch (cc)\r
+                       {\r
+                       case CONDITION_EQUAL:\r
+                               if ((vcnt != 0x7FF) && (vcnt & 0x01))\r
+                                       vcnt ^= 0x01;\r
+                               if (((2*tom_get_scanline()) == vcnt) || (vcnt == 0x7FF))\r
+                                       op_pointer=link;\r
+                               break;\r
+                       case CONDITION_LESS_THAN:\r
+                               if ((2*tom_get_scanline()) < vcnt)\r
+                                       op_pointer=link;\r
+                               break;\r
+                       case CONDITION_GREATER_THAN:\r
+                               if ((2*tom_get_scanline()) > vcnt)\r
+                                       op_pointer=link;\r
+                               break;\r
+                       case CONDITION_OP_FLAG_SET:\r
+                               if (op_get_status_register() & 0x01)\r
+                                       op_pointer=link;\r
+                               break;\r
+                       case CONDITION_SECOND_HALF_LINE:\r
+                               fprintf(log_get(), "op: unexpected CONDITION_SECOND_HALF_LINE in BRANCH object\nop: shuting down\n");\r
+                               fclose(log_get());\r
+                               exit(0);\r
+                               break;\r
+                       default:\r
+                               fprintf(log_get(),"op: unimplemented branch condition %i\n", cc);\r
+                       }\r
+                       break;\r
+               }\r
+               case OBJECT_TYPE_STOP:\r
+               {\r
+                       // unsure\r
+                       op_set_status_register(((p0>>3) & 0xFFFFFFFF));\r
+                       \r
+                       if (p0 & 0x8)\r
+                       {\r
+                               tom_set_pending_object_int();\r
+                               if ((tom_irq_enabled(2)) && (jaguar_interrupt_handler_is_valid(64)))\r
+                               {\r
+//                                     s68000interrupt(7,64);\r
+//                                     s68000flushInterrupts();\r
+                                       m68k_set_irq(7);                                // Cause an NMI to occur...\r
+                               }\r
+                       }\r
+\r
+                       return;\r
+                       break;\r
+               }\r
+               default:\r
+               {\r
+                       fprintf(log_get(),"op: unknown object type %i\n", ((uint8)p0 & 0x07)); \r
+                       return;\r
+               }\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_init(void)\r
+{\r
+       memory_malloc_secure((void **)&op_blend_y, 0x10000, "Jaguar Object processor Y blend lookup table");\r
+       memory_malloc_secure((void **)&op_blend_cc, 0x10000, "Jaguar Object processor C blend lookup table");\r
+\r
+       for(int i=0; i<256*256; i++)\r
+       {\r
+               int y = (i >> 8) & 0xFF;\r
+               int dy = (int8)(i & 0xFF);\r
+               y += dy;\r
+               if (y < 0)\r
+                       y = 0;\r
+               else if (y > 0xFF)\r
+                       y = 0xFF;\r
+               op_blend_y[i] = y;\r
+       }\r
+\r
+       for(int i=0; i<256*256; i++)\r
+       {\r
+               int cl = (i >> 8) & 0xFF;\r
+               int dcl = (int8)(i & 0xFF);\r
+               cl += dcl;\r
+               if (cl < 0)\r
+                       cl = 0;\r
+               else if (cl > 0xFF)\r
+                       cl = 0xFF;\r
+               op_blend_cc[i] = cl;\r
+       }\r
+       op_reset();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_reset(void)\r
+{\r
+       memset(objectp_ram, 0x00, 0x18);\r
+       objectp_running = 0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_done(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_byte_write(uint32 offset, uint8 data)\r
+{\r
+       offset &= 0x3F;\r
+       objectp_ram[offset] = data;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_word_write(uint32 offset, uint16 data)\r
+{\r
+       offset &= 0x3F;\r
+       objectp_ram[offset] = (data >> 8) & 0xFF;\r
+       objectp_ram[offset+1] = data & 0xFF;\r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 op_byte_read(uint32 offset)\r
+{\r
+       offset &= 0x3F;\r
+       return objectp_ram[offset];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 op_word_read(uint32 offset)\r
+{\r
+       return (objectp_ram[offset & 0x3F] << 8) | objectp_ram[(offset+1) & 0x3F];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 op_get_list_pointer(void)\r
+{\r
+       uint32 ptr = objectp_ram[0x22];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x23];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x20];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x21];\r
+       ptr &= ~0x07;\r
+\r
+       return ptr;//*/\r
+//     return (objectp_ram[0x20] << 24) | (objectp_ram[0x21] << 16) | (objectp_ram[0x22] << 8) | objectp_ram[0x23];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 op_get_status_register(void)\r
+{\r
+       uint32 ptr = objectp_ram[0x26];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x27];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x28];\r
+       ptr <<= 8;\r
+       ptr |= objectp_ram[0x29];\r
+\r
+       return ptr;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_set_status_register(uint32 data)\r
+{\r
+       objectp_ram[0x26] = (data & 0xFF000000) >> 24;\r
+       objectp_ram[0x27] = (data & 0x00FF0000) >> 16;\r
+       objectp_ram[0x28] = (data & 0x0000FF00) >> 8;\r
+       objectp_ram[0x29] |= (data & 0xFE);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void op_set_current_object(uint64 object)\r
+{\r
+       // less significant 32 bits first\r
+       objectp_ram[0x13] = object&0xff; object>>=8;\r
+       objectp_ram[0x12] = object&0xff; object>>=8;\r
+       objectp_ram[0x11] = object&0xff; object>>=8;\r
+       objectp_ram[0x10] = object&0xff; object>>=8;\r
+\r
+       objectp_ram[0x17] = object&0xff; object>>=8;\r
+       objectp_ram[0x16] = object&0xff; object>>=8;\r
+       objectp_ram[0x15] = object&0xff; object>>=8;\r
+       objectp_ram[0x14] = object&0xff; \r
+}\r
+\r
diff --git a/src/pcm.cpp b/src/pcm.cpp
new file mode 100644 (file)
index 0000000..5709a7f
--- /dev/null
@@ -0,0 +1,235 @@
+#include "include/pcm.h"\r
+\r
+#define PCM_DUMP\r
+\r
+#define sample_rate 44100\r
+#define sample_bits 16\r
+#define buffer_size 4\r
+#define buffer_modulo (sample_rate * buffer_size)\r
+\r
+static int16 * pcm_left;\r
+static int16 * pcm_right;\r
+static uint32 pcm_left_pos;\r
+static uint32 pcm_right_pos;\r
+static uint32 pcm_left_playback_pos;\r
+static uint32 pcm_right_playback_pos;\r
+static FILE * fp_left;\r
+static FILE * fp_right;\r
+static uint32 pcm_sample_rate = sample_rate;\r
+static uint32 pcm_inc = (pcm_sample_rate << 8) / sample_rate;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_set_sample_rate(int rate)\r
+{\r
+       pcm_sample_rate = rate;\r
+       pcm_inc = (pcm_sample_rate << 8) / sample_rate;\r
+//     fprintf(log_get(),"pcm: sample rate is %i hz, sample increment is %i (%f)\n",pcm_sample_rate,pcm_inc,((float)pcm_inc)/256.0f);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_updateOne(int channel, int16 *data, uint32 length)\r
+{\r
+       if (channel==0)\r
+       {\r
+               while (length)\r
+               {\r
+                       *data++=pcm_left[(pcm_left_playback_pos>>8)%buffer_modulo];\r
+                       pcm_left_playback_pos+=pcm_inc;\r
+                       length--;\r
+               }\r
+       }\r
+       else\r
+       {\r
+               while (length)\r
+               {\r
+                       *data++=pcm_right[(pcm_right_playback_pos>>8)%buffer_modulo];\r
+                       pcm_right_playback_pos+=pcm_inc;\r
+                       length--;\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_init(void)\r
+{\r
+       memory_malloc_secure((void**)&pcm_left,buffer_modulo*sizeof(int16),"Left dac buffer");\r
+       memory_malloc_secure((void**)&pcm_right,buffer_modulo*sizeof(int16),"Right dac buffer");\r
+       pcm_reset();\r
+       fp_left=fopen("leftdac.raw","wb");\r
+       fp_right=fopen("rightdac.raw","wb");\r
+\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_reset(void)\r
+{\r
+       pcm_left_pos=0;\r
+       pcm_right_pos=0;\r
+       pcm_left_playback_pos=0;\r
+       pcm_right_playback_pos=0;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_done(void)\r
+{\r
+       fclose(fp_left);\r
+       fclose(fp_right);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_update(void)\r
+{\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_render_left_dac(void)\r
+{\r
+#ifdef PCM_DUMP\r
+       fwrite(pcm_left,1,sample_rate*2,fp_left);\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_render_right_dac(void)\r
+{\r
+#ifdef PCM_DUMP\r
+       fwrite(pcm_right,1,sample_rate*2,fp_right);\r
+#endif\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_byte_write(uint32 offset, uint8 data)\r
+{\r
+//     fprintf(log_get(),"pcm: writing 0x%.2x at 0x%.8x\n",data,offset);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void pcm_word_write(uint32 offset, uint16 data)\r
+{\r
+       if (offset==2)\r
+       {\r
+               pcm_left[pcm_left_pos%buffer_modulo]=data;\r
+               pcm_left_pos++;\r
+               if ((pcm_left_pos%buffer_modulo)==0)\r
+                       pcm_render_left_dac();\r
+       }\r
+       else\r
+       if (offset==6)\r
+       {\r
+               pcm_right[pcm_right_pos%buffer_modulo]=data;\r
+               pcm_right_pos++;\r
+               if ((pcm_right_pos%buffer_modulo)==0)\r
+                       pcm_render_right_dac();\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 pcm_byte_read(uint32 offset)\r
+{\r
+//     fprintf(log_get(),"pcm: reading byte from 0x%.8x\n",offset);\r
+       return(0xff);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 pcm_word_read(uint32 offset)\r
+{\r
+//     fprintf(log_get(),"pcm: reading word from 0x%.8x\n",offset);\r
+       return(0xffff);\r
+}\r
diff --git a/src/tom.cpp b/src/tom.cpp
new file mode 100644 (file)
index 0000000..cb74e2f
--- /dev/null
@@ -0,0 +1,1291 @@
+//\r
+// TOM Processing\r
+//\r
+// by cal16\r
+// GCC/SDL port by Niels Wagenaar (Linux/WIN32) and Caz (BeOS)\r
+// Cleanups and endian wrongness amelioration by James L. Hammons\r
+// Note: Endian wrongness probably stems from the MAME origins of this emu and\r
+//       the braindead way in which MAME handles memory. :-)\r
+//\r
+// Note: TOM has only a 16K memory space\r
+//\r
+//     ------------------------------------------------------------\r
+//     TOM REGISTERS (Mapped by Aaron Giles)\r
+//     ------------------------------------------------------------\r
+//     F00000-F0FFFF   R/W   xxxxxxxx xxxxxxxx   Internal Registers\r
+//     F00000          R/W   -x-xx--- xxxxxxxx   MEMCON1 - memory config reg 1\r
+//                           -x------ --------      (CPU32 - is the CPU 32bits?)\r
+//                           ---xx--- --------      (IOSPEED - external I/O clock cycles)\r
+//                           -------- x-------      (FASTROM - reduces ROM clock cycles)\r
+//                           -------- -xx-----      (DRAMSPEED - sets RAM clock cycles)\r
+//                           -------- ---xx---      (ROMSPEED - sets ROM clock cycles)\r
+//                           -------- -----xx-      (ROMWIDTH - sets width of ROM: 8,16,32,64 bits)\r
+//                           -------- -------x      (ROMHI - controls ROM mapping)\r
+//     F00002          R/W   --xxxxxx xxxxxxxx   MEMCON2 - memory config reg 2\r
+//                           --x----- --------      (HILO - image display bit order)\r
+//                           ---x---- --------      (BIGEND - big endian addressing?)\r
+//                           ----xxxx --------      (REFRATE - DRAM refresh rate)\r
+//                           -------- xx------      (DWIDTH1 - DRAM1 width: 8,16,32,64 bits)\r
+//                           -------- --xx----      (COLS1 - DRAM1 columns: 256,512,1024,2048)\r
+//                           -------- ----xx--      (DWIDTH0 - DRAM0 width: 8,16,32,64 bits)\r
+//                           -------- ------xx      (COLS0 - DRAM0 columns: 256,512,1024,2048)\r
+//     F00004          R/W   -----xxx xxxxxxxx   HC - horizontal count\r
+//                           -----x-- --------      (which half of the display)\r
+//                           ------xx xxxxxxxx      (10-bit counter)\r
+//     F00006          R/W   ----xxxx xxxxxxxx   VC - vertical count\r
+//                           ----x--- --------      (which field is being generated)\r
+//                           -----xxx xxxxxxxx      (11-bit counter)\r
+//     F00008          R     -----xxx xxxxxxxx   LPH - light pen horizontal position\r
+//     F0000A          R     -----xxx xxxxxxxx   LPV - light pen vertical position\r
+//     F00010-F00017   R     xxxxxxxx xxxxxxxx   OB - current object code from the graphics processor\r
+//     F00020-F00023     W   xxxxxxxx xxxxxxxx   OLP - start of the object list\r
+//     F00026            W   -------- -------x   OBF - object processor flag\r
+//     F00028            W   ----xxxx xxxxxxxx   VMODE - video mode\r
+//                       W   ----xxx- --------      (PWIDTH1-8 - width of pixel in video clock cycles)\r
+//                       W   -------x --------      (VARMOD - enable variable color resolution)\r
+//                       W   -------- x-------      (BGEN - clear line buffere to BG color)\r
+//                       W   -------- -x------      (CSYNC - enable composite sync on VSYNC)\r
+//                       W   -------- --x-----      (BINC - local border color if INCEN)\r
+//                       W   -------- ---x----      (INCEN - encrustation enable)\r
+//                       W   -------- ----x---      (GENLOCK - enable genlock)\r
+//                       W   -------- -----xx-      (MODE - CRY16,RGB24,DIRECT16,RGB16)\r
+//                       W   -------- -------x      (VIDEN - enables video)\r
+//     F0002A            W   xxxxxxxx xxxxxxxx   BORD1 - border color (red/green)\r
+//     F0002C            W   -------- xxxxxxxx   BORD2 - border color (blue)\r
+//     F0002E            W   ------xx xxxxxxxx   HP - horizontal period\r
+//     F00030            W   -----xxx xxxxxxxx   HBB - horizontal blanking begin\r
+//     F00032            W   -----xxx xxxxxxxx   HBE - horizontal blanking end\r
+//     F00034            W   -----xxx xxxxxxxx   HSYNC - horizontal sync\r
+//     F00036            W   ------xx xxxxxxxx   HVS - horizontal vertical sync\r
+//     F00038            W   -----xxx xxxxxxxx   HDB1 - horizontal display begin 1\r
+//     F0003A            W   -----xxx xxxxxxxx   HDB2 - horizontal display begin 2\r
+//     F0003C            W   -----xxx xxxxxxxx   HDE - horizontal display end\r
+//     F0003E            W   -----xxx xxxxxxxx   VP - vertical period\r
+//     F00040            W   -----xxx xxxxxxxx   VBB - vertical blanking begin\r
+//     F00042            W   -----xxx xxxxxxxx   VBE - vertical blanking end\r
+//     F00044            W   -----xxx xxxxxxxx   VS - vertical sync\r
+//     F00046            W   -----xxx xxxxxxxx   VDB - vertical display begin\r
+//     F00048            W   -----xxx xxxxxxxx   VDE - vertical display end\r
+//     F0004A            W   -----xxx xxxxxxxx   VEB - vertical equalization begin\r
+//     F0004C            W   -----xxx xxxxxxxx   VEE - vertical equalization end\r
+//     F0004E            W   -----xxx xxxxxxxx   VI - vertical interrupt\r
+//     F00050            W   xxxxxxxx xxxxxxxx   PIT0 - programmable interrupt timer 0\r
+//     F00052            W   xxxxxxxx xxxxxxxx   PIT1 - programmable interrupt timer 1\r
+//     F00054            W   ------xx xxxxxxxx   HEQ - horizontal equalization end\r
+//     F00058            W   xxxxxxxx xxxxxxxx   BG - background color\r
+//     F000E0          R/W   ---xxxxx ---xxxxx   INT1 - CPU interrupt control register\r
+//                           ---x---- --------      (C_JERCLR - clear pending Jerry ints)\r
+//                           ----x--- --------      (C_PITCLR - clear pending PIT ints)\r
+//                           -----x-- --------      (C_OPCLR - clear pending object processor ints)\r
+//                           ------x- --------      (C_GPUCLR - clear pending graphics processor ints)\r
+//                           -------x --------      (C_VIDCLR - clear pending video timebase ints)\r
+//                           -------- ---x----      (C_JERENA - enable Jerry ints)\r
+//                           -------- ----x---      (C_PITENA - enable PIT ints)\r
+//                           -------- -----x--      (C_OPENA - enable object processor ints)\r
+//                           -------- ------x-      (C_GPUENA - enable graphics processor ints)\r
+//                           -------- -------x      (C_VIDENA - enable video timebase ints)\r
+//     F000E2            W   -------- --------   INT2 - CPU interrupt resume register\r
+//     F00400-F005FF   R/W   xxxxxxxx xxxxxxxx   CLUT - color lookup table A\r
+//     F00600-F007FF   R/W   xxxxxxxx xxxxxxxx   CLUT - color lookup table B\r
+//     F00800-F00D9F   R/W   xxxxxxxx xxxxxxxx   LBUF - line buffer A\r
+//     F01000-F0159F   R/W   xxxxxxxx xxxxxxxx   LBUF - line buffer B\r
+//     F01800-F01D9F   R/W   xxxxxxxx xxxxxxxx   LBUF - line buffer currently selected\r
+//     ------------------------------------------------------------\r
+//     F02000-F021FF   R/W   xxxxxxxx xxxxxxxx   GPU control registers\r
+//     F02100          R/W   xxxxxxxx xxxxxxxx   G_FLAGS - GPU flags register\r
+//                     R/W   x------- --------      (DMAEN - DMA enable)\r
+//                     R/W   -x------ --------      (REGPAGE - register page)\r
+//                       W   --x----- --------      (G_BLITCLR - clear blitter interrupt)\r
+//                       W   ---x---- --------      (G_OPCLR - clear object processor int)\r
+//                       W   ----x--- --------      (G_PITCLR - clear PIT interrupt)\r
+//                       W   -----x-- --------      (G_JERCLR - clear Jerry interrupt)\r
+//                       W   ------x- --------      (G_CPUCLR - clear CPU interrupt)\r
+//                     R/W   -------x --------      (G_BLITENA - enable blitter interrupt)\r
+//                     R/W   -------- x-------      (G_OPENA - enable object processor int)\r
+//                     R/W   -------- -x------      (G_PITENA - enable PIT interrupt)\r
+//                     R/W   -------- --x-----      (G_JERENA - enable Jerry interrupt)\r
+//                     R/W   -------- ---x----      (G_CPUENA - enable CPU interrupt)\r
+//                     R/W   -------- ----x---      (IMASK - interrupt mask)\r
+//                     R/W   -------- -----x--      (NEGA_FLAG - ALU negative)\r
+//                     R/W   -------- ------x-      (CARRY_FLAG - ALU carry)\r
+//                     R/W   -------- -------x      (ZERO_FLAG - ALU zero)\r
+//     F02104            W   -------- ----xxxx   G_MTXC - matrix control register\r
+//                       W   -------- ----x---      (MATCOL - column/row major)\r
+//                       W   -------- -----xxx      (MATRIX3-15 - matrix width)\r
+//     F02108            W   ----xxxx xxxxxx--   G_MTXA - matrix address register\r
+//     F0210C            W   -------- -----xxx   G_END - data organization register\r
+//                       W   -------- -----x--      (BIG_INST - big endian instruction fetch)\r
+//                       W   -------- ------x-      (BIG_PIX - big endian pixels)\r
+//                       W   -------- -------x      (BIG_IO - big endian I/O)\r
+//     F02110          R/W   xxxxxxxx xxxxxxxx   G_PC - GPU program counter\r
+//     F02114          R/W   xxxxxxxx xx-xxxxx   G_CTRL - GPU control/status register\r
+//                     R     xxxx---- --------      (VERSION - GPU version code)\r
+//                     R/W   ----x--- --------      (BUS_HOG - hog the bus!)\r
+//                     R/W   -----x-- --------      (G_BLITLAT - blitter interrupt latch)\r
+//                     R/W   ------x- --------      (G_OPLAT - object processor int latch)\r
+//                     R/W   -------x --------      (G_PITLAT - PIT interrupt latch)\r
+//                     R/W   -------- x-------      (G_JERLAT - Jerry interrupt latch)\r
+//                     R/W   -------- -x------      (G_CPULAT - CPU interrupt latch)\r
+//                     R/W   -------- ---x----      (SINGLE_GO - single step one instruction)\r
+//                     R/W   -------- ----x---      (SINGLE_STEP - single step mode)\r
+//                     R/W   -------- -----x--      (FORCEINT0 - cause interrupt 0 on GPU)\r
+//                     R/W   -------- ------x-      (CPUINT - send GPU interrupt to CPU)\r
+//                     R/W   -------- -------x      (GPUGO - enable GPU execution)\r
+//     F02118-F0211B   R/W   xxxxxxxx xxxxxxxx   G_HIDATA - high data register\r
+//     F0211C-F0211F   R     xxxxxxxx xxxxxxxx   G_REMAIN - divide unit remainder\r
+//     F0211C            W   -------- -------x   G_DIVCTRL - divide unit control\r
+//                       W   -------- -------x      (DIV_OFFSET - 1=16.16 divide, 0=32-bit divide)\r
+//     ------------------------------------------------------------\r
+\r
+#ifndef __PORT__\r
+#include <windows.h>\r
+#endif\r
+#include <SDL.h>\r
+#include "SDLptc.h"\r
+#include "tom.h"\r
+#include "gpu.h"\r
+#include "objectp.h"\r
+#include "cry2rgb.h"\r
+\r
+\r
+extern uint32 jaguar_mainRom_crc32;\r
+\r
+//This can be defined in the makefile as well...\r
+//#define TOM_DEBUG\r
+\r
+extern Console console;\r
+extern Surface * surface;\r
+\r
+// This makes sense IFF it's being used in an endian friendly way. Currently, it's not.\r
+//#define SWAP_32_ALL(A) ((SWAP_16(A>>16))|(SWAP_16(A<<16))) \r
+//#define SWAP_32(A) ((A>>16)|(A<<16))\r
+//#define SWAP_16(A) ((A>>8)|(A<<8))\r
+// These are more endian friendly...\r
+#define SET16(addr, val)       tom_ram_8[addr] = ((val) & 0xFF00) >> 8, tom_ram_8[addr+1] = (val) & 0x00FF\r
+#define GET16(addr)                    (tom_ram_8[addr] << 8) | tom_ram_8[addr+1]\r
+\r
+static uint8 * tom_ram_8;\r
+// This is just braindead and wrong!\r
+//static uint16 * tom_ram_16;\r
+//static uint32 * tom_ram_32;\r
+\r
+/*\r
+#define MEMCON1 tom_ram_16[0]\r
+#define MEMCON2 tom_ram_16[1]\r
+#define VMODE   tom_ram_16[0x28>>1]\r
+#define VBB            tom_ram_16[0x40>>1]\r
+#define VBE            tom_ram_16[0x42>>1]\r
+#define VDB            tom_ram_16[0x46>>1]\r
+#define VDE            tom_ram_16[0x48>>1]\r
+\r
+#define BG             tom_ram_16[0x58>>1]\r
+\r
+#define HBB            tom_ram_16[0x30>>1]\r
+#define HBE            tom_ram_16[0x32>>1]\r
+#define HDB            tom_ram_16[0x38>>1]\r
+#define HDE            tom_ram_16[0x3C>>1]\r
+\r
+#define HP             tom_ram_16[0x2E>>1]\r
+#define VP             tom_ram_16[0x3E>>1]\r
+#define VS             tom_ram_16[0x44>>1]\r
+\r
+#define BKGCOLOR tom_ram_16[0x58>>1]\r
+*/\r
+#define MEMCON1                0x00\r
+#define MEMCON2                0x02\r
+#define VMODE          0x28\r
+#define HP                     0x2E\r
+#define HBB                    0x30\r
+#define HBE                    0x32\r
+#define HDB                    0x38\r
+#define HDE                    0x3C\r
+#define VP                     0x3E\r
+#define VBB                    0x40\r
+#define VBE                    0x42\r
+#define VS                     0x44\r
+#define VDB                    0x46\r
+#define VDE                    0x48\r
+#define BG                     0x58\r
+\r
+\r
+uint32 tom_width, tom_height, tom_real_internal_width;\r
+\r
+static uint32 tom_timer_prescaler;\r
+static uint32 tom_timer_divider;\r
+static int32 tom_timer_counter;\r
+\r
+uint32 tom_scanline;\r
+uint32 hblankWidthInPixels = 0;\r
+\r
+static char * videoMode_to_str[8] =\r
+       {"16 bpp CRY", "24 bpp RGB", "16 bpp DIRECT", "16 bpp RGB",\r
+       "Mixed mode", "24 bpp RGB", "16 bpp DIRECT", "16 bpp RGB"};\r
+\r
+extern uint8 objectp_running;\r
+\r
+typedef void (render_xxx_scanline_fn)(int16 *);\r
+\r
+void tom_render_16bpp_cry_scanline(int16 * backbuffer);\r
+void tom_render_24bpp_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_direct_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_rgb_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_cry_rgb_mix_scanline(int16 * backbuffer);\r
+\r
+void tom_render_16bpp_cry_stretch_scanline(int16 * backbuffer);\r
+void tom_render_24bpp_stretch_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_direct_stretch_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_rgb_stretch_scanline(int16 * backbuffer);\r
+void tom_render_16bpp_cry_rgb_mix_stretch_scanline(int16 * backbuffer);\r
+\r
+render_xxx_scanline_fn * scanline_render_normal[]=\r
+{\r
+       tom_render_16bpp_cry_scanline,\r
+       tom_render_24bpp_scanline,\r
+       tom_render_16bpp_direct_scanline,\r
+       tom_render_16bpp_rgb_scanline,\r
+       tom_render_16bpp_cry_rgb_mix_scanline,\r
+       tom_render_24bpp_scanline,\r
+       tom_render_16bpp_direct_scanline,\r
+       tom_render_16bpp_rgb_scanline,\r
+};\r
+render_xxx_scanline_fn * scanline_render_stretch[]=\r
+{\r
+       tom_render_16bpp_cry_stretch_scanline,\r
+       tom_render_24bpp_stretch_scanline,\r
+       tom_render_16bpp_direct_stretch_scanline,\r
+       tom_render_16bpp_rgb_stretch_scanline,\r
+       tom_render_16bpp_cry_rgb_mix_stretch_scanline,\r
+       tom_render_24bpp_stretch_scanline,\r
+       tom_render_16bpp_direct_stretch_scanline,\r
+       tom_render_16bpp_rgb_stretch_scanline,\r
+};\r
+render_xxx_scanline_fn * scanline_render[8];\r
+\r
+uint16 tom_puck_int_pending;\r
+uint16 tom_timer_int_pending;\r
+uint16 tom_object_int_pending;\r
+uint16 tom_gpu_int_pending;\r
+uint16 tom_video_int_pending;\r
+\r
+uint16 * tom_cry_rgb_mix_lut;\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_calc_cry_rgb_mix_lut(void)\r
+{\r
+       uint32 chrm, chrl, y;\r
+\r
+       memory_malloc_secure((void **)&tom_cry_rgb_mix_lut, 0x20000, "cry/rgb mixed mode lut");\r
+\r
+       for (uint32 i=0; i<0x10000; i++)\r
+       {\r
+               uint16 color=i;\r
+\r
+               if (color & 0x01)\r
+               {\r
+                       color >>= 1;\r
+                       color = (color & 0x007C00) | ((color & 0x00003E0) >> 5) | ((color & 0x0000001F) << 5);\r
+               }\r
+               else\r
+               {\r
+                       chrm = (color & 0xF000) >> 12;    \r
+                       chrl = (color & 0x0F00) >> 8;\r
+                       y    = (color & 0x00FF);\r
+                                       \r
+                       uint16 red   = ((((uint32)redcv[chrm][chrl]) * y) >> 11);\r
+                       uint16 green = ((((uint32)greencv[chrm][chrl]) * y) >> 11);\r
+                       uint16 blue  = ((((uint32)bluecv[chrm][chrl]) * y) >> 11);\r
+                       color = (red << 10) | (green << 5) | blue;\r
+               }\r
+               tom_cry_rgb_mix_lut[i] = color;\r
+       }\r
+}\r
+\r
+void tom_set_pending_puck_int(void)\r
+{\r
+       tom_puck_int_pending = 1;\r
+}\r
+\r
+void tom_set_pending_timer_int(void)\r
+{\r
+       tom_timer_int_pending = 1;\r
+}\r
+\r
+void tom_set_pending_object_int(void)\r
+{\r
+       tom_object_int_pending = 1;\r
+}\r
+\r
+void tom_set_pending_gpu_int(void)\r
+{\r
+       tom_gpu_int_pending = 1;\r
+}\r
+\r
+void tom_set_pending_video_int(void)\r
+{\r
+       tom_video_int_pending = 1;\r
+}\r
+\r
+uint8 * tom_get_ram_pointer(void)\r
+{\r
+       return tom_ram_8;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint8 tom_getVideoMode(void)\r
+{\r
+//     uint16 vmode = SWAP_16(VMODE);\r
+       uint16 vmode = GET16(VMODE);\r
+       return ((vmode >> 1) & 0x03) | ((vmode & 0x100) >> 6);\r
+}\r
+\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 tom_get_scanline(void)\r
+{\r
+       return tom_scanline;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 tom_get_hdb(void)\r
+{\r
+//     return SWAP_16(HDB);\r
+       return GET16(HDB);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 tom_get_vdb(void)\r
+{\r
+//     return SWAP_16(VBE);\r
+       return GET16(VBE);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_cry_rgb_mix_scanline(int16 * backbuffer)\r
+{\r
+       uint32 chrm, chrl, y;\r
+\r
+       uint16 width = tom_width;\r
+       uint8 * current_line_buffer=(uint8 *)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color;\r
+               color = *current_line_buffer++;\r
+               color <<= 8;\r
+               color |= *current_line_buffer++;\r
+               *backbuffer++ = tom_cry_rgb_mix_lut[color];\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_cry_scanline(int16 *backbuffer)\r
+{\r
+       uint32 chrm, chrl, y;\r
+\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color;\r
+               color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               \r
+               chrm = (color & 0xF000) >> 12;    \r
+               chrl = (color & 0x0F00) >> 8;\r
+               y    = (color & 0x00FF);\r
+                               \r
+               uint16 red   =  ((((uint32)redcv[chrm][chrl])*y)>>11);\r
+               uint16 green =  ((((uint32)greencv[chrm][chrl])*y)>>11);\r
+               uint16 blue  =  ((((uint32)bluecv[chrm][chrl])*y)>>11);\r
+               \r
+               \r
+               *backbuffer++=(red<<10)|(green<<5)|blue;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_24bpp_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 green=*current_line_buffer++;\r
+               uint16 red=*current_line_buffer++;\r
+               uint16 nc=*current_line_buffer++;\r
+               uint16 blue=*current_line_buffer++;\r
+               red>>=3;\r
+               green>>=3;\r
+               blue>>=3;\r
+               *backbuffer++=(red<<10)|(green<<5)|blue;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_direct_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               color>>=1;\r
+               *backbuffer++=color;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_rgb_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               color>>=1;\r
+               color=(color&0x007c00)|((color&0x00003e0)>>5)|((color&0x0000001f)<<5);\r
+               *backbuffer++=color;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_cry_rgb_mix_stretch_scanline(int16 *backbuffer)\r
+{\r
+       uint32 chrm, chrl, y;\r
+\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color;\r
+               color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               *backbuffer++=tom_cry_rgb_mix_lut[color];\r
+               current_line_buffer+=2;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_cry_stretch_scanline(int16 *backbuffer)\r
+{\r
+       uint32 chrm, chrl, y;\r
+\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color;\r
+               color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               \r
+               chrm = (color & 0xF000) >> 12;    \r
+               chrl = (color & 0x0F00) >> 8;\r
+               y    = (color & 0x00FF);\r
+                               \r
+               uint16 red   =  ((((uint32)redcv[chrm][chrl])*y)>>11);\r
+               uint16 green =  ((((uint32)greencv[chrm][chrl])*y)>>11);\r
+               uint16 blue  =  ((((uint32)bluecv[chrm][chrl])*y)>>11);\r
+               \r
+               uint16 color2;\r
+               color2=*current_line_buffer++;\r
+               color2<<=8;\r
+               color2|=*current_line_buffer++;\r
+               \r
+               chrm = (color2 & 0xF000) >> 12;    \r
+               chrl = (color2 & 0x0F00) >> 8;\r
+               y    = (color2 & 0x00FF);\r
+                               \r
+               uint16 red2   = ((((uint32)redcv[chrm][chrl])*y)>>11);\r
+               uint16 green2 = ((((uint32)greencv[chrm][chrl])*y)>>11);\r
+               uint16 blue2  = ((((uint32)bluecv[chrm][chrl])*y)>>11);\r
+               \r
+               red=(red+red2)>>1;\r
+               green=(green+green2)>>1;\r
+               blue=(blue+blue2)>>1;\r
+\r
+               *backbuffer++=(red<<10)|(green<<5)|blue;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_24bpp_stretch_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 green=*current_line_buffer++;\r
+               uint16 red=*current_line_buffer++;\r
+               uint16 nc=*current_line_buffer++;\r
+               uint16 blue=*current_line_buffer++;\r
+               red>>=3;\r
+               green>>=3;\r
+               blue>>=3;\r
+               *backbuffer++=(red<<10)|(green<<5)|blue;\r
+               current_line_buffer+=4;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_direct_stretch_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color=*current_line_buffer++;\r
+               color<<=8;\r
+               color|=*current_line_buffer++;\r
+               color>>=1;\r
+               *backbuffer++=color;\r
+               current_line_buffer+=2;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_render_16bpp_rgb_stretch_scanline(int16 *backbuffer)\r
+{\r
+       uint16 width=tom_width;\r
+       uint8 *current_line_buffer=(uint8*)&tom_ram_8[0x1800];\r
+       \r
+       while (width)\r
+       {\r
+               uint16 color1=*current_line_buffer++;\r
+               color1<<=8;\r
+               color1|=*current_line_buffer++;\r
+               color1>>=1;\r
+               uint16 color2=*current_line_buffer++;\r
+               color2<<=8;\r
+               color2|=*current_line_buffer++;\r
+               color2>>=1;\r
+               uint16 red=(((color1&0x7c00)>>10)+((color2&0x7c00)>>10))>>1;\r
+               uint16 green=(((color1&0x00003e0)>>5)+((color2&0x00003e0)>>5))>>1;\r
+               uint16 blue=(((color1&0x0000001f))+((color2&0x0000001f)))>>1;\r
+\r
+               color1=(red<<10)|(blue<<5)|green;\r
+               *backbuffer++=color1;\r
+               width--;\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_exec_scanline(int16 * backbuffer, int32 scanline, int8 render)\r
+{\r
+       UINT16 bg = GET16(BG);\r
+       tom_scanline = scanline;\r
+\r
+       jaguar_word_write(0xF00004, jaguar_word_read(0xF00004) + 1);\r
+\r
+       if (render)\r
+       {\r
+               uint8 * current_line_buffer = (uint8 *)&tom_ram_8[0x1800];\r
+               uint16 * current_line_buffer_16 = (uint16 *)current_line_buffer;\r
+\r
+               for(int i=0; i<tom_real_internal_width; i++)\r
+                       *current_line_buffer_16++ = bg;\r
+\r
+               op_process_list(backbuffer, scanline, render);\r
+               \r
+               (scanline_render[tom_getVideoMode()])(backbuffer);\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_init(void)\r
+{\r
+       op_init();\r
+       blitter_init();\r
+       pcm_init();\r
+//     fprintf(log_get(),"tom_init()\n");\r
+       memory_malloc_secure((void **)&tom_ram_8, 0x4000, "tom ram");\r
+//     tom_ram_16 = (uint16 *)tom_ram_8;\r
+//     tom_ram_32 = (uint32 *)tom_ram_8;\r
+       tom_reset();\r
+       memcpy(scanline_render, scanline_render_normal, sizeof(scanline_render));\r
+       tom_calc_cry_rgb_mix_lut();\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 tom_getHBlankWidthInPixels(void)\r
+{\r
+       return hblankWidthInPixels;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 tom_getVideoModeWidth(void)\r
+{\r
+       static uint16 onetime = 1;\r
+\r
+/*     uint16 vmode = SWAP_16(VMODE);\r
+       uint16 hdb = SWAP_16(HDB);\r
+       uint16 hde = SWAP_16(HDE);\r
+       uint16 hbb = SWAP_16(HBB);\r
+       uint16 hbe = SWAP_16(HBE);*/\r
+       uint16 vmode = GET16(VMODE);\r
+       uint16 hdb = GET16(HDB);\r
+       uint16 hde = GET16(HDE);\r
+       uint16 hbb = GET16(HBB);\r
+       uint16 hbe = GET16(HBE);\r
+\r
+       int clock_cycles_per_pixel = ((vmode >> 9) & 0x07);\r
+\r
+       uint32 width = 640;\r
+       switch (clock_cycles_per_pixel)\r
+       {\r
+       case 0: width = 640; break;\r
+       case 1: width = 640; break;\r
+       case 2: width = 448; break;\r
+       case 3: width = 320; break;\r
+       case 4: width = 256; break;\r
+       case 5: width = 256; break;\r
+       case 6: width = 256; break;\r
+       case 7: width = 320; break;\r
+//     default: fprintf(log_get(),"%i \n",clock_cycles_per_pixel);\r
+       }\r
+       \r
+       if (jaguar_mainRom_crc32 == 0x3c7bfda8)\r
+       {\r
+               if (width == 320)\r
+                       width += 80;\r
+               if (width == 448)\r
+                       width -= 16;\r
+       }\r
+       if (hdb == 123)\r
+               hblankWidthInPixels = 16;\r
+       else\r
+               hblankWidthInPixels = 0;\r
+\r
+//     fprintf(log_get(),"hdb=%i hbe=%i\n",hdb,hbe);\r
+       return width;\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint32 tom_getVideoModeHeight(void)\r
+{\r
+/*     uint16 vmode = SWAP_16(VMODE);\r
+       uint16 vdb = SWAP_16(VDB);\r
+       uint16 vde = SWAP_16(VDE);\r
+       uint16 vbb = SWAP_16(VBB);\r
+       uint16 vbe = SWAP_16(VBE);*/\r
+       uint16 vmode = GET16(VMODE);\r
+       uint16 vdb = GET16(VDB);\r
+       uint16 vde = GET16(VDE);\r
+       uint16 vbb = GET16(VBB);\r
+       uint16 vbe = GET16(VBE);\r
+       \r
+       if (vde == 65535)\r
+               vde = vbb;\r
+       \r
+       uint32 screen_height = (vde/*-vdb*/) >> 1;\r
+       return 227;//WAS:screen_height);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//     \r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_reset(void)\r
+{\r
+//     fprintf(log_get(),"tom_reset()\n");\r
+       op_reset();\r
+       blitter_reset();\r
+       pcm_reset();\r
+\r
+       memset(tom_ram_8, 0x00, 0x4000);\r
+//     tom_ram_8[MEMCON1] = 0x18, tom_ram_8[MEMCON1+1] = 0x61;\r
+       SET16(MEMCON1, 0x1861);\r
+//     tom_ram_8[MEMCON2] = 0x00, tom_ram_8[MEMCON2+1] = 0x00;\r
+       SET16(MEMCON2, 0x0000);\r
+//     tom_ram_8[VMODE] = 0x06, tom_ram_8[VMODE+1] = 0xC1;\r
+       SET16(VMODE, 0x06C1);\r
+//     tom_ram_8[VP] = (523 & 0xFF00) >> 8, tom_ram_8[VP+1] = 523 & 0x00FF; // 525-2\r
+       SET16(VP, 523);\r
+//     tom_ram_8[HP] = SWAP_16(844);\r
+       SET16(HP, 844);\r
+//     tom_ram_8[VS] = SWAP_16(523-6);\r
+       SET16(VS, 523 - 6);\r
+//     tom_ram_8[VBB] = SWAP_16(434);\r
+       SET16(VBB, 434);\r
+//     tom_ram_8[VBE] = SWAP_16(24);\r
+       SET16(VBE, 24);\r
+//     tom_ram_8[HBB] = SWAP_16(689+0x400);\r
+       SET16(HBB, 689 + 0x400);\r
+//     tom_ram_8[HBE] = SWAP_16(125);\r
+       SET16(HBE, 125);\r
+\r
+//     tom_ram_8[VDE] = SWAP_16(65535);\r
+       SET16(VDE, 65535);\r
+//     tom_ram_8[VDB] = SWAP_16(28);\r
+       SET16(VDB, 28);\r
+//     tom_ram_8[HDB] = SWAP_16(166);\r
+       SET16(HDB, 166);\r
+//     tom_ram_8[HDE] = SWAP_16(65535);\r
+       SET16(HDE, 65535);\r
+\r
+       tom_width = tom_real_internal_width = 0;\r
+       tom_height = 0;\r
+       tom_scanline = 0;\r
+       \r
+//     hblankWidthInPixels = (tom_ram_8[HDB] << 8) | tom_ram_8[HDB+1];\r
+//     hblankWidthInPixels >>= 1;\r
+       hblankWidthInPixels = (GET16(HDB)) >> 1;\r
+\r
+       tom_puck_int_pending = 0;\r
+       tom_timer_int_pending = 0;\r
+       tom_object_int_pending = 0;\r
+       tom_gpu_int_pending = 0;\r
+       tom_video_int_pending = 0;\r
+\r
+       tom_timer_prescaler = 0;\r
+       tom_timer_divider = 0;\r
+       tom_timer_counter = 0;\r
+       memcpy(scanline_render, scanline_render_normal, sizeof(scanline_render));\r
+} \r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_done(void)\r
+{\r
+//     fprintf(log_get(),"tom: done()\n");\r
+       op_done();\r
+       pcm_done();\r
+       blitter_done();\r
+       fprintf(log_get(), "tom: resolution %ix%i %s\n", tom_getVideoModeWidth(), tom_getVideoModeHeight(),\r
+               videoMode_to_str[tom_getVideoMode()]);\r
+//     fprintf(log_get(),"\ntom: object processor:\n");\r
+//     fprintf(log_get(),"tom: pointer to object list: 0x%.8x\n",op_get_list_pointer());\r
+//     fprintf(log_get(),"tom: INT1=0x%.2x%.2x\n",tom_byte_read(0xf000e0),tom_byte_read(0xf000e1));\r
+       gpu_done();\r
+       dsp_done();\r
+       memory_free(tom_ram_8);\r
+}\r
+\r
+//\r
+// TOM byte access (read)\r
+//\r
+\r
+unsigned tom_byte_read(unsigned int offset)\r
+{\r
+       offset &= 0xFF3FFF;\r
+\r
+#ifdef TOM_DEBUG\r
+       fprintf(log_get(), "TOM: Reading byte at %06X\n", offset);\r
+#endif\r
+\r
+       if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+               return gpu_byte_read(offset);\r
+       else if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+               return gpu_byte_read(offset);\r
+       else if ((offset >= 0xF00010) && (offset < 0xF00028))\r
+               return op_byte_read(offset);\r
+       else if ((offset >= 0xF02200) && (offset < 0xF022A0))\r
+               return blitter_byte_read(offset);\r
+       else if (offset == 0xF00050)\r
+               return tom_timer_prescaler >> 8;\r
+       else if (offset == 0xF00051)\r
+               return tom_timer_prescaler & 0xFF;\r
+       else if (offset == 0xF00052)\r
+               return tom_timer_divider >> 8;\r
+       else if (offset == 0xF00053)\r
+               return tom_timer_divider & 0xFF;\r
+\r
+       return tom_ram_8[offset & 0x3FFF];\r
+}\r
+\r
+//\r
+// TOM word access (read)\r
+//\r
+\r
+unsigned tom_word_read(unsigned int offset)\r
+{\r
+       offset &= 0xFF3FFF;\r
+#ifdef TOM_DEBUG\r
+       fprintf(log_get(), "TOM: Reading word at %06X\n", offset);\r
+#endif\r
+       if (offset == 0xF000E0)\r
+       {\r
+               uint16 data = (tom_puck_int_pending << 4) | (tom_timer_int_pending << 3)\r
+                       | (tom_object_int_pending << 2) | (tom_gpu_int_pending << 1)\r
+                       | (tom_video_int_pending << 0);\r
+               //fprintf(log_get(),"tom: interrupt status is 0x%.4x \n",data);\r
+               return data;\r
+       }\r
+       else if (offset == 0xF00006)\r
+               return (tom_scanline << 1) + 1;\r
+       else if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+               return gpu_word_read(offset);\r
+       else if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+               return gpu_word_read(offset);\r
+       else if ((offset >= 0xF00010) && (offset < 0xF00028))\r
+               return op_word_read(offset);\r
+       else if ((offset >= 0xF02200) && (offset < 0xF022A0))\r
+               return blitter_word_read(offset);\r
+       else if (offset == 0xF00050)\r
+               return tom_timer_prescaler;\r
+       else if (offset == 0xF00052)\r
+               return tom_timer_divider;\r
+\r
+       offset &= 0x3FFF;\r
+\r
+//     uint16 data = tom_byte_read(offset);\r
+//     data <<= 8;\r
+//     data |= tom_byte_read(offset+1);\r
+\r
+//     return data;\r
+       return (tom_byte_read(offset) << 8) | tom_byte_read(offset+1);\r
+}\r
+\r
+//\r
+// TOM byte access (write)\r
+//\r
+\r
+void tom_byte_write(unsigned offset, unsigned data)\r
+{\r
+       offset &= 0xFF3FFF;\r
+\r
+#ifdef TOM_DEBUG\r
+       fprintf(log_get(), "TOM: Writing byte %02X at %06X\n", data, offset);\r
+#endif\r
+\r
+       if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               gpu_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               gpu_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF00010) && (offset < 0xF00028))\r
+       {\r
+               op_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF02200) && (offset < 0xF022A0))\r
+       {\r
+               blitter_byte_write(offset, data);\r
+               return;\r
+       }\r
+       else if (offset == 0xF00050)\r
+       {\r
+               tom_timer_prescaler = (tom_timer_prescaler & 0x00FF) | (data << 8);\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+       else if (offset == 0xF00051)\r
+       {\r
+               tom_timer_prescaler = (tom_timer_prescaler & 0xFF00) | data;\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+       else if (offset == 0xF00052)\r
+       {\r
+               tom_timer_divider = (tom_timer_divider & 0x00FF) | (data << 8);\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+       else if (offset == 0xF00053)\r
+       {\r
+               tom_timer_divider = (tom_timer_divider & 0xFF00) | data;\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+\r
+       tom_ram_8[offset & 0x3FFF] = data;\r
+}\r
+\r
+//\r
+// TOM word access (write)\r
+//\r
+\r
+void tom_word_write(unsigned offset, unsigned data)\r
+{\r
+       offset &= 0xFF3FFF;\r
+\r
+#ifdef TOM_DEBUG\r
+       fprintf(log_get(), "TOM: Writing word %04X at %06X\n", data, offset);\r
+#endif\r
+\r
+       if ((offset >= gpu_control_ram_base) && (offset < gpu_control_ram_base+0x20))\r
+       {\r
+               gpu_word_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= gpu_work_ram_base) && (offset < gpu_work_ram_base+0x1000))\r
+       {\r
+               gpu_word_write(offset, data);\r
+               return;\r
+       }\r
+       else if ((offset >= 0xF00000) && (offset < 0xF00002))\r
+       {\r
+               tom_byte_write(offset, (data>>8));\r
+               tom_byte_write(offset+1, (data&0xFF));\r
+       }\r
+       else if ((offset >= 0xF00010) && (offset < 0xF00028))\r
+       {\r
+               op_word_write(offset, data);\r
+               return;\r
+       }\r
+       else if (offset == 0xF00050)\r
+       {\r
+               tom_timer_prescaler = data;\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+       else if (offset == 0xF00052)\r
+       {\r
+               tom_timer_divider = data;\r
+               tom_reset_timer();\r
+               return;\r
+       }\r
+       else if (offset == 0xF000E0)\r
+       {\r
+               if (data & 0x0100)\r
+                       tom_video_int_pending = 0;\r
+               if (data & 0x0200)\r
+                       tom_gpu_int_pending = 0;\r
+               if (data & 0x0400)\r
+                       tom_object_int_pending = 0;\r
+               if (data & 0x0800)\r
+                       tom_timer_int_pending = 0;\r
+               if (data & 0x1000)\r
+                       tom_puck_int_pending = 0;\r
+       }\r
+       else if ((offset >= 0xF02200) && (offset < 0xF022A0))\r
+       {\r
+               blitter_word_write(offset, data);\r
+               return;\r
+       }\r
+\r
+       offset &= 0x3FFF;\r
+       if (offset == 0x28)\r
+               objectp_running = 1;\r
+\r
+       tom_byte_write(offset, data >> 8);\r
+       tom_byte_write(offset+1,  data & 0xFF);\r
+\r
+       // detect screen resolution changes\r
+       if ((offset >= 0x28) && (offset <= 0x4F))\r
+       {\r
+               int width, height;\r
+               tom_real_internal_width = width = tom_getVideoModeWidth();\r
+               height = tom_getVideoModeHeight();\r
+               if (width == 640)\r
+               {\r
+                       memcpy(scanline_render, scanline_render_stretch, sizeof(scanline_render));\r
+                       width = 320;\r
+               }\r
+               else\r
+               {\r
+                       memcpy(scanline_render, scanline_render_normal, sizeof(scanline_render));\r
+               }\r
+\r
+               \r
+               if ((width != tom_width) || (height != tom_height))\r
+               {\r
+                       ws_audio_done();\r
+               \r
+                       static char window_title[256];\r
+                       delete surface;\r
+                       \r
+                       tom_width = width;\r
+                       tom_height = height;\r
+                       Format format(16, 0x007C00, 0x00003E0, 0x0000001F);\r
+                       surface = new Surface(tom_width, tom_height, format);\r
+                       console.close();\r
+                       sprintf(window_title, "Virtual Jaguar (%ix%i)", tom_width, tom_height);\r
+                       console.open(window_title, width, tom_height, format);\r
+\r
+                       ws_audio_init();\r
+                       ws_audio_reset();\r
+               }\r
+       }\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+int tom_irq_enabled(int irq)\r
+{\r
+       return jaguar_byte_read(0xF000E1) & (1 << irq);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_set_irq_latch(int irq, int enabled)\r
+{\r
+       tom_ram_8[0xE0] = (tom_ram_8[0xE0] & (~(1<<irq))) | (enabled ? (1<<irq) : 0);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+uint16 tom_irq_control_reg(void)\r
+{\r
+       return (tom_ram_8[0xE0] << 8) | tom_ram_8[0xE1];\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_reset_timer(void)\r
+{\r
+       if ((!tom_timer_prescaler) || (!tom_timer_divider))\r
+               tom_timer_counter = 0;\r
+       else\r
+               tom_timer_counter = (1 + tom_timer_prescaler) * (1 + tom_timer_divider);\r
+//     fprintf(log_get(),"tom: reseting timer to 0x%.8x (%i)\n",tom_timer_counter,tom_timer_counter);\r
+}\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//////////////////////////////////////////////////////////////////////////////\r
+void tom_pit_exec(uint32 cycles)\r
+{\r
+       if (tom_timer_counter > 0)\r
+       {\r
+               tom_timer_counter -= cycles;\r
+\r
+               if (tom_timer_counter <= 0)\r
+               {\r
+                       tom_set_pending_timer_int();\r
+                       gpu_set_irq_line(2, 1);\r
+                       if ((tom_irq_enabled(IRQ_TIMER)) && (jaguar_interrupt_handler_is_valid(64)))\r
+                       {\r
+//                             s68000interrupt(7, 64);\r
+//                             s68000flushInterrupts();\r
+                               m68k_set_irq(7);                                // Cause a 68000 NMI...\r
+                       }\r
+                       tom_reset_timer();\r
+               }\r
+       }\r
+}\r
diff --git a/src/version.cpp b/src/version.cpp
new file mode 100644 (file)
index 0000000..d2f6e9f
--- /dev/null
@@ -0,0 +1,58 @@
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+\r
+#include "include/version.h"\r
+\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void version_init(void)\r
+{\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void version_display(FILE *fp)\r
+{\r
+       fprintf(fp,"VirtualJaguar v1.0.0 (Last full build on %s %s)\n",__DATE__,__TIME__);\r
+}\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+//\r
+////////////////////////////////////////////////////////////////////////////////\r
+void version_done(void)\r
+{\r
+}\r
+\r
diff --git a/tools/fix-unix.sh b/tools/fix-unix.sh
new file mode 100644 (file)
index 0000000..4a1a732
--- /dev/null
@@ -0,0 +1,21 @@
+#! /bin/sh
+#
+#  Sets up the Allegro package for building under Unix, converting text
+#  files from CR/LF to LF format.
+
+
+echo "Converting NeoPocott files to Unix format..."
+
+find . -type f "(" \
+   -name "*.c*" -o -name "*.cfg" -o \
+   -name "*.h" -o -name "*.s" -o \
+   -name "*.txt" -o -name "*.asm" -o \
+   -name "Makefile*" -o -name "readme.*" \
+   ")" \
+   -exec sh -c "echo {};
+               mv {} _tmpfile;
+               tr -d \\\r < _tmpfile > {};
+               touch -r _tmpfile {}; 
+               rm _tmpfile" \;
+
+echo "Done!"