--- /dev/null
+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
+
+
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+Place the bios here
+
+jagboot.rom (128 Kb)
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+ 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.
+
+
--- /dev/null
+#! /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!"
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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,¤t_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, ¤t_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, ¤t_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, ¤t_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, ¤t_track->start_lba, 4);\r
+ if (stdfp) fprintf(stdfp,"cdi: \t\t\tstart lba : %i\n", current_track->start_lba);\r
+ read(fp, ¤t_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, ¤t_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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+//\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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+ 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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#ifndef __CRC32_H__\r
+#define __CRC32_H__\r
+\r
+int crc32_calcCheckSum(unsigned char *data, unsigned int length);\r
+\r
+#endif\r
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+\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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+\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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+int Dasm68000(char * pBase, char * buffer, int pc);\r
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+//\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
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+ 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
--- /dev/null
+#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
--- /dev/null
+//\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
--- /dev/null
+/***************************************************************************\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
--- /dev/null
+#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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#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
--- /dev/null
+/* ======================================================================== */\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 = ®_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 = ®_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 = ®_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 = ®_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 = ®_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 = ®_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 = ®_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
--- /dev/null
+/* ======================================================================== */\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
--- /dev/null
+/* ======================================================================== */\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
--- /dev/null
+#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
--- /dev/null
+/* ======================================================================== */\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
--- /dev/null
+/*\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
--- /dev/null
+/* ======================================================================== */\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
--- /dev/null
+//////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+\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
--- /dev/null
+#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
--- /dev/null
+//\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
--- /dev/null
+////////////////////////////////////////////////////////////////////////////////\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
--- /dev/null
+#! /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!"